From: Hyman Huang <yong.hu...@smartx.com>

Add logic for automatic attachment and detachment of the
vhostuser port within the vhostuser interface lifecycle.
---
 src/qemu/qemu_command.c   |  3 +++
 src/qemu/qemu_hotplug.c   |  4 ++++
 src/qemu/qemu_interface.c | 46 +++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_interface.h |  3 +++
 src/qemu/qemu_process.c   |  4 ++++
 5 files changed, 60 insertions(+)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 202f2dfaca..0370749fc7 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8883,6 +8883,9 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
         if (qemuInterfaceVhostuserConnect(cmd, net, qemuCaps) < 0)
             goto cleanup;
 
+        if (qemuInterfaceVhostUserAddPort(def, net) < 0)
+            goto cleanup;
+
         if (net->backend.type != VIR_DOMAIN_NET_BACKEND_PASST &&
             
virNetDevOpenvswitchGetVhostuserIfname(net->data.vhostuser->data.nix.path,
                                                    
net->data.vhostuser->data.nix.listen,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 67a2464ce4..b6a028700c 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1305,6 +1305,10 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
         if (qemuSecuritySetNetdevLabel(driver, vm, net) < 0)
             goto cleanup;
         teardownlabel = true;
+
+        if (qemuInterfaceVhostUserAddPort(vm->def, net) < 0)
+            goto cleanup;
+
         break;
 
     case VIR_DOMAIN_NET_TYPE_USER:
diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c
index 23a23d201a..8518ddd8bd 100644
--- a/src/qemu/qemu_interface.c
+++ b/src/qemu/qemu_interface.c
@@ -215,3 +215,49 @@ qemuInterfaceOpenVhostNet(virDomainObj *vm,
     virDomainAuditNetDevice(vm->def, net, vhostnet_path, vhostfdSize);
     return 0;
 }
+
+/**
+ * qemuInterfaceVhostUserAddPort:
+ * @def: domain definition
+ * @net: network definition
+ *
+ * Called *only* called if actualType is VIR_DOMAIN_NET_TYPE_VHOSTUSER
+ *
+ * Returns 0 in case of success or -1 on failure
+ */
+int
+qemuInterfaceVhostUserAddPort(virDomainDefPtr def,
+                              virDomainNetDefPtr net)
+{
+    virDomainChrSourceDefPtr src = net->data.vhostuser;
+    virNetDevVhostUserIface iface = {
+        .client = src->data.nix.listen ? true : false,
+        .path = src->data.nix.path,
+    };
+
+    if (net->backend.type != VIR_DOMAIN_NET_BACKEND_OPENVSWITCH ||
+        !net->backend.data.openvswitch.autoiface)
+        return 0;
+
+    if (!net->backend.data.openvswitch.bridge ||
+        !net->backend.data.openvswitch.iface) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("No interface or bridge name found"));
+        return -1;
+    }
+
+    if (virNetDevOpenvswitchAddPort(net->backend.data.openvswitch.bridge,
+                                    net->backend.data.openvswitch.iface,
+                                    &net->mac, def->uuid,
+                                    virDomainNetGetActualVirtPortProfile(net),
+                                    virDomainNetGetActualVlan(net),
+                                    &iface) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed to attach vhost user port '%1$s' to bridge 
'%2$s'"),
+                       net->backend.data.openvswitch.iface,
+                       net->backend.data.openvswitch.bridge);
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h
index d9deca0094..2f8e93b56e 100644
--- a/src/qemu/qemu_interface.h
+++ b/src/qemu/qemu_interface.h
@@ -37,3 +37,6 @@ int qemuInterfaceOpenVhostNet(virDomainObj *def,
 
 int qemuInterfacePrepareSlirp(virQEMUDriver *driver,
                               virDomainNetDef *net);
+
+int qemuInterfaceVhostUserAddPort(virDomainDefPtr def,
+                                  virDomainNetDefPtr net);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 82cab3f76e..c17108fafc 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5885,6 +5885,10 @@ qemuProcessPrepareDomainNetwork(virDomainObj *vm)
                 /* some extra setup of internal data for passt vhostuser mode 
*/
                 qemuPasstPrepareVhostUser(vm, net);
             }
+
+            if (qemuInterfaceVhostUserAddPort(def, net) < 0)
+                return -1;
+
             break;
 
         case VIR_DOMAIN_NET_TYPE_DIRECT:
-- 
2.27.0

Reply via email to