X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=net%2Fbridge%2Fbr.c;h=8f3c58e5f7a562d88abdd9df744bf77fb65663c6;hb=5e70b7f3c24468bb1635b295945edb48ecd9656a;hp=22d806cf40caf86d694eb05f2794bc1454c5ee19;hpb=cf0f02d04a830c8202e6a8f8bb37acc6c1629a91;p=safe%2Fjmp%2Flinux-2.6 diff --git a/net/bridge/br.c b/net/bridge/br.c index 22d806c..8f3c58e 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c @@ -13,7 +13,6 @@ * 2 of the License, or (at your option) any later version. */ -#include #include #include #include @@ -24,42 +23,59 @@ #include "br_private.h" -int (*br_should_route_hook) (struct sk_buff **pskb) = NULL; +int (*br_should_route_hook)(struct sk_buff *skb); static struct llc_sap *br_stp_sap; static int __init br_init(void) { + int err; + br_stp_sap = llc_sap_open(LLC_SAP_BSPAN, br_stp_rcv); if (!br_stp_sap) { printk(KERN_ERR "bridge: can't register sap for STP\n"); - return -EBUSY; + return -EADDRINUSE; } - br_fdb_init(); + err = br_fdb_init(); + if (err) + goto err_out; + + err = br_netfilter_init(); + if (err) + goto err_out1; + + err = register_netdevice_notifier(&br_device_notifier); + if (err) + goto err_out2; + + err = br_netlink_init(); + if (err) + goto err_out3; -#ifdef CONFIG_BRIDGE_NETFILTER - if (br_netfilter_init()) - return 1; -#endif brioctl_set(br_ioctl_deviceless_stub); br_handle_frame_hook = br_handle_frame; br_fdb_get_hook = br_fdb_get; br_fdb_put_hook = br_fdb_put; - register_netdevice_notifier(&br_device_notifier); - return 0; +err_out3: + unregister_netdevice_notifier(&br_device_notifier); +err_out2: + br_netfilter_fini(); +err_out1: + br_fdb_fini(); +err_out: + llc_sap_put(br_stp_sap); + return err; } static void __exit br_deinit(void) { - llc_sap_close(br_stp_sap); + rcu_assign_pointer(br_stp_sap->rcv_func, NULL); -#ifdef CONFIG_BRIDGE_NETFILTER - br_netfilter_fini(); -#endif + br_netlink_fini(); unregister_netdevice_notifier(&br_device_notifier); brioctl_set(NULL); @@ -67,6 +83,8 @@ static void __exit br_deinit(void) synchronize_net(); + br_netfilter_fini(); + llc_sap_put(br_stp_sap); br_fdb_get_hook = NULL; br_fdb_put_hook = NULL;