]> xenbits.xensource.com Git - libvirt.git/commitdiff
Move virBhyveTapGetRealDeviceName to virnetdevtap
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Wed, 26 Mar 2014 16:53:48 +0000 (20:53 +0400)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Thu, 27 Mar 2014 04:23:58 +0000 (08:23 +0400)
To ease mocking for bhyve unit tests move virBhyveTapGetRealDeviceName()
out of bhyve_command.c to virnetdevtap and rename it to
virNetDevTapGetRealDeviceName().

src/bhyve/bhyve_command.c
src/libvirt_private.syms
src/util/virnetdevtap.c
src/util/virnetdevtap.h

index 42b71fbc467e1e96a7f1b9fdd9b5f8536081e3da..3373cfc6f3a5dbeb32dbf6c7c19cd5bc6886cc85 100644 (file)
 
 #include <config.h>
 
-#include <fcntl.h>
 #include <sys/types.h>
-#include <dirent.h>
-#include <sys/ioctl.h>
 #include <net/if.h>
 #include <net/if_tap.h>
 
 
 VIR_LOG_INIT("bhyve.bhyve_command");
 
-static char*
-virBhyveTapGetRealDeviceName(char *name)
-{
-    /* This is an ugly hack, because if we rename
-     * tap device to vnet%d, its device name will be
-     * still /dev/tap%d, and bhyve tries to open /dev/tap%d,
-     * so we have to find the real name
-     */
-    char *ret = NULL;
-    struct dirent *dp;
-    char *devpath = NULL;
-    int fd;
-
-    DIR *dirp = opendir("/dev");
-    if (dirp == NULL) {
-        virReportSystemError(errno,
-                             _("Failed to opendir path '%s'"),
-                             "/dev");
-        return NULL;
-    }
-
-    while ((dp = readdir(dirp)) != NULL) {
-        if (STRPREFIX(dp->d_name, "tap")) {
-            struct ifreq ifr;
-            if (virAsprintf(&devpath, "/dev/%s", dp->d_name) < 0) {
-                goto cleanup;
-            }
-            if ((fd = open(devpath, O_RDWR)) < 0) {
-                if (errno == EBUSY) {
-                    VIR_FREE(devpath);
-                    continue;
-                }
-                virReportSystemError(errno, _("Unable to open '%s'"), devpath);
-                goto cleanup;
-            }
-
-            if (ioctl(fd, TAPGIFNAME, (void *)&ifr) < 0) {
-                virReportSystemError(errno, "%s",
-                                     _("Unable to query tap interface name"));
-                goto cleanup;
-            }
-
-            if (STREQ(name, ifr.ifr_name)) {
-                /* we can ignore the return value
-                 * because we still have nothing
-                 * to do but return;
-                 */
-                ignore_value(VIR_STRDUP(ret, dp->d_name));
-                goto cleanup;
-            }
-
-            VIR_FREE(devpath);
-            VIR_FORCE_CLOSE(fd);
-        }
-
-        errno = 0;
-    }
-
-    if (errno != 0)
-        virReportSystemError(errno, "%s",
-                             _("Unable to iterate over TAP devices"));
-
- cleanup:
-    VIR_FREE(devpath);
-    VIR_FORCE_CLOSE(fd);
-    closedir(dirp);
-    return ret;
-}
-
 static int
 bhyveBuildNetArgStr(const virDomainDef *def, virCommandPtr cmd)
 {
@@ -161,7 +89,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, virCommandPtr cmd)
         }
     }
 
