Use the utilities introduced in the previous patches so the qemu
driver is able to create tap devices that are bound (and unbound
on domain destroyal) to Midonet virtual ports.
Signed-off-by: Antoni Segura Puimedon <toni+libvirt(a)midokura.com>
---
src/conf/domain_conf.h | 1 +
src/qemu/qemu_hotplug.c | 25 ++++++++++++++++++-------
src/qemu/qemu_process.c | 13 +++++++++----
src/util/virnetdevtap.c | 11 ++++++++---
4 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 325afa8..cafe50f 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -42,6 +42,7 @@
# include "virnetdevmacvlan.h"
# include "virsysinfo.h"
# include "virnetdevvportprofile.h"
+# include "virnetdevmidonet.h"
# include "virnetdevopenvswitch.h"
# include "virnetdevbandwidth.h"
# include "virnetdevvlan.h"
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 8691c7e..34d7988 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1141,9 +1141,15 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
}
vport = virDomainNetGetActualVirtPortProfile(net);
- if (vport && vport->virtPortType ==
VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
- ignore_value(virNetDevOpenvswitchRemovePort(
- virDomainNetGetActualBridgeName(net), net->ifname));
+ if (vport) {
+ if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
+ ignore_value(virNetDevMidonetUnbindPort(vport));
+ } else if (vport->virtPortType ==
VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
+ ignore_value(virNetDevOpenvswitchRemovePort(
+ virDomainNetGetActualBridgeName(net),
+ net->ifname));
+ }
+ }
}
virDomainNetRemoveHostdev(vm->def, net);
@@ -2934,10 +2940,15 @@ qemuDomainRemoveNetDevice(virQEMUDriverPtr driver,
}
vport = virDomainNetGetActualVirtPortProfile(net);
- if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
- ignore_value(virNetDevOpenvswitchRemovePort(
- virDomainNetGetActualBridgeName(net),
- net->ifname));
+ if (vport) {
+ if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
+ ignore_value(virNetDevMidonetUnbindPort(vport));
+ } else if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
+ ignore_value(virNetDevOpenvswitchRemovePort(
+ virDomainNetGetActualBridgeName(net),
+ net->ifname));
+ }
+ }
networkReleaseActualDevice(vm->def, net);
virDomainNetDefFree(net);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 1d4e957..982f802 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5291,10 +5291,15 @@ void qemuProcessStop(virQEMUDriverPtr driver,
/* release the physical device (or any other resources used by
* this interface in the network driver
*/
- if (vport && vport->virtPortType ==
VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
- ignore_value(virNetDevOpenvswitchRemovePort(
- virDomainNetGetActualBridgeName(net),
- net->ifname));
+ if (vport) {
+ if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
+ ignore_value(virNetDevMidonetUnbindPort(vport));
+ } else if (vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
+ ignore_value(virNetDevOpenvswitchRemovePort(
+ virDomainNetGetActualBridgeName(net),
+ net->ifname));
+ }
+ }
/* kick the device out of the hostdev list too */
virDomainNetRemoveHostdev(def, net);
diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c
index 83b4131..f6152e9 100644
--- a/src/util/virnetdevtap.c
+++ b/src/util/virnetdevtap.c
@@ -26,6 +26,7 @@
#include "virnetdevtap.h"
#include "virnetdev.h"
#include "virnetdevbridge.h"
+#include "virnetdevmidonet.h"
#include "virnetdevopenvswitch.h"
#include "virerror.h"
#include "virfile.h"
@@ -580,9 +581,13 @@ int virNetDevTapCreateInBridgePort(const char *brname,
goto error;
if (virtPortProfile) {
- if (virNetDevOpenvswitchAddPort(brname, *ifname, macaddr, vmuuid,
- virtPortProfile, virtVlan) < 0) {
- goto error;
+ if (virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
+ if (virNetDevMidonetBindPort(*ifname, virtPortProfile) < 0)
+ goto error;
+ } else {
+ if (virNetDevOpenvswitchAddPort(brname, *ifname, macaddr, vmuuid,
+ virtPortProfile, virtVlan) < 0)
+ goto error;
}
} else {
if (virNetDevBridgeAddPort(brname, *ifname) < 0)
--
2.3.0