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) { 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_nf_core_init(); if (err) goto err_out2; err = register_netdevice_notifier(&br_device_notifier); if (err) goto err_out3; err = register_netdev_switch_notifier(&br_netdev_switch_notifier); if (err) goto err_out4; err = br_netlink_init(); if (err) goto err_out5; brioctl_set(br_ioctl_deviceless_stub); #if IS_ENABLED(CONFIG_ATM_LANE) br_fdb_test_addr_hook = br_fdb_test_addr; #endif pr_info("bridge: automatic filtering via arp/ip/ip6tables has been " "deprecated. Update your scripts to load br_netfilter if you " "need this.\n"); return 0; err_out5: unregister_netdev_switch_notifier(&br_netdev_switch_notifier); err_out4: unregister_netdevice_notifier(&br_device_notifier); err_out3: br_nf_core_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) { 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 int __init br_init(void) { printk(KERN_INFO "NET4: Ethernet Bridge 008 for NET4.0\n"); br_fdb_init(); br_handle_frame_hook = br_handle_frame; br_ioctl_hook = br_ioctl_deviceless_stub; #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_get_hook = br_fdb_get; br_fdb_put_hook = br_fdb_put; #endif register_netdevice_notifier(&br_device_notifier); return 0; }
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 int __init br_init(void) { br_fdb_init(); #ifdef CONFIG_BRIDGE_NETFILTER if (br_netfilter_init()) return 1; #endif brioctl_set(br_ioctl_deviceless_stub); br_handle_frame_hook = br_handle_frame; #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) br_fdb_get_hook = br_fdb_get; br_fdb_put_hook = br_fdb_put; #endif register_netdevice_notifier(&br_device_notifier); return 0; }
static int __init br_init(void) { int err; BUILD_BUG_ON(sizeof(struct br_input_skb_cb) > FIELD_SIZEOF(struct sk_buff, cb)); 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_nf_core_init(); if (err) goto err_out2; err = register_netdevice_notifier(&br_device_notifier); if (err) goto err_out3; err = register_switchdev_notifier(&br_switchdev_notifier); if (err) goto err_out4; err = br_netlink_init(); if (err) goto err_out5; brioctl_set(br_ioctl_deviceless_stub); #if IS_ENABLED(CONFIG_ATM_LANE) br_fdb_test_addr_hook = br_fdb_test_addr; #endif #if IS_MODULE(CONFIG_BRIDGE_NETFILTER) pr_info("bridge: filtering via arp/ip/ip6tables is no longer available " "by default. Update your scripts to load br_netfilter if you " "need this.\n"); #endif return 0; err_out5: unregister_switchdev_notifier(&br_switchdev_notifier); err_out4: unregister_netdevice_notifier(&br_device_notifier); err_out3: br_nf_core_fini(); err_out2: unregister_pernet_subsys(&br_net_ops); err_out1: br_fdb_fini(); err_out: stp_proto_unregister(&br_stp_proto); return err; }