Hi, if the feature VIRTIO_NET_F_CTRL_VLAN is not negotiated, virtio-net should not filter VLANs. That means it should send all packets to the guest instead of dropping all packets that have any VLAN id. The following patch fixes the issue.
Cheers, Stefan --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -312,13 +312,16 @@ static void virtio_net_reset(VirtIODevice *vdev) n->mac_table.first_multi = 0; n->mac_table.multi_overflow = 0; n->mac_table.uni_overflow = 0; memset(n->mac_table.macs, 0, MAC_TABLE_ENTRIES * ETH_ALEN); memcpy(&n->mac[0], &n->nic->conf->macaddr, sizeof(n->mac)); qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); - memset(n->vlans, 0, MAX_VLAN >> 3); + if (vdev->guest_features & (1 << VIRTIO_NET_F_CTRL_VLAN)) + memset(n->vlans, 0, MAX_VLAN >> 3); + else + memset(n->vlans, 0xff, MAX_VLAN >> 3); } static void peer_test_vnet_hdr(VirtIONet *n) { NetClientState *nc = qemu_get_queue(n->nic); if (!nc->peer) { @@ -512,12 +515,17 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint32_t features) } if (!tap_get_vhost_net(nc->peer)) { continue; } vhost_net_ack_features(tap_get_vhost_net(nc->peer), features); } + + if (vdev->guest_features & (1 << VIRTIO_NET_F_CTRL_VLAN)) + memset(n->vlans, 0, MAX_VLAN >> 3); + else + memset(n->vlans, 0xff, MAX_VLAN >> 3); } static int virtio_net_handle_rx_mode(VirtIONet *n, uint8_t cmd, struct iovec *iov, unsigned int iov_cnt) { uint8_t on;