/* AUTOMATICALLY GENERATED, DO NOT MODIFY */

/*
 * Schema-defined QAPI visitors
 *
 * Copyright IBM, Corp. 2011
 * Copyright (C) 2014-2018 Red Hat, Inc.
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING.LIB file in the top-level directory.
 */

#include "qemu/osdep.h"
#include "qemu-common.h"
#include "qapi/error.h"
#include "qapi/qmp/qerror.h"
#include "qapi-visit-net.h"

void visit_type_q_obj_set_link_arg_members(Visitor *v, q_obj_set_link_arg *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "name", &obj->name, &err);
    if (err) {
        goto out;
    }
    visit_type_bool(v, "up", &obj->up, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}

void visit_type_q_obj_netdev_add_arg_members(Visitor *v, q_obj_netdev_add_arg *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "type", &obj->type, &err);
    if (err) {
        goto out;
    }
    visit_type_str(v, "id", &obj->id, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}

void visit_type_q_obj_netdev_del_arg_members(Visitor *v, q_obj_netdev_del_arg *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "id", &obj->id, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevNoneOptions_members(Visitor *v, NetdevNoneOptions *obj, Error **errp)
{
    Error *err = NULL;

    error_propagate(errp, err);
}

void visit_type_NetdevNoneOptions(Visitor *v, const char *name, NetdevNoneOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevNoneOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevNoneOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevNoneOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetLegacyNicOptions_members(Visitor *v, NetLegacyNicOptions *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "netdev", &obj->has_netdev)) {
        visit_type_str(v, "netdev", &obj->netdev, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "macaddr", &obj->has_macaddr)) {
        visit_type_str(v, "macaddr", &obj->macaddr, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "model", &obj->has_model)) {
        visit_type_str(v, "model", &obj->model, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "addr", &obj->has_addr)) {
        visit_type_str(v, "addr", &obj->addr, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "vectors", &obj->has_vectors)) {
        visit_type_uint32(v, "vectors", &obj->vectors, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetLegacyNicOptions(Visitor *v, const char *name, NetLegacyNicOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetLegacyNicOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetLegacyNicOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetLegacyNicOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_StringList(Visitor *v, const char *name, StringList **obj, Error **errp)
{
    Error *err = NULL;
    StringList *tail;
    size_t size = sizeof(**obj);

    visit_start_list(v, name, (GenericList **)obj, size, &err);
    if (err) {
        goto out;
    }

    for (tail = *obj; tail;
         tail = (StringList *)visit_next_list(v, (GenericList *)tail, size)) {
        visit_type_String(v, NULL, &tail->value, &err);
        if (err) {
            break;
        }
    }

    if (!err) {
        visit_check_list(v, &err);
    }
    visit_end_list(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_StringList(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevUserOptions_members(Visitor *v, NetdevUserOptions *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "hostname", &obj->has_hostname)) {
        visit_type_str(v, "hostname", &obj->hostname, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "restrict", &obj->has_q_restrict)) {
        visit_type_bool(v, "restrict", &obj->q_restrict, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv4", &obj->has_ipv4)) {
        visit_type_bool(v, "ipv4", &obj->ipv4, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv6", &obj->has_ipv6)) {
        visit_type_bool(v, "ipv6", &obj->ipv6, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ip", &obj->has_ip)) {
        visit_type_str(v, "ip", &obj->ip, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "net", &obj->has_net)) {
        visit_type_str(v, "net", &obj->net, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "host", &obj->has_host)) {
        visit_type_str(v, "host", &obj->host, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "tftp", &obj->has_tftp)) {
        visit_type_str(v, "tftp", &obj->tftp, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "bootfile", &obj->has_bootfile)) {
        visit_type_str(v, "bootfile", &obj->bootfile, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "dhcpstart", &obj->has_dhcpstart)) {
        visit_type_str(v, "dhcpstart", &obj->dhcpstart, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "dns", &obj->has_dns)) {
        visit_type_str(v, "dns", &obj->dns, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "dnssearch", &obj->has_dnssearch)) {
        visit_type_StringList(v, "dnssearch", &obj->dnssearch, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv6-prefix", &obj->has_ipv6_prefix)) {
        visit_type_str(v, "ipv6-prefix", &obj->ipv6_prefix, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv6-prefixlen", &obj->has_ipv6_prefixlen)) {
        visit_type_int(v, "ipv6-prefixlen", &obj->ipv6_prefixlen, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv6-host", &obj->has_ipv6_host)) {
        visit_type_str(v, "ipv6-host", &obj->ipv6_host, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv6-dns", &obj->has_ipv6_dns)) {
        visit_type_str(v, "ipv6-dns", &obj->ipv6_dns, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "smb", &obj->has_smb)) {
        visit_type_str(v, "smb", &obj->smb, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "smbserver", &obj->has_smbserver)) {
        visit_type_str(v, "smbserver", &obj->smbserver, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "hostfwd", &obj->has_hostfwd)) {
        visit_type_StringList(v, "hostfwd", &obj->hostfwd, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "guestfwd", &obj->has_guestfwd)) {
        visit_type_StringList(v, "guestfwd", &obj->guestfwd, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv6-hostfwd", &obj->has_ipv6_hostfwd)) {
        visit_type_StringList(v, "ipv6-hostfwd", &obj->ipv6_hostfwd, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevUserOptions(Visitor *v, const char *name, NetdevUserOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevUserOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevUserOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevUserOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevTapOptions_members(Visitor *v, NetdevTapOptions *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "ifname", &obj->has_ifname)) {
        visit_type_str(v, "ifname", &obj->ifname, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "fd", &obj->has_fd)) {
        visit_type_str(v, "fd", &obj->fd, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "fds", &obj->has_fds)) {
        visit_type_str(v, "fds", &obj->fds, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "script", &obj->has_script)) {
        visit_type_str(v, "script", &obj->script, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "downscript", &obj->has_downscript)) {
        visit_type_str(v, "downscript", &obj->downscript, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "br", &obj->has_br)) {
        visit_type_str(v, "br", &obj->br, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "helper", &obj->has_helper)) {
        visit_type_str(v, "helper", &obj->helper, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "sndbuf", &obj->has_sndbuf)) {
        visit_type_size(v, "sndbuf", &obj->sndbuf, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "vnet_hdr", &obj->has_vnet_hdr)) {
        visit_type_bool(v, "vnet_hdr", &obj->vnet_hdr, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "vhost", &obj->has_vhost)) {
        visit_type_bool(v, "vhost", &obj->vhost, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "vhostfd", &obj->has_vhostfd)) {
        visit_type_str(v, "vhostfd", &obj->vhostfd, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "vhostfds", &obj->has_vhostfds)) {
        visit_type_str(v, "vhostfds", &obj->vhostfds, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "vhostforce", &obj->has_vhostforce)) {
        visit_type_bool(v, "vhostforce", &obj->vhostforce, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "queues", &obj->has_queues)) {
        visit_type_uint32(v, "queues", &obj->queues, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "poll-us", &obj->has_poll_us)) {
        visit_type_uint32(v, "poll-us", &obj->poll_us, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevTapOptions(Visitor *v, const char *name, NetdevTapOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevTapOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevTapOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevTapOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevSocketOptions_members(Visitor *v, NetdevSocketOptions *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "fd", &obj->has_fd)) {
        visit_type_str(v, "fd", &obj->fd, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "listen", &obj->has_listen)) {
        visit_type_str(v, "listen", &obj->listen, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "connect", &obj->has_connect)) {
        visit_type_str(v, "connect", &obj->connect, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "mcast", &obj->has_mcast)) {
        visit_type_str(v, "mcast", &obj->mcast, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "localaddr", &obj->has_localaddr)) {
        visit_type_str(v, "localaddr", &obj->localaddr, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "udp", &obj->has_udp)) {
        visit_type_str(v, "udp", &obj->udp, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevSocketOptions(Visitor *v, const char *name, NetdevSocketOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevSocketOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevSocketOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevSocketOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevL2TPv3Options_members(Visitor *v, NetdevL2TPv3Options *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "src", &obj->src, &err);
    if (err) {
        goto out;
    }
    visit_type_str(v, "dst", &obj->dst, &err);
    if (err) {
        goto out;
    }
    if (visit_optional(v, "srcport", &obj->has_srcport)) {
        visit_type_str(v, "srcport", &obj->srcport, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "dstport", &obj->has_dstport)) {
        visit_type_str(v, "dstport", &obj->dstport, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "ipv6", &obj->has_ipv6)) {
        visit_type_bool(v, "ipv6", &obj->ipv6, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "udp", &obj->has_udp)) {
        visit_type_bool(v, "udp", &obj->udp, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "cookie64", &obj->has_cookie64)) {
        visit_type_bool(v, "cookie64", &obj->cookie64, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "counter", &obj->has_counter)) {
        visit_type_bool(v, "counter", &obj->counter, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "pincounter", &obj->has_pincounter)) {
        visit_type_bool(v, "pincounter", &obj->pincounter, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "txcookie", &obj->has_txcookie)) {
        visit_type_uint64(v, "txcookie", &obj->txcookie, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "rxcookie", &obj->has_rxcookie)) {
        visit_type_uint64(v, "rxcookie", &obj->rxcookie, &err);
        if (err) {
            goto out;
        }
    }
    visit_type_uint32(v, "txsession", &obj->txsession, &err);
    if (err) {
        goto out;
    }
    if (visit_optional(v, "rxsession", &obj->has_rxsession)) {
        visit_type_uint32(v, "rxsession", &obj->rxsession, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "offset", &obj->has_offset)) {
        visit_type_uint32(v, "offset", &obj->offset, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevL2TPv3Options(Visitor *v, const char *name, NetdevL2TPv3Options **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevL2TPv3Options), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevL2TPv3Options_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevL2TPv3Options(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevVdeOptions_members(Visitor *v, NetdevVdeOptions *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "sock", &obj->has_sock)) {
        visit_type_str(v, "sock", &obj->sock, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "port", &obj->has_port)) {
        visit_type_uint16(v, "port", &obj->port, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "group", &obj->has_group)) {
        visit_type_str(v, "group", &obj->group, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "mode", &obj->has_mode)) {
        visit_type_uint16(v, "mode", &obj->mode, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevVdeOptions(Visitor *v, const char *name, NetdevVdeOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevVdeOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevVdeOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevVdeOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevBridgeOptions_members(Visitor *v, NetdevBridgeOptions *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "br", &obj->has_br)) {
        visit_type_str(v, "br", &obj->br, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "helper", &obj->has_helper)) {
        visit_type_str(v, "helper", &obj->helper, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevBridgeOptions(Visitor *v, const char *name, NetdevBridgeOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevBridgeOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevBridgeOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevBridgeOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevHubPortOptions_members(Visitor *v, NetdevHubPortOptions *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_int32(v, "hubid", &obj->hubid, &err);
    if (err) {
        goto out;
    }
    if (visit_optional(v, "netdev", &obj->has_netdev)) {
        visit_type_str(v, "netdev", &obj->netdev, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevHubPortOptions(Visitor *v, const char *name, NetdevHubPortOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevHubPortOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevHubPortOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevHubPortOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevNetmapOptions_members(Visitor *v, NetdevNetmapOptions *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "ifname", &obj->ifname, &err);
    if (err) {
        goto out;
    }
    if (visit_optional(v, "devname", &obj->has_devname)) {
        visit_type_str(v, "devname", &obj->devname, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevNetmapOptions(Visitor *v, const char *name, NetdevNetmapOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevNetmapOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevNetmapOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevNetmapOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetdevVhostUserOptions_members(Visitor *v, NetdevVhostUserOptions *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "chardev", &obj->chardev, &err);
    if (err) {
        goto out;
    }
    if (visit_optional(v, "vhostforce", &obj->has_vhostforce)) {
        visit_type_bool(v, "vhostforce", &obj->vhostforce, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "queues", &obj->has_queues)) {
        visit_type_int(v, "queues", &obj->queues, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetdevVhostUserOptions(Visitor *v, const char *name, NetdevVhostUserOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetdevVhostUserOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetdevVhostUserOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetdevVhostUserOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetClientDriver(Visitor *v, const char *name, NetClientDriver *obj, Error **errp)
{
    int value = *obj;
    visit_type_enum(v, name, &value, &NetClientDriver_lookup, errp);
    *obj = value;
}

void visit_type_q_obj_Netdev_base_members(Visitor *v, q_obj_Netdev_base *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "id", &obj->id, &err);
    if (err) {
        goto out;
    }
    visit_type_NetClientDriver(v, "type", &obj->type, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}

void visit_type_Netdev_members(Visitor *v, Netdev *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_q_obj_Netdev_base_members(v, (q_obj_Netdev_base *)obj, &err);
    if (err) {
        goto out;
    }
    switch (obj->type) {
    case NET_CLIENT_DRIVER_NONE:
        visit_type_NetdevNoneOptions_members(v, &obj->u.none, &err);
        break;
    case NET_CLIENT_DRIVER_NIC:
        visit_type_NetLegacyNicOptions_members(v, &obj->u.nic, &err);
        break;
    case NET_CLIENT_DRIVER_USER:
        visit_type_NetdevUserOptions_members(v, &obj->u.user, &err);
        break;
    case NET_CLIENT_DRIVER_TAP:
        visit_type_NetdevTapOptions_members(v, &obj->u.tap, &err);
        break;
    case NET_CLIENT_DRIVER_L2TPV3:
        visit_type_NetdevL2TPv3Options_members(v, &obj->u.l2tpv3, &err);
        break;
    case NET_CLIENT_DRIVER_SOCKET:
        visit_type_NetdevSocketOptions_members(v, &obj->u.socket, &err);
        break;
    case NET_CLIENT_DRIVER_VDE:
        visit_type_NetdevVdeOptions_members(v, &obj->u.vde, &err);
        break;
    case NET_CLIENT_DRIVER_BRIDGE:
        visit_type_NetdevBridgeOptions_members(v, &obj->u.bridge, &err);
        break;
    case NET_CLIENT_DRIVER_HUBPORT:
        visit_type_NetdevHubPortOptions_members(v, &obj->u.hubport, &err);
        break;
    case NET_CLIENT_DRIVER_NETMAP:
        visit_type_NetdevNetmapOptions_members(v, &obj->u.netmap, &err);
        break;
    case NET_CLIENT_DRIVER_VHOST_USER:
        visit_type_NetdevVhostUserOptions_members(v, &obj->u.vhost_user, &err);
        break;
    default:
        abort();
    }

out:
    error_propagate(errp, err);
}

void visit_type_Netdev(Visitor *v, const char *name, Netdev **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(Netdev), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_Netdev_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_Netdev(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetLegacy_members(Visitor *v, NetLegacy *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "vlan", &obj->has_vlan)) {
        visit_type_int32(v, "vlan", &obj->vlan, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "id", &obj->has_id)) {
        visit_type_str(v, "id", &obj->id, &err);
        if (err) {
            goto out;
        }
    }
    if (visit_optional(v, "name", &obj->has_name)) {
        visit_type_str(v, "name", &obj->name, &err);
        if (err) {
            goto out;
        }
    }
    visit_type_NetLegacyOptions(v, "opts", &obj->opts, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetLegacy(Visitor *v, const char *name, NetLegacy **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetLegacy), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetLegacy_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetLegacy(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetLegacyOptionsType(Visitor *v, const char *name, NetLegacyOptionsType *obj, Error **errp)
{
    int value = *obj;
    visit_type_enum(v, name, &value, &NetLegacyOptionsType_lookup, errp);
    *obj = value;
}

void visit_type_q_obj_NetLegacyOptions_base_members(Visitor *v, q_obj_NetLegacyOptions_base *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_NetLegacyOptionsType(v, "type", &obj->type, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetLegacyOptions_members(Visitor *v, NetLegacyOptions *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_q_obj_NetLegacyOptions_base_members(v, (q_obj_NetLegacyOptions_base *)obj, &err);
    if (err) {
        goto out;
    }
    switch (obj->type) {
    case NET_LEGACY_OPTIONS_TYPE_NONE:
        visit_type_NetdevNoneOptions_members(v, &obj->u.none, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_NIC:
        visit_type_NetLegacyNicOptions_members(v, &obj->u.nic, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_USER:
        visit_type_NetdevUserOptions_members(v, &obj->u.user, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_TAP:
        visit_type_NetdevTapOptions_members(v, &obj->u.tap, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_L2TPV3:
        visit_type_NetdevL2TPv3Options_members(v, &obj->u.l2tpv3, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_SOCKET:
        visit_type_NetdevSocketOptions_members(v, &obj->u.socket, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_VDE:
        visit_type_NetdevVdeOptions_members(v, &obj->u.vde, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_BRIDGE:
        visit_type_NetdevBridgeOptions_members(v, &obj->u.bridge, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_NETMAP:
        visit_type_NetdevNetmapOptions_members(v, &obj->u.netmap, &err);
        break;
    case NET_LEGACY_OPTIONS_TYPE_VHOST_USER:
        visit_type_NetdevVhostUserOptions_members(v, &obj->u.vhost_user, &err);
        break;
    default:
        abort();
    }

out:
    error_propagate(errp, err);
}

void visit_type_NetLegacyOptions(Visitor *v, const char *name, NetLegacyOptions **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(NetLegacyOptions), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_NetLegacyOptions_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_NetLegacyOptions(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_NetFilterDirection(Visitor *v, const char *name, NetFilterDirection *obj, Error **errp)
{
    int value = *obj;
    visit_type_enum(v, name, &value, &NetFilterDirection_lookup, errp);
    *obj = value;
}

void visit_type_RxState(Visitor *v, const char *name, RxState *obj, Error **errp)
{
    int value = *obj;
    visit_type_enum(v, name, &value, &RxState_lookup, errp);
    *obj = value;
}

void visit_type_RxFilterInfo_members(Visitor *v, RxFilterInfo *obj, Error **errp)
{
    Error *err = NULL;

    visit_type_str(v, "name", &obj->name, &err);
    if (err) {
        goto out;
    }
    visit_type_bool(v, "promiscuous", &obj->promiscuous, &err);
    if (err) {
        goto out;
    }
    visit_type_RxState(v, "multicast", &obj->multicast, &err);
    if (err) {
        goto out;
    }
    visit_type_RxState(v, "unicast", &obj->unicast, &err);
    if (err) {
        goto out;
    }
    visit_type_RxState(v, "vlan", &obj->vlan, &err);
    if (err) {
        goto out;
    }
    visit_type_bool(v, "broadcast-allowed", &obj->broadcast_allowed, &err);
    if (err) {
        goto out;
    }
    visit_type_bool(v, "multicast-overflow", &obj->multicast_overflow, &err);
    if (err) {
        goto out;
    }
    visit_type_bool(v, "unicast-overflow", &obj->unicast_overflow, &err);
    if (err) {
        goto out;
    }
    visit_type_str(v, "main-mac", &obj->main_mac, &err);
    if (err) {
        goto out;
    }
    visit_type_intList(v, "vlan-table", &obj->vlan_table, &err);
    if (err) {
        goto out;
    }
    visit_type_strList(v, "unicast-table", &obj->unicast_table, &err);
    if (err) {
        goto out;
    }
    visit_type_strList(v, "multicast-table", &obj->multicast_table, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}

void visit_type_RxFilterInfo(Visitor *v, const char *name, RxFilterInfo **obj, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, name, (void **)obj, sizeof(RxFilterInfo), &err);
    if (err) {
        goto out;
    }
    if (!*obj) {
        goto out_obj;
    }
    visit_type_RxFilterInfo_members(v, *obj, &err);
    if (err) {
        goto out_obj;
    }
    visit_check_struct(v, &err);
out_obj:
    visit_end_struct(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_RxFilterInfo(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_q_obj_query_rx_filter_arg_members(Visitor *v, q_obj_query_rx_filter_arg *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "name", &obj->has_name)) {
        visit_type_str(v, "name", &obj->name, &err);
        if (err) {
            goto out;
        }
    }

out:
    error_propagate(errp, err);
}

void visit_type_RxFilterInfoList(Visitor *v, const char *name, RxFilterInfoList **obj, Error **errp)
{
    Error *err = NULL;
    RxFilterInfoList *tail;
    size_t size = sizeof(**obj);

    visit_start_list(v, name, (GenericList **)obj, size, &err);
    if (err) {
        goto out;
    }

    for (tail = *obj; tail;
         tail = (RxFilterInfoList *)visit_next_list(v, (GenericList *)tail, size)) {
        visit_type_RxFilterInfo(v, NULL, &tail->value, &err);
        if (err) {
            break;
        }
    }

    if (!err) {
        visit_check_list(v, &err);
    }
    visit_end_list(v, (void **)obj);
    if (err && visit_is_input(v)) {
        qapi_free_RxFilterInfoList(*obj);
        *obj = NULL;
    }
out:
    error_propagate(errp, err);
}

void visit_type_q_obj_NIC_RX_FILTER_CHANGED_arg_members(Visitor *v, q_obj_NIC_RX_FILTER_CHANGED_arg *obj, Error **errp)
{
    Error *err = NULL;

    if (visit_optional(v, "name", &obj->has_name)) {
        visit_type_str(v, "name", &obj->name, &err);
        if (err) {
            goto out;
        }
    }
    visit_type_str(v, "path", &obj->path, &err);
    if (err) {
        goto out;
    }

out:
    error_propagate(errp, err);
}
/* Dummy declaration to prevent empty .o file */
char dummy_qapi_visit_net_c;
