---
src/qemu/qemu_command.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_hotplug.c | 23 ++++++++++++++++--
src/qemu/qemu_process.c | 3 +-
3 files changed, 81 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index bb66364..d67394e 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -27,6 +27,7 @@
#include "qemu_hostdev.h"
#include "qemu_capabilities.h"
#include "qemu_bridge_filter.h"
+#include "qemu_hostdev.h"
#include "cpu/cpu.h"
#include "memory.h"
#include "logging.h"
@@ -4330,10 +4331,16 @@ qemuBuildCommandLine(virConnectPtr conn,
bool emitBootindex = false;
int usbcontroller = 0;
bool usblegacy = false;
+
+ virDomainObjPtr vm = NULL;
+ virDomainObjListPtr doms = &driver->domains;
+
uname_normalize(&ut);
virUUIDFormat(def->uuid, uuid);
+ vm = virHashLookup(doms->objs, uuid);
+
emulator = def->emulator;
/*
@@ -5257,6 +5264,58 @@ qemuBuildCommandLine(virConnectPtr conn,
continue;
}
+ if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV_HYBRID) {
+ virDomainHostdevDefPtr hostdev = virDomainNetGetActualHostdev(net);
+ virDomainHostdevDefPtr found;
+ if (vmop == VIR_NETDEV_VPORT_PROFILE_OP_CREATE) {
+ if (qemuAssignDeviceHostdevAlias(def,
+ hostdev,
+ (def->nhostdevs-1)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Could not assign alias to Net
Hostdev"));
+ goto error;
+ }
+
+ if (virDomainHostdevFind(def,
+ hostdev,
+ &found) < 0) {
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ if (qemuDomainPCIAddressEnsureAddr(priv->pciaddrs,
+ hostdev->info) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Could not assign PCI addr to Hostdev
hybrid"));
+ goto error;
+ }
+
+ if (virDomainHostdevInsert(def,
+ hostdev) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Hostdev not inserted into the
array"));
+ goto error;
+ }
+
+ if (qemuPrepareHostdevPCIDevices(driver, def->name,
+ def->uuid, &hostdev, 1)
< 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Prepare Hostdev PCI Devices
failed"));
+ goto error;
+ }
+ }
+ }
+
+ int tapfd = qemuPhysIfaceConnect(def, driver, net,
+ qemuCaps, vmop);
+ if (tapfd < 0)
+ goto error;
+
+ last_good_net = i;
+ virCommandTransferFD(cmd, tapfd);
+
+ if (snprintf(tapfd_name, sizeof(tapfd_name), "%d",
+ tapfd) >= sizeof(tapfd_name))
+ goto no_memory;
+ }
+
if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) {
/*
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 0fd506e..3586d3e 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -694,6 +694,21 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
goto cleanup;
}
+ if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV_HYBRID) {
+ ret = qemuDomainAttachHostDevice(driver, vm,
+ virDomainNetGetActualHostdev(net));
+ if (ret < 0)
+ goto cleanup;
+
+ if ((tapfd = qemuPhysIfaceConnect(vm->def, driver, net,
+ priv->qemuCaps,
+ VIR_NETDEV_VPORT_PROFILE_OP_CREATE)) < 0)
+ goto cleanup;
+ iface_connected = true;
+ if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, &vhostfd) < 0)
+ goto cleanup;
+ }
+
if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
/*
@@ -2198,7 +2213,8 @@ qemuDomainDetachNetDevice(struct qemud_driver *driver,
goto cleanup;
}
- if (virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
+ if ((virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_HOSTDEV) ||
+ (virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_HOSTDEV_HYBRID)) {
ret = qemuDomainDetachThisHostDevice(driver, vm,
virDomainNetGetActualHostdev(detach),
-1);
@@ -2270,8 +2286,9 @@ qemuDomainDetachNetDevice(struct qemud_driver *driver,
VIR_WARN("Unable to release PCI address on NIC");
virDomainConfNWFilterTeardown(detach);
-
- if (virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_DIRECT) {
+
+ if ((virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_DIRECT) ||
+ (virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_HOSTDEV_HYBRID)) {
ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
detach->ifname, &detach->mac,
virDomainNetGetActualDirectDev(detach),
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index df4a016..9f9a5d2 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4098,7 +4098,8 @@ void qemuProcessStop(struct qemud_driver *driver,
def = vm->def;
for (i = 0; i < def->nnets; i++) {
virDomainNetDefPtr net = def->nets[i];
- if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) {
+ if ((virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) ||
+ (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_HOSTDEV_HYBRID)) {
ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
net->ifname, &net->mac,
virDomainNetGetActualDirectDev(net),
--
1.7.4.4