2005-04-17 02:20:36 +04:00
/*
* Generic parts
* Linux ethernet bridge
*
* Authors :
* Lennert Buytenhek < buytenh @ gnu . org >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/netdevice.h>
# include <linux/etherdevice.h>
# include <linux/init.h>
2006-03-21 09:59:06 +03:00
# include <linux/llc.h>
# include <net/llc.h>
2008-07-06 08:25:56 +04:00
# include <net/stp.h>
2005-04-17 02:20:36 +04:00
# include "br_private.h"
2007-10-15 11:53:15 +04:00
int ( * br_should_route_hook ) ( struct sk_buff * skb ) ;
2005-04-17 02:20:36 +04:00
2008-07-06 08:25:56 +04:00
static const struct stp_proto br_stp_proto = {
. rcv = br_stp_rcv ,
} ;
2006-03-21 09:59:06 +03:00
2008-09-09 03:20:18 +04:00
static struct pernet_operations br_net_ops = {
. exit = br_net_exit ,
} ;
2005-04-17 02:20:36 +04:00
static int __init br_init ( void )
{
2006-05-26 02:59:33 +04:00
int err ;
2008-07-06 08:25:56 +04:00
err = stp_proto_register ( & br_stp_proto ) ;
if ( err < 0 ) {
2006-03-21 09:59:06 +03:00
printk ( KERN_ERR " bridge: can't register sap for STP \n " ) ;
2008-07-06 08:25:56 +04:00
return err ;
2006-03-21 09:59:06 +03:00
}
2007-04-07 13:57:07 +04:00
err = br_fdb_init ( ) ;
if ( err )
2007-11-29 15:41:43 +03:00
goto err_out ;
2005-04-17 02:20:36 +04:00
2008-09-09 03:20:18 +04:00
err = register_pernet_subsys ( & br_net_ops ) ;
2006-05-26 02:59:33 +04:00
if ( err )
goto err_out1 ;
2008-09-09 03:20:18 +04:00
err = br_netfilter_init ( ) ;
2006-05-26 02:59:33 +04:00
if ( err )
goto err_out2 ;
2008-09-09 03:20:18 +04:00
err = register_netdevice_notifier ( & br_device_notifier ) ;
2007-03-22 21:59:03 +03:00
if ( err )
goto err_out3 ;
2008-09-09 03:20:18 +04:00
err = br_netlink_init ( ) ;
if ( err )
goto err_out4 ;
2005-04-17 02:20:36 +04:00
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 ;
return 0 ;
2008-09-09 03:20:18 +04:00
err_out4 :
2007-03-22 21:59:03 +03:00
unregister_netdevice_notifier ( & br_device_notifier ) ;
2008-09-09 03:20:18 +04:00
err_out3 :
2006-05-26 02:59:33 +04:00
br_netfilter_fini ( ) ;
2008-09-09 03:20:18 +04:00
err_out2 :
unregister_pernet_subsys ( & br_net_ops ) ;
2006-05-26 02:59:33 +04:00
err_out1 :
2007-11-29 15:41:43 +03:00
br_fdb_fini ( ) ;
err_out :
2008-07-06 08:25:56 +04:00
stp_proto_unregister ( & br_stp_proto ) ;
2006-05-26 02:59:33 +04:00
return err ;
2005-04-17 02:20:36 +04:00
}
static void __exit br_deinit ( void )
{
2008-07-06 08:25:56 +04:00
stp_proto_unregister ( & br_stp_proto ) ;
2006-03-21 09:59:06 +03:00
2006-05-26 03:00:12 +04:00
br_netlink_fini ( ) ;
2005-04-17 02:20:36 +04:00
unregister_netdevice_notifier ( & br_device_notifier ) ;
brioctl_set ( NULL ) ;
2008-09-09 03:20:18 +04:00
unregister_pernet_subsys ( & br_net_ops ) ;
2005-04-17 02:20:36 +04:00
synchronize_net ( ) ;
2008-04-29 14:18:13 +04:00
br_netfilter_fini ( ) ;
2005-04-17 02:20:36 +04:00
br_fdb_get_hook = NULL ;
br_fdb_put_hook = NULL ;
br_handle_frame_hook = NULL ;
br_fdb_fini ( ) ;
}
EXPORT_SYMBOL ( br_should_route_hook ) ;
module_init ( br_init )
module_exit ( br_deinit )
MODULE_LICENSE ( " GPL " ) ;
2005-12-22 06:01:30 +03:00
MODULE_VERSION ( BR_VERSION ) ;