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 -EADDRINUSE; } br_fdb_init(); err = br_netfilter_init(); if (err) goto err_out1; err = register_netdevice_notifier(&br_device_notifier); if (err) goto err_out2; br_netlink_init(); 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; err_out2: br_netfilter_fini(); err_out1: llc_sap_put(br_stp_sap); return err; }
static int __init br_init(void) { int err; err = stp_proto_register(&br_stp_proto); if (err < 0) { printk(KERN_ERR "bridge: can't register sap for STP\n"); return err; } err = br_fdb_init(); if (err) goto err_out; err = register_pernet_subsys(&br_net_ops); if (err) goto err_out1; err = br_netfilter_init(); if (err) goto err_out2; err = register_netdevice_notifier(&br_device_notifier); if (err) goto err_out3; err = br_netlink_init(); if (err) goto err_out4; get_ve0()->features |= VE_FEATURE_BRIDGE; brioctl_set(br_ioctl_deviceless_stub); br_handle_frame_hook = br_handle_frame; br_hard_xmit_hook = br_xmit; #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_test_addr_hook = br_fdb_test_addr; #endif return 0; err_out4: unregister_netdevice_notifier(&br_device_notifier); err_out3: br_netfilter_fini(); err_out2: unregister_pernet_subsys(&br_net_ops); err_out1: br_fdb_fini(); err_out: stp_proto_unregister(&br_stp_proto); return err; }
static int __init br_init(void) { int err; err = stp_proto_register(&br_stp_proto); if (err < 0) { pr_err("bridge: can't register sap for STP\n"); return err; } err = br_fdb_init(); if (err) goto err_out; err = register_pernet_subsys(&br_net_ops); if (err) goto err_out1; err = br_netfilter_init(); if (err) goto err_out2; err = register_netdevice_notifier(&br_device_notifier); if (err) goto err_out3; err = br_netlink_init(); if (err) goto err_out4; brioctl_set(br_ioctl_deviceless_stub); #if defined(CONFIG_NETFILTER_XT_MATCH_PHYSDEV) || defined(CONFIG_NETFILTER_XT_MATCH_PHYSDEV_MODULE) br_fdb_get_port_hook = br_fdb_get_port; #endif #if IS_ENABLED(CONFIG_ATM_LANE) br_fdb_test_addr_hook = br_fdb_test_addr; #endif return 0; err_out4: unregister_netdevice_notifier(&br_device_notifier); err_out3: br_netfilter_fini(); err_out2: unregister_pernet_subsys(&br_net_ops); err_out1: br_fdb_fini(); err_out: stp_proto_unregister(&br_stp_proto); return err; }
static void __exit br_deinit(void) { #ifdef CONFIG_NETFILTER br_netfilter_fini(); #endif unregister_netdevice_notifier(&br_device_notifier); br_call_ioctl_atomic(__br_clear_ioctl_hook); br_write_lock_bh(BR_NETPROTO_LOCK); br_handle_frame_hook = NULL; br_write_unlock_bh(BR_NETPROTO_LOCK); #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_get_hook = NULL; br_fdb_put_hook = NULL; #endif }
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 -EADDRINUSE; } //网桥数据库初始化,分配slab缓冲区 err = br_fdb_init(); if (err) goto err_out; //netfilter钩子初始 err = br_netfilter_init(); if (err) goto err_out1; ////在netdev_chain通知链表上注册 err = register_netdevice_notifier(&br_device_notifier); if (err) goto err_out2; err = br_netlink_init(); if (err) goto err_out3; //设置ioctl钩子函数:br_ioctl_hook //通过brctl addbr br0命令建立网桥,此处用户空间调用的brctl命令最终对应到内核中的br_ioctl_deviceless_stub处理函数 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; 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) { stp_proto_unregister(&br_stp_proto); br_netlink_fini(); unregister_netdevice_notifier(&br_device_notifier); brioctl_set(NULL); unregister_pernet_subsys(&br_net_ops); rcu_barrier(); /* Wait for completion of call_rcu()'s */ br_netfilter_fini(); #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_test_addr_hook = NULL; #endif br_fdb_fini(); }
static void __exit br_deinit(void) { stp_proto_unregister(&br_stp_proto); br_netlink_fini(); unregister_netdevice_notifier(&br_device_notifier); brioctl_set(NULL); unregister_pernet_subsys(&br_net_ops); rcu_barrier(); /* */ br_netfilter_fini(); #if IS_ENABLED(CONFIG_ATM_LANE) br_fdb_test_addr_hook = NULL; #endif br_fdb_fini(); }
static void __exit br_deinit(void) { #if defined(CONFIG_BRIDGE_NF_EBTABLES) || defined(CONFIG_BRIDGE_NF_EBTABLES_MODULE) br_netfilter_fini(); #endif unregister_netdevice_notifier(&br_device_notifier); rtnl_lock(); br_ioctl_hook = NULL; rtnl_unlock(); br_write_lock_bh(BR_NETPROTO_LOCK); br_handle_frame_hook = NULL; br_write_unlock_bh(BR_NETPROTO_LOCK); #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_get_hook = NULL; br_fdb_put_hook = NULL; #endif }
static void __exit br_deinit(void) { rcu_assign_pointer(br_stp_sap->rcv_func, NULL); br_netlink_fini(); br_netfilter_fini(); unregister_netdevice_notifier(&br_device_notifier); brioctl_set(NULL); br_cleanup_bridges(); synchronize_net(); llc_sap_put(br_stp_sap); br_fdb_get_hook = NULL; br_fdb_put_hook = NULL; br_handle_frame_hook = NULL; br_fdb_fini(); }
static void __exit br_deinit(void) { #ifdef CONFIG_BRIDGE_NETFILTER br_netfilter_fini(); #endif unregister_netdevice_notifier(&br_device_notifier); brioctl_set(NULL); br_cleanup_bridges(); synchronize_net(); #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_get_hook = NULL; br_fdb_put_hook = NULL; #endif br_handle_frame_hook = NULL; br_fdb_fini(); }