Re: [PATCHv3] Bridge: Always send NETDEV_CHANGEADDR up on br MAC change.
flat view
From: Stephen Hemminger <hidden>
Date: 2011-08-05 04:35:57
On Thu, 4 Aug 2011 21:17:05 -0500 Andrei Warkentin [off-list ref] wrote: Half ok, half not.
quoted hunk ↗ jump to hunk
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index cf09fe5..ef18070 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c@@ -162,6 +162,7 @@ static int br_set_mac_address(struct net_device *dev, void *p) br->flags |= BR_SET_MAC_ADDR; spin_unlock_bh(&br->lock); + call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); return 0; }
This is unnecessary since already done by dev_set_mac_address.
quoted hunk ↗ jump to hunk
@@ -492,10 +493,13 @@ int br_del_if(struct net_bridge *br, struct net_device *dev) del_nbp(p); spin_lock_bh(&br->lock); - br_stp_recalculate_bridge_id(br); + changed_addr = br_stp_recalculate_bridge_id(br); br_features_recompute(br); spin_unlock_bh(&br->lock); + if (changed_addr) + call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); + return 0; }
Good, I forgot that case.
quoted hunk ↗ jump to hunk
diff --git a/net/bridge/br_notify.c b/net/bridge/br_notify.c index 404d4e1..651eac3 100644 --- a/net/bridge/br_notify.c +++ b/net/bridge/br_notify.c@@ -34,6 +34,7 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v struct net_device *dev = ptr; struct net_bridge_port *p = br_port_get(dev); struct net_bridge *br; + bool changed_addr; int err; /* not a port of a bridge */@@ -51,8 +52,11 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v case NETDEV_CHANGEADDR: spin_lock_bh(&br->lock); br_fdb_changeaddr(p, dev->dev_addr); - br_stp_recalculate_bridge_id(br); + changed_addr = br_stp_recalculate_bridge_id(br); spin_unlock_bh(&br->lock); + + if (changed_addr) + call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); break; case NETDEV_CHANGE:
This is also fine.
quoted hunk ↗ jump to hunk
iff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index c0990ba..4528e9a 100644--- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c@@ -213,7 +213,7 @@ bool br_stp_recalculate_bridge_id(struct net_bridge *br) /* user has chosen a value so keep it */ if (br->flags & BR_SET_MAC_ADDR) - return; + return false; list_for_each_entry(p, &br->port_list, list) { if (addr == br_mac_zero ||
This is already in net-next.