sysctl_net_ipv4.c revision 89cee8b1cbb9dac40c92ef1968aea2b45f82fd18
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/config.h> 14#include <linux/igmp.h> 15#include <net/snmp.h> 16#include <net/icmp.h> 17#include <net/ip.h> 18#include <net/route.h> 19#include <net/tcp.h> 20 21/* From af_inet.c */ 22extern int sysctl_ip_nonlocal_bind; 23 24#ifdef CONFIG_SYSCTL 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#endif 30 31struct ipv4_config ipv4_config; 32 33#ifdef CONFIG_SYSCTL 34 35static 36int ipv4_sysctl_forward(ctl_table *ctl, int write, struct file * filp, 37 void __user *buffer, size_t *lenp, loff_t *ppos) 38{ 39 int val = ipv4_devconf.forwarding; 40 int ret; 41 42 ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos); 43 44 if (write && ipv4_devconf.forwarding != val) 45 inet_forward_change(); 46 47 return ret; 48} 49 50static int ipv4_sysctl_forward_strategy(ctl_table *table, 51 int __user *name, int nlen, 52 void __user *oldval, size_t __user *oldlenp, 53 void __user *newval, size_t newlen, 54 void **context) 55{ 56 int *valp = table->data; 57 int new; 58 59 if (!newval || !newlen) 60 return 0; 61 62 if (newlen != sizeof(int)) 63 return -EINVAL; 64 65 if (get_user(new, (int __user *)newval)) 66 return -EFAULT; 67 68 if (new == *valp) 69 return 0; 70 71 if (oldval && oldlenp) { 72 size_t len; 73 74 if (get_user(len, oldlenp)) 75 return -EFAULT; 76 77 if (len) { 78 if (len > table->maxlen) 79 len = table->maxlen; 80 if (copy_to_user(oldval, valp, len)) 81 return -EFAULT; 82 if (put_user(len, oldlenp)) 83 return -EFAULT; 84 } 85 } 86 87 *valp = new; 88 inet_forward_change(); 89 return 1; 90} 91 92static int proc_tcp_congestion_control(ctl_table *ctl, int write, struct file * filp, 93 void __user *buffer, size_t *lenp, loff_t *ppos) 94{ 95 char val[TCP_CA_NAME_MAX]; 96 ctl_table tbl = { 97 .data = val, 98 .maxlen = TCP_CA_NAME_MAX, 99 }; 100 int ret; 101 102 tcp_get_default_congestion_control(val); 103 104 ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos); 105 if (write && ret == 0) 106 ret = tcp_set_default_congestion_control(val); 107 return ret; 108} 109 110static int sysctl_tcp_congestion_control(ctl_table *table, int __user *name, 111 int nlen, void __user *oldval, 112 size_t __user *oldlenp, 113 void __user *newval, size_t newlen, 114 void **context) 115{ 116 char val[TCP_CA_NAME_MAX]; 117 ctl_table tbl = { 118 .data = val, 119 .maxlen = TCP_CA_NAME_MAX, 120 }; 121 int ret; 122 123 tcp_get_default_congestion_control(val); 124 ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen, 125 context); 126 if (ret == 0 && newval && newlen) 127 ret = tcp_set_default_congestion_control(val); 128 return ret; 129} 130 131 132ctl_table ipv4_table[] = { 133 { 134 .ctl_name = NET_IPV4_TCP_TIMESTAMPS, 135 .procname = "tcp_timestamps", 136 .data = &sysctl_tcp_timestamps, 137 .maxlen = sizeof(int), 138 .mode = 0644, 139 .proc_handler = &proc_dointvec 140 }, 141 { 142 .ctl_name = NET_IPV4_TCP_WINDOW_SCALING, 143 .procname = "tcp_window_scaling", 144 .data = &sysctl_tcp_window_scaling, 145 .maxlen = sizeof(int), 146 .mode = 0644, 147 .proc_handler = &proc_dointvec 148 }, 149 { 150 .ctl_name = NET_IPV4_TCP_SACK, 151 .procname = "tcp_sack", 152 .data = &sysctl_tcp_sack, 153 .maxlen = sizeof(int), 154 .mode = 0644, 155 .proc_handler = &proc_dointvec 156 }, 157 { 158 .ctl_name = NET_IPV4_TCP_RETRANS_COLLAPSE, 159 .procname = "tcp_retrans_collapse", 160 .data = &sysctl_tcp_retrans_collapse, 161 .maxlen = sizeof(int), 162 .mode = 0644, 163 .proc_handler = &proc_dointvec 164 }, 165 { 166 .ctl_name = NET_IPV4_FORWARD, 167 .procname = "ip_forward", 168 .data = &ipv4_devconf.forwarding, 169 .maxlen = sizeof(int), 170 .mode = 0644, 171 .proc_handler = &ipv4_sysctl_forward, 172 .strategy = &ipv4_sysctl_forward_strategy 173 }, 174 { 175 .ctl_name = NET_IPV4_DEFAULT_TTL, 176 .procname = "ip_default_ttl", 177 .data = &sysctl_ip_default_ttl, 178 .maxlen = sizeof(int), 179 .mode = 0644, 180 .proc_handler = &ipv4_doint_and_flush, 181 .strategy = &ipv4_doint_and_flush_strategy, 182 }, 183 { 184 .ctl_name = NET_IPV4_AUTOCONFIG, 185 .procname = "ip_autoconfig", 186 .data = &ipv4_config.autoconfig, 187 .maxlen = sizeof(int), 188 .mode = 0644, 189 .proc_handler = &proc_dointvec 190 }, 191 { 192 .ctl_name = NET_IPV4_NO_PMTU_DISC, 193 .procname = "ip_no_pmtu_disc", 194 .data = &ipv4_config.no_pmtu_disc, 195 .maxlen = sizeof(int), 196 .mode = 0644, 197 .proc_handler = &proc_dointvec 198 }, 199 { 200 .ctl_name = NET_IPV4_NONLOCAL_BIND, 201 .procname = "ip_nonlocal_bind", 202 .data = &sysctl_ip_nonlocal_bind, 203 .maxlen = sizeof(int), 204 .mode = 0644, 205 .proc_handler = &proc_dointvec 206 }, 207 { 208 .ctl_name = NET_IPV4_TCP_SYN_RETRIES, 209 .procname = "tcp_syn_retries", 210 .data = &sysctl_tcp_syn_retries, 211 .maxlen = sizeof(int), 212 .mode = 0644, 213 .proc_handler = &proc_dointvec 214 }, 215 { 216 .ctl_name = NET_TCP_SYNACK_RETRIES, 217 .procname = "tcp_synack_retries", 218 .data = &sysctl_tcp_synack_retries, 219 .maxlen = sizeof(int), 220 .mode = 0644, 221 .proc_handler = &proc_dointvec 222 }, 223 { 224 .ctl_name = NET_TCP_MAX_ORPHANS, 225 .procname = "tcp_max_orphans", 226 .data = &sysctl_tcp_max_orphans, 227 .maxlen = sizeof(int), 228 .mode = 0644, 229 .proc_handler = &proc_dointvec 230 }, 231 { 232 .ctl_name = NET_TCP_MAX_TW_BUCKETS, 233 .procname = "tcp_max_tw_buckets", 234 .data = &tcp_death_row.sysctl_max_tw_buckets, 235 .maxlen = sizeof(int), 236 .mode = 0644, 237 .proc_handler = &proc_dointvec 238 }, 239 { 240 .ctl_name = NET_IPV4_IPFRAG_HIGH_THRESH, 241 .procname = "ipfrag_high_thresh", 242 .data = &sysctl_ipfrag_high_thresh, 243 .maxlen = sizeof(int), 244 .mode = 0644, 245 .proc_handler = &proc_dointvec 246 }, 247 { 248 .ctl_name = NET_IPV4_IPFRAG_LOW_THRESH, 249 .procname = "ipfrag_low_thresh", 250 .data = &sysctl_ipfrag_low_thresh, 251 .maxlen = sizeof(int), 252 .mode = 0644, 253 .proc_handler = &proc_dointvec 254 }, 255 { 256 .ctl_name = NET_IPV4_DYNADDR, 257 .procname = "ip_dynaddr", 258 .data = &sysctl_ip_dynaddr, 259 .maxlen = sizeof(int), 260 .mode = 0644, 261 .proc_handler = &proc_dointvec 262 }, 263 { 264 .ctl_name = NET_IPV4_IPFRAG_TIME, 265 .procname = "ipfrag_time", 266 .data = &sysctl_ipfrag_time, 267 .maxlen = sizeof(int), 268 .mode = 0644, 269 .proc_handler = &proc_dointvec_jiffies, 270 .strategy = &sysctl_jiffies 271 }, 272 { 273 .ctl_name = NET_IPV4_TCP_KEEPALIVE_TIME, 274 .procname = "tcp_keepalive_time", 275 .data = &sysctl_tcp_keepalive_time, 276 .maxlen = sizeof(int), 277 .mode = 0644, 278 .proc_handler = &proc_dointvec_jiffies, 279 .strategy = &sysctl_jiffies 280 }, 281 { 282 .ctl_name = NET_IPV4_TCP_KEEPALIVE_PROBES, 283 .procname = "tcp_keepalive_probes", 284 .data = &sysctl_tcp_keepalive_probes, 285 .maxlen = sizeof(int), 286 .mode = 0644, 287 .proc_handler = &proc_dointvec 288 }, 289 { 290 .ctl_name = NET_IPV4_TCP_KEEPALIVE_INTVL, 291 .procname = "tcp_keepalive_intvl", 292 .data = &sysctl_tcp_keepalive_intvl, 293 .maxlen = sizeof(int), 294 .mode = 0644, 295 .proc_handler = &proc_dointvec_jiffies, 296 .strategy = &sysctl_jiffies 297 }, 298 { 299 .ctl_name = NET_IPV4_TCP_RETRIES1, 300 .procname = "tcp_retries1", 301 .data = &sysctl_tcp_retries1, 302 .maxlen = sizeof(int), 303 .mode = 0644, 304 .proc_handler = &proc_dointvec_minmax, 305 .strategy = &sysctl_intvec, 306 .extra2 = &tcp_retr1_max 307 }, 308 { 309 .ctl_name = NET_IPV4_TCP_RETRIES2, 310 .procname = "tcp_retries2", 311 .data = &sysctl_tcp_retries2, 312 .maxlen = sizeof(int), 313 .mode = 0644, 314 .proc_handler = &proc_dointvec 315 }, 316 { 317 .ctl_name = NET_IPV4_TCP_FIN_TIMEOUT, 318 .procname = "tcp_fin_timeout", 319 .data = &sysctl_tcp_fin_timeout, 320 .maxlen = sizeof(int), 321 .mode = 0644, 322 .proc_handler = &proc_dointvec_jiffies, 323 .strategy = &sysctl_jiffies 324 }, 325#ifdef CONFIG_SYN_COOKIES 326 { 327 .ctl_name = NET_TCP_SYNCOOKIES, 328 .procname = "tcp_syncookies", 329 .data = &sysctl_tcp_syncookies, 330 .maxlen = sizeof(int), 331 .mode = 0644, 332 .proc_handler = &proc_dointvec 333 }, 334#endif 335 { 336 .ctl_name = NET_TCP_TW_RECYCLE, 337 .procname = "tcp_tw_recycle", 338 .data = &tcp_death_row.sysctl_tw_recycle, 339 .maxlen = sizeof(int), 340 .mode = 0644, 341 .proc_handler = &proc_dointvec 342 }, 343 { 344 .ctl_name = NET_TCP_ABORT_ON_OVERFLOW, 345 .procname = "tcp_abort_on_overflow", 346 .data = &sysctl_tcp_abort_on_overflow, 347 .maxlen = sizeof(int), 348 .mode = 0644, 349 .proc_handler = &proc_dointvec 350 }, 351 { 352 .ctl_name = NET_TCP_STDURG, 353 .procname = "tcp_stdurg", 354 .data = &sysctl_tcp_stdurg, 355 .maxlen = sizeof(int), 356 .mode = 0644, 357 .proc_handler = &proc_dointvec 358 }, 359 { 360 .ctl_name = NET_TCP_RFC1337, 361 .procname = "tcp_rfc1337", 362 .data = &sysctl_tcp_rfc1337, 363 .maxlen = sizeof(int), 364 .mode = 0644, 365 .proc_handler = &proc_dointvec 366 }, 367 { 368 .ctl_name = NET_TCP_MAX_SYN_BACKLOG, 369 .procname = "tcp_max_syn_backlog", 370 .data = &sysctl_max_syn_backlog, 371 .maxlen = sizeof(int), 372 .mode = 0644, 373 .proc_handler = &proc_dointvec 374 }, 375 { 376 .ctl_name = NET_IPV4_LOCAL_PORT_RANGE, 377 .procname = "ip_local_port_range", 378 .data = &sysctl_local_port_range, 379 .maxlen = sizeof(sysctl_local_port_range), 380 .mode = 0644, 381 .proc_handler = &proc_dointvec_minmax, 382 .strategy = &sysctl_intvec, 383 .extra1 = ip_local_port_range_min, 384 .extra2 = ip_local_port_range_max 385 }, 386 { 387 .ctl_name = NET_IPV4_ICMP_ECHO_IGNORE_ALL, 388 .procname = "icmp_echo_ignore_all", 389 .data = &sysctl_icmp_echo_ignore_all, 390 .maxlen = sizeof(int), 391 .mode = 0644, 392 .proc_handler = &proc_dointvec 393 }, 394 { 395 .ctl_name = NET_IPV4_ICMP_ECHO_IGNORE_BROADCASTS, 396 .procname = "icmp_echo_ignore_broadcasts", 397 .data = &sysctl_icmp_echo_ignore_broadcasts, 398 .maxlen = sizeof(int), 399 .mode = 0644, 400 .proc_handler = &proc_dointvec 401 }, 402 { 403 .ctl_name = NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES, 404 .procname = "icmp_ignore_bogus_error_responses", 405 .data = &sysctl_icmp_ignore_bogus_error_responses, 406 .maxlen = sizeof(int), 407 .mode = 0644, 408 .proc_handler = &proc_dointvec 409 }, 410 { 411 .ctl_name = NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR, 412 .procname = "icmp_errors_use_inbound_ifaddr", 413 .data = &sysctl_icmp_errors_use_inbound_ifaddr, 414 .maxlen = sizeof(int), 415 .mode = 0644, 416 .proc_handler = &proc_dointvec 417 }, 418 { 419 .ctl_name = NET_IPV4_ROUTE, 420 .procname = "route", 421 .maxlen = 0, 422 .mode = 0555, 423 .child = ipv4_route_table 424 }, 425#ifdef CONFIG_IP_MULTICAST 426 { 427 .ctl_name = NET_IPV4_IGMP_MAX_MEMBERSHIPS, 428 .procname = "igmp_max_memberships", 429 .data = &sysctl_igmp_max_memberships, 430 .maxlen = sizeof(int), 431 .mode = 0644, 432 .proc_handler = &proc_dointvec 433 }, 434 435#endif 436 { 437 .ctl_name = NET_IPV4_IGMP_MAX_MSF, 438 .procname = "igmp_max_msf", 439 .data = &sysctl_igmp_max_msf, 440 .maxlen = sizeof(int), 441 .mode = 0644, 442 .proc_handler = &proc_dointvec 443 }, 444 { 445 .ctl_name = NET_IPV4_INET_PEER_THRESHOLD, 446 .procname = "inet_peer_threshold", 447 .data = &inet_peer_threshold, 448 .maxlen = sizeof(int), 449 .mode = 0644, 450 .proc_handler = &proc_dointvec 451 }, 452 { 453 .ctl_name = NET_IPV4_INET_PEER_MINTTL, 454 .procname = "inet_peer_minttl", 455 .data = &inet_peer_minttl, 456 .maxlen = sizeof(int), 457 .mode = 0644, 458 .proc_handler = &proc_dointvec_jiffies, 459 .strategy = &sysctl_jiffies 460 }, 461 { 462 .ctl_name = NET_IPV4_INET_PEER_MAXTTL, 463 .procname = "inet_peer_maxttl", 464 .data = &inet_peer_maxttl, 465 .maxlen = sizeof(int), 466 .mode = 0644, 467 .proc_handler = &proc_dointvec_jiffies, 468 .strategy = &sysctl_jiffies 469 }, 470 { 471 .ctl_name = NET_IPV4_INET_PEER_GC_MINTIME, 472 .procname = "inet_peer_gc_mintime", 473 .data = &inet_peer_gc_mintime, 474 .maxlen = sizeof(int), 475 .mode = 0644, 476 .proc_handler = &proc_dointvec_jiffies, 477 .strategy = &sysctl_jiffies 478 }, 479 { 480 .ctl_name = NET_IPV4_INET_PEER_GC_MAXTIME, 481 .procname = "inet_peer_gc_maxtime", 482 .data = &inet_peer_gc_maxtime, 483 .maxlen = sizeof(int), 484 .mode = 0644, 485 .proc_handler = &proc_dointvec_jiffies, 486 .strategy = &sysctl_jiffies 487 }, 488 { 489 .ctl_name = NET_TCP_ORPHAN_RETRIES, 490 .procname = "tcp_orphan_retries", 491 .data = &sysctl_tcp_orphan_retries, 492 .maxlen = sizeof(int), 493 .mode = 0644, 494 .proc_handler = &proc_dointvec 495 }, 496 { 497 .ctl_name = NET_TCP_FACK, 498 .procname = "tcp_fack", 499 .data = &sysctl_tcp_fack, 500 .maxlen = sizeof(int), 501 .mode = 0644, 502 .proc_handler = &proc_dointvec 503 }, 504 { 505 .ctl_name = NET_TCP_REORDERING, 506 .procname = "tcp_reordering", 507 .data = &sysctl_tcp_reordering, 508 .maxlen = sizeof(int), 509 .mode = 0644, 510 .proc_handler = &proc_dointvec 511 }, 512 { 513 .ctl_name = NET_TCP_ECN, 514 .procname = "tcp_ecn", 515 .data = &sysctl_tcp_ecn, 516 .maxlen = sizeof(int), 517 .mode = 0644, 518 .proc_handler = &proc_dointvec 519 }, 520 { 521 .ctl_name = NET_TCP_DSACK, 522 .procname = "tcp_dsack", 523 .data = &sysctl_tcp_dsack, 524 .maxlen = sizeof(int), 525 .mode = 0644, 526 .proc_handler = &proc_dointvec 527 }, 528 { 529 .ctl_name = NET_TCP_MEM, 530 .procname = "tcp_mem", 531 .data = &sysctl_tcp_mem, 532 .maxlen = sizeof(sysctl_tcp_mem), 533 .mode = 0644, 534 .proc_handler = &proc_dointvec 535 }, 536 { 537 .ctl_name = NET_TCP_WMEM, 538 .procname = "tcp_wmem", 539 .data = &sysctl_tcp_wmem, 540 .maxlen = sizeof(sysctl_tcp_wmem), 541 .mode = 0644, 542 .proc_handler = &proc_dointvec 543 }, 544 { 545 .ctl_name = NET_TCP_RMEM, 546 .procname = "tcp_rmem", 547 .data = &sysctl_tcp_rmem, 548 .maxlen = sizeof(sysctl_tcp_rmem), 549 .mode = 0644, 550 .proc_handler = &proc_dointvec 551 }, 552 { 553 .ctl_name = NET_TCP_APP_WIN, 554 .procname = "tcp_app_win", 555 .data = &sysctl_tcp_app_win, 556 .maxlen = sizeof(int), 557 .mode = 0644, 558 .proc_handler = &proc_dointvec 559 }, 560 { 561 .ctl_name = NET_TCP_ADV_WIN_SCALE, 562 .procname = "tcp_adv_win_scale", 563 .data = &sysctl_tcp_adv_win_scale, 564 .maxlen = sizeof(int), 565 .mode = 0644, 566 .proc_handler = &proc_dointvec 567 }, 568 { 569 .ctl_name = NET_IPV4_ICMP_RATELIMIT, 570 .procname = "icmp_ratelimit", 571 .data = &sysctl_icmp_ratelimit, 572 .maxlen = sizeof(int), 573 .mode = 0644, 574 .proc_handler = &proc_dointvec 575 }, 576 { 577 .ctl_name = NET_IPV4_ICMP_RATEMASK, 578 .procname = "icmp_ratemask", 579 .data = &sysctl_icmp_ratemask, 580 .maxlen = sizeof(int), 581 .mode = 0644, 582 .proc_handler = &proc_dointvec 583 }, 584 { 585 .ctl_name = NET_TCP_TW_REUSE, 586 .procname = "tcp_tw_reuse", 587 .data = &sysctl_tcp_tw_reuse, 588 .maxlen = sizeof(int), 589 .mode = 0644, 590 .proc_handler = &proc_dointvec 591 }, 592 { 593 .ctl_name = NET_TCP_FRTO, 594 .procname = "tcp_frto", 595 .data = &sysctl_tcp_frto, 596 .maxlen = sizeof(int), 597 .mode = 0644, 598 .proc_handler = &proc_dointvec 599 }, 600 { 601 .ctl_name = NET_TCP_LOW_LATENCY, 602 .procname = "tcp_low_latency", 603 .data = &sysctl_tcp_low_latency, 604 .maxlen = sizeof(int), 605 .mode = 0644, 606 .proc_handler = &proc_dointvec 607 }, 608 { 609 .ctl_name = NET_IPV4_IPFRAG_SECRET_INTERVAL, 610 .procname = "ipfrag_secret_interval", 611 .data = &sysctl_ipfrag_secret_interval, 612 .maxlen = sizeof(int), 613 .mode = 0644, 614 .proc_handler = &proc_dointvec_jiffies, 615 .strategy = &sysctl_jiffies 616 }, 617 { 618 .ctl_name = NET_IPV4_IPFRAG_MAX_DIST, 619 .procname = "ipfrag_max_dist", 620 .data = &sysctl_ipfrag_max_dist, 621 .maxlen = sizeof(int), 622 .mode = 0644, 623 .proc_handler = &proc_dointvec_minmax, 624 .extra1 = &zero 625 }, 626 { 627 .ctl_name = NET_TCP_NO_METRICS_SAVE, 628 .procname = "tcp_no_metrics_save", 629 .data = &sysctl_tcp_nometrics_save, 630 .maxlen = sizeof(int), 631 .mode = 0644, 632 .proc_handler = &proc_dointvec, 633 }, 634 { 635 .ctl_name = NET_TCP_MODERATE_RCVBUF, 636 .procname = "tcp_moderate_rcvbuf", 637 .data = &sysctl_tcp_moderate_rcvbuf, 638 .maxlen = sizeof(int), 639 .mode = 0644, 640 .proc_handler = &proc_dointvec, 641 }, 642 { 643 .ctl_name = NET_TCP_TSO_WIN_DIVISOR, 644 .procname = "tcp_tso_win_divisor", 645 .data = &sysctl_tcp_tso_win_divisor, 646 .maxlen = sizeof(int), 647 .mode = 0644, 648 .proc_handler = &proc_dointvec, 649 }, 650 { 651 .ctl_name = NET_TCP_CONG_CONTROL, 652 .procname = "tcp_congestion_control", 653 .mode = 0644, 654 .maxlen = TCP_CA_NAME_MAX, 655 .proc_handler = &proc_tcp_congestion_control, 656 .strategy = &sysctl_tcp_congestion_control, 657 }, 658 { 659 .ctl_name = NET_TCP_ABC, 660 .procname = "tcp_abc", 661 .data = &sysctl_tcp_abc, 662 .maxlen = sizeof(int), 663 .mode = 0644, 664 .proc_handler = &proc_dointvec, 665 }, 666 667 { .ctl_name = 0 } 668}; 669 670#endif /* CONFIG_SYSCTL */ 671 672EXPORT_SYMBOL(ipv4_config); 673