It is currently possible to use <interface>s of type openvswitch with the libxl driver in a non-standard way, e.g. <interface type='bridge'> <source bridge='ovsbr0'/> <mac address='00:16:3e:7a:35:ce'/> <script path='vif-openvswitch'/> </interface> This patch adds support for openvswitch <interface>s specified in typical libvirt config <interface type='bridge'> <source bridge='ovsbr0'/> <mac address='00:16:3e:7a:35:ce'/> <virtualport type='openvswitch'/> </interface> VLAN tags and trunking are also supported using the extended syntax for specifying an openvswitch bridge in libxl BRIDGE_NAME[.VLAN][:TRUNK:TRUNK] See Xen's networking wiki for more details on openvswitch support https://wiki.xenproject.org/wiki/Xen_Networking#Open_vSwitch Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx> --- src/libxl/libxl_conf.c | 47 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index e2bfa2f5c3..39c969e482 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -51,6 +51,7 @@ #include "cpu/cpu.h" #include "xen_common.h" #include "xen_xl.h" +#include "virnetdevvportprofile.h" #define VIR_FROM_THIS VIR_FROM_LIBXL @@ -1190,6 +1191,11 @@ libxlMakeNic(virDomainDefPtr def, virNetworkPtr network = NULL; virConnectPtr conn = NULL; virNetDevBandwidthPtr actual_bw; + virNetDevVPortProfilePtr port_profile; + virNetDevVlanPtr virt_vlan; + virBuffer buf = VIR_BUFFER_INITIALIZER; + size_t i; + const char *script = NULL; int ret = -1; /* TODO: Where is mtu stored? @@ -1247,14 +1253,50 @@ libxlMakeNic(virDomainDefPtr def, if (VIR_STRDUP(x_nic->ifname, l_nic->ifname) < 0) goto cleanup; + port_profile = virDomainNetGetActualVirtPortProfile(l_nic); + virt_vlan = virDomainNetGetActualVlan(l_nic); + script = l_nic->script; switch (actual_type) { case VIR_DOMAIN_NET_TYPE_BRIDGE: + virBufferAsprintf(&buf, "%s", virDomainNetGetActualBridgeName(l_nic)); + /* + * A bit of special handling if vif will be connected to an + * openvswitch bridge + */ + if (port_profile && + port_profile->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) { + /* + * If a custom script is not specified for openvswitch, use + * Xen's vif-openvswitch script + */ + if (!script) + script = "vif-openvswitch"; + /* + * libxl_device_nic->bridge supports an extended format for + * specifying VLAN tags and trunks when using openvswitch + * + * BRIDGE_NAME[.VLAN][:TRUNK:TRUNK] + * + * See Xen's networking wiki for more details + * https://wiki.xenproject.org/wiki/Xen_Networking#Open_vSwitch + */ + if (virt_vlan && virt_vlan->nTags > 0) { + if (virt_vlan->trunk) { + for (i = 0; i < virt_vlan->nTags; i++) + virBufferAsprintf(&buf, ":%d", virt_vlan->tag[i]); + } else { + virBufferAsprintf(&buf, ".%d", virt_vlan->tag[0]); + } + } + } + if (virBufferCheckError(&buf) < 0) + goto cleanup; if (VIR_STRDUP(x_nic->bridge, - virDomainNetGetActualBridgeName(l_nic)) < 0) + virBufferCurrentContent(&buf)) < 0) goto cleanup; ATTRIBUTE_FALLTHROUGH; case VIR_DOMAIN_NET_TYPE_ETHERNET: - if (VIR_STRDUP(x_nic->script, l_nic->script) < 0) + if (VIR_STRDUP(x_nic->script, script) < 0) goto cleanup; if (l_nic->guestIP.nips > 0) { x_nic->ip = xenMakeIPList(&l_nic->guestIP); @@ -1351,6 +1393,7 @@ libxlMakeNic(virDomainDefPtr def, ret = 0; cleanup: + virBufferFreeAndReset(&buf); virObjectUnref(network); virObjectUnref(conn); -- 2.18.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list