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
