NetworkManager at least expects all veth devices to be called veth*
otherwise it'll consider them as physical interface and try to do DHCP
on them.

This change makes lxc-user-nic use the same function that we use for LXC
itself which will give us standard vethXXXXX kind of interfaces.

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 src/lxc/conf.c         | 80 ++------------------------------------------------
 src/lxc/lxc_user_nic.c | 16 ++++------
 src/lxc/network.c      | 74 ++++++++++++++++++++++++++++++++++++++++++++++
 src/lxc/network.h      |  5 ++++
 4 files changed, 88 insertions(+), 87 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index daf491f..6542ce1 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -34,12 +34,6 @@
 #include <sys/syscall.h>
 #include <time.h>
 
-#if HAVE_IFADDRS_H
-#include <ifaddrs.h>
-#else
-#include <../include/ifaddrs.h>
-#endif
-
 #if HAVE_PTY_H
 #include <pty.h>
 #else
@@ -280,74 +274,6 @@ static struct caps_opt caps_opt[] = {
 static struct caps_opt caps_opt[] = {};
 #endif
 
-static char padchar[] =
-"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-static char *mkifname(char *template)
-{
-       char *name = NULL;
-       int i = 0;
-       FILE *urandom;
-       unsigned int seed;
-       struct ifaddrs *ifaddr, *ifa;
-       int ifexists = 0;
-
-       /* Get all the network interfaces */
-       getifaddrs(&ifaddr);
-
-       /* Initialize the random number generator */
-       process_lock();
-       urandom = fopen ("/dev/urandom", "r");
-       process_unlock();
-       if (urandom != NULL) {
-               if (fread (&seed, sizeof(seed), 1, urandom) <= 0)
-                       seed = time(0);
-               process_lock();
-               fclose(urandom);
-               process_unlock();
-       }
-       else
-               seed = time(0);
-
-#ifndef HAVE_RAND_R
-       srand(seed);
-#endif
-
-       /* Generate random names until we find one that doesn't exist */
-       while(1) {
-               ifexists = 0;
-               name = strdup(template);
-
-               if (name == NULL)
-                       return NULL;
-
-               for (i = 0; i < strlen(name); i++) {
-                       if (name[i] == 'X') {
-#ifdef HAVE_RAND_R
-                               name[i] = padchar[rand_r(&seed) % 
(strlen(padchar) - 1)];
-#else
-                               name[i] = padchar[rand() % (strlen(padchar) - 
1)];
-#endif
-                       }
-               }
-
-               for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
-                       if (strcmp(ifa->ifa_name, name) == 0) {
-                               ifexists = 1;
-                               break;
-                       }
-               }
-
-               if (ifexists == 0)
-                       break;
-
-               free(name);
-       }
-
-       freeifaddrs(ifaddr);
-       return name;
-}
-
 static int run_buffer(char *buffer)
 {
        FILE *f;
@@ -2668,7 +2594,7 @@ static int instanciate_veth(struct lxc_handler *handler, 
struct lxc_netdev *netd
                        ERROR("veth1 name too long");
                        return -1;
                }
-               veth1 = mkifname(veth1buf);
+               veth1 = lxc_mkifname(veth1buf);
                if (!veth1) {
                        ERROR("failed to allocate a temporary name");
                        return -1;
@@ -2678,7 +2604,7 @@ static int instanciate_veth(struct lxc_handler *handler, 
struct lxc_netdev *netd
        }
 
        snprintf(veth2buf, sizeof(veth2buf), "vethXXXXXX");
-       veth2 = mkifname(veth2buf);
+       veth2 = lxc_mkifname(veth2buf);
        if (!veth2) {
                ERROR("failed to allocate a temporary name");
                goto out_delete;
@@ -2787,7 +2713,7 @@ static int instanciate_macvlan(struct lxc_handler 
*handler, struct lxc_netdev *n
        if (err >= sizeof(peerbuf))
                return -1;
 
-       peer = mkifname(peerbuf);
+       peer = lxc_mkifname(peerbuf);
        if (!peer) {
                ERROR("failed to make a temporary name");
                return -1;
diff --git a/src/lxc/lxc_user_nic.c b/src/lxc/lxc_user_nic.c
index a4ae907..caa411a 100644
--- a/src/lxc/lxc_user_nic.c
+++ b/src/lxc/lxc_user_nic.c
@@ -266,20 +266,16 @@ out_del:
 
 /*
  * Get a new nic.
- * *dest will container the name (lxcuser-%d) which is attached
+ * *dest will container the name (vethXXXXXX) which is attached
  * on the host to the lxc bridge
  */
 static void get_new_nicname(char **dest, char *br, int pid, char **cnic)
 {
-       int i = 0;
-       // TODO - speed this up.  For large installations we won't
-       // want n stats for every nth container startup.
-       while (1) {
-               sprintf(*dest, "lxcuser-%d", i);
-               if (!nic_exists(*dest) && create_nic(*dest, br, pid, cnic))
-                       return;
-               i++;
-       }
+       char template[IFNAMSIZ];
+       snprintf(template, sizeof(template), "vethXXXXXX");
+       *dest = lxc_mkifname(template);
+
+       create_nic(*dest, br, pid, cnic);
 }
 
 static bool get_nic_from_line(char *p, char **nic)
diff --git a/src/lxc/network.c b/src/lxc/network.c
index 941f0ec..f73e57d 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -50,6 +50,12 @@
 #include "conf.h"
 #include "lxclock.h"
 
+#if HAVE_IFADDRS_H
+#include <ifaddrs.h>
+#else
+#include <../include/ifaddrs.h>
+#endif
+
 #ifndef IFLA_LINKMODE
 #  define IFLA_LINKMODE 17
 #endif
@@ -1108,6 +1114,74 @@ const char *lxc_net_type_to_str(int type)
        return lxc_network_types[type];
 }
 
+static char padchar[] =
+"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+char *lxc_mkifname(char *template)
+{
+       char *name = NULL;
+       int i = 0;
+       FILE *urandom;
+       unsigned int seed;
+       struct ifaddrs *ifaddr, *ifa;
+       int ifexists = 0;
+
+       /* Get all the network interfaces */
+       getifaddrs(&ifaddr);
+
+       /* Initialize the random number generator */
+       process_lock();
+       urandom = fopen ("/dev/urandom", "r");
+       process_unlock();
+       if (urandom != NULL) {
+               if (fread (&seed, sizeof(seed), 1, urandom) <= 0)
+                       seed = time(0);
+               process_lock();
+               fclose(urandom);
+               process_unlock();
+       }
+       else
+               seed = time(0);
+
+#ifndef HAVE_RAND_R
+       srand(seed);
+#endif
+
+       /* Generate random names until we find one that doesn't exist */
+       while(1) {
+               ifexists = 0;
+               name = strdup(template);
+
+               if (name == NULL)
+                       return NULL;
+
+               for (i = 0; i < strlen(name); i++) {
+                       if (name[i] == 'X') {
+#ifdef HAVE_RAND_R
+                               name[i] = padchar[rand_r(&seed) % 
(strlen(padchar) - 1)];
+#else
+                               name[i] = padchar[rand() % (strlen(padchar) - 
1)];
+#endif
+                       }
+               }
+
+               for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+                       if (strcmp(ifa->ifa_name, name) == 0) {
+                               ifexists = 1;
+                               break;
+                       }
+               }
+
+               if (ifexists == 0)
+                       break;
+
+               free(name);
+       }
+
+       freeifaddrs(ifaddr);
+       return name;
+}
+
 int setup_private_host_hw_addr(char *veth1)
 {
        struct ifreq ifr;
diff --git a/src/lxc/network.h b/src/lxc/network.h
index e3bb7f4..3ea99ac 100644
--- a/src/lxc/network.h
+++ b/src/lxc/network.h
@@ -131,6 +131,11 @@ extern int lxc_neigh_proxy_on(const char *name, int 
family);
  */
 extern int lxc_neigh_proxy_off(const char *name, int family);
 
+/*
+ * Generate a new unique network interface name
+ */
+extern char *lxc_mkifname(char *template);
+
 extern const char *lxc_net_type_to_str(int type);
 extern int setup_private_host_hw_addr(char *veth1);
 #endif
-- 
1.8.5.1


------------------------------------------------------------------------------
Sponsored by Intel(R) XDK 
Develop, test and display web and hybrid apps with a single code base.
Download it for free now!
http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to