sysctl_net_ipv4.c revision 95766fff6b9a78d11fc2d3812dd035381690b55d
1/*
2 * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
3 *
4 * $Id: sysctl_net_ipv4.c,v 1.50 2001/10/20 00:00:11 davem Exp $
5 *
6 * Begun April 1, 1996, Mike Shaver.
7 * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
8 */
9
10#include <linux/mm.h>
11#include <linux/module.h>
12#include <linux/sysctl.h>
13#include <linux/igmp.h>
14#include <linux/inetdevice.h>
15#include <linux/seqlock.h>
16#include <linux/init.h>
17#include <net/snmp.h>
18#include <net/icmp.h>
19#include <net/ip.h>
20#include <net/route.h>
21#include <net/tcp.h>
22#include <net/udp.h>
23#include <net/cipso_ipv4.h>
24#include <net/inet_frag.h>
25
26static int zero;
27static int tcp_retr1_max = 255;
28static int ip_local_port_range_min[] = { 1, 1 };
29static int ip_local_port_range_max[] = { 65535, 65535 };
30
31extern seqlock_t sysctl_port_range_lock;
32extern int sysctl_local_port_range[2];
33
34/* Update system visible IP port range */
35static void set_local_port_range(int range[2])
36{
37	write_seqlock(&sysctl_port_range_lock);
38	sysctl_local_port_range[0] = range[0];
39	sysctl_local_port_range[1] = range[1];
40	write_sequnlock(&sysctl_port_range_lock);
41}
42
43/* Validate changes from /proc interface. */
44static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp,
45				 void __user *buffer,
46				 size_t *lenp, loff_t *ppos)
47{
48	int ret;
49	int range[2] = { sysctl_local_port_range[0],
50			 sysctl_local_port_range[1] };
51	ctl_table tmp = {
52		.data = &range,
53		.maxlen = sizeof(range),
54		.mode = table->mode,
55		.extra1 = &ip_local_port_range_min,
56		.extra2 = &ip_local_port_range_max,
57	};
58
59	ret = proc_dointvec_minmax(&tmp, write, filp, buffer, lenp, ppos);
60
61	if (write && ret == 0) {
62		if (range[1] < range[0])
63			ret = -EINVAL;
64		else
65			set_local_port_range(range);
66	}
67
68	return ret;
69}
70
71/* Validate changes from sysctl interface. */
72static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name,
73					 int nlen, void __user *oldval,
74					 size_t __user *oldlenp,
75					void __user *newval, size_t newlen)
76{
77	int ret;
78	int range[2] = { sysctl_local_port_range[0],
79			 sysctl_local_port_range[1] };
80	ctl_table tmp = {
81		.data = &range,
82		.maxlen = sizeof(range),
83		.mode = table->mode,
84		.extra1 = &ip_local_port_range_min,
85		.extra2 = &ip_local_port_range_max,
86	};
87
88	ret = sysctl_intvec(&tmp, name, nlen, oldval, oldlenp, newval, newlen);
89	if (ret == 0 && newval && newlen) {
90		if (range[1] < range[0])
91			ret = -EINVAL;
92		else
93			set_local_port_range(range);
94	}
95	return ret;
96}
97
98
99static int proc_tcp_congestion_control(ctl_table *ctl, int write, struct file * filp,
100				       void __user *buffer, size_t *lenp, loff_t *ppos)
101{
102	char val[TCP_CA_NAME_MAX];
103	ctl_table tbl = {
104		.data = val,
105		.maxlen = TCP_CA_NAME_MAX,
106	};
107	int ret;
108
109	tcp_get_default_congestion_control(val);
110
111	ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);
112	if (write && ret == 0)
113		ret = tcp_set_default_congestion_control(val);
114	return ret;
115}
116
117static int sysctl_tcp_congestion_control(ctl_table *table, int __user *name,
118					 int nlen, void __user *oldval,
119					 size_t __user *oldlenp,
120					 void __user *newval, size_t newlen)
121{
122	char val[TCP_CA_NAME_MAX];
123	ctl_table tbl = {
124		.data = val,
125		.maxlen = TCP_CA_NAME_MAX,
126	};
127	int ret;
128
129	tcp_get_default_congestion_control(val);
130	ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen);
131	if (ret == 1 && newval && newlen)
132		ret = tcp_set_default_congestion_control(val);
133	return ret;
134}
135
136static int proc_tcp_available_congestion_control(ctl_table *ctl,
137						 int write, struct file * filp,
138						 void __user *buffer, size_t *lenp,
139						 loff_t *ppos)
140{
141	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, };
142	int ret;
143
144	tbl.data = kmalloc(tbl.maxlen, GFP_USER);
145	if (!tbl.data)
146		return -ENOMEM;
147	tcp_get_available_congestion_control(tbl.data, TCP_CA_BUF_MAX);
148	ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);
149	kfree(tbl.data);
150	return ret;
151}
152
153static int proc_allowed_congestion_control(ctl_table *ctl,
154					   int write, struct file * filp,
155					   void __user *buffer, size_t *lenp,
156					   loff_t *ppos)
157{
158	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
159	int ret;
160
161	tbl.data = kmalloc(tbl.maxlen, GFP_USER);
162	if (!tbl.data)
163		return -ENOMEM;
164
165	tcp_get_allowed_congestion_control(tbl.data, tbl.maxlen);
166	ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);
167	if (write && ret == 0)
168		ret = tcp_set_allowed_congestion_control(tbl.data);
169	kfree(tbl.data);
170	return ret;
171}
172
173static int strategy_allowed_congestion_control(ctl_table *table, int __user *name,
174					       int nlen, void __user *oldval,
175					       size_t __user *oldlenp,
176					       void __user *newval,
177					       size_t newlen)
178{
179	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
180	int ret;
181
182	tbl.data = kmalloc(tbl.maxlen, GFP_USER);
183	if (!tbl.data)
184		return -ENOMEM;
185
186	tcp_get_available_congestion_control(tbl.data, tbl.maxlen);
187	ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen);
188	if (ret == 0 && newval && newlen)
189		ret = tcp_set_allowed_congestion_control(tbl.data);
190	kfree(tbl.data);
191
192	return ret;
193
194}
195
196static struct ctl_table ipv4_table[] = {
197	{
198		.ctl_name	= NET_IPV4_TCP_TIMESTAMPS,
199		.procname	= "tcp_timestamps",
200		.data		= &sysctl_tcp_timestamps,
201		.maxlen		= sizeof(int),
202		.mode		= 0644,
203		.proc_handler	= &proc_dointvec
204	},
205	{
206		.ctl_name	= NET_IPV4_TCP_WINDOW_SCALING,
207		.procname	= "tcp_window_scaling",
208		.data		= &sysctl_tcp_window_scaling,
209		.maxlen		= sizeof(int),
210		.mode		= 0644,
211		.proc_handler	= &proc_dointvec
212	},
213	{
214		.ctl_name	= NET_IPV4_TCP_SACK,
215		.procname	= "tcp_sack",
216		.data		= &sysctl_tcp_sack,
217		.maxlen		= sizeof(int),
218		.mode		= 0644,
219		.proc_handler	= &proc_dointvec
220	},
221	{
222		.ctl_name	= NET_IPV4_TCP_RETRANS_COLLAPSE,
223		.procname	= "tcp_retrans_collapse",
224		.data		= &sysctl_tcp_retrans_collapse,
225		.maxlen		= sizeof(int),
226		.mode		= 0644,
227		.proc_handler	= &proc_dointvec
228	},
229	{
230		.ctl_name	= NET_IPV4_DEFAULT_TTL,
231		.procname	= "ip_default_ttl",
232		.data		= &sysctl_ip_default_ttl,
233		.maxlen		= sizeof(int),
234		.mode		= 0644,
235		.proc_handler	= &ipv4_doint_and_flush,
236		.strategy	= &ipv4_doint_and_flush_strategy,
237	},
238	{
239		.ctl_name	= NET_IPV4_NO_PMTU_DISC,
240		.procname	= "ip_no_pmtu_disc",
241		.data		= &ipv4_config.no_pmtu_disc,
242		.maxlen		= sizeof(int),
243		.mode		= 0644,
244		.proc_handler	= &proc_dointvec
245	},
246	{
247		.ctl_name	= NET_IPV4_NONLOCAL_BIND,
248		.procname	= "ip_nonlocal_bind",
249		.data		= &sysctl_ip_nonlocal_bind,
250		.maxlen		= sizeof(int),
251		.mode		= 0644,
252		.proc_handler	= &proc_dointvec
253	},
254	{
255		.ctl_name	= NET_IPV4_TCP_SYN_RETRIES,
256		.procname	= "tcp_syn_retries",
257		.data		= &sysctl_tcp_syn_retries,
258		.maxlen		= sizeof(int),
259		.mode		= 0644,
260		.proc_handler	= &proc_dointvec
261	},
262	{
263		.ctl_name	= NET_TCP_SYNACK_RETRIES,
264		.procname	= "tcp_synack_retries",
265		.data		= &sysctl_tcp_synack_retries,
266		.maxlen		= sizeof(int),
267		.mode		= 0644,
268		.proc_handler	= &proc_dointvec
269	},
270	{
271		.ctl_name	= NET_TCP_MAX_ORPHANS,
272		.procname	= "tcp_max_orphans",
273		.data		= &sysctl_tcp_max_orphans,
274		.maxlen		= sizeof(int),
275		.mode		= 0644,
276		.proc_handler	= &proc_dointvec
277	},
278	{
279		.ctl_name	= NET_TCP_MAX_TW_BUCKETS,
280		.procname	= "tcp_max_tw_buckets",
281		.data		= &tcp_death_row.sysctl_max_tw_buckets,
282		.maxlen		= sizeof(int),
283		.mode		= 0644,
284		.proc_handler	= &proc_dointvec
285	},
286	{
287		.ctl_name	= NET_IPV4_IPFRAG_HIGH_THRESH,
288		.procname	= "ipfrag_high_thresh",
289		.data		= &ip4_frags_ctl.high_thresh,
290		.maxlen		= sizeof(int),
291		.mode		= 0644,
292		.proc_handler	= &proc_dointvec
293	},
294	{
295		.ctl_name	= NET_IPV4_IPFRAG_LOW_THRESH,
296		.procname	= "ipfrag_low_thresh",
297		.data		= &ip4_frags_ctl.low_thresh,
298		.maxlen		= sizeof(int),
299		.mode		= 0644,
300		.proc_handler	= &proc_dointvec
301	},
302	{
303		.ctl_name	= NET_IPV4_DYNADDR,
304		.procname	= "ip_dynaddr",
305		.data		= &sysctl_ip_dynaddr,
306		.maxlen		= sizeof(int),
307		.mode		= 0644,
308		.proc_handler	= &proc_dointvec
309	},
310	{
311		.ctl_name	= NET_IPV4_IPFRAG_TIME,
312		.procname	= "ipfrag_time",
313		.data		= &ip4_frags_ctl.timeout,
314		.maxlen		= sizeof(int),
315		.mode		= 0644,
316		.proc_handler	= &proc_dointvec_jiffies,
317		.strategy	= &sysctl_jiffies
318	},
319	{
320		.ctl_name	= NET_IPV4_TCP_KEEPALIVE_TIME,
321		.procname	= "tcp_keepalive_time",
322		.data		= &sysctl_tcp_keepalive_time,
323		.maxlen		= sizeof(int),
324		.mode		= 0644,
325		.proc_handler	= &proc_dointvec_jiffies,
326		.strategy	= &sysctl_jiffies
327	},
328	{
329		.ctl_name	= NET_IPV4_TCP_KEEPALIVE_PROBES,
330		.procname	= "tcp_keepalive_probes",
331		.data		= &sysctl_tcp_keepalive_probes,
332		.maxlen		= sizeof(int),
333		.mode		= 0644,
334		.proc_handler	= &proc_dointvec
335	},
336	{
337		.ctl_name	= NET_IPV4_TCP_KEEPALIVE_INTVL,
338		.procname	= "tcp_keepalive_intvl",
339		.data		= &sysctl_tcp_keepalive_intvl,
340		.maxlen		= sizeof(int),
341		.mode		= 0644,
342		.proc_handler	= &proc_dointvec_jiffies,
343		.strategy	= &sysctl_jiffies
344	},
345	{
346		.ctl_name	= NET_IPV4_TCP_RETRIES1,
347		.procname	= "tcp_retries1",
348		.data		= &sysctl_tcp_retries1,
349		.maxlen		= sizeof(int),
350		.mode		= 0644,
351		.proc_handler	= &proc_dointvec_minmax,
352		.strategy	= &sysctl_intvec,
353		.extra2		= &tcp_retr1_max
354	},
355	{
356		.ctl_name	= NET_IPV4_TCP_RETRIES2,
357		.procname	= "tcp_retries2",
358		.data		= &sysctl_tcp_retries2,
359		.maxlen		= sizeof(int),
360		.mode		= 0644,
361		.proc_handler	= &proc_dointvec
362	},
363	{
364		.ctl_name	= NET_IPV4_TCP_FIN_TIMEOUT,
365		.procname	= "tcp_fin_timeout",
366		.data		= &sysctl_tcp_fin_timeout,
367		.maxlen		= sizeof(int),
368		.mode		= 0644,
369		.proc_handler	= &proc_dointvec_jiffies,
370		.strategy	= &sysctl_jiffies
371	},
372#ifdef CONFIG_SYN_COOKIES
373	{
374		.ctl_name	= NET_TCP_SYNCOOKIES,
375		.procname	= "tcp_syncookies",
376		.data		= &sysctl_tcp_syncookies,
377		.maxlen		= sizeof(int),
378		.mode		= 0644,
379		.proc_handler	= &proc_dointvec
380	},
381#endif
382	{
383		.ctl_name	= NET_TCP_TW_RECYCLE,
384		.procname	= "tcp_tw_recycle",
385		.data		= &tcp_death_row.sysctl_tw_recycle,
386		.maxlen		= sizeof(int),
387		.mode		= 0644,
388		.proc_handler	= &proc_dointvec
389	},
390	{
391		.ctl_name	= NET_TCP_ABORT_ON_OVERFLOW,
392		.procname	= "tcp_abort_on_overflow",
393		.data		= &sysctl_tcp_abort_on_overflow,
394		.maxlen		= sizeof(int),
395		.mode		= 0644,
396		.proc_handler	= &proc_dointvec
397	},
398	{
399		.ctl_name	= NET_TCP_STDURG,
400		.procname	= "tcp_stdurg",
401		.data		= &sysctl_tcp_stdurg,
402		.maxlen		= sizeof(int),
403		.mode		= 0644,
404		.proc_handler	= &proc_dointvec
405	},
406	{
407		.ctl_name	= NET_TCP_RFC1337,
408		.procname	= "tcp_rfc1337",
409		.data		= &sysctl_tcp_rfc1337,
410		.maxlen		= sizeof(int),
411		.mode		= 0644,
412		.proc_handler	= &proc_dointvec
413	},
414	{
415		.ctl_name	= NET_TCP_MAX_SYN_BACKLOG,
416		.procname	= "tcp_max_syn_backlog",
417		.data		= &sysctl_max_syn_backlog,
418		.maxlen		= sizeof(int),
419		.mode		= 0644,
420		.proc_handler	= &proc_dointvec
421	},
422	{
423		.ctl_name	= NET_IPV4_LOCAL_PORT_RANGE,
424		.procname	= "ip_local_port_range",
425		.data		= &sysctl_local_port_range,
426		.maxlen		= sizeof(sysctl_local_port_range),
427		.mode		= 0644,
428		.proc_handler	= &ipv4_local_port_range,
429		.strategy	= &ipv4_sysctl_local_port_range,
430	},
431	{
432		.ctl_name	= NET_IPV4_ICMP_ECHO_IGNORE_ALL,
433		.procname	= "icmp_echo_ignore_all",
434		.data		= &sysctl_icmp_echo_ignore_all,
435		.maxlen		= sizeof(int),
436		.mode		= 0644,
437		.proc_handler	= &proc_dointvec
438	},
439	{
440		.ctl_name	= NET_IPV4_ICMP_ECHO_IGNORE_BROADCASTS,
441		.procname	= "icmp_echo_ignore_broadcasts",
442		.data		= &sysctl_icmp_echo_ignore_broadcasts,
443		.maxlen		= sizeof(int),
444		.mode		= 0644,
445		.proc_handler	= &proc_dointvec
446	},
447	{
448		.ctl_name	= NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES,
449		.procname	= "icmp_ignore_bogus_error_responses",
450		.data		= &sysctl_icmp_ignore_bogus_error_responses,
451		.maxlen		= sizeof(int),
452		.mode		= 0644,
453		.proc_handler	= &proc_dointvec
454	},
455	{
456		.ctl_name	= NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR,
457		.procname	= "icmp_errors_use_inbound_ifaddr",
458		.data		= &sysctl_icmp_errors_use_inbound_ifaddr,
459		.maxlen		= sizeof(int),
460		.mode		= 0644,
461		.proc_handler	= &proc_dointvec
462	},
463	{
464		.ctl_name	= NET_IPV4_ROUTE,
465		.procname	= "route",
466		.maxlen		= 0,
467		.mode		= 0555,
468		.child		= ipv4_route_table
469	},
470#ifdef CONFIG_IP_MULTICAST
471	{
472		.ctl_name	= NET_IPV4_IGMP_MAX_MEMBERSHIPS,
473		.procname	= "igmp_max_memberships",
474		.data		= &sysctl_igmp_max_memberships,
475		.maxlen		= sizeof(int),
476		.mode		= 0644,
477		.proc_handler	= &proc_dointvec
478	},
479
480#endif
481	{
482		.ctl_name	= NET_IPV4_IGMP_MAX_MSF,
483		.procname	= "igmp_max_msf",
484		.data		= &sysctl_igmp_max_msf,
485		.maxlen		= sizeof(int),
486		.mode		= 0644,
487		.proc_handler	= &proc_dointvec
488	},
489	{
490		.ctl_name	= NET_IPV4_INET_PEER_THRESHOLD,
491		.procname	= "inet_peer_threshold",
492		.data		= &inet_peer_threshold,
493		.maxlen		= sizeof(int),
494		.mode		= 0644,
495		.proc_handler	= &proc_dointvec
496	},
497	{
498		.ctl_name	= NET_IPV4_INET_PEER_MINTTL,
499		.procname	= "inet_peer_minttl",
500		.data		= &inet_peer_minttl,
501		.maxlen		= sizeof(int),
502		.mode		= 0644,
503		.proc_handler	= &proc_dointvec_jiffies,
504		.strategy	= &sysctl_jiffies
505	},
506	{
507		.ctl_name	= NET_IPV4_INET_PEER_MAXTTL,
508		.procname	= "inet_peer_maxttl",
509		.data		= &inet_peer_maxttl,
510		.maxlen		= sizeof(int),
511		.mode		= 0644,
512		.proc_handler	= &proc_dointvec_jiffies,
513		.strategy	= &sysctl_jiffies
514	},
515	{
516		.ctl_name	= NET_IPV4_INET_PEER_GC_MINTIME,
517		.procname	= "inet_peer_gc_mintime",
518		.data		= &inet_peer_gc_mintime,
519		.maxlen		= sizeof(int),
520		.mode		= 0644,
521		.proc_handler	= &proc_dointvec_jiffies,
522		.strategy	= &sysctl_jiffies
523	},
524	{
525		.ctl_name	= NET_IPV4_INET_PEER_GC_MAXTIME,
526		.procname	= "inet_peer_gc_maxtime",
527		.data		= &inet_peer_gc_maxtime,
528		.maxlen		= sizeof(int),
529		.mode		= 0644,
530		.proc_handler	= &proc_dointvec_jiffies,
531		.strategy	= &sysctl_jiffies
532	},
533	{
534		.ctl_name	= NET_TCP_ORPHAN_RETRIES,
535		.procname	= "tcp_orphan_retries",
536		.data		= &sysctl_tcp_orphan_retries,
537		.maxlen		= sizeof(int),
538		.mode		= 0644,
539		.proc_handler	= &proc_dointvec
540	},
541	{
542		.ctl_name	= NET_TCP_FACK,
543		.procname	= "tcp_fack",
544		.data		= &sysctl_tcp_fack,
545		.maxlen		= sizeof(int),
546		.mode		= 0644,
547		.proc_handler	= &proc_dointvec
548	},
549	{
550		.ctl_name	= NET_TCP_REORDERING,
551		.procname	= "tcp_reordering",
552		.data		= &sysctl_tcp_reordering,
553		.maxlen		= sizeof(int),
554		.mode		= 0644,
555		.proc_handler	= &proc_dointvec
556	},
557	{
558		.ctl_name	= NET_TCP_ECN,
559		.procname	= "tcp_ecn",
560		.data		= &sysctl_tcp_ecn,
561		.maxlen		= sizeof(int),
562		.mode		= 0644,
563		.proc_handler	= &proc_dointvec
564	},
565	{
566		.ctl_name	= NET_TCP_DSACK,
567		.procname	= "tcp_dsack",
568		.data		= &sysctl_tcp_dsack,
569		.maxlen		= sizeof(int),
570		.mode		= 0644,
571		.proc_handler	= &proc_dointvec
572	},
573	{
574		.ctl_name	= NET_TCP_MEM,
575		.procname	= "tcp_mem",
576		.data		= &sysctl_tcp_mem,
577		.maxlen		= sizeof(sysctl_tcp_mem),
578		.mode		= 0644,
579		.proc_handler	= &proc_dointvec
580	},
581	{
582		.ctl_name	= NET_TCP_WMEM,
583		.procname	= "tcp_wmem",
584		.data		= &sysctl_tcp_wmem,
585		.maxlen		= sizeof(sysctl_tcp_wmem),
586		.mode		= 0644,
587		.proc_handler	= &proc_dointvec
588	},
589	{
590		.ctl_name	= NET_TCP_RMEM,
591		.procname	= "tcp_rmem",
592		.data		= &sysctl_tcp_rmem,
593		.maxlen		= sizeof(sysctl_tcp_rmem),
594		.mode		= 0644,
595		.proc_handler	= &proc_dointvec
596	},
597	{
598		.ctl_name	= NET_TCP_APP_WIN,
599		.procname	= "tcp_app_win",
600		.data		= &sysctl_tcp_app_win,
601		.maxlen		= sizeof(int),
602		.mode		= 0644,
603		.proc_handler	= &proc_dointvec
604	},
605	{
606		.ctl_name	= NET_TCP_ADV_WIN_SCALE,
607		.procname	= "tcp_adv_win_scale",
608		.data		= &sysctl_tcp_adv_win_scale,
609		.maxlen		= sizeof(int),
610		.mode		= 0644,
611		.proc_handler	= &proc_dointvec
612	},
613	{
614		.ctl_name	= NET_IPV4_ICMP_RATELIMIT,
615		.procname	= "icmp_ratelimit",
616		.data		= &sysctl_icmp_ratelimit,
617		.maxlen		= sizeof(int),
618		.mode		= 0644,
619		.proc_handler	= &proc_dointvec
620	},
621	{
622		.ctl_name	= NET_IPV4_ICMP_RATEMASK,
623		.procname	= "icmp_ratemask",
624		.data		= &sysctl_icmp_ratemask,
625		.maxlen		= sizeof(int),
626		.mode		= 0644,
627		.proc_handler	= &proc_dointvec
628	},
629	{
630		.ctl_name	= NET_TCP_TW_REUSE,
631		.procname	= "tcp_tw_reuse",
632		.data		= &sysctl_tcp_tw_reuse,
633		.maxlen		= sizeof(int),
634		.mode		= 0644,
635		.proc_handler	= &proc_dointvec
636	},
637	{
638		.ctl_name	= NET_TCP_FRTO,
639		.procname	= "tcp_frto",
640		.data		= &sysctl_tcp_frto,
641		.maxlen		= sizeof(int),
642		.mode		= 0644,
643		.proc_handler	= &proc_dointvec
644	},
645	{
646		.ctl_name	= NET_TCP_FRTO_RESPONSE,
647		.procname	= "tcp_frto_response",
648		.data		= &sysctl_tcp_frto_response,
649		.maxlen		= sizeof(int),
650		.mode		= 0644,
651		.proc_handler	= &proc_dointvec
652	},
653	{
654		.ctl_name	= NET_TCP_LOW_LATENCY,
655		.procname	= "tcp_low_latency",
656		.data		= &sysctl_tcp_low_latency,
657		.maxlen		= sizeof(int),
658		.mode		= 0644,
659		.proc_handler	= &proc_dointvec
660	},
661	{
662		.ctl_name	= NET_IPV4_IPFRAG_SECRET_INTERVAL,
663		.procname	= "ipfrag_secret_interval",
664		.data		= &ip4_frags_ctl.secret_interval,
665		.maxlen		= sizeof(int),
666		.mode		= 0644,
667		.proc_handler	= &proc_dointvec_jiffies,
668		.strategy	= &sysctl_jiffies
669	},
670	{
671		.procname	= "ipfrag_max_dist",
672		.data		= &sysctl_ipfrag_max_dist,
673		.maxlen		= sizeof(int),
674		.mode		= 0644,
675		.proc_handler	= &proc_dointvec_minmax,
676		.extra1		= &zero
677	},
678	{
679		.ctl_name	= NET_TCP_NO_METRICS_SAVE,
680		.procname	= "tcp_no_metrics_save",
681		.data		= &sysctl_tcp_nometrics_save,
682		.maxlen		= sizeof(int),
683		.mode		= 0644,
684		.proc_handler	= &proc_dointvec,
685	},
686	{
687		.ctl_name	= NET_TCP_MODERATE_RCVBUF,
688		.procname	= "tcp_moderate_rcvbuf",
689		.data		= &sysctl_tcp_moderate_rcvbuf,
690		.maxlen		= sizeof(int),
691		.mode		= 0644,
692		.proc_handler	= &proc_dointvec,
693	},
694	{
695		.ctl_name	= NET_TCP_TSO_WIN_DIVISOR,
696		.procname	= "tcp_tso_win_divisor",
697		.data		= &sysctl_tcp_tso_win_divisor,
698		.maxlen		= sizeof(int),
699		.mode		= 0644,
700		.proc_handler	= &proc_dointvec,
701	},
702	{
703		.ctl_name	= NET_TCP_CONG_CONTROL,
704		.procname	= "tcp_congestion_control",
705		.mode		= 0644,
706		.maxlen		= TCP_CA_NAME_MAX,
707		.proc_handler	= &proc_tcp_congestion_control,
708		.strategy	= &sysctl_tcp_congestion_control,
709	},
710	{
711		.ctl_name	= NET_TCP_ABC,
712		.procname	= "tcp_abc",
713		.data		= &sysctl_tcp_abc,
714		.maxlen		= sizeof(int),
715		.mode		= 0644,
716		.proc_handler	= &proc_dointvec,
717	},
718	{
719		.ctl_name	= NET_TCP_MTU_PROBING,
720		.procname	= "tcp_mtu_probing",
721		.data		= &sysctl_tcp_mtu_probing,
722		.maxlen		= sizeof(int),
723		.mode		= 0644,
724		.proc_handler	= &proc_dointvec,
725	},
726	{
727		.ctl_name	= NET_TCP_BASE_MSS,
728		.procname	= "tcp_base_mss",
729		.data		= &sysctl_tcp_base_mss,
730		.maxlen		= sizeof(int),
731		.mode		= 0644,
732		.proc_handler	= &proc_dointvec,
733	},
734	{
735		.ctl_name	= NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS,
736		.procname	= "tcp_workaround_signed_windows",
737		.data		= &sysctl_tcp_workaround_signed_windows,
738		.maxlen		= sizeof(int),
739		.mode		= 0644,
740		.proc_handler	= &proc_dointvec
741	},
742#ifdef CONFIG_NET_DMA
743	{
744		.ctl_name	= NET_TCP_DMA_COPYBREAK,
745		.procname	= "tcp_dma_copybreak",
746		.data		= &sysctl_tcp_dma_copybreak,
747		.maxlen		= sizeof(int),
748		.mode		= 0644,
749		.proc_handler	= &proc_dointvec
750	},
751#endif
752	{
753		.ctl_name	= NET_TCP_SLOW_START_AFTER_IDLE,
754		.procname	= "tcp_slow_start_after_idle",
755		.data		= &sysctl_tcp_slow_start_after_idle,
756		.maxlen		= sizeof(int),
757		.mode		= 0644,
758		.proc_handler	= &proc_dointvec
759	},
760#ifdef CONFIG_NETLABEL
761	{
762		.ctl_name	= NET_CIPSOV4_CACHE_ENABLE,
763		.procname	= "cipso_cache_enable",
764		.data		= &cipso_v4_cache_enabled,
765		.maxlen		= sizeof(int),
766		.mode		= 0644,
767		.proc_handler	= &proc_dointvec,
768	},
769	{
770		.ctl_name	= NET_CIPSOV4_CACHE_BUCKET_SIZE,
771		.procname	= "cipso_cache_bucket_size",
772		.data		= &cipso_v4_cache_bucketsize,
773		.maxlen		= sizeof(int),
774		.mode		= 0644,
775		.proc_handler	= &proc_dointvec,
776	},
777	{
778		.ctl_name	= NET_CIPSOV4_RBM_OPTFMT,
779		.procname	= "cipso_rbm_optfmt",
780		.data		= &cipso_v4_rbm_optfmt,
781		.maxlen		= sizeof(int),
782		.mode		= 0644,
783		.proc_handler	= &proc_dointvec,
784	},
785	{
786		.ctl_name	= NET_CIPSOV4_RBM_STRICTVALID,
787		.procname	= "cipso_rbm_strictvalid",
788		.data		= &cipso_v4_rbm_strictvalid,
789		.maxlen		= sizeof(int),
790		.mode		= 0644,
791		.proc_handler	= &proc_dointvec,
792	},
793#endif /* CONFIG_NETLABEL */
794	{
795		.procname	= "tcp_available_congestion_control",
796		.maxlen		= TCP_CA_BUF_MAX,
797		.mode		= 0444,
798		.proc_handler   = &proc_tcp_available_congestion_control,
799	},
800	{
801		.ctl_name	= NET_TCP_ALLOWED_CONG_CONTROL,
802		.procname	= "tcp_allowed_congestion_control",
803		.maxlen		= TCP_CA_BUF_MAX,
804		.mode		= 0644,
805		.proc_handler   = &proc_allowed_congestion_control,
806		.strategy	= &strategy_allowed_congestion_control,
807	},
808	{
809		.ctl_name	= NET_TCP_MAX_SSTHRESH,
810		.procname	= "tcp_max_ssthresh",
811		.data		= &sysctl_tcp_max_ssthresh,
812		.maxlen		= sizeof(int),
813		.mode		= 0644,
814		.proc_handler	= &proc_dointvec,
815	},
816	{
817		.ctl_name	= CTL_UNNUMBERED,
818		.procname	= "udp_mem",
819		.data		= &sysctl_udp_mem,
820		.maxlen		= sizeof(sysctl_udp_mem),
821		.mode		= 0644,
822		.proc_handler	= &proc_dointvec_minmax,
823		.strategy	= &sysctl_intvec,
824		.extra1		= &zero
825	},
826	{
827		.ctl_name	= CTL_UNNUMBERED,
828		.procname	= "udp_rmem_min",
829		.data		= &sysctl_udp_rmem_min,
830		.maxlen		= sizeof(sysctl_udp_rmem_min),
831		.mode		= 0644,
832		.proc_handler	= &proc_dointvec_minmax,
833		.strategy	= &sysctl_intvec,
834		.extra1		= &zero
835	},
836	{
837		.ctl_name	= CTL_UNNUMBERED,
838		.procname	= "udp_wmem_min",
839		.data		= &sysctl_udp_wmem_min,
840		.maxlen		= sizeof(sysctl_udp_wmem_min),
841		.mode		= 0644,
842		.proc_handler	= &proc_dointvec_minmax,
843		.strategy	= &sysctl_intvec,
844		.extra1		= &zero
845	},
846	{ .ctl_name = 0 }
847};
848
849static __initdata struct ctl_path net_ipv4_path[] = {
850	{ .procname = "net", .ctl_name = CTL_NET, },
851	{ .procname = "ipv4", .ctl_name = NET_IPV4, },
852	{ },
853};
854
855static __init int sysctl_ipv4_init(void)
856{
857	struct ctl_table_header *hdr;
858
859	hdr = register_sysctl_paths(net_ipv4_path, ipv4_table);
860	return hdr == NULL ? -ENOMEM : 0;
861}
862
863__initcall(sysctl_ipv4_init);
864