Commit ba7d284a authored by Florian Westphal's avatar Florian Westphal Committed by Pablo Neira Ayuso

netfilter: xtables: allow table definitions not backed by hook_ops

The ip(6)tables nat table is currently receiving skbs from the netfilter
core, after a followup patch skbs will be coming from the netfilter nat
core instead, so the table is no longer backed by normal hook_ops.
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 1f55236b
...@@ -1782,6 +1782,8 @@ int ipt_register_table(struct net *net, const struct xt_table *table, ...@@ -1782,6 +1782,8 @@ int ipt_register_table(struct net *net, const struct xt_table *table,
/* set res now, will see skbs right after nf_register_net_hooks */ /* set res now, will see skbs right after nf_register_net_hooks */
WRITE_ONCE(*res, new_table); WRITE_ONCE(*res, new_table);
if (!ops)
return 0;
ret = nf_register_net_hooks(net, ops, hweight32(table->valid_hooks)); ret = nf_register_net_hooks(net, ops, hweight32(table->valid_hooks));
if (ret != 0) { if (ret != 0) {
...@@ -1799,6 +1801,7 @@ int ipt_register_table(struct net *net, const struct xt_table *table, ...@@ -1799,6 +1801,7 @@ int ipt_register_table(struct net *net, const struct xt_table *table,
void ipt_unregister_table(struct net *net, struct xt_table *table, void ipt_unregister_table(struct net *net, struct xt_table *table,
const struct nf_hook_ops *ops) const struct nf_hook_ops *ops)
{ {
if (ops)
nf_unregister_net_hooks(net, ops, hweight32(table->valid_hooks)); nf_unregister_net_hooks(net, ops, hweight32(table->valid_hooks));
__ipt_unregister_table(net, table); __ipt_unregister_table(net, table);
} }
......
...@@ -1792,6 +1792,8 @@ int ip6t_register_table(struct net *net, const struct xt_table *table, ...@@ -1792,6 +1792,8 @@ int ip6t_register_table(struct net *net, const struct xt_table *table,
/* set res now, will see skbs right after nf_register_net_hooks */ /* set res now, will see skbs right after nf_register_net_hooks */
WRITE_ONCE(*res, new_table); WRITE_ONCE(*res, new_table);
if (!ops)
return 0;
ret = nf_register_net_hooks(net, ops, hweight32(table->valid_hooks)); ret = nf_register_net_hooks(net, ops, hweight32(table->valid_hooks));
if (ret != 0) { if (ret != 0) {
...@@ -1809,6 +1811,7 @@ int ip6t_register_table(struct net *net, const struct xt_table *table, ...@@ -1809,6 +1811,7 @@ int ip6t_register_table(struct net *net, const struct xt_table *table,
void ip6t_unregister_table(struct net *net, struct xt_table *table, void ip6t_unregister_table(struct net *net, struct xt_table *table,
const struct nf_hook_ops *ops) const struct nf_hook_ops *ops)
{ {
if (ops)
nf_unregister_net_hooks(net, ops, hweight32(table->valid_hooks)); nf_unregister_net_hooks(net, ops, hweight32(table->valid_hooks));
__ip6t_unregister_table(net, table); __ip6t_unregister_table(net, table);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment