[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 2/3] virtio_net: Handle _F_STATUS emulation in virtio_net_get_
From: |
Eugenio Pérez |
Subject: |
[PATCH v2 2/3] virtio_net: Handle _F_STATUS emulation in virtio_net_get_config |
Date: |
Fri, 28 Oct 2022 17:19:16 +0200 |
At this moment this code path is not reached, but vdpa devices can offer
VIRTIO_NET_F_STATUS unconditionally. While the guest must assume that
link is always up by the standard, qemu will set the status bit to 1
always in this case.
This makes little use by itself, but VIRTIO_NET_F_STATUS is needed for
the guest to read status bit VIRTIO_NET_F_GUEST_ANNOUNCE, used by feature
VIRTIO_NET_F_GUEST_ANNOUNCE. So qemu must emulate status feature in case
it needs to emulate the guest announce feature.
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/net/virtio-net.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 56ff219196..6d4d75615b 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -156,8 +156,9 @@ static void virtio_net_get_config(VirtIODevice *vdev,
uint8_t *config)
* disconnect/reconnect a VDPA peer.
*/
if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
- ret = vhost_net_get_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg,
- n->config_size);
+ struct vhost_net *net = get_vhost_net(nc->peer);
+
+ ret = vhost_net_get_config(net, (uint8_t *)&netcfg, n->config_size);
if (ret == -1) {
return;
}
@@ -173,6 +174,12 @@ static void virtio_net_get_config(VirtIODevice *vdev,
uint8_t *config)
memcpy(netcfg.mac, n->mac, ETH_ALEN);
}
+ if (vdev->guest_features & BIT_ULL(VIRTIO_NET_F_STATUS) &&
+ !(net->dev.features & BIT_ULL(VIRTIO_NET_F_STATUS))) {
+ /* Emulating link up in qemu */
+ netcfg.status |= virtio_tswap16(vdev, VIRTIO_NET_S_LINK_UP);
+ }
+
memcpy(config, &netcfg, n->config_size);
}
}
--
2.31.1