On 12/04/2011 05:18 PM, Daniel Lezcano wrote: > On 12/05/2011 12:11 AM, Serge Hallyn wrote: >> On 12/04/2011 04:28 AM, Daniel Lezcano wrote: >>> On 11/16/2011 05:49 PM, Christian Seiler wrote: >>>> Hi, >>>> >>>> I've run into the same problem as was discussed in BUG #3411497 [1] >>>> and on >>>> the users mailing list [2]. To solve this, I've decided to implement >>>> the >>>> patch that was proposed on the mailing list [3]. >>>> >>>> The attached patch is against current trunk. Since trunk currently >>>> doesn't >>>> compile for me, I tested the patch against the current Debian >>>> package for >>>> LXC version 0.7.2. There, it still applies and works as expected for >>>> me, >>>> the bridge interface still keeps its mac address and the high byte >>>> of the >>>> mac address of the host veth interface is correctly set to 0xfe. >>>> >>>> It would be great if this patch or a slightly modified version could be >>>> applied to LXC. >>> Hi guys >>> >>> are ok with this patch ? >>> >>> Thanks >>> -- Daniel >> >> Sorry, where is the patch? I don't find it in the archives. Can >> someone send it (inline)? >> > > It was in attachment. Here it is. > > From e1b4779a89964ec43fa2bc5f76fafd965c89f73f Mon Sep 17 00:00:00 2001 > From: Christian Seiler<christ...@iwakd.de> > Date: Tue, 15 Nov 2011 18:53:53 +0100 > Subject: [PATCH] Set high byte of mac addresses for host veth devices to 0xfe > > When used in conjunction with a bridge, veth devices with random addresses > may change the mac address of the bridge itself if the mac address of the > interface newly added is numerically lower than the previous mac address > of the bridge. This is documented kernel behavior. To avoid changing the > host's mac address back and forth when starting and/or stopping containers, > this patch ensures that the high byte of the mac address of the veth > interface visible from the host side is set to 0xfe. > > A similar logic is also implemented in libvirt. > > Fixes SF bug #3411497 > See > also:<http://thread.gmane.org/gmane.linux.kernel.containers.lxc.general/2709> > --- > src/lxc/conf.c | 40 ++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 40 insertions(+), 0 deletions(-) > > diff --git a/src/lxc/conf.c b/src/lxc/conf.c > index 613e476..a5d067b 100644 > --- a/src/lxc/conf.c > +++ b/src/lxc/conf.c > @@ -1402,6 +1402,36 @@ static int setup_network(struct lxc_list *network) > return 0; > } > > +static int setup_private_host_hw_addr(char *veth1) > +{ > + struct ifreq ifr; > + int err; > + int sockfd; > + > + sockfd = socket(AF_INET, SOCK_DGRAM, 0); > + if (sockfd< 0) > + return -errno; > + > + snprintf((char *)ifr.ifr_name, IFNAMSIZ, "%s", veth1); > + err = ioctl(sockfd, SIOCGIFHWADDR,&ifr); > + if (err< 0) { > + close(sockfd); > + return -errno; > + } > + > + ifr.ifr_hwaddr.sa_data[0] = 0xfe; > + err = ioctl(sockfd, SIOCSIFHWADDR,&ifr); > + close(sockfd); > + if (err< 0) > + return -errno; > + > + DEBUG("mac address of host interface '%s' changed to private > %02x:%02x:%02x:%02x:%02x:%02x", > + veth1, ifr.ifr_hwaddr.sa_data[0]& 0xff, > ifr.ifr_hwaddr.sa_data[1]& 0xff, ifr.ifr_hwaddr.sa_data[2]& 0xff, > + ifr.ifr_hwaddr.sa_data[3]& 0xff, ifr.ifr_hwaddr.sa_data[4]& > 0xff, ifr.ifr_hwaddr.sa_data[5]& 0xff); > + > + return 0; > +} > + > struct lxc_conf *lxc_conf_init(void) > { > struct lxc_conf *new; > @@ -1455,6 +1485,16 @@ static int instanciate_veth(struct lxc_handler > *handler, struct lxc_netdev *netd > strerror(-err)); > return -1; > } > + > + /* changing the high byte of the mac address to 0xfe, the bridge > interface > + * will always keep the host's mac address and not take the mac address > + * of a container */ > + err = setup_private_host_hw_addr(veth1); > + if (err) { > + ERROR("failed to change mac address of host interface '%s' : > %s", > + veth1, strerror(-err)); > + goto out_delete; > + } > > if (netdev->mtu) { > err = lxc_netdev_set_mtu(veth1, atoi(netdev->mtu)); > -- 1.7.2.5 >
Thanks, sorry for the trouble. Looks good, with one exception - if ioctl failed, then you may end up returning the wrong errno (from the close syscall). With that fixed, please do apply. Thanks, Christian. thanks, -serge ------------------------------------------------------------------------------ Cloud Services Checklist: Pricing and Packaging Optimization This white paper is intended to serve as a reference, checklist and point of discussion for anyone considering optimizing the pricing and packaging model of a cloud services business. Read Now! http://www.accelacomm.com/jaw/sfnl/114/51491232/ _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel