summaryrefslogtreecommitdiffstats
path: root/net/bridge/br.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2014-09-18 05:29:03 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2014-09-26 12:42:31 -0400
commit34666d467cbf1e2e3c7bb15a63eccfb582cdd71f (patch)
treef4b44a26f14d9c06dbb2d5df9284f0a00ee974bc /net/bridge/br.c
parent7276ca3fa23864133f5ee7431c51546d9b7f695f (diff)
netfilter: bridge: move br_netfilter out of the core
Jesper reported that br_netfilter always registers the hooks since this is part of the bridge core. This harms performance for people that don't need this. This patch modularizes br_netfilter so it can be rmmod'ed, thus, the hooks can be unregistered. I think the bridge netfilter should have been a separated module since the beginning, Patrick agreed on that. Note that this is breaking compatibility for users that expect that bridge netfilter is going to be available after explicitly 'modprobe bridge' or via automatic load through brctl. However, the damage can be easily undone by modprobing br_netfilter. The bridge core also spots a message to provide a clue to people that didn't notice that this has been deprecated. On top of that, the plan is that nftables will not rely on this software layer, but integrate the connection tracking into the bridge layer to enable stateful filtering and NAT, which is was bridge netfilter users seem to require. This patch still keeps the fake_dst_ops in the bridge core, since this is required by when the bridge port is initialized. So we can safely modprobe/rmmod br_netfilter anytime. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Acked-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'net/bridge/br.c')
-rw-r--r--net/bridge/br.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/net/bridge/br.c b/net/bridge/br.c
index 1a755a1e5410..44425aff7cba 100644
--- a/net/bridge/br.c
+++ b/net/bridge/br.c
@@ -161,7 +161,7 @@ static int __init br_init(void)
161 if (err) 161 if (err)
162 goto err_out1; 162 goto err_out1;
163 163
164 err = br_netfilter_init(); 164 err = br_nf_core_init();
165 if (err) 165 if (err)
166 goto err_out2; 166 goto err_out2;
167 167
@@ -179,11 +179,16 @@ static int __init br_init(void)
179 br_fdb_test_addr_hook = br_fdb_test_addr; 179 br_fdb_test_addr_hook = br_fdb_test_addr;
180#endif 180#endif
181 181
182 pr_info("bridge: automatic filtering via arp/ip/ip6tables has been "
183 "deprecated. Update your scripts to load br_netfilter if you "
184 "need this.\n");
185
182 return 0; 186 return 0;
187
183err_out4: 188err_out4:
184 unregister_netdevice_notifier(&br_device_notifier); 189 unregister_netdevice_notifier(&br_device_notifier);
185err_out3: 190err_out3:
186 br_netfilter_fini(); 191 br_nf_core_fini();
187err_out2: 192err_out2:
188 unregister_pernet_subsys(&br_net_ops); 193 unregister_pernet_subsys(&br_net_ops);
189err_out1: 194err_out1:
@@ -196,20 +201,17 @@ err_out:
196static void __exit br_deinit(void) 201static void __exit br_deinit(void)
197{ 202{
198 stp_proto_unregister(&br_stp_proto); 203 stp_proto_unregister(&br_stp_proto);
199
200 br_netlink_fini(); 204 br_netlink_fini();
201 unregister_netdevice_notifier(&br_device_notifier); 205 unregister_netdevice_notifier(&br_device_notifier);
202 brioctl_set(NULL); 206 brioctl_set(NULL);
203
204 unregister_pernet_subsys(&br_net_ops); 207 unregister_pernet_subsys(&br_net_ops);
205 208
206 rcu_barrier(); /* Wait for completion of call_rcu()'s */ 209 rcu_barrier(); /* Wait for completion of call_rcu()'s */
207 210
208 br_netfilter_fini(); 211 br_nf_core_fini();
209#if IS_ENABLED(CONFIG_ATM_LANE) 212#if IS_ENABLED(CONFIG_ATM_LANE)
210 br_fdb_test_addr_hook = NULL; 213 br_fdb_test_addr_hook = NULL;
211#endif 214#endif
212
213 br_fdb_fini(); 215 br_fdb_fini();
214} 216}
215 217