2005-04-16 15:20:36 -07: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-20 22:59:06 -08:00
# include <linux/llc.h>
# include <net/llc.h>
2008-07-05 21:25:56 -07:00
# include <net/stp.h>
2005-04-16 15:20:36 -07:00
# include "br_private.h"
2008-07-05 21:25:56 -07:00
static const struct stp_proto br_stp_proto = {
. rcv = br_stp_rcv ,
} ;
2006-03-20 22:59:06 -08:00
2008-09-08 16:20:18 -07:00
static struct pernet_operations br_net_ops = {
. exit = br_net_exit ,
} ;
2005-04-16 15:20:36 -07:00
static int __init br_init ( void )
{
2006-05-25 15:59:33 -07:00
int err ;
2008-07-05 21:25:56 -07:00
err = stp_proto_register ( & br_stp_proto ) ;
if ( err < 0 ) {
2010-05-10 09:31:09 +00:00
pr_err ( " bridge: can't register sap for STP \n " ) ;
2008-07-05 21:25:56 -07:00
return err ;
2006-03-20 22:59:06 -08:00
}
2007-04-07 18:57:07 +09:00
err = br_fdb_init ( ) ;
if ( err )
2007-11-29 23:41:43 +11:00
goto err_out ;
2005-04-16 15:20:36 -07:00
2008-09-08 16:20:18 -07:00
err = register_pernet_subsys ( & br_net_ops ) ;
2006-05-25 15:59:33 -07:00
if ( err )
goto err_out1 ;
2008-09-08 16:20:18 -07:00
err = br_netfilter_init ( ) ;
2006-05-25 15:59:33 -07:00
if ( err )
goto err_out2 ;
2008-09-08 16:20:18 -07:00
err = register_netdevice_notifier ( & br_device_notifier ) ;
2007-03-22 11:59:03 -07:00
if ( err )
goto err_out3 ;
2008-09-08 16:20:18 -07:00
err = br_netlink_init ( ) ;
if ( err )
goto err_out4 ;
2005-04-16 15:20:36 -07:00
brioctl_set ( br_ioctl_deviceless_stub ) ;
2011-12-12 02:58:25 +00:00
# if IS_ENABLED(CONFIG_ATM_LANE)
2009-06-05 05:35:28 +00:00
br_fdb_test_addr_hook = br_fdb_test_addr ;
# endif
2005-04-16 15:20:36 -07:00
return 0 ;
2008-09-08 16:20:18 -07:00
err_out4 :
2007-03-22 11:59:03 -07:00
unregister_netdevice_notifier ( & br_device_notifier ) ;
2008-09-08 16:20:18 -07:00
err_out3 :
2006-05-25 15:59:33 -07:00
br_netfilter_fini ( ) ;
2008-09-08 16:20:18 -07:00
err_out2 :
unregister_pernet_subsys ( & br_net_ops ) ;
2006-05-25 15:59:33 -07:00
err_out1 :
2007-11-29 23:41:43 +11:00
br_fdb_fini ( ) ;
err_out :
2008-07-05 21:25:56 -07:00
stp_proto_unregister ( & br_stp_proto ) ;
2006-05-25 15:59:33 -07:00
return err ;
2005-04-16 15:20:36 -07:00
}
static void __exit br_deinit ( void )
{
2008-07-05 21:25:56 -07:00
stp_proto_unregister ( & br_stp_proto ) ;
2006-03-20 22:59:06 -08:00
2006-05-25 16:00:12 -07:00
br_netlink_fini ( ) ;
2005-04-16 15:20:36 -07:00
unregister_netdevice_notifier ( & br_device_notifier ) ;
brioctl_set ( NULL ) ;
2008-09-08 16:20:18 -07:00
unregister_pernet_subsys ( & br_net_ops ) ;
2005-04-16 15:20:36 -07:00
2009-06-26 10:45:48 +00:00
rcu_barrier ( ) ; /* Wait for completion of call_rcu()'s */
2005-04-16 15:20:36 -07:00
2008-04-29 03:18:13 -07:00
br_netfilter_fini ( ) ;
2011-12-12 02:58:25 +00:00
# if IS_ENABLED(CONFIG_ATM_LANE)
2009-06-05 05:35:28 +00:00
br_fdb_test_addr_hook = NULL ;
# endif
2005-04-16 15:20:36 -07:00
br_fdb_fini ( ) ;
}
module_init ( br_init )
module_exit ( br_deinit )
MODULE_LICENSE ( " GPL " ) ;
2005-12-21 19:01:30 -08:00
MODULE_VERSION ( BR_VERSION ) ;
2011-04-04 14:03:32 +00:00
MODULE_ALIAS_RTNL_LINK ( " bridge " ) ;