[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