2 * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
4 * $Id: sysctl_net_ipv4.c,v 1.50 2001/10/20 00:00:11 davem Exp $
6 * Begun April 1, 1996, Mike Shaver.
7 * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
11 #include <linux/module.h>
12 #include <linux/sysctl.h>
13 #include <linux/config.h>
16 #include <net/route.h>
20 extern int sysctl_ip_nonlocal_bind;
23 extern int sysctl_icmp_echo_ignore_all;
24 extern int sysctl_icmp_echo_ignore_broadcasts;
25 extern int sysctl_icmp_ignore_bogus_error_responses;
26 extern int sysctl_icmp_errors_use_inbound_ifaddr;
27 #ifdef CONFIG_ICMP_IPOD
28 extern int sysctl_icmp_ipod_version;
29 extern int sysctl_icmp_ipod_enabled;
30 extern u32 sysctl_icmp_ipod_host;
31 extern u32 sysctl_icmp_ipod_mask;
32 extern char sysctl_icmp_ipod_key[32+1];
35 /* From ip_fragment.c */
36 extern int sysctl_ipfrag_low_thresh;
37 extern int sysctl_ipfrag_high_thresh;
38 extern int sysctl_ipfrag_time;
39 extern int sysctl_ipfrag_secret_interval;
41 /* From ip_output.c */
42 extern int sysctl_ip_dynaddr;
45 extern int sysctl_icmp_ratelimit;
46 extern int sysctl_icmp_ratemask;
49 extern int sysctl_igmp_max_memberships;
50 extern int sysctl_igmp_max_msf;
53 extern int inet_peer_threshold;
54 extern int inet_peer_minttl;
55 extern int inet_peer_maxttl;
56 extern int inet_peer_gc_mintime;
57 extern int inet_peer_gc_maxtime;
60 static int tcp_retr1_max = 255;
61 static int ip_local_port_range_min[] = { 1, 1 };
62 static int ip_local_port_range_max[] = { 65535, 65535 };
65 struct ipv4_config ipv4_config;
67 extern ctl_table ipv4_route_table[];
72 int ipv4_sysctl_forward(ctl_table *ctl, int write, struct file * filp,
73 void __user *buffer, size_t *lenp, loff_t *ppos)
75 int val = ipv4_devconf.forwarding;
78 ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
80 if (write && ipv4_devconf.forwarding != val)
81 inet_forward_change();
86 static int ipv4_sysctl_forward_strategy(ctl_table *table,
87 int __user *name, int nlen,
88 void __user *oldval, size_t __user *oldlenp,
89 void __user *newval, size_t newlen,
92 int *valp = table->data;
95 if (!newval || !newlen)
98 if (newlen != sizeof(int))
101 if (get_user(new, (int __user *)newval))
107 if (oldval && oldlenp) {
110 if (get_user(len, oldlenp))
114 if (len > table->maxlen)
116 if (copy_to_user(oldval, valp, len))
118 if (put_user(len, oldlenp))
124 inet_forward_change();
128 ctl_table ipv4_table[] = {
130 .ctl_name = NET_IPV4_TCP_TIMESTAMPS,
131 .procname = "tcp_timestamps",
132 .data = &sysctl_tcp_timestamps,
133 .maxlen = sizeof(int),
135 .proc_handler = &proc_dointvec
138 .ctl_name = NET_IPV4_TCP_WINDOW_SCALING,
139 .procname = "tcp_window_scaling",
140 .data = &sysctl_tcp_window_scaling,
141 .maxlen = sizeof(int),
143 .proc_handler = &proc_dointvec
146 .ctl_name = NET_IPV4_TCP_SACK,
147 .procname = "tcp_sack",
148 .data = &sysctl_tcp_sack,
149 .maxlen = sizeof(int),
151 .proc_handler = &proc_dointvec
154 .ctl_name = NET_IPV4_TCP_RETRANS_COLLAPSE,
155 .procname = "tcp_retrans_collapse",
156 .data = &sysctl_tcp_retrans_collapse,
157 .maxlen = sizeof(int),
159 .proc_handler = &proc_dointvec
162 .ctl_name = NET_IPV4_FORWARD,
163 .procname = "ip_forward",
164 .data = &ipv4_devconf.forwarding,
165 .maxlen = sizeof(int),
167 .proc_handler = &ipv4_sysctl_forward,
168 .strategy = &ipv4_sysctl_forward_strategy
171 .ctl_name = NET_IPV4_DEFAULT_TTL,
172 .procname = "ip_default_ttl",
173 .data = &sysctl_ip_default_ttl,
174 .maxlen = sizeof(int),
176 .proc_handler = &ipv4_doint_and_flush,
177 .strategy = &ipv4_doint_and_flush_strategy,
180 .ctl_name = NET_IPV4_AUTOCONFIG,
181 .procname = "ip_autoconfig",
182 .data = &ipv4_config.autoconfig,
183 .maxlen = sizeof(int),
185 .proc_handler = &proc_dointvec
188 .ctl_name = NET_IPV4_NO_PMTU_DISC,
189 .procname = "ip_no_pmtu_disc",
190 .data = &ipv4_config.no_pmtu_disc,
191 .maxlen = sizeof(int),
193 .proc_handler = &proc_dointvec
196 .ctl_name = NET_IPV4_NONLOCAL_BIND,
197 .procname = "ip_nonlocal_bind",
198 .data = &sysctl_ip_nonlocal_bind,
199 .maxlen = sizeof(int),
201 .proc_handler = &proc_dointvec
204 .ctl_name = NET_IPV4_TCP_SYN_RETRIES,
205 .procname = "tcp_syn_retries",
206 .data = &sysctl_tcp_syn_retries,
207 .maxlen = sizeof(int),
209 .proc_handler = &proc_dointvec
212 .ctl_name = NET_TCP_SYNACK_RETRIES,
213 .procname = "tcp_synack_retries",
214 .data = &sysctl_tcp_synack_retries,
215 .maxlen = sizeof(int),
217 .proc_handler = &proc_dointvec
220 .ctl_name = NET_TCP_MAX_ORPHANS,
221 .procname = "tcp_max_orphans",
222 .data = &sysctl_tcp_max_orphans,
223 .maxlen = sizeof(int),
225 .proc_handler = &proc_dointvec
228 .ctl_name = NET_TCP_MAX_TW_BUCKETS,
229 .procname = "tcp_max_tw_buckets",
230 .data = &sysctl_tcp_max_tw_buckets,
231 .maxlen = sizeof(int),
233 .proc_handler = &proc_dointvec
236 .ctl_name = NET_IPV4_IPFRAG_HIGH_THRESH,
237 .procname = "ipfrag_high_thresh",
238 .data = &sysctl_ipfrag_high_thresh,
239 .maxlen = sizeof(int),
241 .proc_handler = &proc_dointvec
244 .ctl_name = NET_IPV4_IPFRAG_LOW_THRESH,
245 .procname = "ipfrag_low_thresh",
246 .data = &sysctl_ipfrag_low_thresh,
247 .maxlen = sizeof(int),
249 .proc_handler = &proc_dointvec
252 .ctl_name = NET_IPV4_DYNADDR,
253 .procname = "ip_dynaddr",
254 .data = &sysctl_ip_dynaddr,
255 .maxlen = sizeof(int),
257 .proc_handler = &proc_dointvec
260 .ctl_name = NET_IPV4_IPFRAG_TIME,
261 .procname = "ipfrag_time",
262 .data = &sysctl_ipfrag_time,
263 .maxlen = sizeof(int),
265 .proc_handler = &proc_dointvec_jiffies,
266 .strategy = &sysctl_jiffies
269 .ctl_name = NET_IPV4_TCP_KEEPALIVE_TIME,
270 .procname = "tcp_keepalive_time",
271 .data = &sysctl_tcp_keepalive_time,
272 .maxlen = sizeof(int),
274 .proc_handler = &proc_dointvec_jiffies,
275 .strategy = &sysctl_jiffies
278 .ctl_name = NET_IPV4_TCP_KEEPALIVE_PROBES,
279 .procname = "tcp_keepalive_probes",
280 .data = &sysctl_tcp_keepalive_probes,
281 .maxlen = sizeof(int),
283 .proc_handler = &proc_dointvec
286 .ctl_name = NET_IPV4_TCP_KEEPALIVE_INTVL,
287 .procname = "tcp_keepalive_intvl",
288 .data = &sysctl_tcp_keepalive_intvl,
289 .maxlen = sizeof(int),
291 .proc_handler = &proc_dointvec_jiffies,
292 .strategy = &sysctl_jiffies
295 .ctl_name = NET_IPV4_TCP_RETRIES1,
296 .procname = "tcp_retries1",
297 .data = &sysctl_tcp_retries1,
298 .maxlen = sizeof(int),
300 .proc_handler = &proc_dointvec_minmax,
301 .strategy = &sysctl_intvec,
302 .extra2 = &tcp_retr1_max
305 .ctl_name = NET_IPV4_TCP_RETRIES2,
306 .procname = "tcp_retries2",
307 .data = &sysctl_tcp_retries2,
308 .maxlen = sizeof(int),
310 .proc_handler = &proc_dointvec
313 .ctl_name = NET_IPV4_TCP_FIN_TIMEOUT,
314 .procname = "tcp_fin_timeout",
315 .data = &sysctl_tcp_fin_timeout,
316 .maxlen = sizeof(int),
318 .proc_handler = &proc_dointvec_jiffies,
319 .strategy = &sysctl_jiffies
321 #ifdef CONFIG_SYN_COOKIES
323 .ctl_name = NET_TCP_SYNCOOKIES,
324 .procname = "tcp_syncookies",
325 .data = &sysctl_tcp_syncookies,
326 .maxlen = sizeof(int),
328 .proc_handler = &proc_dointvec
332 .ctl_name = NET_TCP_TW_RECYCLE,
333 .procname = "tcp_tw_recycle",
334 .data = &sysctl_tcp_tw_recycle,
335 .maxlen = sizeof(int),
337 .proc_handler = &proc_dointvec
340 .ctl_name = NET_TCP_ABORT_ON_OVERFLOW,
341 .procname = "tcp_abort_on_overflow",
342 .data = &sysctl_tcp_abort_on_overflow,
343 .maxlen = sizeof(int),
345 .proc_handler = &proc_dointvec
348 .ctl_name = NET_TCP_STDURG,
349 .procname = "tcp_stdurg",
350 .data = &sysctl_tcp_stdurg,
351 .maxlen = sizeof(int),
353 .proc_handler = &proc_dointvec
356 .ctl_name = NET_TCP_RFC1337,
357 .procname = "tcp_rfc1337",
358 .data = &sysctl_tcp_rfc1337,
359 .maxlen = sizeof(int),
361 .proc_handler = &proc_dointvec
364 .ctl_name = NET_TCP_MAX_SYN_BACKLOG,
365 .procname = "tcp_max_syn_backlog",
366 .data = &sysctl_max_syn_backlog,
367 .maxlen = sizeof(int),
369 .proc_handler = &proc_dointvec
372 .ctl_name = NET_IPV4_LOCAL_PORT_RANGE,
373 .procname = "ip_local_port_range",
374 .data = &sysctl_local_port_range,
375 .maxlen = sizeof(sysctl_local_port_range),
377 .proc_handler = &proc_dointvec_minmax,
378 .strategy = &sysctl_intvec,
379 .extra1 = ip_local_port_range_min,
380 .extra2 = ip_local_port_range_max
383 .ctl_name = NET_IPV4_ICMP_ECHO_IGNORE_ALL,
384 .procname = "icmp_echo_ignore_all",
385 .data = &sysctl_icmp_echo_ignore_all,
386 .maxlen = sizeof(int),
388 .proc_handler = &proc_dointvec
391 .ctl_name = NET_IPV4_ICMP_ECHO_IGNORE_BROADCASTS,
392 .procname = "icmp_echo_ignore_broadcasts",
393 .data = &sysctl_icmp_echo_ignore_broadcasts,
394 .maxlen = sizeof(int),
396 .proc_handler = &proc_dointvec
399 .ctl_name = NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES,
400 .procname = "icmp_ignore_bogus_error_responses",
401 .data = &sysctl_icmp_ignore_bogus_error_responses,
402 .maxlen = sizeof(int),
404 .proc_handler = &proc_dointvec
406 #ifdef CONFIG_ICMP_IPOD
408 .ctl_name = NET_IPV4_ICMP_IPOD_VERSION,
409 .procname = "icmp_ipod_version",
410 .data = &sysctl_icmp_ipod_version,
411 .maxlen = sizeof(sysctl_icmp_ipod_version),
413 .proc_handler = &proc_dointvec
416 .ctl_name = NET_IPV4_ICMP_IPOD_ENABLED,
417 .procname = "icmp_ipod_enabled",
418 .data = &sysctl_icmp_ipod_enabled,
419 .maxlen = sizeof(sysctl_icmp_ipod_enabled),
421 .proc_handler = &proc_dointvec
424 .ctl_name = NET_IPV4_ICMP_IPOD_HOST,
425 .procname = "icmp_ipod_host",
426 .data = &sysctl_icmp_ipod_host,
427 .maxlen = sizeof(sysctl_icmp_ipod_host),
429 .proc_handler = &proc_dointvec
432 .ctl_name = NET_IPV4_ICMP_IPOD_MASK,
433 .procname = "icmp_ipod_mask",
434 .data = &sysctl_icmp_ipod_mask,
435 .maxlen = sizeof(sysctl_icmp_ipod_mask),
437 .proc_handler = &proc_dointvec
440 .ctl_name = NET_IPV4_ICMP_IPOD_KEY,
441 .procname = "icmp_ipod_key",
442 .data = &sysctl_icmp_ipod_key,
443 .maxlen = sizeof(sysctl_icmp_ipod_key),
445 .proc_handler = &proc_dostring,
446 .strategy = &sysctl_string
450 .ctl_name = NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR,
451 .procname = "icmp_errors_use_inbound_ifaddr",
452 .data = &sysctl_icmp_errors_use_inbound_ifaddr,
453 .maxlen = sizeof(int),
455 .proc_handler = &proc_dointvec
458 .ctl_name = NET_IPV4_ROUTE,
462 .child = ipv4_route_table
464 #ifdef CONFIG_IP_MULTICAST
466 .ctl_name = NET_IPV4_IGMP_MAX_MEMBERSHIPS,
467 .procname = "igmp_max_memberships",
468 .data = &sysctl_igmp_max_memberships,
469 .maxlen = sizeof(int),
471 .proc_handler = &proc_dointvec
476 .ctl_name = NET_IPV4_IGMP_MAX_MSF,
477 .procname = "igmp_max_msf",
478 .data = &sysctl_igmp_max_msf,
479 .maxlen = sizeof(int),
481 .proc_handler = &proc_dointvec
484 .ctl_name = NET_IPV4_INET_PEER_THRESHOLD,
485 .procname = "inet_peer_threshold",
486 .data = &inet_peer_threshold,
487 .maxlen = sizeof(int),
489 .proc_handler = &proc_dointvec
492 .ctl_name = NET_IPV4_INET_PEER_MINTTL,
493 .procname = "inet_peer_minttl",
494 .data = &inet_peer_minttl,
495 .maxlen = sizeof(int),
497 .proc_handler = &proc_dointvec_jiffies,
498 .strategy = &sysctl_jiffies
501 .ctl_name = NET_IPV4_INET_PEER_MAXTTL,
502 .procname = "inet_peer_maxttl",
503 .data = &inet_peer_maxttl,
504 .maxlen = sizeof(int),
506 .proc_handler = &proc_dointvec_jiffies,
507 .strategy = &sysctl_jiffies
510 .ctl_name = NET_IPV4_INET_PEER_GC_MINTIME,
511 .procname = "inet_peer_gc_mintime",
512 .data = &inet_peer_gc_mintime,
513 .maxlen = sizeof(int),
515 .proc_handler = &proc_dointvec_jiffies,
516 .strategy = &sysctl_jiffies
519 .ctl_name = NET_IPV4_INET_PEER_GC_MAXTIME,
520 .procname = "inet_peer_gc_maxtime",
521 .data = &inet_peer_gc_maxtime,
522 .maxlen = sizeof(int),
524 .proc_handler = &proc_dointvec_jiffies,
525 .strategy = &sysctl_jiffies
528 .ctl_name = NET_TCP_ORPHAN_RETRIES,
529 .procname = "tcp_orphan_retries",
530 .data = &sysctl_tcp_orphan_retries,
531 .maxlen = sizeof(int),
533 .proc_handler = &proc_dointvec
536 .ctl_name = NET_TCP_FACK,
537 .procname = "tcp_fack",
538 .data = &sysctl_tcp_fack,
539 .maxlen = sizeof(int),
541 .proc_handler = &proc_dointvec
544 .ctl_name = NET_TCP_REORDERING,
545 .procname = "tcp_reordering",
546 .data = &sysctl_tcp_reordering,
547 .maxlen = sizeof(int),
549 .proc_handler = &proc_dointvec
552 .ctl_name = NET_TCP_ECN,
553 .procname = "tcp_ecn",
554 .data = &sysctl_tcp_ecn,
555 .maxlen = sizeof(int),
557 .proc_handler = &proc_dointvec
560 .ctl_name = NET_TCP_DSACK,
561 .procname = "tcp_dsack",
562 .data = &sysctl_tcp_dsack,
563 .maxlen = sizeof(int),
565 .proc_handler = &proc_dointvec
568 .ctl_name = NET_TCP_MEM,
569 .procname = "tcp_mem",
570 .data = &sysctl_tcp_mem,
571 .maxlen = sizeof(sysctl_tcp_mem),
573 .proc_handler = &proc_dointvec
576 .ctl_name = NET_TCP_WMEM,
577 .procname = "tcp_wmem",
578 .data = &sysctl_tcp_wmem,
579 .maxlen = sizeof(sysctl_tcp_wmem),
581 .proc_handler = &proc_dointvec
584 .ctl_name = NET_TCP_RMEM,
585 .procname = "tcp_rmem",
586 .data = &sysctl_tcp_rmem,
587 .maxlen = sizeof(sysctl_tcp_rmem),
589 .proc_handler = &proc_dointvec
592 .ctl_name = NET_TCP_APP_WIN,
593 .procname = "tcp_app_win",
594 .data = &sysctl_tcp_app_win,
595 .maxlen = sizeof(int),
597 .proc_handler = &proc_dointvec
600 .ctl_name = NET_TCP_ADV_WIN_SCALE,
601 .procname = "tcp_adv_win_scale",
602 .data = &sysctl_tcp_adv_win_scale,
603 .maxlen = sizeof(int),
605 .proc_handler = &proc_dointvec
608 .ctl_name = NET_IPV4_ICMP_RATELIMIT,
609 .procname = "icmp_ratelimit",
610 .data = &sysctl_icmp_ratelimit,
611 .maxlen = sizeof(int),
613 .proc_handler = &proc_dointvec
616 .ctl_name = NET_IPV4_ICMP_RATEMASK,
617 .procname = "icmp_ratemask",
618 .data = &sysctl_icmp_ratemask,
619 .maxlen = sizeof(int),
621 .proc_handler = &proc_dointvec
624 .ctl_name = NET_TCP_TW_REUSE,
625 .procname = "tcp_tw_reuse",
626 .data = &sysctl_tcp_tw_reuse,
627 .maxlen = sizeof(int),
629 .proc_handler = &proc_dointvec
632 .ctl_name = NET_TCP_FRTO,
633 .procname = "tcp_frto",
634 .data = &sysctl_tcp_frto,
635 .maxlen = sizeof(int),
637 .proc_handler = &proc_dointvec
640 .ctl_name = NET_TCP_LOW_LATENCY,
641 .procname = "tcp_low_latency",
642 .data = &sysctl_tcp_low_latency,
643 .maxlen = sizeof(int),
645 .proc_handler = &proc_dointvec
648 .ctl_name = NET_IPV4_IPFRAG_SECRET_INTERVAL,
649 .procname = "ipfrag_secret_interval",
650 .data = &sysctl_ipfrag_secret_interval,
651 .maxlen = sizeof(int),
653 .proc_handler = &proc_dointvec_jiffies,
654 .strategy = &sysctl_jiffies
657 .ctl_name = NET_TCP_NO_METRICS_SAVE,
658 .procname = "tcp_no_metrics_save",
659 .data = &sysctl_tcp_nometrics_save,
660 .maxlen = sizeof(int),
662 .proc_handler = &proc_dointvec,
665 .ctl_name = NET_TCP_WESTWOOD,
666 .procname = "tcp_westwood",
667 .data = &sysctl_tcp_westwood,
668 .maxlen = sizeof(int),
670 .proc_handler = &proc_dointvec,
673 .ctl_name = NET_TCP_VEGAS,
674 .procname = "tcp_vegas_cong_avoid",
675 .data = &sysctl_tcp_vegas_cong_avoid,
676 .maxlen = sizeof(int),
678 .proc_handler = &proc_dointvec,
681 .ctl_name = NET_TCP_VEGAS_ALPHA,
682 .procname = "tcp_vegas_alpha",
683 .data = &sysctl_tcp_vegas_alpha,
684 .maxlen = sizeof(int),
686 .proc_handler = &proc_dointvec,
689 .ctl_name = NET_TCP_VEGAS_BETA,
690 .procname = "tcp_vegas_beta",
691 .data = &sysctl_tcp_vegas_beta,
692 .maxlen = sizeof(int),
694 .proc_handler = &proc_dointvec,
697 .ctl_name = NET_TCP_VEGAS_GAMMA,
698 .procname = "tcp_vegas_gamma",
699 .data = &sysctl_tcp_vegas_gamma,
700 .maxlen = sizeof(int),
702 .proc_handler = &proc_dointvec,
705 .ctl_name = NET_TCP_BIC,
706 .procname = "tcp_bic",
707 .data = &sysctl_tcp_bic,
708 .maxlen = sizeof(int),
710 .proc_handler = &proc_dointvec,
713 .ctl_name = NET_TCP_BIC_FAST_CONVERGENCE,
714 .procname = "tcp_bic_fast_convergence",
715 .data = &sysctl_tcp_bic_fast_convergence,
716 .maxlen = sizeof(int),
718 .proc_handler = &proc_dointvec,
721 .ctl_name = NET_TCP_BIC_LOW_WINDOW,
722 .procname = "tcp_bic_low_window",
723 .data = &sysctl_tcp_bic_low_window,
724 .maxlen = sizeof(int),
726 .proc_handler = &proc_dointvec,
729 .ctl_name = NET_TCP_MODERATE_RCVBUF,
730 .procname = "tcp_moderate_rcvbuf",
731 .data = &sysctl_tcp_moderate_rcvbuf,
732 .maxlen = sizeof(int),
734 .proc_handler = &proc_dointvec,
737 .ctl_name = NET_TCP_TSO_WIN_DIVISOR,
738 .procname = "tcp_tso_win_divisor",
739 .data = &sysctl_tcp_tso_win_divisor,
740 .maxlen = sizeof(int),
742 .proc_handler = &proc_dointvec,
745 .ctl_name = NET_TCP_BIC_BETA,
746 .procname = "tcp_bic_beta",
747 .data = &sysctl_tcp_bic_beta,
748 .maxlen = sizeof(int),
750 .proc_handler = &proc_dointvec,
755 #endif /* CONFIG_SYSCTL */
757 EXPORT_SYMBOL(ipv4_config);