diff options
Diffstat (limited to 'net/ipv6/sysctl_net_ipv6.c')
| -rw-r--r-- | net/ipv6/sysctl_net_ipv6.c | 96 | 
1 files changed, 48 insertions, 48 deletions
diff --git a/net/ipv6/sysctl_net_ipv6.c b/net/ipv6/sysctl_net_ipv6.c index fa1d8f4e005..058f3eca2e5 100644 --- a/net/ipv6/sysctl_net_ipv6.c +++ b/net/ipv6/sysctl_net_ipv6.c @@ -10,27 +10,37 @@  #include <linux/in6.h>  #include <linux/ipv6.h>  #include <linux/slab.h> +#include <linux/export.h>  #include <net/ndisc.h>  #include <net/ipv6.h>  #include <net/addrconf.h>  #include <net/inet_frag.h> -static ctl_table ipv6_table_template[] = { +static struct ctl_table ipv6_table_template[] = {  	{ -		.procname	= "route", -		.maxlen		= 0, -		.mode		= 0555, -		.child		= ipv6_route_table_template +		.procname	= "bindv6only", +		.data		= &init_net.ipv6.sysctl.bindv6only, +		.maxlen		= sizeof(int), +		.mode		= 0644, +		.proc_handler	= proc_dointvec  	},  	{ -		.procname	= "icmp", -		.maxlen		= 0, -		.mode		= 0555, -		.child		= ipv6_icmp_table_template +		.procname	= "anycast_src_echo_reply", +		.data		= &init_net.ipv6.sysctl.anycast_src_echo_reply, +		.maxlen		= sizeof(int), +		.mode		= 0644, +		.proc_handler	= proc_dointvec  	},  	{ -		.procname	= "bindv6only", -		.data		= &init_net.ipv6.sysctl.bindv6only, +		.procname	= "flowlabel_consistency", +		.data		= &init_net.ipv6.sysctl.flowlabel_consistency, +		.maxlen		= sizeof(int), +		.mode		= 0644, +		.proc_handler	= proc_dointvec +	}, +	{ +		.procname	= "fwmark_reflect", +		.data		= &init_net.ipv6.sysctl.fwmark_reflect,  		.maxlen		= sizeof(int),  		.mode		= 0644,  		.proc_handler	= proc_dointvec @@ -38,7 +48,7 @@ static ctl_table ipv6_table_template[] = {  	{ }  }; -static ctl_table ipv6_rotable[] = { +static struct ctl_table ipv6_rotable[] = {  	{  		.procname	= "mld_max_msf",  		.data		= &sysctl_mld_max_msf, @@ -49,13 +59,6 @@ static ctl_table ipv6_rotable[] = {  	{ }  }; -struct ctl_path net_ipv6_ctl_path[] = { -	{ .procname = "net", }, -	{ .procname = "ipv6", }, -	{ }, -}; -EXPORT_SYMBOL_GPL(net_ipv6_ctl_path); -  static int __net_init ipv6_sysctl_net_init(struct net *net)  {  	struct ctl_table *ipv6_table; @@ -68,28 +71,39 @@ static int __net_init ipv6_sysctl_net_init(struct net *net)  			     GFP_KERNEL);  	if (!ipv6_table)  		goto out; +	ipv6_table[0].data = &net->ipv6.sysctl.bindv6only; +	ipv6_table[1].data = &net->ipv6.sysctl.anycast_src_echo_reply; +	ipv6_table[2].data = &net->ipv6.sysctl.flowlabel_consistency;  	ipv6_route_table = ipv6_route_sysctl_init(net);  	if (!ipv6_route_table)  		goto out_ipv6_table; -	ipv6_table[0].child = ipv6_route_table;  	ipv6_icmp_table = ipv6_icmp_sysctl_init(net);  	if (!ipv6_icmp_table)  		goto out_ipv6_route_table; -	ipv6_table[1].child = ipv6_icmp_table; - -	ipv6_table[2].data = &net->ipv6.sysctl.bindv6only; -	net->ipv6.sysctl.table = register_net_sysctl_table(net, net_ipv6_ctl_path, -							   ipv6_table); -	if (!net->ipv6.sysctl.table) +	net->ipv6.sysctl.hdr = register_net_sysctl(net, "net/ipv6", ipv6_table); +	if (!net->ipv6.sysctl.hdr)  		goto out_ipv6_icmp_table; +	net->ipv6.sysctl.route_hdr = +		register_net_sysctl(net, "net/ipv6/route", ipv6_route_table); +	if (!net->ipv6.sysctl.route_hdr) +		goto out_unregister_ipv6_table; + +	net->ipv6.sysctl.icmp_hdr = +		register_net_sysctl(net, "net/ipv6/icmp", ipv6_icmp_table); +	if (!net->ipv6.sysctl.icmp_hdr) +		goto out_unregister_route_table; +  	err = 0;  out:  	return err; - +out_unregister_route_table: +	unregister_net_sysctl_table(net->ipv6.sysctl.route_hdr); +out_unregister_ipv6_table: +	unregister_net_sysctl_table(net->ipv6.sysctl.hdr);  out_ipv6_icmp_table:  	kfree(ipv6_icmp_table);  out_ipv6_route_table: @@ -105,11 +119,13 @@ static void __net_exit ipv6_sysctl_net_exit(struct net *net)  	struct ctl_table *ipv6_route_table;  	struct ctl_table *ipv6_icmp_table; -	ipv6_table = net->ipv6.sysctl.table->ctl_table_arg; -	ipv6_route_table = ipv6_table[0].child; -	ipv6_icmp_table = ipv6_table[1].child; +	ipv6_table = net->ipv6.sysctl.hdr->ctl_table_arg; +	ipv6_route_table = net->ipv6.sysctl.route_hdr->ctl_table_arg; +	ipv6_icmp_table = net->ipv6.sysctl.icmp_hdr->ctl_table_arg; -	unregister_net_sysctl_table(net->ipv6.sysctl.table); +	unregister_net_sysctl_table(net->ipv6.sysctl.icmp_hdr); +	unregister_net_sysctl_table(net->ipv6.sysctl.route_hdr); +	unregister_net_sysctl_table(net->ipv6.sysctl.hdr);  	kfree(ipv6_table);  	kfree(ipv6_route_table); @@ -127,7 +143,7 @@ int ipv6_sysctl_register(void)  {  	int err = -ENOMEM; -	ip6_header = register_net_sysctl_rotable(net_ipv6_ctl_path, ipv6_rotable); +	ip6_header = register_net_sysctl(&init_net, "net/ipv6", ipv6_rotable);  	if (ip6_header == NULL)  		goto out; @@ -147,19 +163,3 @@ void ipv6_sysctl_unregister(void)  	unregister_net_sysctl_table(ip6_header);  	unregister_pernet_subsys(&ipv6_sysctl_net_ops);  } - -static struct ctl_table_header *ip6_base; - -int ipv6_static_sysctl_register(void) -{ -	static struct ctl_table empty[1]; -	ip6_base = register_sysctl_paths(net_ipv6_ctl_path, empty); -	if (ip6_base == NULL) -		return -ENOMEM; -	return 0; -} - -void ipv6_static_sysctl_unregister(void) -{ -	unregister_net_sysctl_table(ip6_base); -}  | 
