net: bridge: Issue NETDEV_PRE_CHANGEADDR
authorPetr Machata <petrm@mellanox.com>
Thu, 13 Dec 2018 11:54:37 +0000 (11:54 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 Dec 2018 02:41:38 +0000 (18:41 -0800)
When a port is attached to a bridge, the address of the bridge in
question may change as well. Even if it would not change at this
point (because the current bridge address is lower), it might end up
changing later as a result of detach of another port, which can't be
vetoed.

Therefore issue NETDEV_PRE_CHANGEADDR regardless of whether the address
will be used at this point or not, and make sure all involved parties
would agree with the change.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_if.c

index 3b945d6369c49714795019349c272100b3d4ceaa..41f0a696a65f4362a4e1507024dcff0ce1a9208e 100644 (file)
@@ -650,6 +650,15 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
        if (br_fdb_insert(br, p, dev->dev_addr, 0))
                netdev_err(dev, "failed insert local address bridge forwarding table\n");
 
+       if (br->dev->addr_assign_type != NET_ADDR_SET) {
+               /* Ask for permission to use this MAC address now, even if we
+                * don't end up choosing it below.
+                */
+               err = dev_pre_changeaddr_notify(br->dev, dev->dev_addr, extack);
+               if (err)
+                       goto err7;
+       }
+
        err = nbp_vlan_init(p, extack);
        if (err) {
                netdev_err(dev, "failed to initialize vlan filtering on this port\n");