diff options
author | Ivan Vecera <cera@cera.cz> | 2017-01-20 12:12:17 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-01-20 15:07:27 -0500 |
commit | b6677449dff674cf5b81429b11d5c7f358852ef9 (patch) | |
tree | c085cab00b7517dd78bbb8758092a94591ada27f | |
parent | 90c311b0eeead647b708a723dbdde1eda3dcad05 (diff) |
bridge: netlink: call br_changelink() during br_dev_newlink()
Any bridge options specified during link creation (e.g. ip link add)
are ignored as br_dev_newlink() does not process them.
Use br_changelink() to do it.
Fixes: 133235161721 ("bridge: implement rtnl_link_ops->changelink")
Signed-off-by: Ivan Vecera <cera@cera.cz>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/bridge/br_netlink.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 71c7453268c1..7109b389ea58 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -781,20 +781,6 @@ static int br_validate(struct nlattr *tb[], struct nlattr *data[]) | |||
781 | return 0; | 781 | return 0; |
782 | } | 782 | } |
783 | 783 | ||
784 | static int br_dev_newlink(struct net *src_net, struct net_device *dev, | ||
785 | struct nlattr *tb[], struct nlattr *data[]) | ||
786 | { | ||
787 | struct net_bridge *br = netdev_priv(dev); | ||
788 | |||
789 | if (tb[IFLA_ADDRESS]) { | ||
790 | spin_lock_bh(&br->lock); | ||
791 | br_stp_change_bridge_id(br, nla_data(tb[IFLA_ADDRESS])); | ||
792 | spin_unlock_bh(&br->lock); | ||
793 | } | ||
794 | |||
795 | return register_netdevice(dev); | ||
796 | } | ||
797 | |||
798 | static int br_port_slave_changelink(struct net_device *brdev, | 784 | static int br_port_slave_changelink(struct net_device *brdev, |
799 | struct net_device *dev, | 785 | struct net_device *dev, |
800 | struct nlattr *tb[], | 786 | struct nlattr *tb[], |
@@ -1115,6 +1101,25 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[], | |||
1115 | return 0; | 1101 | return 0; |
1116 | } | 1102 | } |
1117 | 1103 | ||
1104 | static int br_dev_newlink(struct net *src_net, struct net_device *dev, | ||
1105 | struct nlattr *tb[], struct nlattr *data[]) | ||
1106 | { | ||
1107 | struct net_bridge *br = netdev_priv(dev); | ||
1108 | int err; | ||
1109 | |||
1110 | if (tb[IFLA_ADDRESS]) { | ||
1111 | spin_lock_bh(&br->lock); | ||
1112 | br_stp_change_bridge_id(br, nla_data(tb[IFLA_ADDRESS])); | ||
1113 | spin_unlock_bh(&br->lock); | ||
1114 | } | ||
1115 | |||
1116 | err = br_changelink(dev, tb, data); | ||
1117 | if (err) | ||
1118 | return err; | ||
1119 | |||
1120 | return register_netdevice(dev); | ||
1121 | } | ||
1122 | |||
1118 | static size_t br_get_size(const struct net_device *brdev) | 1123 | static size_t br_get_size(const struct net_device *brdev) |
1119 | { | 1124 | { |
1120 | return nla_total_size(sizeof(u32)) + /* IFLA_BR_FORWARD_DELAY */ | 1125 | return nla_total_size(sizeof(u32)) + /* IFLA_BR_FORWARD_DELAY */ |