net: bridge: Handle NETDEV_PRE_CHANGEADDR from ports
authorPetr Machata <petrm@mellanox.com>
Thu, 13 Dec 2018 11:54:39 +0000 (11:54 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 Dec 2018 02:41:38 +0000 (18:41 -0800)
When a port device seeks approval of a potential new MAC address, make
sure that should the bridge device end up using this address, all
interested parties would agree with it.

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.c

index 4e7cd993ce94bc3ded5b0f690b5166c065ebb5cd..a5174e5001d86a5b16faadd519167820284961a9 100644 (file)
@@ -31,6 +31,8 @@
  */
 static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr)
 {
+       struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(ptr);
+       struct netdev_notifier_pre_changeaddr_info *prechaddr_info;
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
        struct net_bridge_port *p;
        struct net_bridge *br;
@@ -56,6 +58,17 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
                br_mtu_auto_adjust(br);
                break;
 
+       case NETDEV_PRE_CHANGEADDR:
+               if (br->dev->addr_assign_type == NET_ADDR_SET)
+                       break;
+               prechaddr_info = ptr;
+               err = dev_pre_changeaddr_notify(br->dev,
+                                               prechaddr_info->dev_addr,
+                                               extack);
+               if (err)
+                       return notifier_from_errno(err);
+               break;
+
        case NETDEV_CHANGEADDR:
                spin_lock_bh(&br->lock);
                br_fdb_changeaddr(p, dev->dev_addr);