diff options
author | Patrick McHardy <kaber@trash.net> | 2014-01-03 12:16:13 +0000 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-01-07 23:50:43 +0100 |
commit | 3b088c4bc0035da662faa81818ba217e34c4bba4 (patch) | |
tree | 1d43e3ff229e464491a5764efae37ed030d11bd7 /net/netfilter | |
parent | 688d18636f77e360ae9078d7cd78a2556a1f35c1 (diff) |
netfilter: nf_tables: make chain types override the default AF functions
Currently the AF-specific hook functions override the chain-type specific
hook functions. That doesn't make too much sense since the chain types
are a special case of the AF-specific hooks.
Make the AF-specific hook functions the default and make the optional
chain type hooks override them.
As a side effect, the necessary code restructuring reduces the code size,
f.i. in case of nf_tables_ipv4.o:
nf_tables_ipv4_init_net | -24
nft_do_chain_ipv4 | -113
2 functions changed, 137 bytes removed, diff: -137
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net/netfilter')
-rw-r--r-- | net/netfilter/nf_tables_api.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 1fcef1ec1dc1..d568626bc0f9 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -927,9 +927,9 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, if (hooknum >= afi->nhooks) return -EINVAL; - hookfn = chain_type[family][type]->fn[hooknum]; - if (hookfn == NULL) + if (!(chain_type[family][type]->hook_mask & (1 << hooknum))) return -EOPNOTSUPP; + hookfn = chain_type[family][type]->fn[hooknum]; basechain = kzalloc(sizeof(*basechain), GFP_KERNEL); if (basechain == NULL) @@ -944,9 +944,9 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, ops->hooknum = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM])); ops->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY])); ops->priv = chain; - ops->hook = hookfn; - if (afi->hooks[ops->hooknum]) - ops->hook = afi->hooks[ops->hooknum]; + ops->hook = afi->hooks[ops->hooknum]; + if (hookfn) + ops->hook = hookfn; chain->flags |= NFT_BASE_CHAIN; |