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