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