@@ -32,6 +32,19 @@ static uint64_t vpnet_get_features(VirtIODevice *vdev, uint64_t features,
return features;
}
+void vpnet_set_link_up(VhostPCINet *vpnet, bool up)
+{
+ VirtIODevice *vdev = VIRTIO_DEVICE(vpnet);
+
+ if (up) {
+ vpnet->status |= VPNET_S_LINK_UP;
+ } else {
+ vpnet->status &= ~VPNET_S_LINK_UP;
+ }
+
+ virtio_notify_config(vdev);
+}
+
static void vpnet_get_config(VirtIODevice *vdev, uint8_t *config)
{
VhostPCINet *vpnet = VHOST_PCI_NET(vdev);
@@ -287,6 +287,9 @@ void vp_slave_read(void *opaque, const uint8_t *buf, int size)
case VHOST_USER_SET_VRING_ENABLE:
vp_slave_set_vring_enable(vpnet, &msg);
break;
+ case VHOST_USER_SET_VHOST_PCI:
+ vpnet_set_link_up(vpnet, (bool)msg.payload.u64);
+ break;
case VHOST_USER_SET_LOG_BASE:
break;
case VHOST_USER_SET_LOG_FD:
@@ -37,4 +37,6 @@ typedef struct VhostPCINet {
CharBackend chr_be;
} VhostPCINet;
+void vpnet_set_link_up(VhostPCINet *vpnet, bool up);
+
#endif
@@ -35,6 +35,8 @@
#define MAX_REMOTE_REGION 8
+/* Set by the device to indicate that the device (e.g. metadata) is ready */
+#define VPNET_S_LINK_UP 1
struct vpnet_config {
uint16_t status;
};
This patch implements the slave part handling of the VHOST_USER_SET_VHOST_PCI msg. Receiving a "true" from the master will set the LINK_UP status of the vhost-pci device config status, and a config interrupt will be injected to the guest to notify that the device is ready to use. The driver is expected to start reading the metadata for remote memory and vring setup after this LINK_UP interrupt is received. Receiving a "false" from the master will clear the LINK_UP status and inject a config interrupt to the guest to notify the driver to stop sending and receiving packets. Signed-off-by: Wei Wang <wei.w.wang@intel.com> --- hw/net/vhost_pci_net.c | 13 +++++++++++++ hw/virtio/vhost-pci-slave.c | 3 +++ include/hw/virtio/vhost-pci-net.h | 2 ++ include/standard-headers/linux/vhost_pci_net.h | 2 ++ 4 files changed, 20 insertions(+)