From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N10re-0004np-Q8 for qemu-devel@nongnu.org; Thu, 22 Oct 2009 12:50:14 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N10ra-0004gx-1I for qemu-devel@nongnu.org; Thu, 22 Oct 2009 12:50:14 -0400 Received: from [199.232.76.173] (port=56695 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N10rZ-0004gV-RZ for qemu-devel@nongnu.org; Thu, 22 Oct 2009 12:50:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:29905) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N10rZ-0003uM-B9 for qemu-devel@nongnu.org; Thu, 22 Oct 2009 12:50:09 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n9MGjjHS008440 for ; Thu, 22 Oct 2009 12:45:45 -0400 From: Mark McLoughlin Date: Thu, 22 Oct 2009 17:43:50 +0100 Message-Id: <1256229830-28066-20-git-send-email-markmc@redhat.com> In-Reply-To: <1256229830-28066-1-git-send-email-markmc@redhat.com> References: <1256229830-28066-1-git-send-email-markmc@redhat.com> Subject: [Qemu-devel] [PATCH 19/19] virtio-net: add tap_has_ufo flag to saved state List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Mark McLoughlin 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. [v2: - add has_ufo uint8_t field for ease of vmstate conversion - use qemu_error() ] Signed-off-by: Mark McLoughlin --- hw/virtio-net.c | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-) diff --git a/hw/virtio-net.c b/hw/virtio-net.c index 31ac9ef..15b6f45 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 */ @@ -33,6 +33,7 @@ typedef struct VirtIONet QEMUTimer *tx_timer; int tx_timer_active; uint32_t has_vnet_hdr; + uint8_t has_ufo; struct { VirtQueueElement elem; ssize_t len; @@ -134,6 +135,16 @@ static int peer_has_vnet_hdr(VirtIONet *n) return n->has_vnet_hdr; } +static int peer_has_ufo(VirtIONet *n) +{ + if (!peer_has_vnet_hdr(n)) + return 0; + + n->has_ufo = tap_has_ufo(n->vc->peer); + + return n->has_ufo; +} + static uint32_t virtio_net_get_features(VirtIODevice *vdev) { VirtIONet *n = to_virtio_net(vdev); @@ -158,7 +169,7 @@ static uint32_t virtio_net_get_features(VirtIODevice *vdev) features |= (1 << VIRTIO_NET_F_GUEST_TSO6); features |= (1 << VIRTIO_NET_F_GUEST_ECN); - if (tap_has_ufo(n->vc->peer)) { + if (peer_has_ufo(n)) { features |= (1 << VIRTIO_NET_F_GUEST_UFO); features |= (1 << VIRTIO_NET_F_HOST_UFO); } @@ -697,6 +708,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, n->has_ufo); } static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) @@ -771,6 +783,13 @@ 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_ufo(n)) { + qemu_error("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