From: Hyman Huang <yong.huang(a)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