On Thu, Apr 24, 2014 at 2:16 PM, Toshiaki Makita <makita.toshiaki@xxxxxxxxxxxxx> wrote: > When bridge device is created with IFLA_ADDRESS, we are not calling > br_stp_change_bridge_id(), which leads to incorrect local fdb > management and bridge id calculation, and prevents us from receiving > frames on the bridge device. > > Reported-by: Tom Gundersen <teg@xxxxxxx> Thanks. That looks correct to me (not able to test at the moment though). Would this be appropriate for stable if it goes in? Cheers, Tom > Signed-off-by: Toshiaki Makita <makita.toshiaki@xxxxxxxxxxxxx> > --- > net/bridge/br_netlink.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c > index e74b6d53..a8b664e 100644 > --- a/net/bridge/br_netlink.c > +++ b/net/bridge/br_netlink.c > @@ -445,6 +445,25 @@ static int br_validate(struct nlattr *tb[], struct nlattr *data[]) > return 0; > } > > +static int br_dev_newlink(struct net *src_net, struct net_device *dev, > + struct nlattr *tb[], struct nlattr *data[]) > +{ > + int err; > + struct net_bridge *br = netdev_priv(dev); > + > + if (tb[IFLA_ADDRESS]) { > + spin_lock_bh(&br->lock); > + br_stp_change_bridge_id(br, nla_data(tb[IFLA_ADDRESS])); > + spin_unlock_bh(&br->lock); > + } > + > + err = register_netdevice(dev); > + if (err) > + return err; > + > + return 0; > +} > + > static size_t br_get_link_af_size(const struct net_device *dev) > { > struct net_port_vlans *pv; > @@ -473,6 +492,7 @@ struct rtnl_link_ops br_link_ops __read_mostly = { > .priv_size = sizeof(struct net_bridge), > .setup = br_dev_setup, > .validate = br_validate, > + .newlink = br_dev_newlink, > .dellink = br_dev_delete, > }; > > -- > 1.8.1.2 > >