On Mon, Jan 6, 2014 at 11:46 AM, Serge Hallyn <serge.hal...@ubuntu.com> wrote: > Quoting Serge Hallyn (serge.hal...@ubuntu.com): >> Quoting Guillaume ZITTA (l...@zitta.fr): >> > This change introduce mac address templating. >> > >> > By setting lxc.network.hwaddr to something like fe:xx:xx:xx:xx:xx >> > each "x" will be replaced by a random value. >> > If less significant bit of first byte is "templated", it will be >> > set to 0. >> > >> > This chage introduce also a common randinit() function that could be >> > used to initialize random generator. >> > >> > Signed-off-by: gza <l...@zitta.fr> >> > --- >> > doc/lxc.conf.sgml.in | 4 +++- >> > src/lxc/confile.c | 36 ++++++++++++++++++++++++++++++++++-- >> > src/lxc/utils.c | 22 ++++++++++++++++++++++ >> > src/lxc/utils.h | 2 ++ >> > 4 files changed, 61 insertions(+), 3 deletions(-) >> > >> > diff --git a/doc/lxc.conf.sgml.in b/doc/lxc.conf.sgml.in >> > index e6d9689..4bbeeeb 100644 >> > --- a/doc/lxc.conf.sgml.in >> > +++ b/doc/lxc.conf.sgml.in >> > @@ -326,7 +326,9 @@ Foundation, Inc., 51 Franklin Street, Fifth >> > Floor, Boston, MA 02110-1301 USA >> > the interface mac address is dynamically allocated by >> > default to the virtual interface, but in some cases, >> > this is needed to resolve a mac address conflict or to >> > - always have the same link-local ipv6 address >> > + always have the same link-local ipv6 address. >> > + Any "x" in address will be replaced by random value, >> > + this allows setting hwaddr templates. >> > </para> >> > </listitem> >> > </varlistentry> >> > diff --git a/src/lxc/confile.c b/src/lxc/confile.c >> > index 0982b3e..3d7554a 100644 >> > --- a/src/lxc/confile.c >> > +++ b/src/lxc/confile.c >> > @@ -508,6 +508,28 @@ static int macvlan_mode(int *valuep, const char >> > *value) >> > return -1; >> > } >> > >> > +static int rand_complete_hwaddr(char *hwaddr) >> > +{ >> > + const char hex[] = "0123456789abcdef"; >> > + char *curs = hwaddr; >> > + >> > + randinit(); >> > + >> > + while (*curs != '\0') >> > + { >> > + if ( *curs == 'x' || *curs == 'X' ) { >> > + if (curs - hwaddr == 1) { >> > + //ensure address is unicast >> > + *curs = hex[(rand() & 0x0E)]; >> > + } else { >> > + *curs = hex[rand() & 0x0F]; >> > + } >> > + } >> > + curs++; >> > + } >> > + return 0; >> > +} >> > + >> > static int config_network_flags(const char *key, const char *value, >> > struct lxc_conf *lxc_conf) >> > { >> > @@ -575,11 +597,21 @@ static int config_network_hwaddr(const char >> > *key, const char *value, >> > { >> > struct lxc_netdev *netdev; >> > >> > - netdev = network_netdev(key, value, &lxc_conf->network); >> > + char *newval = strdup(value); >> >> Since this is strdup'd, >> >> > + >> > + rand_complete_hwaddr(newval); >> > + >> > + netdev = network_netdev(key, newval, &lxc_conf->network); >> > if (!netdev) >> >> this error path needs to free it, >> >> > return -1; >> > >> > - return config_string_item(&netdev->hwaddr, value); >> > + if (!newval || strlen(newval) == 0) { >> > + netdev->hwaddr = NULL; >> >> as does this one in the case where newval != NULL. > > To be less terse: once you add this, it looks good, thanks.
Guillaume , could you please drop process_lock/process_unlock from the patch while addressing Serge's comment as we no longer need them? > _______________________________________________ > lxc-devel mailing list > lxc-devel@lists.linuxcontainers.org > http://lists.linuxcontainers.org/listinfo/lxc-devel -- S.Çağlar Onur <cag...@10ur.org> _______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel