Skip to content

Commit

Permalink
xfrm: make gc_thresh configurable in all namespaces
Browse files Browse the repository at this point in the history
The xfrm gc threshold can be configured via xfrm{4,6}_gc_thresh
sysctl but currently only in init_net, other namespaces always
use the default value. This can substantially limit the number
of IPsec tunnels that can be effectively used.

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
  • Loading branch information
mkubecek authored and klassert committed Feb 6, 2013
1 parent 1f53c80 commit 8d06887
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 8 deletions.
1 change: 1 addition & 0 deletions include/net/netns/ipv4.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ struct netns_ipv4 {
struct ctl_table_header *frags_hdr;
struct ctl_table_header *ipv4_hdr;
struct ctl_table_header *route_hdr;
struct ctl_table_header *xfrm4_hdr;
#endif
struct ipv4_devconf *devconf_all;
struct ipv4_devconf *devconf_dflt;
Expand Down
1 change: 1 addition & 0 deletions include/net/netns/ipv6.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct netns_sysctl_ipv6 {
struct ctl_table_header *route_hdr;
struct ctl_table_header *icmp_hdr;
struct ctl_table_header *frags_hdr;
struct ctl_table_header *xfrm6_hdr;
#endif
int bindv6only;
int flush_delay;
Expand Down
49 changes: 46 additions & 3 deletions net/ipv4/xfrm4_policy.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,51 @@ static struct ctl_table xfrm4_policy_table[] = {
{ }
};

static struct ctl_table_header *sysctl_hdr;
static int __net_init xfrm4_net_init(struct net *net)
{
struct ctl_table *table;
struct ctl_table_header *hdr;

table = xfrm4_policy_table;
if (!net_eq(net, &init_net)) {
table = kmemdup(table, sizeof(xfrm4_policy_table), GFP_KERNEL);
if (!table)
goto err_alloc;

table[0].data = &net->xfrm.xfrm4_dst_ops.gc_thresh;
}

hdr = register_net_sysctl(net, "net/ipv4", table);
if (!hdr)
goto err_reg;

net->ipv4.xfrm4_hdr = hdr;
return 0;

err_reg:
if (!net_eq(net, &init_net))
kfree(table);
err_alloc:
return -ENOMEM;
}

static void __net_exit xfrm4_net_exit(struct net *net)
{
struct ctl_table *table;

if (net->ipv4.xfrm4_hdr == NULL)
return;

table = net->ipv4.xfrm4_hdr->ctl_table_arg;
unregister_net_sysctl_table(net->ipv4.xfrm4_hdr);
if (!net_eq(net, &init_net))
kfree(table);
}

static struct pernet_operations __net_initdata xfrm4_net_ops = {
.init = xfrm4_net_init,
.exit = xfrm4_net_exit,
};
#endif

static void __init xfrm4_policy_init(void)
Expand All @@ -277,8 +321,7 @@ void __init xfrm4_init(void)
xfrm4_state_init();
xfrm4_policy_init();
#ifdef CONFIG_SYSCTL
sysctl_hdr = register_net_sysctl(&init_net, "net/ipv4",
xfrm4_policy_table);
register_pernet_subsys(&xfrm4_net_ops);
#endif
}

52 changes: 47 additions & 5 deletions net/ipv6/xfrm6_policy.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,51 @@ static struct ctl_table xfrm6_policy_table[] = {
{ }
};

static struct ctl_table_header *sysctl_hdr;
static int __net_init xfrm6_net_init(struct net *net)
{
struct ctl_table *table;
struct ctl_table_header *hdr;

table = xfrm6_policy_table;
if (!net_eq(net, &init_net)) {
table = kmemdup(table, sizeof(xfrm6_policy_table), GFP_KERNEL);
if (!table)
goto err_alloc;

table[0].data = &net->xfrm.xfrm6_dst_ops.gc_thresh;
}

hdr = register_net_sysctl(net, "net/ipv6", table);
if (!hdr)
goto err_reg;

net->ipv6.sysctl.xfrm6_hdr = hdr;
return 0;

err_reg:
if (!net_eq(net, &init_net))
kfree(table);
err_alloc:
return -ENOMEM;
}

static void __net_exit xfrm6_net_exit(struct net *net)
{
struct ctl_table *table;

if (net->ipv6.sysctl.xfrm6_hdr == NULL)
return;

table = net->ipv6.sysctl.xfrm6_hdr->ctl_table_arg;
unregister_net_sysctl_table(net->ipv6.sysctl.xfrm6_hdr);
if (!net_eq(net, &init_net))
kfree(table);
}

static struct pernet_operations xfrm6_net_ops = {
.init = xfrm6_net_init,
.exit = xfrm6_net_exit,
};
#endif

int __init xfrm6_init(void)
Expand All @@ -339,8 +383,7 @@ int __init xfrm6_init(void)
goto out_policy;

#ifdef CONFIG_SYSCTL
sysctl_hdr = register_net_sysctl(&init_net, "net/ipv6",
xfrm6_policy_table);
register_pernet_subsys(&xfrm6_net_ops);
#endif
out:
return ret;
Expand All @@ -352,8 +395,7 @@ int __init xfrm6_init(void)
void xfrm6_fini(void)
{
#ifdef CONFIG_SYSCTL
if (sysctl_hdr)
unregister_net_sysctl_table(sysctl_hdr);
unregister_pernet_subsys(&xfrm6_net_ops);
#endif
xfrm6_policy_fini();
xfrm6_state_fini();
Expand Down

0 comments on commit 8d06887

Please sign in to comment.