]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
netdevtap: Use common helper function to create unique tap name
authorShi Lei <shi_lei@massclouds.com>
Mon, 14 Dec 2020 01:50:33 +0000 (09:50 +0800)
committerLaine Stump <laine@redhat.com>
Tue, 15 Dec 2020 18:35:27 +0000 (13:35 -0500)
Simplify GenerateName/ReserveName for netdevtap by using common
functions.

Signed-off-by: Shi Lei <shi_lei@massclouds.com>
Reviewed-by: Laine Stump <laine@redhat.com>
src/libvirt_private.syms
src/qemu/qemu_process.c
src/util/virnetdevtap.c
src/util/virnetdevtap.h

index 77c8e4aaee9d165bc80250217ba43589d2302420..31c91b99649ff9b747dc26a90e6035f93b361652 100644 (file)
@@ -2692,7 +2692,6 @@ virNetDevTapGetName;
 virNetDevTapGetRealDeviceName;
 virNetDevTapInterfaceStats;
 virNetDevTapReattachBridge;
-virNetDevTapReserveName;
 
 
 # util/virnetdevveth.h
index bb78967ca3a55edc88d7d2f6368b4944f8a037df..de04922a47c83d99ac4643d8128cd68959466650 100644 (file)
@@ -3396,7 +3396,7 @@ qemuProcessNotifyNets(virDomainDefPtr def)
         case VIR_DOMAIN_NET_TYPE_BRIDGE:
         case VIR_DOMAIN_NET_TYPE_NETWORK:
         case VIR_DOMAIN_NET_TYPE_ETHERNET:
-            virNetDevTapReserveName(net->ifname);
+            virNetDevReserveName(net->ifname);
             break;
         case VIR_DOMAIN_NET_TYPE_USER:
         case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
index 9354cc10e4168aeb887d739e01e29057041371c0..88ad321627d6b9b9f003dc1d7f5f7446ce46dccf 100644 (file)
 #if defined(WITH_GETIFADDRS) && defined(AF_LINK)
 # include <ifaddrs.h>
 #endif
-#include <math.h>
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
 VIR_LOG_INIT("util.netdevtap");
 
-virMutex virNetDevTapCreateMutex = VIR_MUTEX_INITIALIZER;
-static int virNetDevTapLastID = -1; /* not "unsigned" because callers use %d */
-
-
-/**
- * virNetDevTapReserveName:
- * @name: name of an existing tap device
- *
- * Set the value of virNetDevTapLastID to assure that any new tap
- * device created with an autogenerated name will use a number higher
- * than the number in the given tap device name.
- *
- * Returns nothing.
- */
-void
-virNetDevTapReserveName(const char *name)
-{
-    unsigned int id;
-    const char *idstr = NULL;
-
-
-    if (STRPREFIX(name, VIR_NET_GENERATED_VNET_PREFIX)) {
-
-        VIR_INFO("marking device in use: '%s'", name);
-
-        idstr = name + strlen(VIR_NET_GENERATED_VNET_PREFIX);
-
-        if (virStrToLong_ui(idstr, NULL, 10, &id) >= 0) {
-            virMutexLock(&virNetDevTapCreateMutex);
-
-            if (virNetDevTapLastID < (int)id)
-                virNetDevTapLastID = id;
-
-            virMutexUnlock(&virNetDevTapCreateMutex);
-        }
-    }
-}
-
-
 /**
  * virNetDevTapGetName:
  * @tapfd: a tun/tap file descriptor
@@ -183,55 +143,6 @@ virNetDevTapGetRealDeviceName(char *ifname G_GNUC_UNUSED)
 
 
 #ifdef TUNSETIFF
-/**
- * virNetDevTapGenerateName:
- * @ifname: pointer to pointer to string containing template
- *
- * generate a new (currently unused) name for a new tap device based
- * on the templace string in @ifname - replace %d with
- * ++virNetDevTapLastID, and keep trying new values until one is found
- * that doesn't already exist, or we've tried 10000 different
- * names. Once a usable name is found, replace the template with the
- * actual name.
- *
- * Returns 0 on success, -1 on failure.
- */
-static int
-virNetDevTapGenerateName(char **ifname)
-{
-    int id;
-    double maxIDd = pow(10, IFNAMSIZ - 1 - strlen(VIR_NET_GENERATED_VNET_PREFIX));
-    int maxID = INT_MAX;
-    int attempts = 0;
-
-    if (maxIDd <= (double)INT_MAX)
-        maxID = (int)maxIDd;
-
-    do {
-        g_autofree char *try = NULL;
-
-        id = ++virNetDevTapLastID;
-
-        /* reset before overflow */
-        if (virNetDevTapLastID >= maxID)
-            virNetDevTapLastID = -1;
-
-        try = g_strdup_printf(*ifname, id);
-
-        if (!virNetDevExists(try)) {
-            g_free(*ifname);
-            *ifname = g_steal_pointer(&try);
-            return 0;
-        }
-    } while (++attempts < 10000);
-
-    virReportError(VIR_ERR_INTERNAL_ERROR,
-                   _("no unused %s names available"),
-                   VIR_NET_GENERATED_VNET_PREFIX);
-    return -1;
-}
-
-
 /**
  * virNetDevTapCreate:
  * @ifname: the interface name
@@ -263,16 +174,14 @@ int virNetDevTapCreate(char **ifname,
     int ret = -1;
     int fd = -1;
 
-    virMutexLock(&virNetDevTapCreateMutex);
-
     /* if ifname is "vnet%d", then auto-generate a name for the new
      * device (the kernel could do this for us, but has a bad habit of
      * immediately re-using names that have just been released, which
      * can lead to race conditions).
-     */
-    if (STREQ(*ifname, VIR_NET_GENERATED_VNET_PREFIX "%d") &&
-        virNetDevTapGenerateName(ifname) < 0) {
-        goto cleanup;
+     * if ifname is just a user-provided name, virNetDevGenerateName
+     * leaves it unchanged. */
+    if (virNetDevGenerateName(ifname, VIR_NET_DEV_GEN_NAME_VNET) < 0) {
+        return -1;
     }
 
     if (!tunpath)
@@ -333,7 +242,6 @@ int virNetDevTapCreate(char **ifname,
     ret = 0;
 
  cleanup:
-    virMutexUnlock(&virNetDevTapCreateMutex);
     if (ret < 0) {
         VIR_FORCE_CLOSE(fd);
         while (i--)
index dea8aec3af8d6870ad2f52a7c487407e3365caaa..c6bd9285bab2bd799e66b3202d4ef049507dc0e0 100644 (file)
 # define VIR_NETDEV_TAP_REQUIRE_MANUAL_CLEANUP 1
 #endif
 
-void
-virNetDevTapReserveName(const char *name)
-    ATTRIBUTE_NONNULL(1);
-
 int virNetDevTapCreate(char **ifname,
                        const char *tunpath,
                        int *tapfd,