[libvirt] [PATCH 4/5] macvtap support for libvirt -- helper code

Daniel P. Berrange berrange at redhat.com
Mon Feb 8 17:03:53 UTC 2010


On Thu, Feb 04, 2010 at 08:02:54AM -0500, Stefan Berger wrote:
> This part adds the helper code to setup and tear down macvtap devices
> using direct communication with the device driver via netlink sockets.
> 
> Signed-off-by: Stefan Berger <stefanb at us.ibm.com>
> 

> Index: libvirt-macvtap/src/util/macvtap.h
> ===================================================================
> --- /dev/null
> +++ libvirt-macvtap/src/util/macvtap.h
> @@ -0,0 +1,49 @@
> +/*
> + * Copyright (C) 2010 IBM Corporation
> + *
> + * 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, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
> + *
> + * Authors:
> + *     Stefan Berger <stefanb at us.ibm.com>
> + */
> +
> +#ifndef __UTIL_MACVTAP_H__
> +#define __UTIL_MACVTAP_H__
> +
> +#include <config.h>
> +
> +#if defined(WITH_MACVTAP)
> +
> +#include "internal.h"
> +
> +int openMacvtapTap(virConnectPtr conn,
> +                   const char *ifname,
> +                   const unsigned char *macaddress,
> +                   const char *linkdev,
> +                   const char *mode,
> +                   char **res_ifname);

'mode' should be just an int rather than char *

> +
> +int delMacvtapByMACAddress(virConnectPtr conn,
> +                           const unsigned char *macaddress,
> +                           int *hasBusyDev);
> +
> +#endif /* WITH_MACVTAP */
> +
> +#define MACVTAP_MODE_PRIVATE_STR  "private"
> +#define MACVTAP_MODE_VEPA_STR     "vepa"
> +#define MACVTAP_MODE_BRIDGE_STR   "bridge"

These strings are redundant if the XML parser takes care of the
string -> int conversion at parsing time.

> +
> +static uint32_t
> +modeFromString(const char *mode_str)
> +{
> +    if (!mode_str)
> +        return 0;
> +    if (STREQ(mode_str, MACVTAP_MODE_PRIVATE_STR))
> +        return MACVLAN_MODE_PRIVATE;
> +    if (STREQ(mode_str, MACVTAP_MODE_VEPA_STR))
> +        return MACVLAN_MODE_VEPA;
> +    if (STREQ(mode_str, MACVTAP_MODE_BRIDGE_STR))
> +        return MACVLAN_MODE_BRIDGE;
> +    return 0;
> +}

This method can be removed, since it is just duplicating the
functionality of the code generated by the VIR_ENUM_DECL
declaration in the XML parsing code you have.

> +create_name:
> +        retries = 5;
> +        for (c = 0; c < 255; c++) {

This that an abslute limit on number of MACVTAP devices, or can we
raise this somewhat higher ?  We recently had to remove a similarly
low hardcoded limit in number of plain TAP devices. If we cna make
this 1024 or more, that'd be great

> +            snprintf(ifname, sizeof(ifname), MACVTAP_NAME_PATTERN, c);
> +            if (getIfIndex(NULL, ifname, &ifindex) == ENODEV) {
> +                rc = link_add(conn, type, macaddress, 6, ifname, linkdev,
> +                              mode, &do_retry);
> +                if (rc == 0)
> +                    break;
> +
> +                if (do_retry && --retries)
> +                    continue;
> +                return -1;
> +            }
> +        }
> +        cr_ifname = ifname;
> +    }
> +
> +    rc = ifUp(cr_ifname, 1);
> +    if (rc != 0) {
> +        virReportSystemError(conn, errno,
> +                             _("cannot 'up' interface %s"), cr_ifname);
> +        rc = -1;
> +        goto link_del_exit;
> +    }
> +
> +    rc = openTap(conn, cr_ifname, 10);
> +
> +    if (rc > 0)
> +        *res_ifname = strdup(cr_ifname);
> +    else
> +        goto link_del_exit;
> +
> +    return rc;
> +
> +link_del_exit:
> +    link_del(conn, type, ifname);
> +
> +    return rc;
> +}


Regards,
Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list