--- zzzz-none-000/linux-2.6.32.61/net/bridge/br_notify.c 2013-06-10 09:43:48.000000000 +0000 +++ virian-300e-630/linux-2.6.32.61/net/bridge/br_notify.c 2014-08-12 13:03:17.000000000 +0000 @@ -31,12 +31,32 @@ */ static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr) { +#if 0 + /* AVM: not present in 2.6.32: added around 3.10 + * + * commit: + * 351638e7deeed2ec8ce451b53d33921b3da68f83 net: pass info struct via netdevice notifier + */ + struct net_device *dev = netdev_notifier_info_to_dev(ptr); +#else struct net_device *dev = ptr; - struct net_bridge_port *p = dev->br_port; +#endif + struct net_bridge_port *p; struct net_bridge *br; + bool changed_addr; +#if 0 + int err; +#endif + + /* register of bridge completed, add sysfs entries */ + if ((dev->priv_flags & IFF_EBRIDGE) && event == NETDEV_REGISTER) { + br_sysfs_addbr(dev); + return NOTIFY_DONE; + } /* not a port of a bridge */ - if (p == NULL) + p = br_port_get_rtnl(dev); + if (!p) return NOTIFY_DONE; br = p->br; @@ -49,8 +69,12 @@ 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: @@ -60,7 +84,7 @@ case NETDEV_FEAT_CHANGE: spin_lock_bh(&br->lock); if (netif_running(br->dev)) - br_features_recompute(br); + br_features_recompute(br); spin_unlock_bh(&br->lock); break; @@ -72,7 +96,7 @@ break; case NETDEV_UP: - if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) { + if (netif_running(br->dev) && netif_oper_up(dev)) { spin_lock_bh(&br->lock); br_stp_enable_port(p); spin_unlock_bh(&br->lock); @@ -82,6 +106,38 @@ case NETDEV_UNREGISTER: br_del_if(br, dev); break; + +#if 0 + /* AVM: revert effect of commit + * e0f43752a942b7be1bc06b9fd74e20ae337c1cca bridge: update sysfs link names if port device names have changed */ + case NETDEV_CHANGENAME: + err = br_sysfs_renameif(p); + if (err) + return notifier_from_errno(err); + break; +#endif + +#if 0 + /* AVM: not present in 2.6.32, added around 3.11 + * + * commit: + * 4aa5dee4d9997879adff858514844efab5a15a01 net: convert resend IGMP to notifier event + */ + case NETDEV_PRE_TYPE_CHANGE: + /* Forbid underlaying device to change its type. */ + return NOTIFY_BAD; +#endif +#if 0 + /* AVM: not present in 2.6.32, added around 2.6.34 + * + * commit: + * 1c01fe14a87332cc88266fbd6e598319322eb96f net: forbid underlaying devices to change its type + */ + case NETDEV_RESEND_IGMP: + /* Propagate to master device */ + call_netdevice_notifiers(event, br->dev); + break; +#endif } /* Events that may cause spanning tree to refresh */