[libvirt] [PATCH 1/3] libxl: support openvswitch interfaces
Michal Privoznik
mprivozn at redhat.com
Thu Dec 6 07:44:19 UTC 2018
On 11/16/18 11:26 PM, Jim Fehlig wrote:
> 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 at suse.com>
> ---
> 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));
Or virBufferAddStr() or virBufferAdd(,,-1);
> + /*
> + * 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);
>
>
Michal
More information about the libvir-list
mailing list