diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/sysctl_net_core.c | 42 | ||||
| -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 | 
6 files changed, 105 insertions, 56 deletions
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index 2bc0384b044..83d3398559e 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c @@ -12,7 +12,6 @@  #include <linux/netdevice.h>  #include <linux/init.h>  #include <net/sock.h> -#include <net/xfrm.h>  static struct ctl_table net_core_table[] = {  #ifdef CONFIG_NET @@ -89,40 +88,6 @@ static struct ctl_table net_core_table[] = {  		.mode		= 0644,  		.proc_handler	= proc_dointvec  	}, -#ifdef CONFIG_XFRM -	{ -		.ctl_name	= NET_CORE_AEVENT_ETIME, -		.procname	= "xfrm_aevent_etime", -		.data		= &sysctl_xfrm_aevent_etime, -		.maxlen		= sizeof(u32), -		.mode		= 0644, -		.proc_handler	= proc_dointvec -	}, -	{ -		.ctl_name	= NET_CORE_AEVENT_RSEQTH, -		.procname	= "xfrm_aevent_rseqth", -		.data		= &sysctl_xfrm_aevent_rseqth, -		.maxlen		= sizeof(u32), -		.mode		= 0644, -		.proc_handler	= proc_dointvec -	}, -	{ -		.ctl_name	= CTL_UNNUMBERED, -		.procname	= "xfrm_larval_drop", -		.data		= &sysctl_xfrm_larval_drop, -		.maxlen		= sizeof(int), -		.mode		= 0644, -		.proc_handler	= proc_dointvec -	}, -	{ -		.ctl_name	= CTL_UNNUMBERED, -		.procname	= "xfrm_acq_expires", -		.data		= &sysctl_xfrm_acq_expires, -		.maxlen		= sizeof(int), -		.mode		= 0644, -		.proc_handler	= proc_dointvec -	}, -#endif /* CONFIG_XFRM */  #endif /* CONFIG_NET */  	{  		.ctl_name	= NET_CORE_BUDGET, @@ -155,7 +120,7 @@ static struct ctl_table netns_core_table[] = {  	{ .ctl_name = 0 }  }; -static __net_initdata struct ctl_path net_core_path[] = { +__net_initdata struct ctl_path net_core_path[] = {  	{ .procname = "net", .ctl_name = CTL_NET, },  	{ .procname = "core", .ctl_name = NET_CORE, },  	{ }, @@ -207,8 +172,11 @@ static __net_initdata struct pernet_operations sysctl_core_ops = {  static __init int sysctl_core_init(void)  { +	static struct ctl_table empty[1]; + +	register_sysctl_paths(net_core_path, empty);  	register_net_sysctl_rotable(net_core_path, net_core_table);  	return register_pernet_subsys(&sysctl_core_ops);  } -__initcall(sysctl_core_init); +fs_initcall(sysctl_core_init); diff --git a/net/xfrm/Makefile b/net/xfrm/Makefile index 0f439a72cca..c631047e1b2 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 38822b34ba7..393cc65dbfa 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 662e47b0bcc..2fd57f8f77c 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 00000000000..2e6ffb66f06 --- /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 b7240d5b77a..38ffaf33312 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;  |