diff options
| author | Alexey Dobriyan <adobriyan@gmail.com> | 2008-11-25 18:00:48 -0800 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-11-25 18:00:48 -0800 | 
| commit | b27aeadb5948d400df83db4d29590fb9862ba49d (patch) | |
| tree | f76cc43150164facbb890e4d5c619a99fe6ce303 /net/xfrm | |
| parent | c68cd1a01ba56995d85a4a62b195b2b3f6415c64 (diff) | |
| download | linux-b27aeadb5948d400df83db4d29590fb9862ba49d.tar.bz2 | |
netns xfrm: per-netns sysctls
Make
	net.core.xfrm_aevent_etime
	net.core.xfrm_acq_expires
	net.core.xfrm_aevent_rseqth
	net.core.xfrm_larval_drop
sysctls per-netns.
For that make net_core_path[] global, register it to prevent two
/proc/net/core antries and change initcall position -- xfrm_init() is called
from fs_initcall, so this one should be fs_initcall at least.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm')
| -rw-r--r-- | net/xfrm/Makefile | 4 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 10 | ||||
| -rw-r--r-- | net/xfrm/xfrm_state.c | 16 | ||||
| -rw-r--r-- | net/xfrm/xfrm_sysctl.c | 85 | ||||
| -rw-r--r-- | net/xfrm/xfrm_user.c | 4 | 
5 files changed, 100 insertions, 19 deletions
| diff --git a/net/xfrm/Makefile b/net/xfrm/Makefile index 0f439a72ccab..c631047e1b27 100644 --- a/net/xfrm/Makefile +++ b/net/xfrm/Makefile @@ -3,8 +3,8 @@  #  obj-$(CONFIG_XFRM) := xfrm_policy.o xfrm_state.o xfrm_hash.o \ -		      xfrm_input.o xfrm_output.o xfrm_algo.o +		      xfrm_input.o xfrm_output.o xfrm_algo.o \ +		      xfrm_sysctl.o  obj-$(CONFIG_XFRM_STATISTICS) += xfrm_proc.o  obj-$(CONFIG_XFRM_USER) += xfrm_user.o  obj-$(CONFIG_XFRM_IPCOMP) += xfrm_ipcomp.o - diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 38822b34ba7d..393cc65dbfa4 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -34,8 +34,6 @@  #include "xfrm_hash.h" -int sysctl_xfrm_larval_drop __read_mostly = 1; -  DEFINE_MUTEX(xfrm_cfg_mutex);  EXPORT_SYMBOL(xfrm_cfg_mutex); @@ -1671,7 +1669,7 @@ restart:  		if (unlikely(nx<0)) {  			err = nx; -			if (err == -EAGAIN && sysctl_xfrm_larval_drop) { +			if (err == -EAGAIN && net->xfrm.sysctl_larval_drop) {  				/* EREMOTE tells the caller to generate  				 * a one-shot blackhole route.  				 */ @@ -2504,8 +2502,13 @@ static int __net_init xfrm_net_init(struct net *net)  	rv = xfrm_policy_init(net);  	if (rv < 0)  		goto out_policy; +	rv = xfrm_sysctl_init(net); +	if (rv < 0) +		goto out_sysctl;  	return 0; +out_sysctl: +	xfrm_policy_fini(net);  out_policy:  	xfrm_state_fini(net);  out_state: @@ -2516,6 +2519,7 @@ out_statistics:  static void __net_exit xfrm_net_exit(struct net *net)  { +	xfrm_sysctl_fini(net);  	xfrm_policy_fini(net);  	xfrm_state_fini(net);  	xfrm_statistics_fini(net); diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 662e47b0bcc3..2fd57f8f77c1 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -24,14 +24,6 @@  #include "xfrm_hash.h" -u32 sysctl_xfrm_aevent_etime __read_mostly = XFRM_AE_ETIME; -EXPORT_SYMBOL(sysctl_xfrm_aevent_etime); - -u32 sysctl_xfrm_aevent_rseqth __read_mostly = XFRM_AE_SEQT_SIZE; -EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth); - -u32 sysctl_xfrm_acq_expires __read_mostly = 30; -  /* Each xfrm_state may be linked to two tables:     1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl) @@ -851,8 +843,8 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,  				h = xfrm_spi_hash(net, &x->id.daddr, x->id.spi, x->id.proto, family);  				hlist_add_head(&x->byspi, net->xfrm.state_byspi+h);  			} -			x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires; -			x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ; +			x->lft.hard_add_expires_seconds = net->xfrm.sysctl_acq_expires; +			x->timer.expires = jiffies + net->xfrm.sysctl_acq_expires*HZ;  			add_timer(&x->timer);  			net->xfrm.state_num++;  			xfrm_hash_grow_check(net, x->bydst.next != NULL); @@ -1040,9 +1032,9 @@ static struct xfrm_state *__find_acq_core(struct net *net, unsigned short family  		x->props.family = family;  		x->props.mode = mode;  		x->props.reqid = reqid; -		x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires; +		x->lft.hard_add_expires_seconds = net->xfrm.sysctl_acq_expires;  		xfrm_state_hold(x); -		x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ; +		x->timer.expires = jiffies + net->xfrm.sysctl_acq_expires*HZ;  		add_timer(&x->timer);  		list_add(&x->km.all, &net->xfrm.state_all);  		hlist_add_head(&x->bydst, net->xfrm.state_bydst+h); diff --git a/net/xfrm/xfrm_sysctl.c b/net/xfrm/xfrm_sysctl.c new file mode 100644 index 000000000000..2e6ffb66f06f --- /dev/null +++ b/net/xfrm/xfrm_sysctl.c @@ -0,0 +1,85 @@ +#include <linux/sysctl.h> +#include <net/net_namespace.h> +#include <net/xfrm.h> + +static void __xfrm_sysctl_init(struct net *net) +{ +	net->xfrm.sysctl_aevent_etime = XFRM_AE_ETIME; +	net->xfrm.sysctl_aevent_rseqth = XFRM_AE_SEQT_SIZE; +	net->xfrm.sysctl_larval_drop = 1; +	net->xfrm.sysctl_acq_expires = 30; +} + +#ifdef CONFIG_SYSCTL +static struct ctl_table xfrm_table[] = { +	{ +		.ctl_name	= NET_CORE_AEVENT_ETIME, +		.procname	= "xfrm_aevent_etime", +		.maxlen		= sizeof(u32), +		.mode		= 0644, +		.proc_handler	= proc_dointvec +	}, +	{ +		.ctl_name	= NET_CORE_AEVENT_RSEQTH, +		.procname	= "xfrm_aevent_rseqth", +		.maxlen		= sizeof(u32), +		.mode		= 0644, +		.proc_handler	= proc_dointvec +	}, +	{ +		.ctl_name	= CTL_UNNUMBERED, +		.procname	= "xfrm_larval_drop", +		.maxlen		= sizeof(int), +		.mode		= 0644, +		.proc_handler	= proc_dointvec +	}, +	{ +		.ctl_name	= CTL_UNNUMBERED, +		.procname	= "xfrm_acq_expires", +		.maxlen		= sizeof(int), +		.mode		= 0644, +		.proc_handler	= proc_dointvec +	}, +	{} +}; + +int __net_init xfrm_sysctl_init(struct net *net) +{ +	struct ctl_table *table; + +	__xfrm_sysctl_init(net); + +	table = kmemdup(xfrm_table, sizeof(xfrm_table), GFP_KERNEL); +	if (!table) +		goto out_kmemdup; +	table[0].data = &net->xfrm.sysctl_aevent_etime; +	table[1].data = &net->xfrm.sysctl_aevent_rseqth; +	table[2].data = &net->xfrm.sysctl_larval_drop; +	table[3].data = &net->xfrm.sysctl_acq_expires; + +	net->xfrm.sysctl_hdr = register_net_sysctl_table(net, net_core_path, table); +	if (!net->xfrm.sysctl_hdr) +		goto out_register; +	return 0; + +out_register: +	kfree(table); +out_kmemdup: +	return -ENOMEM; +} + +void xfrm_sysctl_fini(struct net *net) +{ +	struct ctl_table *table; + +	table = net->xfrm.sysctl_hdr->ctl_table_arg; +	unregister_net_sysctl_table(net->xfrm.sysctl_hdr); +	kfree(table); +} +#else +int __net_init xfrm_sysctl_init(struct net *net) +{ +	__xfrm_sysctl_init(net); +	return 0; +} +#endif diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index b7240d5b77ad..38ffaf33312e 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -368,9 +368,9 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,  		goto error;  	x->km.seq = p->seq; -	x->replay_maxdiff = sysctl_xfrm_aevent_rseqth; +	x->replay_maxdiff = net->xfrm.sysctl_aevent_rseqth;  	/* sysctl_xfrm_aevent_etime is in 100ms units */ -	x->replay_maxage = (sysctl_xfrm_aevent_etime*HZ)/XFRM_AE_ETH_M; +	x->replay_maxage = (net->xfrm.sysctl_aevent_etime*HZ)/XFRM_AE_ETH_M;  	x->preplay.bitmap = 0;  	x->preplay.seq = x->replay.seq+x->replay_maxdiff;  	x->preplay.oseq = x->replay.oseq +x->replay_maxdiff; |