Skip to content

Commit

Permalink
netfilter: nf_tables: get rid of pernet families
Browse files Browse the repository at this point in the history
Now that we have a single table list for each netns, we can get rid of
one pointer per family and the global afinfo list, thus, shrinking
struct netns for nftables that now becomes 64 bytes smaller.

And call __nft_release_afinfo() from __net_exit path accordingly to
release netnamespace objects on removal.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
Pablo Neira Ayuso committed Jan 10, 2018
1 parent 36596da commit dd4cbef
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 239 deletions.
4 changes: 2 additions & 2 deletions include/net/netfilter/nf_tables.h
Original file line number Diff line number Diff line change
Expand Up @@ -979,8 +979,8 @@ struct nft_af_info {
struct module *owner;
};

int nft_register_afinfo(struct net *, struct nft_af_info *);
void nft_unregister_afinfo(struct net *, struct nft_af_info *);
int nft_register_afinfo(struct nft_af_info *);
void nft_unregister_afinfo(struct nft_af_info *);

int nft_register_chain_type(const struct nf_chain_type *);
void nft_unregister_chain_type(const struct nf_chain_type *);
Expand Down
7 changes: 0 additions & 7 deletions include/net/netns/nftables.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,8 @@
struct nft_af_info;

struct netns_nftables {
struct list_head af_info;
struct list_head tables;
struct list_head commit_list;
struct nft_af_info *ipv4;
struct nft_af_info *ipv6;
struct nft_af_info *inet;
struct nft_af_info *arp;
struct nft_af_info *bridge;
struct nft_af_info *netdev;
unsigned int base_seq;
u8 gencursor;
};
Expand Down
38 changes: 5 additions & 33 deletions net/bridge/netfilter/nf_tables_bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,34 +47,6 @@ static struct nft_af_info nft_af_bridge __read_mostly = {
.owner = THIS_MODULE,
};

static int nf_tables_bridge_init_net(struct net *net)
{
net->nft.bridge = kmalloc(sizeof(struct nft_af_info), GFP_KERNEL);
if (net->nft.bridge == NULL)
return -ENOMEM;

memcpy(net->nft.bridge, &nft_af_bridge, sizeof(nft_af_bridge));

if (nft_register_afinfo(net, net->nft.bridge) < 0)
goto err;

return 0;
err:
kfree(net->nft.bridge);
return -ENOMEM;
}

static void nf_tables_bridge_exit_net(struct net *net)
{
nft_unregister_afinfo(net, net->nft.bridge);
kfree(net->nft.bridge);
}

static struct pernet_operations nf_tables_bridge_net_ops = {
.init = nf_tables_bridge_init_net,
.exit = nf_tables_bridge_exit_net,
};

