If we tell the guest we support UFO and then migrate to host which doesn't support it, we will find ourselves in grave difficulties.
Prevent this scenario by adding a flag to virtio-net's savevm format which indicates whether the device requires host UFO support. Signed-off-by: Mark McLoughlin <mar...@redhat.com> --- hw/virtio-net.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 3349800..f919952 100644 --- a/hw/virtio-net.c +++ b/hw/virtio-net.c @@ -16,7 +16,7 @@ #include "qemu-timer.h" #include "virtio-net.h" -#define VIRTIO_NET_VM_VERSION 10 +#define VIRTIO_NET_VM_VERSION 11 #define MAC_TABLE_ENTRIES 64 #define MAX_VLAN (1 << 12) /* Per 802.1Q definition */ @@ -694,6 +694,7 @@ static void virtio_net_save(QEMUFile *f, void *opaque) qemu_put_byte(f, n->nomulti); qemu_put_byte(f, n->nouni); qemu_put_byte(f, n->nobcast); + qemu_put_byte(f, peer_has_vnet_hdr(n) && tap_has_ufo(n->vc->peer)); } static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) @@ -769,6 +770,15 @@ static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) n->nobcast = qemu_get_byte(f); } + if (version_id >= 11) { + if (qemu_get_byte(f) && + (!peer_has_vnet_hdr(n) || !tap_has_ufo(n->vc->peer))) { + fprintf(stderr, + "virtio-net: saved image requires TUN_F_UFO support\n"); + return -1; + } + } + /* Find the first multicast entry in the saved MAC filter */ for (i = 0; i < n->mac_table.in_use; i++) { if (n->mac_table.macs[i * ETH_ALEN] & 1) { -- 1.6.2.5