blob: 844f26fab06f9b06e4dde166c299a1acf299921e [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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>
Arnaldo Carvalho de Melo20380732005-08-16 02:18:02 -030013#include <linux/igmp.h>
Arnaldo Carvalho de Melo14c85022005-12-27 02:43:12 -020014#include <linux/inetdevice.h>
Stephen Hemminger227b60f2007-10-10 17:30:46 -070015#include <linux/seqlock.h>
Pavel Emelyanov3e37c3f2007-12-05 01:41:26 -080016#include <linux/init.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070017#include <net/snmp.h>
Arnaldo Carvalho de Melo20380732005-08-16 02:18:02 -030018#include <net/icmp.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070019#include <net/ip.h>
20#include <net/route.h>
21#include <net/tcp.h>
Paul Moore446fda42006-08-03 16:48:06 -070022#include <net/cipso_ipv4.h>
Pavel Emelyanov04128f22007-10-15 02:33:45 -070023#include <net/inet_frag.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Herbert Xu89cee8b2005-12-13 23:14:27 -080025static int zero;
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +090026static int tcp_retr1_max = 255;
Linus Torvalds1da177e2005-04-16 15:20:36 -070027static int ip_local_port_range_min[] = { 1, 1 };
28static int ip_local_port_range_max[] = { 65535, 65535 };
Linus Torvalds1da177e2005-04-16 15:20:36 -070029
Stephen Hemminger227b60f2007-10-10 17:30:46 -070030extern seqlock_t sysctl_port_range_lock;
31extern int sysctl_local_port_range[2];
32
33/* Update system visible IP port range */
34static void set_local_port_range(int range[2])
35{
36 write_seqlock(&sysctl_port_range_lock);
37 sysctl_local_port_range[0] = range[0];
38 sysctl_local_port_range[1] = range[1];
39 write_sequnlock(&sysctl_port_range_lock);
40}
41
42/* Validate changes from /proc interface. */
43static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp,
44 void __user *buffer,
45 size_t *lenp, loff_t *ppos)
46{
47 int ret;
48 int range[2] = { sysctl_local_port_range[0],
49 sysctl_local_port_range[1] };
50 ctl_table tmp = {
51 .data = &range,
52 .maxlen = sizeof(range),
53 .mode = table->mode,
54 .extra1 = &ip_local_port_range_min,
55 .extra2 = &ip_local_port_range_max,
56 };
57
58 ret = proc_dointvec_minmax(&tmp, write, filp, buffer, lenp, ppos);
59
60 if (write && ret == 0) {
Anton Arapova25de532007-10-18 22:00:17 -070061 if (range[1] < range[0])
Stephen Hemminger227b60f2007-10-10 17:30:46 -070062 ret = -EINVAL;
63 else
64 set_local_port_range(range);
65 }
66
67 return ret;
68}
69
70/* Validate changes from sysctl interface. */
71static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name,
72 int nlen, void __user *oldval,
73 size_t __user *oldlenp,
74 void __user *newval, size_t newlen)
75{
76 int ret;
77 int range[2] = { sysctl_local_port_range[0],
78 sysctl_local_port_range[1] };
79 ctl_table tmp = {
80 .data = &range,
81 .maxlen = sizeof(range),
82 .mode = table->mode,
83 .extra1 = &ip_local_port_range_min,
84 .extra2 = &ip_local_port_range_max,
85 };
86
87 ret = sysctl_intvec(&tmp, name, nlen, oldval, oldlenp, newval, newlen);
88 if (ret == 0 && newval && newlen) {
Anton Arapova25de532007-10-18 22:00:17 -070089 if (range[1] < range[0])
Stephen Hemminger227b60f2007-10-10 17:30:46 -070090 ret = -EINVAL;
91 else
92 set_local_port_range(range);
93 }
94 return ret;
95}
96
97
Stephen Hemminger317a76f2005-06-23 12:19:55 -070098static int proc_tcp_congestion_control(ctl_table *ctl, int write, struct file * filp,
99 void __user *buffer, size_t *lenp, loff_t *ppos)
100{
101 char val[TCP_CA_NAME_MAX];
102 ctl_table tbl = {
103 .data = val,
104 .maxlen = TCP_CA_NAME_MAX,
105 };
106 int ret;
107
108 tcp_get_default_congestion_control(val);
109
110 ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);
111 if (write && ret == 0)
112 ret = tcp_set_default_congestion_control(val);
113 return ret;
114}
115
Arnaldo Carvalho de Melo20380732005-08-16 02:18:02 -0300116static int sysctl_tcp_congestion_control(ctl_table *table, int __user *name,
117 int nlen, void __user *oldval,
118 size_t __user *oldlenp,
Alexey Dobriyan1f29bcd2006-12-10 02:19:10 -0800119 void __user *newval, size_t newlen)
Stephen Hemminger317a76f2005-06-23 12:19:55 -0700120{
121 char val[TCP_CA_NAME_MAX];
122 ctl_table tbl = {
123 .data = val,
124 .maxlen = TCP_CA_NAME_MAX,
125 };
126 int ret;
127
128 tcp_get_default_congestion_control(val);
Alexey Dobriyan1f29bcd2006-12-10 02:19:10 -0800129 ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen);
Sam Jansen54877962007-11-19 23:28:21 -0800130 if (ret == 1 && newval && newlen)
Stephen Hemminger317a76f2005-06-23 12:19:55 -0700131 ret = tcp_set_default_congestion_control(val);
132 return ret;
133}
134
Stephen Hemminger3ff825b2006-11-09 16:32:06 -0800135static int proc_tcp_available_congestion_control(ctl_table *ctl,
136 int write, struct file * filp,
137 void __user *buffer, size_t *lenp,
138 loff_t *ppos)
139{
140 ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, };
141 int ret;
142
143 tbl.data = kmalloc(tbl.maxlen, GFP_USER);
144 if (!tbl.data)
145 return -ENOMEM;
146 tcp_get_available_congestion_control(tbl.data, TCP_CA_BUF_MAX);
147 ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);
148 kfree(tbl.data);
149 return ret;
150}
151
Stephen Hemmingerce7bc3b2006-11-09 16:35:15 -0800152static int proc_allowed_congestion_control(ctl_table *ctl,
153 int write, struct file * filp,
154 void __user *buffer, size_t *lenp,
155 loff_t *ppos)
156{
157 ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
158 int ret;
159
160 tbl.data = kmalloc(tbl.maxlen, GFP_USER);
161 if (!tbl.data)
162 return -ENOMEM;
163
164 tcp_get_allowed_congestion_control(tbl.data, tbl.maxlen);
165 ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);
166 if (write && ret == 0)
167 ret = tcp_set_allowed_congestion_control(tbl.data);
168 kfree(tbl.data);
169 return ret;
170}
171
172static int strategy_allowed_congestion_control(ctl_table *table, int __user *name,
173 int nlen, void __user *oldval,
174 size_t __user *oldlenp,
Alexey Dobriyan1f29bcd2006-12-10 02:19:10 -0800175 void __user *newval,
176 size_t newlen)
Stephen Hemmingerce7bc3b2006-11-09 16:35:15 -0800177{
178 ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
179 int ret;
180
181 tbl.data = kmalloc(tbl.maxlen, GFP_USER);
182 if (!tbl.data)
183 return -ENOMEM;
184
185 tcp_get_available_congestion_control(tbl.data, tbl.maxlen);
Alexey Dobriyan1f29bcd2006-12-10 02:19:10 -0800186 ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen);
Stephen Hemmingerce7bc3b2006-11-09 16:35:15 -0800187 if (ret == 0 && newval && newlen)
188 ret = tcp_set_allowed_congestion_control(tbl.data);
189 kfree(tbl.data);
190
191 return ret;
192
193}
194
Pavel Emelyanov3e37c3f2007-12-05 01:41:26 -0800195static struct ctl_table ipv4_table[] = {
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900196 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 .ctl_name = NET_IPV4_TCP_TIMESTAMPS,
198 .procname = "tcp_timestamps",
199 .data = &sysctl_tcp_timestamps,
200 .maxlen = sizeof(int),
201 .mode = 0644,
202 .proc_handler = &proc_dointvec
203 },
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900204 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 .ctl_name = NET_IPV4_TCP_WINDOW_SCALING,
206 .procname = "tcp_window_scaling",
207 .data = &sysctl_tcp_window_scaling,
208 .maxlen = sizeof(int),
209 .mode = 0644,
210 .proc_handler = &proc_dointvec
211 },
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900212 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213 .ctl_name = NET_IPV4_TCP_SACK,
214 .procname = "tcp_sack",
215 .data = &sysctl_tcp_sack,
216 .maxlen = sizeof(int),
217 .mode = 0644,
218 .proc_handler = &proc_dointvec
219 },
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900220 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 .ctl_name = NET_IPV4_TCP_RETRANS_COLLAPSE,
222 .procname = "tcp_retrans_collapse",
223 .data = &sysctl_tcp_retrans_collapse,
224 .maxlen = sizeof(int),
225 .mode = 0644,
226 .proc_handler = &proc_dointvec
227 },
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900228 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229 .ctl_name = NET_IPV4_DEFAULT_TTL,
230 .procname = "ip_default_ttl",
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900231 .data = &sysctl_ip_default_ttl,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232 .maxlen = sizeof(int),
233 .mode = 0644,
234 .proc_handler = &ipv4_doint_and_flush,
235 .strategy = &ipv4_doint_and_flush_strategy,
236 },
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900237 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238 .ctl_name = NET_IPV4_NO_PMTU_DISC,
239 .procname = "ip_no_pmtu_disc",
240 .data = &ipv4_config.no_pmtu_disc,
241 .maxlen = sizeof(int),
242 .mode = 0644,
243 .proc_handler = &proc_dointvec
244 },
245 {
246 .ctl_name = NET_IPV4_NONLOCAL_BIND,
247 .procname = "ip_nonlocal_bind",
248 .data = &sysctl_ip_nonlocal_bind,
249 .maxlen = sizeof(int),
250 .mode = 0644,
251 .proc_handler = &proc_dointvec
252 },
253 {
254 .ctl_name = NET_IPV4_TCP_SYN_RETRIES,
255 .procname = "tcp_syn_retries",
256 .data = &sysctl_tcp_syn_retries,
257 .maxlen = sizeof(int),
258 .mode = 0644,
259 .proc_handler = &proc_dointvec
260 },
261 {
262 .ctl_name = NET_TCP_SYNACK_RETRIES,
263 .procname = "tcp_synack_retries",
264 .data = &sysctl_tcp_synack_retries,
265 .maxlen = sizeof(int),
266 .mode = 0644,
267 .proc_handler = &proc_dointvec
268 },
269 {
270 .ctl_name = NET_TCP_MAX_ORPHANS,
271 .procname = "tcp_max_orphans",
272 .data = &sysctl_tcp_max_orphans,
273 .maxlen = sizeof(int),
274 .mode = 0644,
275 .proc_handler = &proc_dointvec
276 },
277 {
278 .ctl_name = NET_TCP_MAX_TW_BUCKETS,
279 .procname = "tcp_max_tw_buckets",
Arnaldo Carvalho de Melo295ff7e2005-08-09 20:44:40 -0700280 .data = &tcp_death_row.sysctl_max_tw_buckets,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281 .maxlen = sizeof(int),
282 .mode = 0644,
283 .proc_handler = &proc_dointvec
284 },
285 {
286 .ctl_name = NET_IPV4_IPFRAG_HIGH_THRESH,
287 .procname = "ipfrag_high_thresh",
Pavel Emelyanov04128f22007-10-15 02:33:45 -0700288 .data = &ip4_frags_ctl.high_thresh,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 .maxlen = sizeof(int),
290 .mode = 0644,
291 .proc_handler = &proc_dointvec
292 },
293 {
294 .ctl_name = NET_IPV4_IPFRAG_LOW_THRESH,
295 .procname = "ipfrag_low_thresh",
Pavel Emelyanov04128f22007-10-15 02:33:45 -0700296 .data = &ip4_frags_ctl.low_thresh,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297 .maxlen = sizeof(int),
298 .mode = 0644,
299 .proc_handler = &proc_dointvec
300 },
301 {
302 .ctl_name = NET_IPV4_DYNADDR,
303 .procname = "ip_dynaddr",
304 .data = &sysctl_ip_dynaddr,
305 .maxlen = sizeof(int),
306 .mode = 0644,
307 .proc_handler = &proc_dointvec
308 },
309 {
310 .ctl_name = NET_IPV4_IPFRAG_TIME,
311 .procname = "ipfrag_time",
Pavel Emelyanov04128f22007-10-15 02:33:45 -0700312 .data = &ip4_frags_ctl.timeout,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313 .maxlen = sizeof(int),
314 .mode = 0644,
315 .proc_handler = &proc_dointvec_jiffies,
316 .strategy = &sysctl_jiffies
317 },
318 {
319 .ctl_name = NET_IPV4_TCP_KEEPALIVE_TIME,
320 .procname = "tcp_keepalive_time",
321 .data = &sysctl_tcp_keepalive_time,
322 .maxlen = sizeof(int),
323 .mode = 0644,
324 .proc_handler = &proc_dointvec_jiffies,
325 .strategy = &sysctl_jiffies
326 },
327 {
328 .ctl_name = NET_IPV4_TCP_KEEPALIVE_PROBES,
329 .procname = "tcp_keepalive_probes",
330 .data = &sysctl_tcp_keepalive_probes,
331 .maxlen = sizeof(int),
332 .mode = 0644,
333 .proc_handler = &proc_dointvec
334 },
335 {
336 .ctl_name = NET_IPV4_TCP_KEEPALIVE_INTVL,
337 .procname = "tcp_keepalive_intvl",
338 .data = &sysctl_tcp_keepalive_intvl,
339 .maxlen = sizeof(int),
340 .mode = 0644,
341 .proc_handler = &proc_dointvec_jiffies,
342 .strategy = &sysctl_jiffies
343 },
344 {
345 .ctl_name = NET_IPV4_TCP_RETRIES1,
346 .procname = "tcp_retries1",
347 .data = &sysctl_tcp_retries1,
348 .maxlen = sizeof(int),
349 .mode = 0644,
350 .proc_handler = &proc_dointvec_minmax,
351 .strategy = &sysctl_intvec,
352 .extra2 = &tcp_retr1_max
353 },
354 {
355 .ctl_name = NET_IPV4_TCP_RETRIES2,
356 .procname = "tcp_retries2",
357 .data = &sysctl_tcp_retries2,
358 .maxlen = sizeof(int),
359 .mode = 0644,
360 .proc_handler = &proc_dointvec
361 },
362 {
363 .ctl_name = NET_IPV4_TCP_FIN_TIMEOUT,
364 .procname = "tcp_fin_timeout",
365 .data = &sysctl_tcp_fin_timeout,
366 .maxlen = sizeof(int),
367 .mode = 0644,
368 .proc_handler = &proc_dointvec_jiffies,
369 .strategy = &sysctl_jiffies
370 },
371#ifdef CONFIG_SYN_COOKIES
372 {
373 .ctl_name = NET_TCP_SYNCOOKIES,
374 .procname = "tcp_syncookies",
375 .data = &sysctl_tcp_syncookies,
376 .maxlen = sizeof(int),
377 .mode = 0644,
378 .proc_handler = &proc_dointvec
379 },
380#endif
381 {
382 .ctl_name = NET_TCP_TW_RECYCLE,
383 .procname = "tcp_tw_recycle",
Arnaldo Carvalho de Melo295ff7e2005-08-09 20:44:40 -0700384 .data = &tcp_death_row.sysctl_tw_recycle,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 .maxlen = sizeof(int),
386 .mode = 0644,
387 .proc_handler = &proc_dointvec
388 },
389 {
390 .ctl_name = NET_TCP_ABORT_ON_OVERFLOW,
391 .procname = "tcp_abort_on_overflow",
392 .data = &sysctl_tcp_abort_on_overflow,
393 .maxlen = sizeof(int),
394 .mode = 0644,
395 .proc_handler = &proc_dointvec
396 },
397 {
398 .ctl_name = NET_TCP_STDURG,
399 .procname = "tcp_stdurg",
400 .data = &sysctl_tcp_stdurg,
401 .maxlen = sizeof(int),
402 .mode = 0644,
403 .proc_handler = &proc_dointvec
404 },
405 {
406 .ctl_name = NET_TCP_RFC1337,
407 .procname = "tcp_rfc1337",
408 .data = &sysctl_tcp_rfc1337,
409 .maxlen = sizeof(int),
410 .mode = 0644,
411 .proc_handler = &proc_dointvec
412 },
413 {
414 .ctl_name = NET_TCP_MAX_SYN_BACKLOG,
415 .procname = "tcp_max_syn_backlog",
416 .data = &sysctl_max_syn_backlog,
417 .maxlen = sizeof(int),
418 .mode = 0644,
419 .proc_handler = &proc_dointvec
420 },
421 {
422 .ctl_name = NET_IPV4_LOCAL_PORT_RANGE,
423 .procname = "ip_local_port_range",
424 .data = &sysctl_local_port_range,
425 .maxlen = sizeof(sysctl_local_port_range),
426 .mode = 0644,
Stephen Hemminger227b60f2007-10-10 17:30:46 -0700427 .proc_handler = &ipv4_local_port_range,
428 .strategy = &ipv4_sysctl_local_port_range,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429 },
430 {
431 .ctl_name = NET_IPV4_ICMP_ECHO_IGNORE_ALL,
432 .procname = "icmp_echo_ignore_all",
433 .data = &sysctl_icmp_echo_ignore_all,
434 .maxlen = sizeof(int),
435 .mode = 0644,
436 .proc_handler = &proc_dointvec
437 },
438 {
439 .ctl_name = NET_IPV4_ICMP_ECHO_IGNORE_BROADCASTS,
440 .procname = "icmp_echo_ignore_broadcasts",
441 .data = &sysctl_icmp_echo_ignore_broadcasts,
442 .maxlen = sizeof(int),
443 .mode = 0644,
444 .proc_handler = &proc_dointvec
445 },
446 {
447 .ctl_name = NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES,
448 .procname = "icmp_ignore_bogus_error_responses",
449 .data = &sysctl_icmp_ignore_bogus_error_responses,
450 .maxlen = sizeof(int),
451 .mode = 0644,
452 .proc_handler = &proc_dointvec
453 },
454 {
J. Simonetti1c2fb7f2005-06-13 15:19:03 -0700455 .ctl_name = NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR,
456 .procname = "icmp_errors_use_inbound_ifaddr",
457 .data = &sysctl_icmp_errors_use_inbound_ifaddr,
458 .maxlen = sizeof(int),
459 .mode = 0644,
460 .proc_handler = &proc_dointvec
461 },
462 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 .ctl_name = NET_IPV4_ROUTE,
464 .procname = "route",
465 .maxlen = 0,
466 .mode = 0555,
467 .child = ipv4_route_table
468 },
469#ifdef CONFIG_IP_MULTICAST
470 {
471 .ctl_name = NET_IPV4_IGMP_MAX_MEMBERSHIPS,
472 .procname = "igmp_max_memberships",
473 .data = &sysctl_igmp_max_memberships,
474 .maxlen = sizeof(int),
475 .mode = 0644,
476 .proc_handler = &proc_dointvec
477 },
478
479#endif
480 {
481 .ctl_name = NET_IPV4_IGMP_MAX_MSF,
482 .procname = "igmp_max_msf",
483 .data = &sysctl_igmp_max_msf,
484 .maxlen = sizeof(int),
485 .mode = 0644,
486 .proc_handler = &proc_dointvec
487 },
488 {
489 .ctl_name = NET_IPV4_INET_PEER_THRESHOLD,
490 .procname = "inet_peer_threshold",
491 .data = &inet_peer_threshold,
492 .maxlen = sizeof(int),
493 .mode = 0644,
494 .proc_handler = &proc_dointvec
495 },
496 {
497 .ctl_name = NET_IPV4_INET_PEER_MINTTL,
498 .procname = "inet_peer_minttl",
499 .data = &inet_peer_minttl,
500 .maxlen = sizeof(int),
501 .mode = 0644,
502 .proc_handler = &proc_dointvec_jiffies,
503 .strategy = &sysctl_jiffies
504 },
505 {
506 .ctl_name = NET_IPV4_INET_PEER_MAXTTL,
507 .procname = "inet_peer_maxttl",
508 .data = &inet_peer_maxttl,
509 .maxlen = sizeof(int),
510 .mode = 0644,
511 .proc_handler = &proc_dointvec_jiffies,
512 .strategy = &sysctl_jiffies
513 },
514 {
515 .ctl_name = NET_IPV4_INET_PEER_GC_MINTIME,
516 .procname = "inet_peer_gc_mintime",
517 .data = &inet_peer_gc_mintime,
518 .maxlen = sizeof(int),
519 .mode = 0644,
520 .proc_handler = &proc_dointvec_jiffies,
521 .strategy = &sysctl_jiffies
522 },
523 {
524 .ctl_name = NET_IPV4_INET_PEER_GC_MAXTIME,
525 .procname = "inet_peer_gc_maxtime",
526 .data = &inet_peer_gc_maxtime,
527 .maxlen = sizeof(int),
528 .mode = 0644,
529 .proc_handler = &proc_dointvec_jiffies,
530 .strategy = &sysctl_jiffies
531 },
532 {
533 .ctl_name = NET_TCP_ORPHAN_RETRIES,
534 .procname = "tcp_orphan_retries",
535 .data = &sysctl_tcp_orphan_retries,
536 .maxlen = sizeof(int),
537 .mode = 0644,
538 .proc_handler = &proc_dointvec
539 },
540 {
541 .ctl_name = NET_TCP_FACK,
542 .procname = "tcp_fack",
543 .data = &sysctl_tcp_fack,
544 .maxlen = sizeof(int),
545 .mode = 0644,
546 .proc_handler = &proc_dointvec
547 },
548 {
549 .ctl_name = NET_TCP_REORDERING,
550 .procname = "tcp_reordering",
551 .data = &sysctl_tcp_reordering,
552 .maxlen = sizeof(int),
553 .mode = 0644,
554 .proc_handler = &proc_dointvec
555 },
556 {
557 .ctl_name = NET_TCP_ECN,
558 .procname = "tcp_ecn",
559 .data = &sysctl_tcp_ecn,
560 .maxlen = sizeof(int),
561 .mode = 0644,
562 .proc_handler = &proc_dointvec
563 },
564 {
565 .ctl_name = NET_TCP_DSACK,
566 .procname = "tcp_dsack",
567 .data = &sysctl_tcp_dsack,
568 .maxlen = sizeof(int),
569 .mode = 0644,
570 .proc_handler = &proc_dointvec
571 },
572 {
573 .ctl_name = NET_TCP_MEM,
574 .procname = "tcp_mem",
575 .data = &sysctl_tcp_mem,
576 .maxlen = sizeof(sysctl_tcp_mem),
577 .mode = 0644,
578 .proc_handler = &proc_dointvec
579 },
580 {
581 .ctl_name = NET_TCP_WMEM,
582 .procname = "tcp_wmem",
583 .data = &sysctl_tcp_wmem,
584 .maxlen = sizeof(sysctl_tcp_wmem),
585 .mode = 0644,
586 .proc_handler = &proc_dointvec
587 },
588 {
589 .ctl_name = NET_TCP_RMEM,
590 .procname = "tcp_rmem",
591 .data = &sysctl_tcp_rmem,
592 .maxlen = sizeof(sysctl_tcp_rmem),
593 .mode = 0644,
594 .proc_handler = &proc_dointvec
595 },
596 {
597 .ctl_name = NET_TCP_APP_WIN,
598 .procname = "tcp_app_win",
599 .data = &sysctl_tcp_app_win,
600 .maxlen = sizeof(int),
601 .mode = 0644,
602 .proc_handler = &proc_dointvec
603 },
604 {
605 .ctl_name = NET_TCP_ADV_WIN_SCALE,
606 .procname = "tcp_adv_win_scale",
607 .data = &sysctl_tcp_adv_win_scale,
608 .maxlen = sizeof(int),
609 .mode = 0644,
610 .proc_handler = &proc_dointvec
611 },
612 {
613 .ctl_name = NET_IPV4_ICMP_RATELIMIT,
614 .procname = "icmp_ratelimit",
615 .data = &sysctl_icmp_ratelimit,
616 .maxlen = sizeof(int),
617 .mode = 0644,
618 .proc_handler = &proc_dointvec
619 },
620 {
621 .ctl_name = NET_IPV4_ICMP_RATEMASK,
622 .procname = "icmp_ratemask",
623 .data = &sysctl_icmp_ratemask,
624 .maxlen = sizeof(int),
625 .mode = 0644,
626 .proc_handler = &proc_dointvec
627 },
628 {
629 .ctl_name = NET_TCP_TW_REUSE,
630 .procname = "tcp_tw_reuse",
631 .data = &sysctl_tcp_tw_reuse,
632 .maxlen = sizeof(int),
633 .mode = 0644,
634 .proc_handler = &proc_dointvec
635 },
636 {
637 .ctl_name = NET_TCP_FRTO,
638 .procname = "tcp_frto",
639 .data = &sysctl_tcp_frto,
640 .maxlen = sizeof(int),
641 .mode = 0644,
642 .proc_handler = &proc_dointvec
643 },
644 {
Ilpo Järvinen3cfe3ba2007-02-27 10:09:49 -0800645 .ctl_name = NET_TCP_FRTO_RESPONSE,
646 .procname = "tcp_frto_response",
647 .data = &sysctl_tcp_frto_response,
648 .maxlen = sizeof(int),
649 .mode = 0644,
650 .proc_handler = &proc_dointvec
651 },
652 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653 .ctl_name = NET_TCP_LOW_LATENCY,
654 .procname = "tcp_low_latency",
655 .data = &sysctl_tcp_low_latency,
656 .maxlen = sizeof(int),
657 .mode = 0644,
658 .proc_handler = &proc_dointvec
659 },
660 {
661 .ctl_name = NET_IPV4_IPFRAG_SECRET_INTERVAL,
662 .procname = "ipfrag_secret_interval",
Pavel Emelyanov04128f22007-10-15 02:33:45 -0700663 .data = &ip4_frags_ctl.secret_interval,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 .maxlen = sizeof(int),
665 .mode = 0644,
666 .proc_handler = &proc_dointvec_jiffies,
667 .strategy = &sysctl_jiffies
668 },
669 {
Herbert Xu89cee8b2005-12-13 23:14:27 -0800670 .procname = "ipfrag_max_dist",
671 .data = &sysctl_ipfrag_max_dist,
672 .maxlen = sizeof(int),
673 .mode = 0644,
674 .proc_handler = &proc_dointvec_minmax,
675 .extra1 = &zero
676 },
677 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 .ctl_name = NET_TCP_NO_METRICS_SAVE,
679 .procname = "tcp_no_metrics_save",
680 .data = &sysctl_tcp_nometrics_save,
681 .maxlen = sizeof(int),
682 .mode = 0644,
683 .proc_handler = &proc_dointvec,
684 },
685 {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 .ctl_name = NET_TCP_MODERATE_RCVBUF,
687 .procname = "tcp_moderate_rcvbuf",
688 .data = &sysctl_tcp_moderate_rcvbuf,
689 .maxlen = sizeof(int),
690 .mode = 0644,
691 .proc_handler = &proc_dointvec,
692 },
693 {
694 .ctl_name = NET_TCP_TSO_WIN_DIVISOR,
695 .procname = "tcp_tso_win_divisor",
696 .data = &sysctl_tcp_tso_win_divisor,
697 .maxlen = sizeof(int),
698 .mode = 0644,
699 .proc_handler = &proc_dointvec,
700 },
701 {
Stephen Hemminger317a76f2005-06-23 12:19:55 -0700702 .ctl_name = NET_TCP_CONG_CONTROL,
703 .procname = "tcp_congestion_control",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 .mode = 0644,
Stephen Hemminger317a76f2005-06-23 12:19:55 -0700705 .maxlen = TCP_CA_NAME_MAX,
706 .proc_handler = &proc_tcp_congestion_control,
707 .strategy = &sysctl_tcp_congestion_control,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708 },
Stephen Hemminger9772efb2005-11-10 17:09:53 -0800709 {
710 .ctl_name = NET_TCP_ABC,
711 .procname = "tcp_abc",
712 .data = &sysctl_tcp_abc,
713 .maxlen = sizeof(int),
714 .mode = 0644,
715 .proc_handler = &proc_dointvec,
716 },
John Heffner5d424d52006-03-20 17:53:41 -0800717 {
718 .ctl_name = NET_TCP_MTU_PROBING,
719 .procname = "tcp_mtu_probing",
720 .data = &sysctl_tcp_mtu_probing,
721 .maxlen = sizeof(int),
722 .mode = 0644,
723 .proc_handler = &proc_dointvec,
724 },
725 {
726 .ctl_name = NET_TCP_BASE_MSS,
727 .procname = "tcp_base_mss",
728 .data = &sysctl_tcp_base_mss,
729 .maxlen = sizeof(int),
730 .mode = 0644,
731 .proc_handler = &proc_dointvec,
732 },
YOSHIFUJI Hideakie905a9e2007-02-09 23:24:47 +0900733 {
Rick Jones15d99e02006-03-20 22:40:29 -0800734 .ctl_name = NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS,
735 .procname = "tcp_workaround_signed_windows",
736 .data = &sysctl_tcp_workaround_signed_windows,
737 .maxlen = sizeof(int),
738 .mode = 0644,
739 .proc_handler = &proc_dointvec
740 },
Chris Leech95937822006-05-23 18:02:55 -0700741#ifdef CONFIG_NET_DMA
742 {
743 .ctl_name = NET_TCP_DMA_COPYBREAK,
744 .procname = "tcp_dma_copybreak",
745 .data = &sysctl_tcp_dma_copybreak,
746 .maxlen = sizeof(int),
747 .mode = 0644,
748 .proc_handler = &proc_dointvec
749 },
750#endif
David S. Miller35089bb2006-06-13 22:33:04 -0700751 {
752 .ctl_name = NET_TCP_SLOW_START_AFTER_IDLE,
753 .procname = "tcp_slow_start_after_idle",
754 .data = &sysctl_tcp_slow_start_after_idle,
755 .maxlen = sizeof(int),
756 .mode = 0644,
757 .proc_handler = &proc_dointvec
758 },
Paul Moore446fda42006-08-03 16:48:06 -0700759#ifdef CONFIG_NETLABEL
760 {
761 .ctl_name = NET_CIPSOV4_CACHE_ENABLE,
762 .procname = "cipso_cache_enable",
763 .data = &cipso_v4_cache_enabled,
764 .maxlen = sizeof(int),
765 .mode = 0644,
766 .proc_handler = &proc_dointvec,
767 },
768 {
769 .ctl_name = NET_CIPSOV4_CACHE_BUCKET_SIZE,
770 .procname = "cipso_cache_bucket_size",
771 .data = &cipso_v4_cache_bucketsize,
772 .maxlen = sizeof(int),
773 .mode = 0644,
774 .proc_handler = &proc_dointvec,
775 },
776 {
777 .ctl_name = NET_CIPSOV4_RBM_OPTFMT,
778 .procname = "cipso_rbm_optfmt",
779 .data = &cipso_v4_rbm_optfmt,
780 .maxlen = sizeof(int),
781 .mode = 0644,
782 .proc_handler = &proc_dointvec,
783 },
784 {
785 .ctl_name = NET_CIPSOV4_RBM_STRICTVALID,
786 .procname = "cipso_rbm_strictvalid",
787 .data = &cipso_v4_rbm_strictvalid,
788 .maxlen = sizeof(int),
789 .mode = 0644,
790 .proc_handler = &proc_dointvec,
791 },
792#endif /* CONFIG_NETLABEL */
Stephen Hemminger3ff825b2006-11-09 16:32:06 -0800793 {
Stephen Hemminger3ff825b2006-11-09 16:32:06 -0800794 .procname = "tcp_available_congestion_control",
795 .maxlen = TCP_CA_BUF_MAX,
796 .mode = 0444,
797 .proc_handler = &proc_tcp_available_congestion_control,
798 },
Stephen Hemmingerce7bc3b2006-11-09 16:35:15 -0800799 {
800 .ctl_name = NET_TCP_ALLOWED_CONG_CONTROL,
801 .procname = "tcp_allowed_congestion_control",
802 .maxlen = TCP_CA_BUF_MAX,
803 .mode = 0644,
804 .proc_handler = &proc_allowed_congestion_control,
805 .strategy = &strategy_allowed_congestion_control,
806 },
John Heffner886236c2007-03-25 19:21:45 -0700807 {
808 .ctl_name = NET_TCP_MAX_SSTHRESH,
809 .procname = "tcp_max_ssthresh",
810 .data = &sysctl_tcp_max_ssthresh,
811 .maxlen = sizeof(int),
812 .mode = 0644,
813 .proc_handler = &proc_dointvec,
814 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815 { .ctl_name = 0 }
816};
Pavel Emelyanov3e37c3f2007-12-05 01:41:26 -0800817
818static __initdata struct ctl_path net_ipv4_path[] = {
819 { .procname = "net", .ctl_name = CTL_NET, },
820 { .procname = "ipv4", .ctl_name = NET_IPV4, },
821 { },
822};
823
824static __init int sysctl_ipv4_init(void)
825{
826 struct ctl_table_header *hdr;
827
828 hdr = register_sysctl_paths(net_ipv4_path, ipv4_table);
829 return hdr == NULL ? -ENOMEM : 0;
830}
831
832__initcall(sysctl_ipv4_init);