| From foo@baz Wed May 28 21:03:54 PDT 2014 |
| From: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> |
| Date: Fri, 25 Apr 2014 17:01:18 +0900 |
| Subject: bridge: Handle IFLA_ADDRESS correctly when creating |
| bridge device |
| |
| From: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> |
| |
| [ Upstream commit 30313a3d5794472c3548d7288e306a5492030370 ] |
| |
| 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@jklm.no> |
| Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/bridge/br_netlink.c | 15 +++++++++++++++ |
| 1 file changed, 15 insertions(+) |
| |
| --- a/net/bridge/br_netlink.c |
| +++ b/net/bridge/br_netlink.c |
| @@ -445,6 +445,20 @@ static int br_validate(struct nlattr *tb |
| return 0; |
| } |
| |
| +static int br_dev_newlink(struct net *src_net, struct net_device *dev, |
| + struct nlattr *tb[], struct nlattr *data[]) |
| +{ |
| + 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); |
| + } |
| + |
| + return register_netdevice(dev); |
| +} |
| + |
| static size_t br_get_link_af_size(const struct net_device *dev) |
| { |
| struct net_port_vlans *pv; |
| @@ -473,6 +487,7 @@ struct rtnl_link_ops br_link_ops __read_ |
| .priv_size = sizeof(struct net_bridge), |
| .setup = br_dev_setup, |
| .validate = br_validate, |
| + .newlink = br_dev_newlink, |
| .dellink = br_dev_delete, |
| }; |
| |