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