[Bridge] 2.6.27: persistent MAC assignment to bridge not working

Stephen Hemminger shemminger at vyatta.com
Fri May 8 16:27:19 PDT 2009


On Fri, 8 May 2009 17:20:08 -0600
Daniel Robbins <drobbins at funtoo.org> wrote:

> This commit is in my 2.6.27-based kernel. It does not appear to be
> working. Can you show me what steps I should take to confirm that this
> sticky code is functioning properly, ie commands and expected results?
> 
> Thanks.
> 
> -Daniel
> 
> On Fri, May 8, 2009 at 4:54 PM, Stephen Hemminger <shemminger at vyatta.com> wrote:
> > On Fri, 8 May 2009 15:31:43 -0600
> > Daniel Robbins <drobbins at funtoo.org> wrote:
> >
> >> Hi All,
> >>
> >> I am trying to figure out how to get a persistent, non-changing MAC
> >> address assigned to a bridge. It looks like there is new functionality
> >> in 2.6.27 to allow this to happen, specifically, in:
> >>
> >> void br_stp_recalculate_bridge_id(struct net_bridge *br)
> >> [...]
> >>        /* user has chosen a value so keep it */
> >>         if (br->flags & BR_SET_MAC_ADDR)
> >>                 return;
> >>
> >> and in..
> >>
> >> static int br_set_mac_address(struct net_device *dev, void *p)
> >> [...]
> >>         br->flags |= BR_SET_MAC_ADDR;
> >>
> >> However, I cannot get this functionality to work as it appears it
> >> should. If I manually set a bridge's MAC address to an arbitrary
> >> value, as follows:
> >>
> >> # ifconfig br0 hw ether "xx:xx:xx:xx:xx:xx"
> >>
> >> Then, subsequent calls such as the following seem to still change the
> >> bridge's MAC address:
> >>
> >> # brctl addif br0 veth100.0
> >> # brctl delif br0 veth100.0
> >>
> >> Am I doing something wrong? What is the proper way to take advantage
> >> of the new code in 2.6.27?
> >>
> >> The only mechanism that I have found that appears to achieve my
> >> desired result is application of Deitmar Maurer's 2.6.24 patch which,
> >> after being applied, seems to disable the dynamic nature of the
> >> bridge's MAC, so that br0 persistently uses the MAC of the first
> >> interface that was added to the bridge. Here is this patch that seems
> >> to be working for me:
> >>
> >> --- linux-2.6.24-openvz.org/net/bridge/br_stp_if.c.org  2008-06-11
> >> 09:15:16.000000000 +0200
> >> +++ linux-2.6.24-openvz.org/net/bridge/br_stp_if.c      2008-06-11
> >> 09:44:53.000000000 +0200
> >> @@ -217,10 +217,7 @@
> >>        struct net_bridge_port *p;
> >>
> >>        list_for_each_entry(p, &br->port_list, list) {
> >> -               if (addr == br_mac_zero ||
> >> -                   memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
> >> -                       addr = p->dev->dev_addr;
> >> -
> >> +               addr = p->dev->dev_addr;
> >>        }
> >>
> >>        if (compare_ether_addr(br->bridge_id.addr, addr))
> >> --------------------------
> >>
> >> However, when I look at the 2.6.27 source code, it seems like this
> >> patch should no longer be needed and an "ifconfig br0 hw ether
> >> "xx:xx:xx:xx:xx:xx" should be sufficient. Am I doing something wrong?
> >>
> >> Thanks for your time,
> >>
> >> Daniel Robbins
> >
> > It was fixed by:
> >
> > Author: Stephen Hemminger <shemminger at vyatta.com>  2008-06-17 16:10:06
> > Committer: David S. Miller <davem at davemloft.net>  2008-06-17 16:10:06
> > Parent: 0b040829952d84bf2a62526f0e24b624e0699447 (net: remove CVS keywords)
> > Branches: master, remotes/origin/master
> > Follows: v2.6.26-rc6
> > Precedes: v2.6.27-rc1
> >
> >    bridge: make bridge address settings sticky
> >
> >    Normally, the bridge just chooses the smallest mac address as the
> >    bridge id and mac address of bridge device. But if the administrator
> >    has explictly set the interface address then don't change it.
> >
> >    Signed-off-by: Stephen Hemminger <shemminger at vyatta.com>
> >    Signed-off-by: David S. Miller <davem at davemloft.net>
> >
> >

# brctl addbr brex0
# modprobe dummy

# ip li set dev brex0 addr 0c:01:02:03:04:05
# ip li show dev brex0
22: brex0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN 
    link/ether 0c:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
# brctl addif brex0 dummy0
# ip li show dev brex0
22: brex0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN 
    link/ether 0c:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff

-- 


More information about the Bridge mailing list