--- zzzz-none-000/linux-3.10.107/net/bridge/br.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/net/bridge/br.c 2021-11-10 11:53:56.000000000 +0000 @@ -22,18 +22,36 @@ #include "br_private.h" -static const struct stp_proto br_stp_proto = { - .rcv = br_stp_rcv, -}; +static void __net_exit br_net_exit(struct net *net) +{ + struct net_device *dev; + LIST_HEAD(list); + + rtnl_lock(); + for_each_netdev(net, dev) + if (dev->priv_flags & IFF_EBRIDGE) + br_dev_delete(dev, &list); + + unregister_netdevice_many(&list); + rtnl_unlock(); + +} static struct pernet_operations br_net_ops = { .exit = br_net_exit, }; +static const struct stp_proto br_stp_proto = { + .rcv = br_stp_rcv, +}; + static int __init br_init(void) { int err; + BUILD_BUG_ON(sizeof(struct br_input_skb_cb) > FIELD_SIZEOF(struct sk_buff, cb)); + BUILD_BUG_ON(sizeof(struct br_output_skb_cb) > FIELD_SIZEOF(struct sk_buff, cb)); + err = stp_proto_register(&br_stp_proto); if (err < 0) { pr_err("bridge: can't register sap for STP\n"); @@ -62,11 +80,17 @@ brioctl_set(br_ioctl_deviceless_stub); + err = br_flood_rl_init(); + if (err) + goto err_out5; + #if IS_ENABLED(CONFIG_ATM_LANE) br_fdb_test_addr_hook = br_fdb_test_addr; #endif return 0; +err_out5: + br_netlink_fini(); err_out4: unregister_netdevice_notifier(&br_device_notifier); err_out3: @@ -84,6 +108,7 @@ { stp_proto_unregister(&br_stp_proto); + br_flood_rl_fini(); br_netlink_fini(); unregister_netdevice_notifier(&br_device_notifier); brioctl_set(NULL);