static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)

{

    VirtIONet *n = VIRTIO_NET(vdev);

    struct virtio_net_ctrl_hdr ctrl;

    virtio_net_ctrl_ack status = VIRTIO_NET_ERR;

    VirtQueueElement elem;

    size_t s;

    struct iovec *iov;

    unsigned int iov_cnt;



    while (virtqueue_pop(vq, &elem)) {

        if (iov_size(elem.in_sg, elem.in_num) < sizeof(status) ||

            iov_size(elem.out_sg, elem.out_num) < sizeof(ctrl)) {

            error_report("virtio-net ctrl missing headers");

            exit(1);

        }



        iov = elem.out_sg;

        iov_cnt = elem.out_num;

        s = iov_to_buf(iov, iov_cnt, 0, &ctrl, sizeof(ctrl));

        iov_discard_front(&iov, &iov_cnt, sizeof(ctrl));

        if (s != sizeof(ctrl)) {

            status = VIRTIO_NET_ERR;

        } else if (ctrl.class == VIRTIO_NET_CTRL_RX) {

            status = virtio_net_handle_rx_mode(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_MAC) {

            status = virtio_net_handle_mac(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_VLAN) {

            status = virtio_net_handle_vlan_table(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_ANNOUNCE) {

            status = virtio_net_handle_announce(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_MQ) {

            status = virtio_net_handle_mq(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_GUEST_OFFLOADS) {

            status = virtio_net_handle_offloads(n, ctrl.cmd, iov, iov_cnt);

        }



        s = iov_from_buf(elem.in_sg, elem.in_num, 0, &status, sizeof(status));

        assert(s == sizeof(status));



        virtqueue_push(vq, &elem, sizeof(status));

        virtio_notify(vdev, vq);

    }

}

static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)

{

    VirtIONet *n = VIRTIO_NET(vdev);

    struct virtio_net_ctrl_hdr ctrl;

    virtio_net_ctrl_ack status = VIRTIO_NET_ERR;

    VirtQueueElement elem;

    size_t s;

    struct iovec *iov;

    unsigned int iov_cnt;



    while (virtqueue_pop(vq, &elem)) {

        if (iov_size(elem.in_sg, elem.in_num) < sizeof(status) ||

            iov_size(elem.out_sg, elem.out_num) < sizeof(ctrl)) {

            error_report("virtio-net ctrl missing headers");

            exit(1);

        }



        iov = elem.out_sg;

        iov_cnt = elem.out_num;

        s = iov_to_buf(iov, iov_cnt, 0, &ctrl, sizeof(ctrl));

        iov_discard_front(&iov, &iov_cnt, sizeof(ctrl));

        if (s != sizeof(ctrl)) {

            status = VIRTIO_NET_ERR;

        } else if (ctrl.class == VIRTIO_NET_CTRL_RX) {

            status = virtio_net_handle_rx_mode(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_MAC) {

            status = virtio_net_handle_mac(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_VLAN) {

            status = virtio_net_handle_vlan_table(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_ANNOUNCE) {

            status = virtio_net_handle_announce(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_MQ) {

            status = virtio_net_handle_mq(n, ctrl.cmd, iov, iov_cnt);

        } else if (ctrl.class == VIRTIO_NET_CTRL_GUEST_OFFLOADS) {

            status = virtio_net_handle_offloads(n, ctrl.cmd, iov, iov_cnt);

        }



        s = iov_from_buf(elem.in_sg, elem.in_num, 0, &status, sizeof(status));

        assert(s == sizeof(status));



        virtqueue_push(vq, &elem, sizeof(status));

        virtio_notify(vdev, vq);

    }

}

    struct iovec *iov;         iov = elem.out_sg;
static void FUNC_0(VirtIODevice *VAR_0, VirtQueue *VAR_1)

{

    VirtIONet *n = VIRTIO_NET(VAR_0);

    struct virtio_net_ctrl_hdr VAR_2;

    virtio_net_ctrl_ack status = VIRTIO_NET_ERR;

    VirtQueueElement elem;

    size_t s;

    struct iovec *VAR_3;

    unsigned int VAR_4;



    while (virtqueue_pop(VAR_1, &elem)) {

        if (iov_size(elem.in_sg, elem.in_num) < sizeof(status) ||

            iov_size(elem.out_sg, elem.out_num) < sizeof(VAR_2)) {

            error_report("virtio-net VAR_2 missing headers");

            exit(1);

        }



        VAR_3 = elem.out_sg;

        VAR_4 = elem.out_num;

        s = iov_to_buf(VAR_3, VAR_4, 0, &VAR_2, sizeof(VAR_2));

        iov_discard_front(&VAR_3, &VAR_4, sizeof(VAR_2));

        if (s != sizeof(VAR_2)) {

            status = VIRTIO_NET_ERR;

        } else if (VAR_2.class == VIRTIO_NET_CTRL_RX) {

            status = virtio_net_handle_rx_mode(n, VAR_2.cmd, VAR_3, VAR_4);

        } else if (VAR_2.class == VIRTIO_NET_CTRL_MAC) {

            status = virtio_net_handle_mac(n, VAR_2.cmd, VAR_3, VAR_4);

        } else if (VAR_2.class == VIRTIO_NET_CTRL_VLAN) {

            status = virtio_net_handle_vlan_table(n, VAR_2.cmd, VAR_3, VAR_4);

        } else if (VAR_2.class == VIRTIO_NET_CTRL_ANNOUNCE) {

            status = virtio_net_handle_announce(n, VAR_2.cmd, VAR_3, VAR_4);

        } else if (VAR_2.class == VIRTIO_NET_CTRL_MQ) {

            status = virtio_net_handle_mq(n, VAR_2.cmd, VAR_3, VAR_4);

        } else if (VAR_2.class == VIRTIO_NET_CTRL_GUEST_OFFLOADS) {

            status = virtio_net_handle_offloads(n, VAR_2.cmd, VAR_3, VAR_4);

        }



        s = iov_from_buf(elem.in_sg, elem.in_num, 0, &status, sizeof(status));

        assert(s == sizeof(status));



        virtqueue_push(VAR_1, &elem, sizeof(status));

        virtio_notify(VAR_0, VAR_1);

    }

}

static void FUNC_0(VirtIODevice *VAR_0, VirtQueue *VAR_1)
{ VirtIONet *n = VIRTIO_NET(VAR_0); struct virtio_net_ctrl_hdr VAR_2; virtio_net_ctrl_ack status = VIRTIO_NET_ERR; VirtQueueElement elem; size_t s; struct iovec *VAR_3; unsigned int VAR_4; while (virtqueue_pop(VAR_1, &elem)) { if (iov_size(elem.in_sg, elem.in_num) < sizeof(status) ||
iov_size(elem.out_sg, elem.out_num) < sizeof(VAR_2)) { error_report("virtio-net VAR_2 missing headers"); exit(1); } VAR_3 = elem.out_sg; VAR_4 = elem.out_num; s = iov_to_buf(VAR_3, VAR_4, 0, &VAR_2, sizeof(VAR_2)); iov_discard_front(&VAR_3, &VAR_4, sizeof(VAR_2)); if (s != sizeof(VAR_2)) { status = VIRTIO_NET_ERR; } else if (VAR_2.class == VIRTIO_NET_CTRL_RX) { status = virtio_net_handle_rx_mode(n, VAR_2.cmd, VAR_3, VAR_4); } else if (VAR_2.class == VIRTIO_NET_CTRL_MAC) { status = virtio_net_handle_mac(n, VAR_2.cmd, VAR_3, VAR_4); } else if (VAR_2.class == VIRTIO_NET_CTRL_VLAN) { status = virtio_net_handle_vlan_table(n, VAR_2.cmd, VAR_3, VAR_4); } else if (VAR_2.class == VIRTIO_NET_CTRL_ANNOUNCE) { status = virtio_net_handle_announce(n, VAR_2.cmd, VAR_3, VAR_4); } else if (VAR_2.class == VIRTIO_NET_CTRL_MQ) { status = virtio_net_handle_mq(n, VAR_2.cmd, VAR_3, VAR_4); } else if (VAR_2.class == VIRTIO_NET_CTRL_GUEST_OFFLOADS) { status = virtio_net_handle_offloads(n, VAR_2.cmd, VAR_3, VAR_4); } s = iov_from_buf(elem.in_sg, elem.in_num, 0, &status, sizeof(status)); assert(s == sizeof(status)); virtqueue_push(VAR_1, &elem, sizeof(status)); virtio_notify(VAR_0, VAR_1); } }