mlx4_en: Convert the normal skb free path to dev_consume_skb_any()
[linux-2.6-block.git] / net / ipv6 / sysctl_net_ipv6.c
CommitLineData
1da177e4
LT
1/*
2 * sysctl_net_ipv6.c: sysctl interface to net IPV6 subsystem.
3 *
4 * Changes:
5 * YOSHIFUJI Hideaki @USAGI: added icmp sysctl table.
6 */
7
8#include <linux/mm.h>
9#include <linux/sysctl.h>
1da177e4
LT
10#include <linux/in6.h>
11#include <linux/ipv6.h>
5a0e3ad6 12#include <linux/slab.h>
bc3b2d7f 13#include <linux/export.h>
1da177e4
LT
14#include <net/ndisc.h>
15#include <net/ipv6.h>
16#include <net/addrconf.h>
04128f23 17#include <net/inet_frag.h>
1da177e4 18
fe2c6338 19static struct ctl_table ipv6_table_template[] = {
1da177e4 20 {
1da177e4 21 .procname = "bindv6only",
99bc9c4e 22 .data = &init_net.ipv6.sysctl.bindv6only,
1da177e4
LT
23 .maxlen = sizeof(int),
24 .mode = 0644,
6d9f239a 25 .proc_handler = proc_dointvec
1da177e4 26 },
509aba3b
FLB
27 {
28 .procname = "anycast_src_echo_reply",
ec35b61e 29 .data = &init_net.ipv6.sysctl.anycast_src_echo_reply,
509aba3b
FLB
30 .maxlen = sizeof(int),
31 .mode = 0644,
32 .proc_handler = proc_dointvec
33 },
6444f72b
FF
34 {
35 .procname = "flowlabel_consistency",
36 .data = &init_net.ipv6.sysctl.flowlabel_consistency,
37 .maxlen = sizeof(int),
38 .mode = 0644,
39 .proc_handler = proc_dointvec
40 },
cb1ce2ef
TH
41 {
42 .procname = "auto_flowlabels",
43 .data = &init_net.ipv6.sysctl.auto_flowlabels,
44 .maxlen = sizeof(int),
45 .mode = 0644,
46 .proc_handler = proc_dointvec
47 },
e110861f
LC
48 {
49 .procname = "fwmark_reflect",
50 .data = &init_net.ipv6.sysctl.fwmark_reflect,
51 .maxlen = sizeof(int),
52 .mode = 0644,
53 .proc_handler = proc_dointvec
54 },
f8572d8f 55 { }
34ac2573
PE
56};
57
fe2c6338 58static struct ctl_table ipv6_rotable[] = {
1da177e4 59 {
1da177e4
LT
60 .procname = "mld_max_msf",
61 .data = &sysctl_mld_max_msf,
62 .maxlen = sizeof(int),
63 .mode = 0644,
6d9f239a 64 .proc_handler = proc_dointvec
1da177e4 65 },
f8572d8f 66 { }
1da177e4
LT
67};
68
2c8c1e72 69static int __net_init ipv6_sysctl_net_init(struct net *net)
1da177e4 70{
760f2d01
DL
71 struct ctl_table *ipv6_table;
72 struct ctl_table *ipv6_route_table;
73 struct ctl_table *ipv6_icmp_table;
74 int err;
75
76 err = -ENOMEM;
77 ipv6_table = kmemdup(ipv6_table_template, sizeof(ipv6_table_template),
78 GFP_KERNEL);
79 if (!ipv6_table)
80 goto out;
6dceb036 81 ipv6_table[0].data = &net->ipv6.sysctl.bindv6only;
ec35b61e 82 ipv6_table[1].data = &net->ipv6.sysctl.anycast_src_echo_reply;
6444f72b 83 ipv6_table[2].data = &net->ipv6.sysctl.flowlabel_consistency;
cb1ce2ef 84 ipv6_table[3].data = &net->ipv6.sysctl.auto_flowlabels;
d247b6ab 85 ipv6_table[4].data = &net->ipv6.sysctl.fwmark_reflect;
760f2d01
DL
86
87 ipv6_route_table = ipv6_route_sysctl_init(net);
88 if (!ipv6_route_table)
89 goto out_ipv6_table;
90
91 ipv6_icmp_table = ipv6_icmp_sysctl_init(net);
92 if (!ipv6_icmp_table)
93 goto out_ipv6_route_table;
760f2d01 94
6dceb036
EB
95 net->ipv6.sysctl.hdr = register_net_sysctl(net, "net/ipv6", ipv6_table);
96 if (!net->ipv6.sysctl.hdr)
760f2d01
DL
97 goto out_ipv6_icmp_table;
98
6dceb036
EB
99 net->ipv6.sysctl.route_hdr =
100 register_net_sysctl(net, "net/ipv6/route", ipv6_route_table);
101 if (!net->ipv6.sysctl.route_hdr)
102 goto out_unregister_ipv6_table;
103
104 net->ipv6.sysctl.icmp_hdr =
105 register_net_sysctl(net, "net/ipv6/icmp", ipv6_icmp_table);
106 if (!net->ipv6.sysctl.icmp_hdr)
107 goto out_unregister_route_table;
108
760f2d01
DL
109 err = 0;
110out:
111 return err;
6dceb036
EB
112out_unregister_route_table:
113 unregister_net_sysctl_table(net->ipv6.sysctl.route_hdr);
114out_unregister_ipv6_table:
115 unregister_net_sysctl_table(net->ipv6.sysctl.hdr);
760f2d01
DL
116out_ipv6_icmp_table:
117 kfree(ipv6_icmp_table);
118out_ipv6_route_table:
119 kfree(ipv6_route_table);
120out_ipv6_table:
121 kfree(ipv6_table);
122 goto out;
1da177e4
LT
123}
124
2c8c1e72 125static void __net_exit ipv6_sysctl_net_exit(struct net *net)
89918fc2 126{
760f2d01
DL
127 struct ctl_table *ipv6_table;
128 struct ctl_table *ipv6_route_table;
129 struct ctl_table *ipv6_icmp_table;
130
6dceb036
EB
131 ipv6_table = net->ipv6.sysctl.hdr->ctl_table_arg;
132 ipv6_route_table = net->ipv6.sysctl.route_hdr->ctl_table_arg;
133 ipv6_icmp_table = net->ipv6.sysctl.icmp_hdr->ctl_table_arg;
760f2d01 134
6dceb036
EB
135 unregister_net_sysctl_table(net->ipv6.sysctl.icmp_hdr);
136 unregister_net_sysctl_table(net->ipv6.sysctl.route_hdr);
137 unregister_net_sysctl_table(net->ipv6.sysctl.hdr);
760f2d01
DL
138
139 kfree(ipv6_table);
140 kfree(ipv6_route_table);
141 kfree(ipv6_icmp_table);
89918fc2
DL
142}
143
144static struct pernet_operations ipv6_sysctl_net_ops = {
145 .init = ipv6_sysctl_net_init,
146 .exit = ipv6_sysctl_net_exit,
147};
148
34ac2573
PE
149static struct ctl_table_header *ip6_header;
150
89918fc2
DL
151int ipv6_sysctl_register(void)
152{
c19a28e1 153 int err = -ENOMEM;
34ac2573 154
43444757 155 ip6_header = register_net_sysctl(&init_net, "net/ipv6", ipv6_rotable);
34ac2573
PE
156 if (ip6_header == NULL)
157 goto out;
158
159 err = register_pernet_subsys(&ipv6_sysctl_net_ops);
160 if (err)
161 goto err_pernet;
162out:
163 return err;
164
165err_pernet:
166 unregister_net_sysctl_table(ip6_header);
167 goto out;
89918fc2
DL
168}
169
1da177e4
LT
170void ipv6_sysctl_unregister(void)
171{
34ac2573 172 unregister_net_sysctl_table(ip6_header);
89918fc2 173 unregister_pernet_subsys(&ipv6_sysctl_net_ops);
1da177e4 174}