static const struct nf_chain_type filter_bridge = {
.name = "filter",
.type = NFT_CHAIN_T_DEFAULT,
Expand All @@ -98,26 +70,26 @@ static int __init nf_tables_bridge_init(void)
{
int ret;

ret = nft_register_chain_type(&filter_bridge);
ret = nft_register_afinfo(&nft_af_bridge);
if (ret < 0)
return ret;

ret = register_pernet_subsys(&nf_tables_bridge_net_ops);
ret = nft_register_chain_type(&filter_bridge);
if (ret < 0)
goto err_register_subsys;
goto err_register_chain;

return ret;

err_register_subsys:
err_register_chain:
nft_unregister_chain_type(&filter_bridge);

return ret;
}

static void __exit nf_tables_bridge_exit(void)
{
unregister_pernet_subsys(&nf_tables_bridge_net_ops);
nft_unregister_chain_type(&filter_bridge);
nft_unregister_afinfo(&nft_af_bridge);
}

module_init(nf_tables_bridge_init);
Expand Down
41 changes: 9 additions & 32 deletions net/ipv4/netfilter/nf_tables_arp.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,34 +32,6 @@ static struct nft_af_info nft_af_arp __read_mostly = {
.owner = THIS_MODULE,
};

static int nf_tables_arp_init_net(struct net *net)
{
net->nft.arp = kmalloc(sizeof(struct nft_af_info), GFP_KERNEL);
if (net->nft.arp== NULL)
return -ENOMEM;

memcpy(net->nft.arp, &nft_af_arp, sizeof(nft_af_arp));

if (nft_register_afinfo(net, net->nft.arp) < 0)
goto err;

return 0;
err:
kfree(net->nft.arp);
return -ENOMEM;
}

static void nf_tables_arp_exit_net(struct net *net)
{
nft_unregister_afinfo(net, net->nft.arp);
kfree(net->nft.arp);
}

static struct pernet_operations nf_tables_arp_net_ops = {
.init = nf_tables_arp_init_net,
.exit = nf_tables_arp_exit_net,
};

static const struct nf_chain_type filter_arp = {
.name = "filter",
.type = NFT_CHAIN_T_DEFAULT,
Expand All @@ -77,21 +49,26 @@ static int __init nf_tables_arp_init(void)
{
int ret;

ret = nft_register_chain_type(&filter_arp);
ret = nft_register_afinfo(&nft_af_arp);
if (ret < 0)
return ret;

ret = register_pernet_subsys(&nf_tables_arp_net_ops);
ret = nft_register_chain_type(&filter_arp);
if (ret < 0)
nft_unregister_chain_type(&filter_arp);
goto err_register_chain;

return 0;

err_register_chain:
nft_unregister_chain_type(&filter_arp);

return ret;
}

static void __exit nf_tables_arp_exit(void)
{
unregister_pernet_subsys(&nf_tables_arp_net_ops);
nft_unregister_chain_type(&filter_arp);
nft_unregister_afinfo(&nft_af_arp);
}

module_init(nf_tables_arp_init);
Expand Down
40 changes: 8 additions & 32 deletions net/ipv4/netfilter/nf_tables_ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,34 +35,6 @@ static struct nft_af_info nft_af_ipv4 __read_mostly = {
.owner = THIS_MODULE,
};

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, 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 const struct nf_chain_type filter_ipv4 = {
.name = "filter",
.type = NFT_CHAIN_T_DEFAULT,
Expand All @@ -86,21 +58,25 @@ static int __init nf_tables_ipv4_init(void)
{
int ret;

ret = nft_register_chain_type(&filter_ipv4);
ret = nft_register_afinfo(&nft_af_ipv4);
if (ret < 0)
return ret;

ret = register_pernet_subsys(&nf_tables_ipv4_net_ops);
ret = nft_register_chain_type(&filter_ipv4);
if (ret < 0)
nft_unregister_chain_type(&filter_ipv4);
goto err_register_chain;

return 0;

err_register_chain:
nft_unregister_afinfo(&nft_af_ipv4);
return ret;
}

static void __exit nf_tables_ipv4_exit(void)
{
unregister_pernet_subsys(&nf_tables_ipv4_net_ops);
nft_unregister_chain_type(&filter_ipv4);
nft_unregister_afinfo(&nft_af_ipv4);
}

module_init(nf_tables_ipv4_init);
Expand Down
40 changes: 8 additions & 32 deletions net/ipv6/netfilter/nf_tables_ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,34 +33,6 @@ static struct nft_af_info nft_af_ipv6 __read_mostly = {
.owner = THIS_MODULE,
};

static int nf_tables_ipv6_init_net(struct net *net)
{
net->nft.ipv6 = kmalloc(sizeof(struct nft_af_info), GFP_KERNEL);
if (net->nft.ipv6 == NULL)
return -ENOMEM;

memcpy(net->nft.ipv6, &nft_af_ipv6, sizeof(nft_af_ipv6));

if (nft_register_afinfo(net, net->nft.ipv6) < 0)
goto err;

return 0;
err:
kfree(net->nft.ipv6);
return -ENOMEM;
}

static void nf_tables_ipv6_exit_net(struct net *net)
{
nft_unregister_afinfo(net, net->nft.ipv6);
kfree(net->nft.ipv6);
}

static struct pernet_operations nf_tables_ipv6_net_ops = {
.init = nf_tables_ipv6_init_net,
.exit = nf_tables_ipv6_exit_net,
};

static const struct nf_chain_type filter_ipv6 = {
.name = "filter",
.type = NFT_CHAIN_T_DEFAULT,
Expand All @@ -84,20 +56,24 @@ static int __init nf_tables_ipv6_init(void)
{
int ret;

ret = nft_register_chain_type(&filter_ipv6);
ret = nft_register_afinfo(&nft_af_ipv6);
if (ret < 0)
return ret;

ret = register_pernet_subsys(&nf_tables_ipv6_net_ops);
ret = nft_register_chain_type(&filter_ipv6);
if (ret < 0)
nft_unregister_chain_type(&filter_ipv6);
goto err_register_chain;

return 0;

err_register_chain:
nft_unregister_afinfo(&nft_af_ipv6);
return ret;
}

static void __exit nf_tables_ipv6_exit(void)
{
unregister_pernet_subsys(&nf_tables_ipv6_net_ops);
nft_unregister_afinfo(&nft_af_ipv6);
nft_unregister_chain_type(&filter_ipv6);
}

Expand Down
Loading

0 comments on commit dd4cbef

Please sign in to comment.