virtio_load() restores guest_features after vmstate post_load hooks. Re-apply
vnet_hdr related state in virtio_net_post_load_virtio() so backend header
lengths match the migrated feature set (important for netfilter pipelines).

Signed-off-by: Cindy Lu <[email protected]>
---
 hw/net/virtio-net.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index d6d2188863..125aa0108d 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3282,6 +3282,21 @@ static int virtio_net_post_load_device(void *opaque, int 
version_id)
 static int virtio_net_post_load_virtio(VirtIODevice *vdev)
 {
     VirtIONet *n = VIRTIO_NET(vdev);
+    bool has_tunnel_hdr = virtio_has_tunnel_hdr(vdev->guest_features_ex);
+
+    /*
+     * virtio_load() restores guest_features after vmstate post_load hooks.
+     * Re-apply vnet_hdr related state here so the backend vnet_hdr_len and
+     * n->host_hdr_len match the migrated feature set (important for receiving
+     * packets from netfilters like redirector/buffer during COLO/migration).
+     */
+    peer_test_vnet_hdr(n);
+    virtio_net_set_mrg_rx_bufs(n, n->mergeable_rx_bufs,
+                               virtio_vdev_has_feature(vdev,
+                                                       VIRTIO_F_VERSION_1),
+                               virtio_vdev_has_feature(vdev,
+                                                      
VIRTIO_NET_F_HASH_REPORT),
+                               has_tunnel_hdr);
     /*
      * The actual needed state is now in saved_guest_offloads,
      * see virtio_net_post_load_device for detail.
-- 
2.52.0


Reply via email to