-    realifname = virBhyveTapGetRealDeviceName(net->ifname);
+    realifname = virNetDevTapGetRealDeviceName(net->ifname);
 
     if (realifname == NULL) {
         VIR_FREE(net->ifname);
index 2357f95f5d4593599e9dcd952905cb8dec44fbf6..38fbf63da82f44bb2610e08d60172af031ed6db7 100644 (file)
@@ -1584,6 +1584,7 @@ virNetDevTapCreate;
 virNetDevTapCreateInBridgePort;
 virNetDevTapDelete;
 virNetDevTapGetName;
+virNetDevTapGetRealDeviceName;
 
 
 # util/virnetdevveth.h
index 32ad4064cb2703528ef44c5bdecbc34d9b52c4a0..03bb4185694e4eda6ed0a3dbf71489f1d66362e6 100644 (file)
 #include "virlog.h"
 #include "virstring.h"
 
+#include <dirent.h>
+#include <sys/types.h>
 #include <sys/ioctl.h>
 #include <net/if.h>
 #include <fcntl.h>
 #ifdef __linux__
 # include <linux/if_tun.h>    /* IFF_TUN, IFF_NO_PI */
+#elif defined(__FreeBSD__)
+# include <net/if_tap.h>
 #endif
 
 #define VIR_FROM_THIS VIR_FROM_NONE
@@ -72,6 +76,87 @@ virNetDevTapGetName(int tapfd ATTRIBUTE_UNUSED, char **ifname ATTRIBUTE_UNUSED)
 #endif
 }
 
+/**
+ * virNetDevTapGetRealDeviceName:
+ * @ifname: the interface name
+ *
+ * Lookup real interface name (i.e. name of the device entry in /dev),
+ * because e.g. on FreeBSD if we rename tap device to vnetN its device
+ * entry still remains unchanged (/dev/tapX), but bhyve needs a name
+ * that matches /dev entry.
+ *
+ * Returns the proper interface name or NULL if no corresponding interface
+ * found.
+ */
+char*
+virNetDevTapGetRealDeviceName(char *ifname ATTRIBUTE_UNUSED)
+{
+#ifdef TAPGIFNAME
+    char *ret = NULL;
+    struct dirent *dp;
+    char *devpath = NULL;
+    int fd;
+
+    DIR *dirp = opendir("/dev");
+    if (dirp == NULL) {
+        virReportSystemError(errno,
+                             _("Failed to opendir path '%s'"),
+                             "/dev");
+        return NULL;
+    }
+
+    while ((dp = readdir(dirp)) != NULL) {
+        if (STRPREFIX(dp->d_name, "tap")) {
+            struct ifreq ifr;
+            if (virAsprintf(&devpath, "/dev/%s", dp->d_name) < 0) {
+                goto cleanup;
+            }
+            if ((fd = open(devpath, O_RDWR)) < 0) {
+                if (errno == EBUSY) {
+                    VIR_FREE(devpath);
+                    continue;
+                }
+
+                virReportSystemError(errno, _("Unable to open '%s'"), devpath);
+                goto cleanup;
+            }
+
+            if (ioctl(fd, TAPGIFNAME, (void *)&ifr) < 0) {
+                virReportSystemError(errno, "%s",
+                                     _("Unable to query tap interface name"));
+                goto cleanup;
+            }
+
+            if (STREQ(ifname, ifr.ifr_name)) {
+                /* we can ignore the return value
+                 * because we still have nothing
+                 * to do but return;
+                 */
+                ignore_value(VIR_STRDUP(ret, dp->d_name));
+                goto cleanup;
+            }
+
+            VIR_FREE(devpath);
+            VIR_FORCE_CLOSE(fd);
+        }
+
+        errno = 0;
+    }
+
+    if (errno != 0)
+        virReportSystemError(errno, "%s",
+                             _("Unable to iterate over TAP devices"));
+
+ cleanup:
+    VIR_FREE(devpath);
+    VIR_FORCE_CLOSE(fd);
+    closedir(dirp);
+    return ret;
+#else
+    return NULL;
+#endif
+}
+
 
 /**
  * virNetDevProbeVnetHdr:
index 1e5bd19d25a8ba76cdf7360e5cd85de5c77f5f90..03fb5f8dab657996cd5e24e105ad3c9d3d0c739a 100644 (file)
@@ -45,6 +45,9 @@ int virNetDevTapDelete(const char *ifname)
 int virNetDevTapGetName(int tapfd, char **ifname)
     ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 
+char* virNetDevTapGetRealDeviceName(char *ifname)
+      ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
 typedef enum {
    VIR_NETDEV_TAP_CREATE_NONE = 0,
    /* Bring the interface up */