diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-10-10 23:28:33 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-10-14 18:00:59 +0200 |
commit | 99633ab29b2131b68089a6c7f60458390860e044 (patch) | |
tree | eb7e2ecd9ed875ed4d3a050b95ed3d77bbde762b /net/ipv4/netfilter/nf_tables_ipv4.c | |
parent | eb31628e37a0a4e01fffd79dcc7f815d2357f53a (diff) | |
download | linux-99633ab29b2131b68089a6c7f60458390860e044.tar.gz linux-99633ab29b2131b68089a6c7f60458390860e044.tar.bz2 linux-99633ab29b2131b68089a6c7f60458390860e044.zip |
netfilter: nf_tables: complete net namespace support
Register family per netnamespace to ensure that sets are
only visible in its approapriate namespace.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net/ipv4/netfilter/nf_tables_ipv4.c')
-rw-r--r-- | net/ipv4/netfilter/nf_tables_ipv4.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/net/ipv4/netfilter/nf_tables_ipv4.c b/net/ipv4/netfilter/nf_tables_ipv4.c index c61cffb9b760..8f7536be1322 100644 --- a/net/ipv4/netfilter/nf_tables_ipv4.c +++ b/net/ipv4/netfilter/nf_tables_ipv4.c @@ -14,6 +14,7 @@ #include <linux/ip.h> #include <linux/netfilter_ipv4.h> #include <net/netfilter/nf_tables.h> +#include <net/net_namespace.h> #include <net/ip.h> #include <net/net_namespace.h> #include <net/netfilter/nf_tables_ipv4.h> @@ -47,6 +48,33 @@ static struct nft_af_info nft_af_ipv4 __read_mostly = { }, }; +static int nf_tables_ipv4_init_net(struct net *net) +{ + net->nft.ipv4 = kmalloc(sizeof(struct nft_af_info), GFP_KERNEL); + if (net->nft.ipv4 == NULL) + return -ENOMEM; + + memcpy(net->nft.ipv4, &nft_af_ipv4, sizeof(nft_af_ipv4)); + + if (nft_register_afinfo(net, net->nft.ipv4) < 0) + goto err; + + return 0; +err: + kfree(net->nft.ipv4); + return -ENOMEM; +} + +static void nf_tables_ipv4_exit_net(struct net *net) +{ + nft_unregister_afinfo(net->nft.ipv4); + kfree(net->nft.ipv4); +} + +static struct pernet_operations nf_tables_ipv4_net_ops = { + .init = nf_tables_ipv4_init_net, + .exit = nf_tables_ipv4_exit_net, +}; static unsigned int nft_do_chain_ipv4(const struct nf_hook_ops *ops, @@ -83,12 +111,12 @@ static struct nf_chain_type filter_ipv4 = { static int __init nf_tables_ipv4_init(void) { nft_register_chain_type(&filter_ipv4); - return nft_register_afinfo(&nft_af_ipv4); + return register_pernet_subsys(&nf_tables_ipv4_net_ops); } static void __exit nf_tables_ipv4_exit(void) { - nft_unregister_afinfo(&nft_af_ipv4); + unregister_pernet_subsys(&nf_tables_ipv4_net_ops); nft_unregister_chain_type(&filter_ipv4); } |