linux/net/bridge/br.c
<<
>>
Prefs
   1/*
   2 *      Generic parts
   3 *      Linux ethernet bridge
   4 *
   5 *      Authors:
   6 *      Lennert Buytenhek               <buytenh@gnu.org>
   7 *
   8 *      This program is free software; you can redistribute it and/or
   9 *      modify it under the terms of the GNU General Public License
  10 *      as published by the Free Software Foundation; either version
  11 *      2 of the License, or (at your option) any later version.
  12 */
  13
  14#include <linux/module.h>
  15#include <linux/kernel.h>
  16#include <linux/netdevice.h>
  17#include <linux/etherdevice.h>
  18#include <linux/init.h>
  19#include <linux/llc.h>
  20#include <net/llc.h>
  21#include <net/stp.h>
  22
  23#include "br_private.h"
  24
  25int (*br_should_route_hook)(struct sk_buff *skb);
  26
  27static const struct stp_proto br_stp_proto = {
  28        .rcv    = br_stp_rcv,
  29};
  30
  31static struct pernet_operations br_net_ops = {
  32        .exit   = br_net_exit,
  33};
  34
  35static int __init br_init(void)
  36{
  37        int err;
  38
  39        err = stp_proto_register(&br_stp_proto);
  40        if (err < 0) {
  41                printk(KERN_ERR "bridge: can't register sap for STP\n");
  42                return err;
  43        }
  44
  45        err = br_fdb_init();
  46        if (err)
  47                goto err_out;
  48
  49        err = register_pernet_subsys(&br_net_ops);
  50        if (err)
  51                goto err_out1;
  52
  53        err = br_netfilter_init();
  54        if (err)
  55                goto err_out2;
  56
  57        err = register_netdevice_notifier(&br_device_notifier);
  58        if (err)
  59                goto err_out3;
  60
  61        err = br_netlink_init();
  62        if (err)
  63                goto err_out4;
  64
  65        brioctl_set(br_ioctl_deviceless_stub);
  66        br_handle_frame_hook = br_handle_frame;
  67
  68#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
  69        br_fdb_test_addr_hook = br_fdb_test_addr;
  70#endif
  71
  72        return 0;
  73err_out4:
  74        unregister_netdevice_notifier(&br_device_notifier);
  75err_out3:
  76        br_netfilter_fini();
  77err_out2:
  78        unregister_pernet_subsys(&br_net_ops);
  79err_out1:
  80        br_fdb_fini();
  81err_out:
  82        stp_proto_unregister(&br_stp_proto);
  83        return err;
  84}
  85
  86static void __exit br_deinit(void)
  87{
  88        stp_proto_unregister(&br_stp_proto);
  89
  90        br_netlink_fini();
  91        unregister_netdevice_notifier(&br_device_notifier);
  92        brioctl_set(NULL);
  93
  94        unregister_pernet_subsys(&br_net_ops);
  95
  96        rcu_barrier(); /* Wait for completion of call_rcu()'s */
  97
  98        br_netfilter_fini();
  99#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
 100        br_fdb_test_addr_hook = NULL;
 101#endif
 102
 103        br_handle_frame_hook = NULL;
 104        br_fdb_fini();
 105}
 106
 107EXPORT_SYMBOL(br_should_route_hook);
 108
 109module_init(br_init)
 110module_exit(br_deinit)
 111MODULE_LICENSE("GPL");
 112MODULE_VERSION(BR_VERSION);
 113