2005-04-17 02:20:36 +04:00
/*
* Generic parts
* Linux ethernet bridge
*
* Authors :
* Lennert Buytenhek < buytenh @ gnu . org >
*
* $ Id : br . c , v 1.47 2001 / 12 / 24 00 : 56 : 41 davem Exp $
*
* 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>
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
2006-03-21 09:59:06 +03:00
static struct llc_sap * br_stp_sap ;
2005-04-17 02:20:36 +04:00
static int __init br_init ( void )
{
2006-05-26 02:59:33 +04:00
int err ;
2006-03-21 09:59:06 +03:00
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 " ) ;
2006-05-26 02:59:33 +04:00
return - EADDRINUSE ;
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
2006-05-26 02:59:33 +04:00
err = br_netfilter_init ( ) ;
if ( err )
goto err_out1 ;
err = register_netdevice_notifier ( & br_device_notifier ) ;
if ( err )
goto err_out2 ;
2007-03-22 21:59:03 +03:00
err = br_netlink_init ( ) ;
if ( err )
goto err_out3 ;
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 ;
2007-03-22 21:59:03 +03:00
err_out3 :
unregister_netdevice_notifier ( & br_device_notifier ) ;
2006-05-26 02:59:33 +04:00
err_out2 :
br_netfilter_fini ( ) ;
err_out1 :
2007-11-29 15:41:43 +03:00
br_fdb_fini ( ) ;
err_out :
2006-05-26 02:59:33 +04:00
llc_sap_put ( br_stp_sap ) ;
return err ;
2005-04-17 02:20:36 +04:00
}
static void __exit br_deinit ( void )
{
2006-05-24 02:20:25 +04:00
rcu_assign_pointer ( br_stp_sap - > rcv_func , NULL ) ;
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
br_netfilter_fini ( ) ;
unregister_netdevice_notifier ( & br_device_notifier ) ;
brioctl_set ( NULL ) ;
br_cleanup_bridges ( ) ;
synchronize_net ( ) ;
2006-05-24 02:20:25 +04:00
llc_sap_put ( br_stp_sap ) ;
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 ) ;