sysctl_net_ipv4.c revision 8d987e5c75107ca7515fa19e857cfa24aab6ec8f
1/*
2 * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
3 *
4 * Begun April 1, 1996, Mike Shaver.
5 * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
6 */
7
8#include <linux/mm.h>
9#include <linux/module.h>
10#include <linux/sysctl.h>
11#include <linux/igmp.h>
12#include <linux/inetdevice.h>
13#include <linux/seqlock.h>
14#include <linux/init.h>
15#include <linux/slab.h>
16#include <net/snmp.h>
17#include <net/icmp.h>
18#include <net/ip.h>
19#include <net/route.h>
20#include <net/tcp.h>
21#include <net/udp.h>
22#include <net/cipso_ipv4.h>
23#include <net/inet_frag.h>
24
25static int zero;
26static int tcp_retr1_max = 255;
27static int ip_local_port_range_min[] = { 1, 1 };
28static int ip_local_port_range_max[] = { 65535, 65535 };
29
30/* Update system visible IP port range */
31static void set_local_port_range(int range[2])
32{
33	write_seqlock(&sysctl_local_ports.lock);
34	sysctl_local_ports.range[0] = range[0];
35	sysctl_local_ports.range[1] = range[1];
36	write_sequnlock(&sysctl_local_ports.lock);
37}
38
39/* Validate changes from /proc interface. */
40static int ipv4_local_port_range(ctl_table *table, int write,
41				 void __user *buffer,
42				 size_t *lenp, loff_t *ppos)
43{
44	int ret;
45	int range[2];
46	ctl_table tmp = {
47		.data = &range,
48		.maxlen = sizeof(range),
49		.mode = table->mode,
50		.extra1 = &ip_local_port_range_min,
51		.extra2 = &ip_local_port_range_max,
52	};
53
54	inet_get_local_port_range(range, range + 1);
55	ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
56
57	if (write && ret == 0) {
58		if (range[1] < range[0])
59			ret = -EINVAL;
60		else
61			set_local_port_range(range);
62	}
63
64	return ret;
65}
66
67static int proc_tcp_congestion_control(ctl_table *ctl, int write,
68				       void __user *buffer, size_t *lenp, loff_t *ppos)
69{
70	char val[TCP_CA_NAME_MAX];
71	ctl_table tbl = {
72		.data = val,
73		.maxlen = TCP_CA_NAME_MAX,
74	};
75	int ret;
76
77	tcp_get_default_congestion_control(val);
78
79	ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
80	if (write && ret == 0)
81		ret = tcp_set_default_congestion_control(val);
82	return ret;
83}
84
85static int proc_tcp_available_congestion_control(ctl_table *ctl,
86						 int write,
87						 void __user *buffer, size_t *lenp,
88						 loff_t *ppos)
89{
90	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, };
91	int ret;
92
93	tbl.data = kmalloc(tbl.maxlen, GFP_USER);
94	if (!tbl.data)
95		return -ENOMEM;
96	tcp_get_available_congestion_control(tbl.data, TCP_CA_BUF_MAX);
97	ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
98	kfree(tbl.data);
99	return ret;
100}
101
102static int proc_allowed_congestion_control(ctl_table *ctl,
103					   int write,
104					   void __user *buffer, size_t *lenp,
105					   loff_t *ppos)
106{
107	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
108	int ret;
109
110	tbl.data = kmalloc(tbl.maxlen, GFP_USER);
111	if (!tbl.data)
112		return -ENOMEM;
113
114	tcp_get_allowed_congestion_control(tbl.data, tbl.maxlen);
115	ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
116	if (write && ret == 0)
117		ret = tcp_set_allowed_congestion_control(tbl.data);
118	kfree(tbl.data);
119	return ret;
120}
121
122static struct ctl_table ipv4_table[] = {
123	{
124		.procname	= "tcp_timestamps",
125		.data		= &sysctl_tcp_timestamps,
126		.maxlen		= sizeof(int),
127		.mode		= 0644,
128		.proc_handler	= proc_dointvec
129	},
130	{
131		.procname	= "tcp_window_scaling",
132		.data		= &sysctl_tcp_window_scaling,
133		.maxlen		= sizeof(int),
134		.mode		= 0644,
135		.proc_handler	= proc_dointvec
136	},
137	{
138		.procname	= "tcp_sack",
139		.data		= &sysctl_tcp_sack,
140		.maxlen		= sizeof(int),
141		.mode		= 0644,
142		.proc_handler	= proc_dointvec
143	},
144	{
145		.procname	= "tcp_retrans_collapse",
146		.data		= &sysctl_tcp_retrans_collapse,
147		.maxlen		= sizeof(int),
148		.mode		= 0644,
149		.proc_handler	= proc_dointvec
150	},
151	{
152		.procname	= "ip_default_ttl",
153		.data		= &sysctl_ip_default_ttl,
154		.maxlen		= sizeof(int),
155		.mode		= 0644,
156		.proc_handler	= ipv4_doint_and_flush,
157		.extra2		= &init_net,
158	},
159	{
160		.procname	= "ip_no_pmtu_disc",
161		.data		= &ipv4_config.no_pmtu_disc,
162		.maxlen		= sizeof(int),
163		.mode		= 0644,
164		.proc_handler	= proc_dointvec
165	},
166	{
167		.procname	= "ip_nonlocal_bind",
168		.data		= &sysctl_ip_nonlocal_bind,
169		.maxlen		= sizeof(int),
170		.mode		= 0644,
171		.proc_handler	= proc_dointvec
172	},
173	{
174		.procname	= "tcp_syn_retries",
175		.data		= &sysctl_tcp_syn_retries,
176		.maxlen		= sizeof(int),
177		.mode		= 0644,
178		.proc_handler	= proc_dointvec
179	},
180	{
181		.procname	= "tcp_synack_retries",
182		.data		= &sysctl_tcp_synack_retries,
183		.maxlen		= sizeof(int),
184		.mode		= 0644,
185		.proc_handler	= proc_dointvec
186	},
187	{
188		.procname	= "tcp_max_orphans",
189		.data		= &sysctl_tcp_max_orphans,
190		.maxlen		= sizeof(int),
191		.mode		= 0644,
192		.proc_handler	= proc_dointvec
193	},
194	{
195		.procname	= "tcp_max_tw_buckets",
196		.data		= &tcp_death_row.sysctl_max_tw_buckets,
197		.maxlen		= sizeof(int),
198		.mode		= 0644,
199		.proc_handler	= proc_dointvec
200	},
201	{
202		.procname	= "ip_dynaddr",
203		.data		= &sysctl_ip_dynaddr,
204		.maxlen		= sizeof(int),
205		.mode		= 0644,
206		.proc_handler	= proc_dointvec
207	},
208	{
209		.procname	= "tcp_keepalive_time",
210		.data		= &sysctl_tcp_keepalive_time,
211		.maxlen		= sizeof(int),
212		.mode		= 0644,
213		.proc_handler	= proc_dointvec_jiffies,
214	},
215	{
216		.procname	= "tcp_keepalive_probes",
217		.data		= &sysctl_tcp_keepalive_probes,
218		.maxlen		= sizeof(int),
219		.mode		= 0644,
220		.proc_handler	= proc_dointvec
221	},
222	{
223		.procname	= "tcp_keepalive_intvl",
224		.data		= &sysctl_tcp_keepalive_intvl,
225		.maxlen		= sizeof(int),
226		.mode		= 0644,
227		.proc_handler	= proc_dointvec_jiffies,
228	},
229	{
230		.procname	= "tcp_retries1",
231		.data		= &sysctl_tcp_retries1,
232		.maxlen		= sizeof(int),
233		.mode		= 0644,
234		.proc_handler	= proc_dointvec_minmax,
235		.extra2		= &tcp_retr1_max
236	},
237	{
238		.procname	= "tcp_retries2",
239		.data		= &sysctl_tcp_retries2,
240		.maxlen		= sizeof(int),
241		.mode		= 0644,
242		.proc_handler	= proc_dointvec
243	},
244	{
245		.procname	= "tcp_fin_timeout",
246		.data		= &sysctl_tcp_fin_timeout,
247		.maxlen		= sizeof(int),
248		.mode		= 0644,
249		.proc_handler	= proc_dointvec_jiffies,
250	},
251#ifdef CONFIG_SYN_COOKIES
252	{
253		.procname	= "tcp_syncookies",
254		.data		= &sysctl_tcp_syncookies,
255		.maxlen		= sizeof(int),
256		.mode		= 0644,
257		.proc_handler	= proc_dointvec
258	},
259#endif
260	{
261		.procname	= "tcp_tw_recycle",
262		.data		= &tcp_death_row.sysctl_tw_recycle,
263		.maxlen		= sizeof(int),
264		.mode		= 0644,
265		.proc_handler	= proc_dointvec
266	},
267	{
268		.procname	= "tcp_abort_on_overflow",
269		.data		= &sysctl_tcp_abort_on_overflow,
270		.maxlen		= sizeof(int),
271		.mode		= 0644,
272		.proc_handler	= proc_dointvec
273	},
274	{
275		.procname	= "tcp_stdurg",
276		.data		= &sysctl_tcp_stdurg,
277		.maxlen		= sizeof(int),
278		.mode		= 0644,
279		.proc_handler	= proc_dointvec
280	},
281	{
282		.procname	= "tcp_rfc1337",
283		.data		= &sysctl_tcp_rfc1337,
284		.maxlen		= sizeof(int),
285		.mode		= 0644,
286		.proc_handler	= proc_dointvec
287	},
288	{
289		.procname	= "tcp_max_syn_backlog",
290		.data		= &sysctl_max_syn_backlog,
291		.maxlen		= sizeof(int),
292		.mode		= 0644,
293		.proc_handler	= proc_dointvec
294	},
295	{
296		.procname	= "ip_local_port_range",
297		.data		= &sysctl_local_ports.range,
298		.maxlen		= sizeof(sysctl_local_ports.range),
299		.mode		= 0644,
300		.proc_handler	= ipv4_local_port_range,
301	},
302	{
303		.procname	= "ip_local_reserved_ports",
304		.data		= NULL, /* initialized in sysctl_ipv4_init */
305		.maxlen		= 65536,
306		.mode		= 0644,
307		.proc_handler	= proc_do_large_bitmap,
308	},
309#ifdef CONFIG_IP_MULTICAST
310	{
311		.procname	= "igmp_max_memberships",
312		.data		= &sysctl_igmp_max_memberships,
313		.maxlen		= sizeof(int),
314		.mode		= 0644,
315		.proc_handler	= proc_dointvec
316	},
317
318#endif
319	{
320		.procname	= "igmp_max_msf",
321		.data		= &sysctl_igmp_max_msf,
322		.maxlen		= sizeof(int),
323		.mode		= 0644,
324		.proc_handler	= proc_dointvec
325	},
326	{
327		.procname	= "inet_peer_threshold",
328		.data		= &inet_peer_threshold,
329		.maxlen		= sizeof(int),
330		.mode		= 0644,
331		.proc_handler	= proc_dointvec
332	},
333	{
334		.procname	= "inet_peer_minttl",
335		.data		= &inet_peer_minttl,
336		.maxlen		= sizeof(int),
337		.mode		= 0644,
338		.proc_handler	= proc_dointvec_jiffies,
339	},
340	{
341		.procname	= "inet_peer_maxttl",
342		.data		= &inet_peer_maxttl,
343		.maxlen		= sizeof(int),
344		.mode		= 0644,
345		.proc_handler	= proc_dointvec_jiffies,
346	},
347	{
348		.procname	= "inet_peer_gc_mintime",
349		.data		= &inet_peer_gc_mintime,
350		.maxlen		= sizeof(int),
351		.mode		= 0644,
352		.proc_handler	= proc_dointvec_jiffies,
353	},
354	{
355		.procname	= "inet_peer_gc_maxtime",
356		.data		= &inet_peer_gc_maxtime,
357		.maxlen		= sizeof(int),
358		.mode		= 0644,
359		.proc_handler	= proc_dointvec_jiffies,
360	},
361	{
362		.procname	= "tcp_orphan_retries",
363		.data		= &sysctl_tcp_orphan_retries,
364		.maxlen		= sizeof(int),
365		.mode		= 0644,
366		.proc_handler	= proc_dointvec
367	},
368	{
369		.procname	= "tcp_fack",
370		.data		= &sysctl_tcp_fack,
371		.maxlen		= sizeof(int),
372		.mode		= 0644,
373		.proc_handler	= proc_dointvec
374	},
375	{
376		.procname	= "tcp_reordering",
377		.data		= &sysctl_tcp_reordering,
378		.maxlen		= sizeof(int),
379		.mode		= 0644,
380		.proc_handler	= proc_dointvec
381	},
382	{
383		.procname	= "tcp_ecn",
384		.data		= &sysctl_tcp_ecn,
385		.maxlen		= sizeof(int),
386		.mode		= 0644,
387		.proc_handler	= proc_dointvec
388	},
389	{
390		.procname	= "tcp_dsack",
391		.data		= &sysctl_tcp_dsack,
392		.maxlen		= sizeof(int),
393		.mode		= 0644,
394		.proc_handler	= proc_dointvec
395	},
396	{
397		.procname	= "tcp_mem",
398		.data		= &sysctl_tcp_mem,
399		.maxlen		= sizeof(sysctl_tcp_mem),
400		.mode		= 0644,
401		.proc_handler	= proc_doulongvec_minmax
402	},
403	{
404		.procname	= "tcp_wmem",
405		.data		= &sysctl_tcp_wmem,
406		.maxlen		= sizeof(sysctl_tcp_wmem),
407		.mode		= 0644,
408		.proc_handler	= proc_dointvec
409	},
410	{
411		.procname	= "tcp_rmem",
412		.data		= &sysctl_tcp_rmem,
413		.maxlen		= sizeof(sysctl_tcp_rmem),
414		.mode		= 0644,
415		.proc_handler	= proc_dointvec
416	},
417	{
418		.procname	= "tcp_app_win",
419		.data		= &sysctl_tcp_app_win,
420		.maxlen		= sizeof(int),
421		.mode		= 0644,
422		.proc_handler	= proc_dointvec
423	},
424	{
425		.procname	= "tcp_adv_win_scale",
426		.data		= &sysctl_tcp_adv_win_scale,
427		.maxlen		= sizeof(int),
428		.mode		= 0644,
429		.proc_handler	= proc_dointvec
430	},
431	{
432		.procname	= "tcp_tw_reuse",
433		.data		= &sysctl_tcp_tw_reuse,
434		.maxlen		= sizeof(int),
435		.mode		= 0644,
436		.proc_handler	= proc_dointvec
437	},
438	{
439		.procname	= "tcp_frto",
440		.data		= &sysctl_tcp_frto,
441		.maxlen		= sizeof(int),
442		.mode		= 0644,
443		.proc_handler	= proc_dointvec
444	},
445	{
446		.procname	= "tcp_frto_response",
447		.data		= &sysctl_tcp_frto_response,
448		.maxlen		= sizeof(int),
449		.mode		= 0644,
450		.proc_handler	= proc_dointvec
451	},
452	{
453		.procname	= "tcp_low_latency",
454		.data		= &sysctl_tcp_low_latency,
455		.maxlen		= sizeof(int),
456		.mode		= 0644,
457		.proc_handler	= proc_dointvec
458	},
459	{
460		.procname	= "tcp_no_metrics_save",
461		.data		= &sysctl_tcp_nometrics_save,
462		.maxlen		= sizeof(int),
463		.mode		= 0644,
464		.proc_handler	= proc_dointvec,
465	},
466	{
467		.procname	= "tcp_moderate_rcvbuf",
468		.data		= &sysctl_tcp_moderate_rcvbuf,
469		.maxlen		= sizeof(int),
470		.mode		= 0644,
471		.proc_handler	= proc_dointvec,
472	},
473	{
474		.procname	= "tcp_tso_win_divisor",
475		.data		= &sysctl_tcp_tso_win_divisor,
476		.maxlen		= sizeof(int),
477		.mode		= 0644,
478		.proc_handler	= proc_dointvec,
479	},
480	{
481		.procname	= "tcp_congestion_control",
482		.mode		= 0644,
483		.maxlen		= TCP_CA_NAME_MAX,
484		.proc_handler	= proc_tcp_congestion_control,
485	},
486	{
487		.procname	= "tcp_abc",
488		.data		= &sysctl_tcp_abc,
489		.maxlen		= sizeof(int),
490		.mode		= 0644,
491		.proc_handler	= proc_dointvec,
492	},
493	{
494		.procname	= "tcp_mtu_probing",
495		.data		= &sysctl_tcp_mtu_probing,
496		.maxlen		= sizeof(int),
497		.mode		= 0644,
498		.proc_handler	= proc_dointvec,
499	},
500	{
501		.procname	= "tcp_base_mss",
502		.data		= &sysctl_tcp_base_mss,
503		.maxlen		= sizeof(int),
504		.mode		= 0644,
505		.proc_handler	= proc_dointvec,
506	},
507	{
508		.procname	= "tcp_workaround_signed_windows",
509		.data		= &sysctl_tcp_workaround_signed_windows,
510		.maxlen		= sizeof(int),
511		.mode		= 0644,
512		.proc_handler	= proc_dointvec
513	},
514#ifdef CONFIG_NET_DMA
515	{
516		.procname	= "tcp_dma_copybreak",
517		.data		= &sysctl_tcp_dma_copybreak,
518		.maxlen		= sizeof(int),
519		.mode		= 0644,
520		.proc_handler	= proc_dointvec
521	},
522#endif
523	{
524		.procname	= "tcp_slow_start_after_idle",
525		.data		= &sysctl_tcp_slow_start_after_idle,
526		.maxlen		= sizeof(int),
527		.mode		= 0644,
528		.proc_handler	= proc_dointvec
529	},
530#ifdef CONFIG_NETLABEL
531	{
532		.procname	= "cipso_cache_enable",
533		.data		= &cipso_v4_cache_enabled,
534		.maxlen		= sizeof(int),
535		.mode		= 0644,
536		.proc_handler	= proc_dointvec,
537	},
538	{
539		.procname	= "cipso_cache_bucket_size",
540		.data		= &cipso_v4_cache_bucketsize,
541		.maxlen		= sizeof(int),
542		.mode		= 0644,
543		.proc_handler	= proc_dointvec,
544	},
545	{
546		.procname	= "cipso_rbm_optfmt",
547		.data		= &cipso_v4_rbm_optfmt,
548		.maxlen		= sizeof(int),
549		.mode		= 0644,
550		.proc_handler	= proc_dointvec,
551	},
552	{
553		.procname	= "cipso_rbm_strictvalid",
554		.data		= &cipso_v4_rbm_strictvalid,
555		.maxlen		= sizeof(int),
556		.mode		= 0644,
557		.proc_handler	= proc_dointvec,
558	},
559#endif /* CONFIG_NETLABEL */
560	{
561		.procname	= "tcp_available_congestion_control",
562		.maxlen		= TCP_CA_BUF_MAX,
563		.mode		= 0444,
564		.proc_handler   = proc_tcp_available_congestion_control,
565	},
566	{
567		.procname	= "tcp_allowed_congestion_control",
568		.maxlen		= TCP_CA_BUF_MAX,
569		.mode		= 0644,
570		.proc_handler   = proc_allowed_congestion_control,
571	},
572	{
573		.procname	= "tcp_max_ssthresh",
574		.data		= &sysctl_tcp_max_ssthresh,
575		.maxlen		= sizeof(int),
576		.mode		= 0644,
577		.proc_handler	= proc_dointvec,
578	},
579	{
580		.procname	= "tcp_cookie_size",
581		.data		= &sysctl_tcp_cookie_size,
582		.maxlen		= sizeof(int),
583		.mode		= 0644,
584		.proc_handler	= proc_dointvec
585	},
586	{
587		.procname       = "tcp_thin_linear_timeouts",
588		.data           = &sysctl_tcp_thin_linear_timeouts,
589		.maxlen         = sizeof(int),
590		.mode           = 0644,
591		.proc_handler   = proc_dointvec
592	},
593        {
594		.procname       = "tcp_thin_dupack",
595		.data           = &sysctl_tcp_thin_dupack,
596		.maxlen         = sizeof(int),
597		.mode           = 0644,
598		.proc_handler   = proc_dointvec
599	},
600	{
601		.procname	= "udp_mem",
602		.data		= &sysctl_udp_mem,
603		.maxlen		= sizeof(sysctl_udp_mem),
604		.mode		= 0644,
605		.proc_handler	= proc_doulongvec_minmax,
606	},
607	{
608		.procname	= "udp_rmem_min",
609		.data		= &sysctl_udp_rmem_min,
610		.maxlen		= sizeof(sysctl_udp_rmem_min),
611		.mode		= 0644,
612		.proc_handler	= proc_dointvec_minmax,
613		.extra1		= &zero
614	},
615	{
616		.procname	= "udp_wmem_min",
617		.data		= &sysctl_udp_wmem_min,
618		.maxlen		= sizeof(sysctl_udp_wmem_min),
619		.mode		= 0644,
620		.proc_handler	= proc_dointvec_minmax,
621		.extra1		= &zero
622	},
623	{ }
624};
625
626static struct ctl_table ipv4_net_table[] = {
627	{
628		.procname	= "icmp_echo_ignore_all",
629		.data		= &init_net.ipv4.sysctl_icmp_echo_ignore_all,
630		.maxlen		= sizeof(int),
631		.mode		= 0644,
632		.proc_handler	= proc_dointvec
633	},
634	{
635		.procname	= "icmp_echo_ignore_broadcasts",
636		.data		= &init_net.ipv4.sysctl_icmp_echo_ignore_broadcasts,
637		.maxlen		= sizeof(int),
638		.mode		= 0644,
639		.proc_handler	= proc_dointvec
640	},
641	{
642		.procname	= "icmp_ignore_bogus_error_responses",
643		.data		= &init_net.ipv4.sysctl_icmp_ignore_bogus_error_responses,
644		.maxlen		= sizeof(int),
645		.mode		= 0644,
646		.proc_handler	= proc_dointvec
647	},
648	{
649		.procname	= "icmp_errors_use_inbound_ifaddr",
650		.data		= &init_net.ipv4.sysctl_icmp_errors_use_inbound_ifaddr,
651		.maxlen		= sizeof(int),
652		.mode		= 0644,
653		.proc_handler	= proc_dointvec
654	},
655	{
656		.procname	= "icmp_ratelimit",
657		.data		= &init_net.ipv4.sysctl_icmp_ratelimit,
658		.maxlen		= sizeof(int),
659		.mode		= 0644,
660		.proc_handler	= proc_dointvec_ms_jiffies,
661	},
662	{
663		.procname	= "icmp_ratemask",
664		.data		= &init_net.ipv4.sysctl_icmp_ratemask,
665		.maxlen		= sizeof(int),
666		.mode		= 0644,
667		.proc_handler	= proc_dointvec
668	},
669	{
670		.procname	= "rt_cache_rebuild_count",
671		.data		= &init_net.ipv4.sysctl_rt_cache_rebuild_count,
672		.maxlen		= sizeof(int),
673		.mode		= 0644,
674		.proc_handler	= proc_dointvec
675	},
676	{ }
677};
678
679struct ctl_path net_ipv4_ctl_path[] = {
680	{ .procname = "net", },
681	{ .procname = "ipv4", },
682	{ },
683};
684EXPORT_SYMBOL_GPL(net_ipv4_ctl_path);
685
686static __net_init int ipv4_sysctl_init_net(struct net *net)
687{
688	struct ctl_table *table;
689
690	table = ipv4_net_table;
691	if (!net_eq(net, &init_net)) {
692		table = kmemdup(table, sizeof(ipv4_net_table), GFP_KERNEL);
693		if (table == NULL)
694			goto err_alloc;
695
696		table[0].data =
697			&net->ipv4.sysctl_icmp_echo_ignore_all;
698		table[1].data =
699			&net->ipv4.sysctl_icmp_echo_ignore_broadcasts;
700		table[2].data =
701			&net->ipv4.sysctl_icmp_ignore_bogus_error_responses;
702		table[3].data =
703			&net->ipv4.sysctl_icmp_errors_use_inbound_ifaddr;
704		table[4].data =
705			&net->ipv4.sysctl_icmp_ratelimit;
706		table[5].data =
707			&net->ipv4.sysctl_icmp_ratemask;
708		table[6].data =
709			&net->ipv4.sysctl_rt_cache_rebuild_count;
710	}
711
712	net->ipv4.sysctl_rt_cache_rebuild_count = 4;
713
714	net->ipv4.ipv4_hdr = register_net_sysctl_table(net,
715			net_ipv4_ctl_path, table);
716	if (net->ipv4.ipv4_hdr == NULL)
717		goto err_reg;
718
719	return 0;
720
721err_reg:
722	if (!net_eq(net, &init_net))
723		kfree(table);
724err_alloc:
725	return -ENOMEM;
726}
727
728static __net_exit void ipv4_sysctl_exit_net(struct net *net)
729{
730	struct ctl_table *table;
731
732	table = net->ipv4.ipv4_hdr->ctl_table_arg;
733	unregister_net_sysctl_table(net->ipv4.ipv4_hdr);
734	kfree(table);
735}
736
737static __net_initdata struct pernet_operations ipv4_sysctl_ops = {
738	.init = ipv4_sysctl_init_net,
739	.exit = ipv4_sysctl_exit_net,
740};
741
742static __init int sysctl_ipv4_init(void)
743{
744	struct ctl_table_header *hdr;
745	struct ctl_table *i;
746
747	for (i = ipv4_table; i->procname; i++) {
748		if (strcmp(i->procname, "ip_local_reserved_ports") == 0) {
749			i->data = sysctl_local_reserved_ports;
750			break;
751		}
752	}
753	if (!i->procname)
754		return -EINVAL;
755
756	hdr = register_sysctl_paths(net_ipv4_ctl_path, ipv4_table);
757	if (hdr == NULL)
758		return -ENOMEM;
759
760	if (register_pernet_subsys(&ipv4_sysctl_ops)) {
761		unregister_sysctl_table(hdr);
762		return -ENOMEM;
763	}
764
765	return 0;
766}
767
768__initcall(sysctl_ipv4_init);
769