[libvirt] [PATCH 1/2] V2 Modify generic ethernet interface so it will work when sVirt is enabled with qemu

Eric Blake eblake at redhat.com
Fri Oct 28 03:23:54 UTC 2011


Long subject line; I trimmed it:

bridge: modify for use when sVirt is enabled with qemu

Use 'git shortlog -30' to get a feel for typical subjects.

On 10/24/2011 05:43 PM, Tyler Coumbes wrote:
> This refactors the TAP creation code out of brAddTap into a new
> function brCreateTap to allow it to be used on its own. I have also
> changed ifSetInterfaceMac to brSetInterfaceMac and exported it since
> it is will be needed by code outside of util/bridge.c in the next
> patch.
>
>   AUTHORS                 |    1 +
>   src/libvirt_bridge.syms |    2 +
>   src/util/bridge.c       |  116 +++++++++++++++++++++++++++++++----------------
>   src/util/bridge.h       |    9 ++++
>   4 files changed, 89 insertions(+), 39 deletions(-)
> +++ b/src/libvirt_bridge.syms
> @@ -12,10 +12,12 @@ brAddTap;
>   brDeleteTap;
>   brDeleteBridge;
>   brDelInetAddress;
> +brCreateTap;

Not sorted, but easy to fix.

> -static int ifSetInterfaceMac(brControl *ctl, const char *ifname,
> +int brSetInterfaceMac(brControl *ctl, const char *ifname,
>                                const unsigned char *macaddr)

I touched up the indentation here to match.

>   {
>       struct ifreq ifr;
> @@ -478,32 +478,12 @@ brAddTap(brControl *ctl,
>            bool up,
>            int *tapfd)
>   {
> -    int fd;
> -    struct ifreq ifr;
> -
>       if (!ctl || !ctl->fd || !bridge || !ifname)
>           return EINVAL;
>
> -    if ((fd = open("/dev/net/tun", O_RDWR))<  0)
> -      return errno;
> -
> -    memset(&ifr, 0, sizeof(ifr));
> -
> -    ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
> +    errno = brCreateTap(ctl, ifname, vnet_hdr, tapfd);

Generally, we prefer returning -1 on failure, rather than a positive 
errno value; but this is pre-existing.

>
> -# ifdef IFF_VNET_HDR
> -    if (vnet_hdr&&  brProbeVnetHdr(fd))
> -        ifr.ifr_flags |= IFF_VNET_HDR;
> -# else
> -    (void) vnet_hdr;
> -# endif
> -
> -    if (virStrcpyStatic(ifr.ifr_name, *ifname) == NULL) {
> -        errno = EINVAL;
> -        goto error;
> -    }
> -
> -    if (ioctl(fd, TUNSETIFF,&ifr)<  0)
> +    if(*tapfd<  0 || errno)

space after if.

>   }


>
> +/**
> + * brCreateTap:
> + * @ctl: bridge control pointer
> + * @ifname: the interface name
> + * @vnet_hr: whether to try enabling IFF_VNET_HDR
> + * @tapfd: file descriptor return value for the new tap device
> + *
> + * Creates a tap interface.
> + * If the @tapfd parameter is supplied, the open tap device file
> + * descriptor will be returned, otherwise the TAP device will be made
> + * persistent and closed. The caller must use brDeleteTap to remove
> + * a persistent TAP devices when it is no longer needed.
> + *
> + * Returns 0 in case of success or an errno code in case of failure.

So your choice of convention isn't typical, but fits the existing code.

> + */
> +
> +int brCreateTap (brControl *ctl ATTRIBUTE_UNUSED,

No space after function names.

> +                 char **ifname,
> +                 int vnet_hdr,
> +                 int *tapfd)
> +{
> +
> +    int fd;

Extra blank line.

> +    struct ifreq ifr;
> +
> +    if (!ifname)
> +        return EINVAL;
> +
> +    if ((fd = open("/dev/net/tun", O_RDWR))<  0)
> +      return errno;

Inconsistent indentation.

> +
> +    memset(&ifr, 0, sizeof(ifr));
> +
> +    ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
> +
> +# ifdef IFF_VNET_HDR
> +    if (vnet_hdr&&  brProbeVnetHdr(fd))
> +        ifr.ifr_flags |= IFF_VNET_HDR;
> +# else
> +    (void) vnet_hdr;

I don't like the cast to void; marking the parameter ATTRIBUTE_UNUSED is 
sufficient.

But those are minor.  So:

ACK. I squashed this in and pushed.

diff --git i/src/libvirt_bridge.syms w/src/libvirt_bridge.syms
index 669830b..626f6ee 100644
--- i/src/libvirt_bridge.syms
+++ w/src/libvirt_bridge.syms
@@ -9,10 +9,10 @@ brAddBridge;
  brAddInetAddress;
  brAddInterface;
  brAddTap;
-brDeleteTap;
-brDeleteBridge;
-brDelInetAddress;
  brCreateTap;
+brDelInetAddress;
+brDeleteBridge;
+brDeleteTap;
  brHasBridge;
  brInit;
  brSetEnableSTP;
diff --git i/src/util/bridge.c w/src/util/bridge.c
index 4875f52..952f0f3 100644
--- i/src/util/bridge.c
+++ w/src/util/bridge.c
@@ -288,8 +288,9 @@ brDeleteInterface(brControl *ctl ATTRIBUTE_UNUSED,
   *
   * Returns 0 in case of success or an errno code in case of failure.
   */
-int brSetInterfaceMac(brControl *ctl, const char *ifname,
-                             const unsigned char *macaddr)
+int
+brSetInterfaceMac(brControl *ctl, const char *ifname,
+                  const unsigned char *macaddr)
  {
      struct ifreq ifr;

@@ -483,7 +484,7 @@ brAddTap(brControl *ctl,

      errno = brCreateTap(ctl, ifname, vnet_hdr, tapfd);

-    if(*tapfd < 0 || errno)
+    if (*tapfd < 0 || errno)
          goto error;

      /* We need to set the interface MAC before adding it
@@ -789,12 +790,12 @@ cleanup:
   * Returns 0 in case of success or an errno code in case of failure.
   */

-int brCreateTap (brControl *ctl ATTRIBUTE_UNUSED,
-                 char **ifname,
-                 int vnet_hdr,
-                 int *tapfd)
+int
+brCreateTap(brControl *ctl ATTRIBUTE_UNUSED,
+            char **ifname,
+            int vnet_hdr ATTRIBUTE_UNUSED,
+            int *tapfd)
  {
-
      int fd;
      struct ifreq ifr;

@@ -802,7 +803,7 @@ int brCreateTap (brControl *ctl ATTRIBUTE_UNUSED,
          return EINVAL;

      if ((fd = open("/dev/net/tun", O_RDWR)) < 0)
-      return errno;
+        return errno;

      memset(&ifr, 0, sizeof(ifr));

@@ -811,8 +812,6 @@ int brCreateTap (brControl *ctl ATTRIBUTE_UNUSED,
  # ifdef IFF_VNET_HDR
      if (vnet_hdr && brProbeVnetHdr(fd))
          ifr.ifr_flags |= IFF_VNET_HDR;
-# else
-    (void) vnet_hdr;
  # endif

      if (virStrcpyStatic(ifr.ifr_name, *ifname) == NULL) {

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list