[libvirt] [PATCH 3/4] Allow creation of plain macvlan devices

Stefan Berger stefanb at linux.vnet.ibm.com
Thu Nov 10 14:06:53 UTC 2011


On 11/10/2011 06:28 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange"<berrange at redhat.com>
>
> Update virNetDevMacVLanCreateWithVPortProfile to allow creation
> of plain macvlan devices, as well as macvtap devices. The former
> is useful for LXC containers
>
> * src/qemu/qemu_command.c: Explicitly request a macvtap device
> * src/util/virnetdevmacvlan.c, src/util/virnetdevmacvlan.h: Add
>    new flag to allow switching between macvlan and macvtap
>    creation
> ---
>   src/qemu/qemu_command.c     |    2 +-
>   src/util/virnetdevmacvlan.c |   41 ++++++++++++++++++++++++++++-------------
>   src/util/virnetdevmacvlan.h |    5 +++--
>   3 files changed, 32 insertions(+), 16 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 6df1f83..2f01436 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -154,7 +154,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def,
>           net->ifname, net->mac,
>           virDomainNetGetActualDirectDev(net),
>           virDomainNetGetActualDirectMode(net),
> -        vnet_hdr, def->uuid,
> +        true, vnet_hdr, def->uuid,
>           virDomainNetGetActualDirectVirtPortProfile(net),
>           &res_ifname,
>           vmop, driver->stateDir,
> diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c
> index fe2f383..98b0f9a 100644
> --- a/src/util/virnetdevmacvlan.c
> +++ b/src/util/virnetdevmacvlan.c
> @@ -72,11 +72,14 @@ VIR_ENUM_IMPL(virNetDevMacVLanMode, VIR_NETDEV_MACVLAN_MODE_LAST,
>   # define MACVTAP_NAME_PREFIX	"macvtap"
>   # define MACVTAP_NAME_PATTERN	"macvtap%d"
>
> +# define MACVLAN_NAME_PREFIX	"macvlan"
> +# define MACVLAN_NAME_PATTERN	"macvlan%d"
> +
>   /**
>    * virNetDevMacVLanCreate:
>    *
>    * @ifname: The name the interface is supposed to have; optional parameter
> - * @type: The type of device, i.e., "macvtap"
> + * @type: The type of device, i.e., "macvtap", "macvlan"
>    * @macaddress: The MAC address of the device
>    * @srcdev: The name of the 'link' device
>    * @macvlan_mode: The macvlan mode to use
> @@ -458,14 +461,14 @@ static const uint32_t modeMap[VIR_NETDEV_MACVLAN_MODE_LAST] = {
>    *     interface will be stored into if everything succeeded. It is up
>    *     to the caller to free the string.
>    *
> - * Returns file descriptor of the tap device in case of success,
> - * negative value otherwise with error reported.
> - *
> + * Returns file descriptor of the tap device in case of success with @withTap,
> + * otherwise returns 0; returns -1 on error.
>    */
>   int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
>                                              const unsigned char *macaddress,
>                                              const char *linkdev,
>                                              enum virNetDevMacVLanMode mode,
> +                                           bool withTap,
>                                              int vnet_hdr,
>                                              const unsigned char *vmuuid,
>                                              virNetDevVPortProfilePtr virtPortProfile,
> @@ -474,7 +477,9 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
>                                              char *stateDir,
>                                              virNetDevBandwidthPtr bandwidth)
>   {
> -    const char *type = "macvtap";
> +    const char *type = withTap ? "macvtap" : "macvlan";
> +    const char *prefix = withTap ? MACVTAP_NAME_PREFIX : MACVLAN_NAME_PREFIX;
> +    const char *pattern = withTap ? MACVTAP_NAME_PATTERN : MACVLAN_NAME_PATTERN;
>       int c, rc;
>       char ifname[IFNAMSIZ];
>       int retries, do_retry = 0;
> @@ -505,8 +510,7 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
>               return -1;
>
>           if (ret) {
> -            if (STRPREFIX(tgifname,
> -                          MACVTAP_NAME_PREFIX)) {
> +            if (STRPREFIX(tgifname, prefix)) {
>                   goto create_name;
>               }
>               virReportSystemError(EEXIST,
> @@ -522,7 +526,7 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
>   create_name:
>           retries = 5;
>           for (c = 0; c<  8192; c++) {
> -            snprintf(ifname, sizeof(ifname), MACVTAP_NAME_PATTERN, c);
> +            snprintf(ifname, sizeof(ifname), pattern, c);
>               if ((ret = virNetDevExists(ifname))<  0)
>                   return -1;
>               if (!ret) {
> @@ -553,15 +557,26 @@ create_name:
>           goto disassociate_exit;
>       }
>
> -    rc = virNetDevMacVLanTapOpen(cr_ifname, 10);
> -    if (rc>= 0) {
> +    if (withTap) {
> +        if ((rc = virNetDevMacVLanTapOpen(cr_ifname, 10))<  0)
> +            goto disassociate_exit;
> +
>           if (virNetDevMacVLanTapSetup(rc, vnet_hdr)<  0) {
>               VIR_FORCE_CLOSE(rc); /* sets rc to -1 */
>               goto disassociate_exit;
>           }
> -        *res_ifname = strdup(cr_ifname);
> -    } else
> -        goto disassociate_exit;
> +        if (!(*res_ifname = strdup(cr_ifname))) {
> +            VIR_FORCE_CLOSE(rc); /* sets rc to -1 */
> +            virReportOOMError();
> +            goto disassociate_exit;
> +        }
> +    } else {
> +        if (!(*res_ifname = strdup(cr_ifname))) {
> +            virReportOOMError();
> +            goto disassociate_exit;
> +        }
> +        rc = 0;
> +    }
>
>       if (virNetDevBandwidthSet(cr_ifname, bandwidth)<  0) {
>           virNetDevError(VIR_ERR_INTERNAL_ERROR,
> diff --git a/src/util/virnetdevmacvlan.h b/src/util/virnetdevmacvlan.h
> index 73918b8..130ecea 100644
> --- a/src/util/virnetdevmacvlan.h
> +++ b/src/util/virnetdevmacvlan.h
> @@ -55,6 +55,7 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *ifname,
>                                              const unsigned char *macaddress,
>                                              const char *linkdev,
>                                              enum virNetDevMacVLanMode mode,
> +                                           bool withTap,
>                                              int vnet_hdr,
>                                              const unsigned char *vmuuid,
>                                              virNetDevVPortProfilePtr virtPortProfile,
> @@ -62,8 +63,8 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *ifname,
>                                              enum virNetDevVPortProfileOp vmop,
>                                              char *stateDir,
>                                              virNetDevBandwidthPtr bandwidth)
> -    ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(6)
> -    ATTRIBUTE_NONNULL(8) ATTRIBUTE_NONNULL(10) ATTRIBUTE_RETURN_CHECK;
> +    ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(7)
> +    ATTRIBUTE_NONNULL(9) ATTRIBUTE_NONNULL(11) ATTRIBUTE_RETURN_CHECK;
>
>   int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname,
>                                              const unsigned char *macaddress,
ACK




More information about the libvir-list mailing list