diff --git a/configure.ac b/configure.ac
index b5a05bbf99..412a23d05f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -431,6 +431,8 @@ AC_PATH_PROG([MODPROBE], [modprobe], [modprobe],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_PATH_PROG([RMMOD], [rmmod], [rmmod],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
+AC_PATH_PROG([MMCTL], [mm-ctl], [mm-ctl],
+ [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_PATH_PROG([OVSVSCTL], [ovs-vsctl], [ovs-vsctl],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_PATH_PROG([SCRUB], [scrub], [scrub],
@@ -446,6 +448,8 @@ AC_DEFINE_UNQUOTED([RADVD],["$RADVD"],
[Location or name of the radvd program])
AC_DEFINE_UNQUOTED([TC],["$TC"],
[Location or name of the tc program (see iproute2)])
+AC_DEFINE_UNQUOTED([MMCTL],["$MMCTL"],
+ [Location or name of the mm-ctl program])
AC_DEFINE_UNQUOTED([OVSVSCTL],["$OVSVSCTL"],
[Location or name of the ovs-vsctl program])
diff --git a/po/POTFILES.in b/po/POTFILES.in
index c25bfce5bc..fd8bf33801 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -195,6 +195,7 @@ src/util/virnetdev.c
src/util/virnetdevbandwidth.c
src/util/virnetdevbridge.c
src/util/virnetdevmacvlan.c
+src/util/virnetdevmidonet.c
src/util/virnetdevopenvswitch.c
src/util/virnetdevtap.c
src/util/virnetdevveth.c
diff --git a/src/Makefile.am b/src/Makefile.am
index d38432ec2a..956d9ce463 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -131,6 +131,7 @@ UTIL_SOURCES = \
util/virnetdevbandwidth.h util/virnetdevbandwidth.c \
util/virnetdevbridge.h util/virnetdevbridge.c \
util/virnetdevmacvlan.c util/virnetdevmacvlan.h \
+ util/virnetdevmidonet.h util/virnetdevmidonet.c \
util/virnetdevopenvswitch.h util/virnetdevopenvswitch.c \
util/virnetdevtap.h util/virnetdevtap.c \
util/virnetdevveth.h util/virnetdevveth.c \
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 1fb42ac364..c11ea18e59 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1759,6 +1759,11 @@ virNetDevMacVLanRestartWithVPortProfile;
virNetDevMacVLanVPortProfileRegisterCallback;
+# util/virnetdevmidonet.h
+virNetDevMidonetBindPort;
+virNetDevMidonetUnbindPort;
+
+
# util/virnetdevopenvswitch.h
virNetDevOpenvswitchAddPort;
virNetDevOpenvswitchGetMigrateData;
diff --git a/src/util/virnetdevmidonet.c b/src/util/virnetdevmidonet.c
new file mode 100644
index 0000000000..ea31d0371f
--- /dev/null
+++ b/src/util/virnetdevmidonet.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 Midokura, Sarl.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ *
+ * Authors:
+ * Antoni Segura Puimedon
+ */
+
+#include
+
+#include "virnetdevmidonet.h"
+#include "vircommand.h"
+#include "viralloc.h"
+#include "virerror.h"
+#include "viruuid.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+/**
+ * virNetDevMidonetBindPort:
+ * @ifname: the network interface name
+ * @virtualport: the midonet specific fields
+ *
+ * Bind an interface to a Midonet virtual port
+ *
+ * Returns 0 in case of success or -1 in case of failure.
+ */
+int
+virNetDevMidonetBindPort(const char *ifname,
+ virNetDevVPortProfilePtr virtualport)
+{
+ int ret = -1;
+ virCommandPtr cmd = NULL;
+ char virtportuuid[VIR_UUID_STRING_BUFLEN];
+
+ virUUIDFormat(virtualport->interfaceID, virtportuuid);
+
+ cmd = virCommandNew(MMCTL);
+
+ virCommandAddArgList(cmd, "--bind-port", virtportuuid, ifname, NULL);
+
+ if (virCommandRun(cmd, NULL) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unable to bind port %s to the virtual port %s"),
+ ifname, virtportuuid);
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ virCommandFree(cmd);
+ return ret;
+}
+
+/**
+ * virNetDevMidonetUnbindPort:
+ * @virtualport: the midonet specific fields
+ *
+ * Unbinds a virtual port from the host
+ *
+ * Returns 0 in case of success or -1 in case of failure.
+ */
+int
+virNetDevMidonetUnbindPort(virNetDevVPortProfilePtr virtualport)
+{
+ int ret = -1;
+ virCommandPtr cmd = NULL;
+ char virtportuuid[VIR_UUID_STRING_BUFLEN];
+
+ virUUIDFormat(virtualport->interfaceID, virtportuuid);
+
+ cmd = virCommandNew(MMCTL);
+ virCommandAddArgList(cmd, "--unbind-port", virtportuuid, NULL);
+
+ if (virCommandRun(cmd, NULL) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unable to unbind the virtual port %s from Midonet"),
+ virtportuuid);
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ virCommandFree(cmd);
+ return ret;
+}
diff --git a/src/util/virnetdevmidonet.h b/src/util/virnetdevmidonet.h
new file mode 100644
index 0000000000..3bfc1f6e67
--- /dev/null
+++ b/src/util/virnetdevmidonet.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 Midokura Sarl.
+
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * .
+ *
+ * Authors:
+ * Antoni Segura Puimedon
+ */
+
+#ifndef __VIR_NETDEV_MIDONET_H__
+# define __VIR_NETDEV_MIDONET_H__
+
+# include "internal.h"
+# include "virnetdevvportprofile.h"
+
+
+int virNetDevMidonetBindPort(const char *ifname,
+ virNetDevVPortProfilePtr virtualport)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
+
+int virNetDevMidonetUnbindPort(virNetDevVPortProfilePtr virtualport)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
+#endif /* __VIR_NETDEV_MIDONET_H__ */
diff --git a/src/util/virnetdevvportprofile.c b/src/util/virnetdevvportprofile.c
index 6ee20d3bfa..09acb52e5c 100644
--- a/src/util/virnetdevvportprofile.c
+++ b/src/util/virnetdevvportprofile.c
@@ -33,7 +33,8 @@ VIR_ENUM_IMPL(virNetDevVPort, VIR_NETDEV_VPORT_PROFILE_LAST,
"none",
"802.1Qbg",
"802.1Qbh",
- "openvswitch")
+ "openvswitch",
+ "midonet")
VIR_ENUM_IMPL(virNetDevVPortProfileOp, VIR_NETDEV_VPORT_PROFILE_OP_LAST,
"create",
diff --git a/src/util/virnetdevvportprofile.h b/src/util/virnetdevvportprofile.h
index ad063c5fab..dc3e6438ac 100644
--- a/src/util/virnetdevvportprofile.h
+++ b/src/util/virnetdevvportprofile.h
@@ -35,6 +35,7 @@ enum virNetDevVPortProfile {
VIR_NETDEV_VPORT_PROFILE_8021QBG,
VIR_NETDEV_VPORT_PROFILE_8021QBH,
VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH,
+ VIR_NETDEV_VPORT_PROFILE_MIDONET,
VIR_NETDEV_VPORT_PROFILE_LAST,
};
@@ -73,7 +74,7 @@ struct _virNetDevVPortProfile {
/* this is a null-terminated character string */
char profileID[LIBVIRT_IFLA_VF_PORT_PROFILE_MAX];
- /* this member is used when virtPortType == openvswitch */
+ /* this member is used when virtPortType == openvswitch|midonet */
unsigned char interfaceID[VIR_UUID_BUFLEN];
bool interfaceID_specified;
/* NB - if virtPortType == NONE, any/all of the items could be used */