Quoting Stéphane Graber (stgra...@ubuntu.com):
> 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>

thanks.

Acked-by: Serge E. Hallyn <serge.hal...@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

------------------------------------------------------------------------------
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