diff --git a/configure.ac b/configure.ac index b5a05bbf991adce2c0f130b37ece009d28c4d39b..412a23d05ff5c8d9af8beab91d9717f54c6d22e3 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 c25bfce5bc11886999ca3239353358af82ae3a89..fd8bf33801a8c0dbadce6094c83892c9621151cd 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 d38432ec2ad0c0e4df4931bc92f124f3080fb881..956d9ce463c407c8190074f6f5bec5ef63ed0f3f 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 1fb42ac364c3a0041101baf354b3ecbdd5c1555b..c11ea18e59eba4de974e671cba6788e88ad82b87 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 0000000000000000000000000000000000000000..ea31d0371f111d0af5c3051c57fee7efed48ea26 --- /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 0000000000000000000000000000000000000000..3bfc1f6e6790c89c8ed17ad3d99fe66a9790b03d --- /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 6ee20d3bfa9c88c667d7a9095c1a0d81af037983..09acb52e5c44af4e1e5af20b71930c61c9bfe314 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 ad063c5fab58f35d2c24404c4cc01d29d720d046..dc3e6438acf97cec05c67c66d73f17af14ef9102 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 */