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