1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem. 4 * 5 * Begun April 1, 1996, Mike Shaver. 6 * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS] 7 */ 8 9 #include <linux/mm.h> 10 #include <linux/module.h> 11 #include <linux/sysctl.h> 12 #include <linux/igmp.h> 13 #include <linux/inetdevice.h> 14 #include <linux/seqlock.h> 15 #include <linux/init.h> 16 #include <linux/slab.h> 17 #include <linux/nsproxy.h> 18 #include <linux/swap.h> 19 #include <net/snmp.h> 20 #include <net/icmp.h> 21 #include <net/ip.h> 22 #include <net/route.h> 23 #include <net/tcp.h> 24 #include <net/udp.h> 25 #include <net/cipso_ipv4.h> 26 #include <net/inet_frag.h> 27 #include <net/ping.h> 28 #include <net/protocol.h> 29 #include <net/netevent.h> 30 31 static int zero; 32 static int one = 1; 33 static int two = 2; 34 static int four = 4; 35 static int thousand = 1000; 36 static int gso_max_segs = GSO_MAX_SEGS; 37 static int tcp_retr1_max = 255; 38 static int ip_local_port_range_min[] = { 1, 1 }; 39 static int ip_local_port_range_max[] = { 65535, 65535 }; 40 static int tcp_adv_win_scale_min = -31; 41 static int tcp_adv_win_scale_max = 31; 42 static int tcp_min_snd_mss_min = TCP_MIN_SND_MSS; 43 static int tcp_min_snd_mss_max = 65535; 44 static int ip_privileged_port_min; 45 static int ip_privileged_port_max = 65535; 46 static int ip_ttl_min = 1; 47 static int ip_ttl_max = 255; 48 static int tcp_syn_retries_min = 1; 49 static int tcp_syn_retries_max = MAX_TCP_SYNCNT; 50 static int ip_ping_group_range_min[] = { 0, 0 }; 51 static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; 52 static int comp_sack_nr_max = 255; 53 static u32 u32_max_div_HZ = UINT_MAX / HZ; 54 static int one_day_secs = 24 * 3600; 55 56 /* obsolete */ 57 static int sysctl_tcp_low_latency __read_mostly; 58 59 /* Update system visible IP port range */ 60 static void set_local_port_range(struct net *net, int range[2]) 61 { 62 bool same_parity = !((range[0] ^ range[1]) & 1); 63 64 write_seqlock_bh(&net->ipv4.ip_local_ports.lock); 65 if (same_parity && !net->ipv4.ip_local_ports.warned) { 66 net->ipv4.ip_local_ports.warned = true; 67 pr_err_ratelimited("ip_local_port_range: prefer different parity for start/end values.\n"); 68 } 69 net->ipv4.ip_local_ports.range[0] = range[0]; 70 net->ipv4.ip_local_ports.range[1] = range[1]; 71 write_sequnlock_bh(&net->ipv4.ip_local_ports.lock); 72 } 73 74 /* Validate changes from /proc interface. */ 75 static int ipv4_local_port_range(struct ctl_table *table, int write, 76 void __user *buffer, 77 size_t *lenp, loff_t *ppos) 78 { 79 struct net *net = 80 container_of(table->data, struct net, ipv4.ip_local_ports.range); 81 int ret; 82 int range[2]; 83 struct ctl_table tmp = { 84 .data = &range, 85 .maxlen = sizeof(range), 86 .mode = table->mode, 87 .extra1 = &ip_local_port_range_min, 88 .extra2 = &ip_local_port_range_max, 89 }; 90 91 inet_get_local_port_range(net, &range[0], &range[1]); 92 93 ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); 94 95 if (write && ret == 0) { 96 /* Ensure that the upper limit is not smaller than the lower, 97 * and that the lower does not encroach upon the privileged 98 * port limit. 99 */ 100 if ((range[1] < range[0]) || 101 (range[0] < net->ipv4.sysctl_ip_prot_sock)) 102 ret = -EINVAL; 103 else 104 set_local_port_range(net, range); 105 } 106 107 return ret; 108 } 109 110 /* Validate changes from /proc interface. */ 111 static int ipv4_privileged_ports(struct ctl_table *table, int write, 112 void __user *buffer, size_t *lenp, loff_t *ppos) 113 { 114 struct net *net = container_of(table->data, struct net, 115 ipv4.sysctl_ip_prot_sock); 116 int ret; 117 int pports; 118 int range[2]; 119 struct ctl_table tmp = { 120 .data = &pports, 121 .maxlen = sizeof(pports), 122 .mode = table->mode, 123 .extra1 = &ip_privileged_port_min, 124 .extra2 = &ip_privileged_port_max, 125 }; 126 127 pports = net->ipv4.sysctl_ip_prot_sock; 128 129 ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); 130 131 if (write && ret == 0) { 132 inet_get_local_port_range(net, &range[0], &range[1]); 133 /* Ensure that the local port range doesn't overlap with the 134 * privileged port range. 135 */ 136 if (range[0] < pports) 137 ret = -EINVAL; 138 else 139 net->ipv4.sysctl_ip_prot_sock = pports; 140 } 141 142 return ret; 143 } 144 145 static void inet_get_ping_group_range_table(struct ctl_table *table, kgid_t *low, kgid_t *high) 146 { 147 kgid_t *data = table->data; 148 struct net *net = 149 container_of(table->data, struct net, ipv4.ping_group_range.range); 150 unsigned int seq; 151 do { 152 seq = read_seqbegin(&net->ipv4.ping_group_range.lock); 153 154 *low = data[0]; 155 *high = data[1]; 156 } while (read_seqretry(&net->ipv4.ping_group_range.lock, seq)); 157 } 158 159 /* Update system visible IP port range */ 160 static void set_ping_group_range(struct ctl_table *table, kgid_t low, kgid_t high) 161 { 162 kgid_t *data = table->data; 163 struct net *net = 164 container_of(table->data, struct net, ipv4.ping_group_range.range); 165 write_seqlock(&net->ipv4.ping_group_range.lock); 166 data[0] = low; 167 data[1] = high; 168 write_sequnlock(&net->ipv4.ping_group_range.lock); 169 } 170 171 /* Validate changes from /proc interface. */ 172 static int ipv4_ping_group_range(struct ctl_table *table, int write, 173 void __user *buffer, 174 size_t *lenp, loff_t *ppos) 175 { 176 struct user_namespace *user_ns = current_user_ns(); 177 int ret; 178 gid_t urange[2]; 179 kgid_t low, high; 180 struct ctl_table tmp = { 181 .data = &urange, 182 .maxlen = sizeof(urange), 183 .mode = table->mode, 184 .extra1 = &ip_ping_group_range_min, 185 .extra2 = &ip_ping_group_range_max, 186 }; 187 188 inet_get_ping_group_range_table(table, &low, &high); 189 urange[0] = from_kgid_munged(user_ns, low); 190 urange[1] = from_kgid_munged(user_ns, high); 191 ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); 192 193 if (write && ret == 0) { 194 low = make_kgid(user_ns, urange[0]); 195 high = make_kgid(user_ns, urange[1]); 196 if (!gid_valid(low) || !gid_valid(high)) 197 return -EINVAL; 198 if (urange[1] < urange[0] || gid_lt(high, low)) { 199 low = make_kgid(&init_user_ns, 1); 200 high = make_kgid(&init_user_ns, 0); 201 } 202 set_ping_group_range(table, low, high); 203 } 204 205 return ret; 206 } 207 208 static int ipv4_fwd_update_priority(struct ctl_table *table, int write, 209 void __user *buffer, 210 size_t *lenp, loff_t *ppos) 211 { 212 struct net *net; 213 int ret; 214 215 net = container_of(table->data, struct net, 216 ipv4.sysctl_ip_fwd_update_priority); 217 ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); 218 if (write && ret == 0) 219 call_netevent_notifiers(NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE, 220 net); 221 222 return ret; 223 } 224 225 static int proc_tcp_congestion_control(struct ctl_table *ctl, int write, 226 void __user *buffer, size_t *lenp, loff_t *ppos) 227 { 228 struct net *net = container_of(ctl->data, struct net, 229 ipv4.tcp_congestion_control); 230 char val[TCP_CA_NAME_MAX]; 231 struct ctl_table tbl = { 232 .data = val, 233 .maxlen = TCP_CA_NAME_MAX, 234 }; 235 int ret; 236 237 tcp_get_default_congestion_control(net, val); 238 239 ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 240 if (write && ret == 0) 241 ret = tcp_set_default_congestion_control(net, val); 242 return ret; 243 } 244 245 static int proc_tcp_available_congestion_control(struct ctl_table *ctl, 246 int write, 247 void __user *buffer, size_t *lenp, 248 loff_t *ppos) 249 { 250 struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, }; 251 int ret; 252 253 tbl.data = kmalloc(tbl.maxlen, GFP_USER); 254 if (!tbl.data) 255 return -ENOMEM; 256 tcp_get_available_congestion_control(tbl.data, TCP_CA_BUF_MAX); 257 ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 258 kfree(tbl.data); 259 return ret; 260 } 261 262 static int proc_allowed_congestion_control(struct ctl_table *ctl, 263 int write, 264 void __user *buffer, size_t *lenp, 265 loff_t *ppos) 266 { 267 struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX }; 268 int ret; 269 270 tbl.data = kmalloc(tbl.maxlen, GFP_USER); 271 if (!tbl.data) 272 return -ENOMEM; 273 274 tcp_get_allowed_congestion_control(tbl.data, tbl.maxlen); 275 ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 276 if (write && ret == 0) 277 ret = tcp_set_allowed_congestion_control(tbl.data); 278 kfree(tbl.data); 279 return ret; 280 } 281 282 static int proc_tcp_fastopen_key(struct ctl_table *table, int write, 283 void __user *buffer, size_t *lenp, 284 loff_t *ppos) 285 { 286 struct net *net = container_of(table->data, struct net, 287 ipv4.sysctl_tcp_fastopen); 288 struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) }; 289 struct tcp_fastopen_context *ctxt; 290 u32 user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */ 291 __le32 key[4]; 292 int ret, i; 293 294 tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL); 295 if (!tbl.data) 296 return -ENOMEM; 297 298 rcu_read_lock(); 299 ctxt = rcu_dereference(net->ipv4.tcp_fastopen_ctx); 300 if (ctxt) 301 memcpy(key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH); 302 else 303 memset(key, 0, sizeof(key)); 304 rcu_read_unlock(); 305 306 for (i = 0; i < ARRAY_SIZE(key); i++) 307 user_key[i] = le32_to_cpu(key[i]); 308 309 snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x", 310 user_key[0], user_key[1], user_key[2], user_key[3]); 311 ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 312 313 if (write && ret == 0) { 314 if (sscanf(tbl.data, "%x-%x-%x-%x", user_key, user_key + 1, 315 user_key + 2, user_key + 3) != 4) { 316 ret = -EINVAL; 317 goto bad_key; 318 } 319 320 for (i = 0; i < ARRAY_SIZE(user_key); i++) 321 key[i] = cpu_to_le32(user_key[i]); 322 323 tcp_fastopen_reset_cipher(net, NULL, key, 324 TCP_FASTOPEN_KEY_LENGTH); 325 } 326 327 bad_key: 328 pr_debug("proc FO key set 0x%x-%x-%x-%x <- 0x%s: %u\n", 329 user_key[0], user_key[1], user_key[2], user_key[3], 330 (char *)tbl.data, ret); 331 kfree(tbl.data); 332 return ret; 333 } 334 335 static void proc_configure_early_demux(int enabled, int protocol) 336 { 337 struct net_protocol *ipprot; 338 #if IS_ENABLED(CONFIG_IPV6) 339 struct inet6_protocol *ip6prot; 340 #endif 341 342 rcu_read_lock(); 343 344 ipprot = rcu_dereference(inet_protos[protocol]); 345 if (ipprot) 346 ipprot->early_demux = enabled ? ipprot->early_demux_handler : 347 NULL; 348 349 #if IS_ENABLED(CONFIG_IPV6) 350 ip6prot = rcu_dereference(inet6_protos[protocol]); 351 if (ip6prot) 352 ip6prot->early_demux = enabled ? ip6prot->early_demux_handler : 353 NULL; 354 #endif 355 rcu_read_unlock(); 356 } 357 358 static int proc_tcp_early_demux(struct ctl_table *table, int write, 359 void __user *buffer, size_t *lenp, loff_t *ppos) 360 { 361 int ret = 0; 362 363 ret = proc_dointvec(table, write, buffer, lenp, ppos); 364 365 if (write && !ret) { 366 int enabled = init_net.ipv4.sysctl_tcp_early_demux; 367 368 proc_configure_early_demux(enabled, IPPROTO_TCP); 369 } 370 371 return ret; 372 } 373 374 static int proc_udp_early_demux(struct ctl_table *table, int write, 375 void __user *buffer, size_t *lenp, loff_t *ppos) 376 { 377 int ret = 0; 378 379 ret = proc_dointvec(table, write, buffer, lenp, ppos); 380 381 if (write && !ret) { 382 int enabled = init_net.ipv4.sysctl_udp_early_demux; 383 384 proc_configure_early_demux(enabled, IPPROTO_UDP); 385 } 386 387 return ret; 388 } 389 390 static int proc_tfo_blackhole_detect_timeout(struct ctl_table *table, 391 int write, 392 void __user *buffer, 393 size_t *lenp, loff_t *ppos) 394 { 395 struct net *net = container_of(table->data, struct net, 396 ipv4.sysctl_tcp_fastopen_blackhole_timeout); 397 int ret; 398 399 ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); 400 if (write && ret == 0) 401 atomic_set(&net->ipv4.tfo_active_disable_times, 0); 402 403 return ret; 404 } 405 406 static int proc_tcp_available_ulp(struct ctl_table *ctl, 407 int write, 408 void __user *buffer, size_t *lenp, 409 loff_t *ppos) 410 { 411 struct ctl_table tbl = { .maxlen = TCP_ULP_BUF_MAX, }; 412 int ret; 413 414 tbl.data = kmalloc(tbl.maxlen, GFP_USER); 415 if (!tbl.data) 416 return -ENOMEM; 417 tcp_get_available_ulp(tbl.data, TCP_ULP_BUF_MAX); 418 ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 419 kfree(tbl.data); 420 421 return ret; 422 } 423 424 #ifdef CONFIG_IP_ROUTE_MULTIPATH 425 static int proc_fib_multipath_hash_policy(struct ctl_table *table, int write, 426 void __user *buffer, size_t *lenp, 427 loff_t *ppos) 428 { 429 struct net *net = container_of(table->data, struct net, 430 ipv4.sysctl_fib_multipath_hash_policy); 431 int ret; 432 433 ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); 434 if (write && ret == 0) 435 call_netevent_notifiers(NETEVENT_IPV4_MPATH_HASH_UPDATE, net); 436 437 return ret; 438 } 439 #endif 440 441 static struct ctl_table ipv4_table[] = { 442 { 443 .procname = "tcp_max_orphans", 444 .data = &sysctl_tcp_max_orphans, 445 .maxlen = sizeof(int), 446 .mode = 0644, 447 .proc_handler = proc_dointvec 448 }, 449 { 450 .procname = "inet_peer_threshold", 451 .data = &inet_peer_threshold, 452 .maxlen = sizeof(int), 453 .mode = 0644, 454 .proc_handler = proc_dointvec 455 }, 456 { 457 .procname = "inet_peer_minttl", 458 .data = &inet_peer_minttl, 459 .maxlen = sizeof(int), 460 .mode = 0644, 461 .proc_handler = proc_dointvec_jiffies, 462 }, 463 { 464 .procname = "inet_peer_maxttl", 465 .data = &inet_peer_maxttl, 466 .maxlen = sizeof(int), 467 .mode = 0644, 468 .proc_handler = proc_dointvec_jiffies, 469 }, 470 { 471 .procname = "tcp_mem", 472 .maxlen = sizeof(sysctl_tcp_mem), 473 .data = &sysctl_tcp_mem, 474 .mode = 0644, 475 .proc_handler = proc_doulongvec_minmax, 476 }, 477 { 478 .procname = "tcp_low_latency", 479 .data = &sysctl_tcp_low_latency, 480 .maxlen = sizeof(int), 481 .mode = 0644, 482 .proc_handler = proc_dointvec 483 }, 484 #ifdef CONFIG_NETLABEL 485 { 486 .procname = "cipso_cache_enable", 487 .data = &cipso_v4_cache_enabled, 488 .maxlen = sizeof(int), 489 .mode = 0644, 490 .proc_handler = proc_dointvec, 491 }, 492 { 493 .procname = "cipso_cache_bucket_size", 494 .data = &cipso_v4_cache_bucketsize, 495 .maxlen = sizeof(int), 496 .mode = 0644, 497 .proc_handler = proc_dointvec, 498 }, 499 { 500 .procname = "cipso_rbm_optfmt", 501 .data = &cipso_v4_rbm_optfmt, 502 .maxlen = sizeof(int), 503 .mode = 0644, 504 .proc_handler = proc_dointvec, 505 }, 506 { 507 .procname = "cipso_rbm_strictvalid", 508 .data = &cipso_v4_rbm_strictvalid, 509 .maxlen = sizeof(int), 510 .mode = 0644, 511 .proc_handler = proc_dointvec, 512 }, 513 #endif /* CONFIG_NETLABEL */ 514 { 515 .procname = "tcp_available_congestion_control", 516 .maxlen = TCP_CA_BUF_MAX, 517 .mode = 0444, 518 .proc_handler = proc_tcp_available_congestion_control, 519 }, 520 { 521 .procname = "tcp_allowed_congestion_control", 522 .maxlen = TCP_CA_BUF_MAX, 523 .mode = 0644, 524 .proc_handler = proc_allowed_congestion_control, 525 }, 526 { 527 .procname = "tcp_available_ulp", 528 .maxlen = TCP_ULP_BUF_MAX, 529 .mode = 0444, 530 .proc_handler = proc_tcp_available_ulp, 531 }, 532 { 533 .procname = "icmp_msgs_per_sec", 534 .data = &sysctl_icmp_msgs_per_sec, 535 .maxlen = sizeof(int), 536 .mode = 0644, 537 .proc_handler = proc_dointvec_minmax, 538 .extra1 = &zero, 539 }, 540 { 541 .procname = "icmp_msgs_burst", 542 .data = &sysctl_icmp_msgs_burst, 543 .maxlen = sizeof(int), 544 .mode = 0644, 545 .proc_handler = proc_dointvec_minmax, 546 .extra1 = &zero, 547 }, 548 { 549 .procname = "udp_mem", 550 .data = &sysctl_udp_mem, 551 .maxlen = sizeof(sysctl_udp_mem), 552 .mode = 0644, 553 .proc_handler = proc_doulongvec_minmax, 554 }, 555 { 556 .procname = "fib_sync_mem", 557 .data = &sysctl_fib_sync_mem, 558 .maxlen = sizeof(sysctl_fib_sync_mem), 559 .mode = 0644, 560 .proc_handler = proc_douintvec_minmax, 561 .extra1 = &sysctl_fib_sync_mem_min, 562 .extra2 = &sysctl_fib_sync_mem_max, 563 }, 564 { 565 .procname = "tcp_rx_skb_cache", 566 .data = &tcp_rx_skb_cache_key.key, 567 .mode = 0644, 568 .proc_handler = proc_do_static_key, 569 }, 570 { 571 .procname = "tcp_tx_skb_cache", 572 .data = &tcp_tx_skb_cache_key.key, 573 .mode = 0644, 574 .proc_handler = proc_do_static_key, 575 }, 576 { } 577 }; 578 579 static struct ctl_table ipv4_net_table[] = { 580 { 581 .procname = "icmp_echo_ignore_all", 582 .data = &init_net.ipv4.sysctl_icmp_echo_ignore_all, 583 .maxlen = sizeof(int), 584 .mode = 0644, 585 .proc_handler = proc_dointvec 586 }, 587 { 588 .procname = "icmp_echo_ignore_broadcasts", 589 .data = &init_net.ipv4.sysctl_icmp_echo_ignore_broadcasts, 590 .maxlen = sizeof(int), 591 .mode = 0644, 592 .proc_handler = proc_dointvec 593 }, 594 { 595 .procname = "icmp_ignore_bogus_error_responses", 596 .data = &init_net.ipv4.sysctl_icmp_ignore_bogus_error_responses, 597 .maxlen = sizeof(int), 598 .mode = 0644, 599 .proc_handler = proc_dointvec 600 }, 601 { 602 .procname = "icmp_errors_use_inbound_ifaddr", 603 .data = &init_net.ipv4.sysctl_icmp_errors_use_inbound_ifaddr, 604 .maxlen = sizeof(int), 605 .mode = 0644, 606 .proc_handler = proc_dointvec 607 }, 608 { 609 .procname = "icmp_ratelimit", 610 .data = &init_net.ipv4.sysctl_icmp_ratelimit, 611 .maxlen = sizeof(int), 612 .mode = 0644, 613 .proc_handler = proc_dointvec_ms_jiffies, 614 }, 615 { 616 .procname = "icmp_ratemask", 617 .data = &init_net.ipv4.sysctl_icmp_ratemask, 618 .maxlen = sizeof(int), 619 .mode = 0644, 620 .proc_handler = proc_dointvec 621 }, 622 { 623 .procname = "ping_group_range", 624 .data = &init_net.ipv4.ping_group_range.range, 625 .maxlen = sizeof(gid_t)*2, 626 .mode = 0644, 627 .proc_handler = ipv4_ping_group_range, 628 }, 629 #ifdef CONFIG_NET_L3_MASTER_DEV 630 { 631 .procname = "raw_l3mdev_accept", 632 .data = &init_net.ipv4.sysctl_raw_l3mdev_accept, 633 .maxlen = sizeof(int), 634 .mode = 0644, 635 .proc_handler = proc_dointvec_minmax, 636 .extra1 = &zero, 637 .extra2 = &one, 638 }, 639 #endif 640 { 641 .procname = "tcp_ecn", 642 .data = &init_net.ipv4.sysctl_tcp_ecn, 643 .maxlen = sizeof(int), 644 .mode = 0644, 645 .proc_handler = proc_dointvec 646 }, 647 { 648 .procname = "tcp_ecn_fallback", 649 .data = &init_net.ipv4.sysctl_tcp_ecn_fallback, 650 .maxlen = sizeof(int), 651 .mode = 0644, 652 .proc_handler = proc_dointvec 653 }, 654 { 655 .procname = "ip_dynaddr", 656 .data = &init_net.ipv4.sysctl_ip_dynaddr, 657 .maxlen = sizeof(int), 658 .mode = 0644, 659 .proc_handler = proc_dointvec 660 }, 661 { 662 .procname = "ip_early_demux", 663 .data = &init_net.ipv4.sysctl_ip_early_demux, 664 .maxlen = sizeof(int), 665 .mode = 0644, 666 .proc_handler = proc_dointvec 667 }, 668 { 669 .procname = "udp_early_demux", 670 .data = &init_net.ipv4.sysctl_udp_early_demux, 671 .maxlen = sizeof(int), 672 .mode = 0644, 673 .proc_handler = proc_udp_early_demux 674 }, 675 { 676 .procname = "tcp_early_demux", 677 .data = &init_net.ipv4.sysctl_tcp_early_demux, 678 .maxlen = sizeof(int), 679 .mode = 0644, 680 .proc_handler = proc_tcp_early_demux 681 }, 682 { 683 .procname = "ip_default_ttl", 684 .data = &init_net.ipv4.sysctl_ip_default_ttl, 685 .maxlen = sizeof(int), 686 .mode = 0644, 687 .proc_handler = proc_dointvec_minmax, 688 .extra1 = &ip_ttl_min, 689 .extra2 = &ip_ttl_max, 690 }, 691 { 692 .procname = "ip_local_port_range", 693 .maxlen = sizeof(init_net.ipv4.ip_local_ports.range), 694 .data = &init_net.ipv4.ip_local_ports.range, 695 .mode = 0644, 696 .proc_handler = ipv4_local_port_range, 697 }, 698 { 699 .procname = "ip_local_reserved_ports", 700 .data = &init_net.ipv4.sysctl_local_reserved_ports, 701 .maxlen = 65536, 702 .mode = 0644, 703 .proc_handler = proc_do_large_bitmap, 704 }, 705 { 706 .procname = "ip_no_pmtu_disc", 707 .data = &init_net.ipv4.sysctl_ip_no_pmtu_disc, 708 .maxlen = sizeof(int), 709 .mode = 0644, 710 .proc_handler = proc_dointvec 711 }, 712 { 713 .procname = "ip_forward_use_pmtu", 714 .data = &init_net.ipv4.sysctl_ip_fwd_use_pmtu, 715 .maxlen = sizeof(int), 716 .mode = 0644, 717 .proc_handler = proc_dointvec, 718 }, 719 { 720 .procname = "ip_forward_update_priority", 721 .data = &init_net.ipv4.sysctl_ip_fwd_update_priority, 722 .maxlen = sizeof(int), 723 .mode = 0644, 724 .proc_handler = ipv4_fwd_update_priority, 725 .extra1 = &zero, 726 .extra2 = &one, 727 }, 728 { 729 .procname = "ip_nonlocal_bind", 730 .data = &init_net.ipv4.sysctl_ip_nonlocal_bind, 731 .maxlen = sizeof(int), 732 .mode = 0644, 733 .proc_handler = proc_dointvec 734 }, 735 { 736 .procname = "fwmark_reflect", 737 .data = &init_net.ipv4.sysctl_fwmark_reflect, 738 .maxlen = sizeof(int), 739 .mode = 0644, 740 .proc_handler = proc_dointvec, 741 }, 742 { 743 .procname = "tcp_fwmark_accept", 744 .data = &init_net.ipv4.sysctl_tcp_fwmark_accept, 745 .maxlen = sizeof(int), 746 .mode = 0644, 747 .proc_handler = proc_dointvec, 748 }, 749 #ifdef CONFIG_NET_L3_MASTER_DEV 750 { 751 .procname = "tcp_l3mdev_accept", 752 .data = &init_net.ipv4.sysctl_tcp_l3mdev_accept, 753 .maxlen = sizeof(int), 754 .mode = 0644, 755 .proc_handler = proc_dointvec_minmax, 756 .extra1 = &zero, 757 .extra2 = &one, 758 }, 759 #endif 760 { 761 .procname = "tcp_mtu_probing", 762 .data = &init_net.ipv4.sysctl_tcp_mtu_probing, 763 .maxlen = sizeof(int), 764 .mode = 0644, 765 .proc_handler = proc_dointvec, 766 }, 767 { 768 .procname = "tcp_base_mss", 769 .data = &init_net.ipv4.sysctl_tcp_base_mss, 770 .maxlen = sizeof(int), 771 .mode = 0644, 772 .proc_handler = proc_dointvec, 773 }, 774 { 775 .procname = "tcp_min_snd_mss", 776 .data = &init_net.ipv4.sysctl_tcp_min_snd_mss, 777 .maxlen = sizeof(int), 778 .mode = 0644, 779 .proc_handler = proc_dointvec_minmax, 780 .extra1 = &tcp_min_snd_mss_min, 781 .extra2 = &tcp_min_snd_mss_max, 782 }, 783 { 784 .procname = "tcp_probe_threshold", 785 .data = &init_net.ipv4.sysctl_tcp_probe_threshold, 786 .maxlen = sizeof(int), 787 .mode = 0644, 788 .proc_handler = proc_dointvec, 789 }, 790 { 791 .procname = "tcp_probe_interval", 792 .data = &init_net.ipv4.sysctl_tcp_probe_interval, 793 .maxlen = sizeof(u32), 794 .mode = 0644, 795 .proc_handler = proc_douintvec_minmax, 796 .extra2 = &u32_max_div_HZ, 797 }, 798 { 799 .procname = "igmp_link_local_mcast_reports", 800 .data = &init_net.ipv4.sysctl_igmp_llm_reports, 801 .maxlen = sizeof(int), 802 .mode = 0644, 803 .proc_handler = proc_dointvec 804 }, 805 { 806 .procname = "igmp_max_memberships", 807 .data = &init_net.ipv4.sysctl_igmp_max_memberships, 808 .maxlen = sizeof(int), 809 .mode = 0644, 810 .proc_handler = proc_dointvec 811 }, 812 { 813 .procname = "igmp_max_msf", 814 .data = &init_net.ipv4.sysctl_igmp_max_msf, 815 .maxlen = sizeof(int), 816 .mode = 0644, 817 .proc_handler = proc_dointvec 818 }, 819 #ifdef CONFIG_IP_MULTICAST 820 { 821 .procname = "igmp_qrv", 822 .data = &init_net.ipv4.sysctl_igmp_qrv, 823 .maxlen = sizeof(int), 824 .mode = 0644, 825 .proc_handler = proc_dointvec_minmax, 826 .extra1 = &one 827 }, 828 #endif 829 { 830 .procname = "tcp_congestion_control", 831 .data = &init_net.ipv4.tcp_congestion_control, 832 .mode = 0644, 833 .maxlen = TCP_CA_NAME_MAX, 834 .proc_handler = proc_tcp_congestion_control, 835 }, 836 { 837 .procname = "tcp_keepalive_time", 838 .data = &init_net.ipv4.sysctl_tcp_keepalive_time, 839 .maxlen = sizeof(int), 840 .mode = 0644, 841 .proc_handler = proc_dointvec_jiffies, 842 }, 843 { 844 .procname = "tcp_keepalive_probes", 845 .data = &init_net.ipv4.sysctl_tcp_keepalive_probes, 846 .maxlen = sizeof(int), 847 .mode = 0644, 848 .proc_handler = proc_dointvec 849 }, 850 { 851 .procname = "tcp_keepalive_intvl", 852 .data = &init_net.ipv4.sysctl_tcp_keepalive_intvl, 853 .maxlen = sizeof(int), 854 .mode = 0644, 855 .proc_handler = proc_dointvec_jiffies, 856 }, 857 { 858 .procname = "tcp_syn_retries", 859 .data = &init_net.ipv4.sysctl_tcp_syn_retries, 860 .maxlen = sizeof(int), 861 .mode = 0644, 862 .proc_handler = proc_dointvec_minmax, 863 .extra1 = &tcp_syn_retries_min, 864 .extra2 = &tcp_syn_retries_max 865 }, 866 { 867 .procname = "tcp_synack_retries", 868 .data = &init_net.ipv4.sysctl_tcp_synack_retries, 869 .maxlen = sizeof(int), 870 .mode = 0644, 871 .proc_handler = proc_dointvec 872 }, 873 #ifdef CONFIG_SYN_COOKIES 874 { 875 .procname = "tcp_syncookies", 876 .data = &init_net.ipv4.sysctl_tcp_syncookies, 877 .maxlen = sizeof(int), 878 .mode = 0644, 879 .proc_handler = proc_dointvec 880 }, 881 #endif 882 { 883 .procname = "tcp_reordering", 884 .data = &init_net.ipv4.sysctl_tcp_reordering, 885 .maxlen = sizeof(int), 886 .mode = 0644, 887 .proc_handler = proc_dointvec 888 }, 889 { 890 .procname = "tcp_retries1", 891 .data = &init_net.ipv4.sysctl_tcp_retries1, 892 .maxlen = sizeof(int), 893 .mode = 0644, 894 .proc_handler = proc_dointvec_minmax, 895 .extra2 = &tcp_retr1_max 896 }, 897 { 898 .procname = "tcp_retries2", 899 .data = &init_net.ipv4.sysctl_tcp_retries2, 900 .maxlen = sizeof(int), 901 .mode = 0644, 902 .proc_handler = proc_dointvec 903 }, 904 { 905 .procname = "tcp_orphan_retries", 906 .data = &init_net.ipv4.sysctl_tcp_orphan_retries, 907 .maxlen = sizeof(int), 908 .mode = 0644, 909 .proc_handler = proc_dointvec 910 }, 911 { 912 .procname = "tcp_fin_timeout", 913 .data = &init_net.ipv4.sysctl_tcp_fin_timeout, 914 .maxlen = sizeof(int), 915 .mode = 0644, 916 .proc_handler = proc_dointvec_jiffies, 917 }, 918 { 919 .procname = "tcp_notsent_lowat", 920 .data = &init_net.ipv4.sysctl_tcp_notsent_lowat, 921 .maxlen = sizeof(unsigned int), 922 .mode = 0644, 923 .proc_handler = proc_douintvec, 924 }, 925 { 926 .procname = "tcp_tw_reuse", 927 .data = &init_net.ipv4.sysctl_tcp_tw_reuse, 928 .maxlen = sizeof(int), 929 .mode = 0644, 930 .proc_handler = proc_dointvec_minmax, 931 .extra1 = &zero, 932 .extra2 = &two, 933 }, 934 { 935 .procname = "tcp_max_tw_buckets", 936 .data = &init_net.ipv4.tcp_death_row.sysctl_max_tw_buckets, 937 .maxlen = sizeof(int), 938 .mode = 0644, 939 .proc_handler = proc_dointvec 940 }, 941 { 942 .procname = "tcp_max_syn_backlog", 943 .data = &init_net.ipv4.sysctl_max_syn_backlog, 944 .maxlen = sizeof(int), 945 .mode = 0644, 946 .proc_handler = proc_dointvec 947 }, 948 { 949 .procname = "tcp_fastopen", 950 .data = &init_net.ipv4.sysctl_tcp_fastopen, 951 .maxlen = sizeof(int), 952 .mode = 0644, 953 .proc_handler = proc_dointvec, 954 }, 955 { 956 .procname = "tcp_fastopen_key", 957 .mode = 0600, 958 .data = &init_net.ipv4.sysctl_tcp_fastopen, 959 .maxlen = ((TCP_FASTOPEN_KEY_LENGTH * 2) + 10), 960 .proc_handler = proc_tcp_fastopen_key, 961 }, 962 { 963 .procname = "tcp_fastopen_blackhole_timeout_sec", 964 .data = &init_net.ipv4.sysctl_tcp_fastopen_blackhole_timeout, 965 .maxlen = sizeof(int), 966 .mode = 0644, 967 .proc_handler = proc_tfo_blackhole_detect_timeout, 968 .extra1 = &zero, 969 }, 970 #ifdef CONFIG_IP_ROUTE_MULTIPATH 971 { 972 .procname = "fib_multipath_use_neigh", 973 .data = &init_net.ipv4.sysctl_fib_multipath_use_neigh, 974 .maxlen = sizeof(int), 975 .mode = 0644, 976 .proc_handler = proc_dointvec_minmax, 977 .extra1 = &zero, 978 .extra2 = &one, 979 }, 980 { 981 .procname = "fib_multipath_hash_policy", 982 .data = &init_net.ipv4.sysctl_fib_multipath_hash_policy, 983 .maxlen = sizeof(int), 984 .mode = 0644, 985 .proc_handler = proc_fib_multipath_hash_policy, 986 .extra1 = &zero, 987 .extra2 = &one, 988 }, 989 #endif 990 { 991 .procname = "ip_unprivileged_port_start", 992 .maxlen = sizeof(int), 993 .data = &init_net.ipv4.sysctl_ip_prot_sock, 994 .mode = 0644, 995 .proc_handler = ipv4_privileged_ports, 996 }, 997 #ifdef CONFIG_NET_L3_MASTER_DEV 998 { 999 .procname = "udp_l3mdev_accept", 1000 .data = &init_net.ipv4.sysctl_udp_l3mdev_accept, 1001 .maxlen = sizeof(int), 1002 .mode = 0644, 1003 .proc_handler = proc_dointvec_minmax, 1004 .extra1 = &zero, 1005 .extra2 = &one, 1006 }, 1007 #endif 1008 { 1009 .procname = "tcp_sack", 1010 .data = &init_net.ipv4.sysctl_tcp_sack, 1011 .maxlen = sizeof(int), 1012 .mode = 0644, 1013 .proc_handler = proc_dointvec 1014 }, 1015 { 1016 .procname = "tcp_window_scaling", 1017 .data = &init_net.ipv4.sysctl_tcp_window_scaling, 1018 .maxlen = sizeof(int), 1019 .mode = 0644, 1020 .proc_handler = proc_dointvec 1021 }, 1022 { 1023 .procname = "tcp_timestamps", 1024 .data = &init_net.ipv4.sysctl_tcp_timestamps, 1025 .maxlen = sizeof(int), 1026 .mode = 0644, 1027 .proc_handler = proc_dointvec 1028 }, 1029 { 1030 .procname = "tcp_early_retrans", 1031 .data = &init_net.ipv4.sysctl_tcp_early_retrans, 1032 .maxlen = sizeof(int), 1033 .mode = 0644, 1034 .proc_handler = proc_dointvec_minmax, 1035 .extra1 = &zero, 1036 .extra2 = &four, 1037 }, 1038 { 1039 .procname = "tcp_recovery", 1040 .data = &init_net.ipv4.sysctl_tcp_recovery, 1041 .maxlen = sizeof(int), 1042 .mode = 0644, 1043 .proc_handler = proc_dointvec, 1044 }, 1045 { 1046 .procname = "tcp_thin_linear_timeouts", 1047 .data = &init_net.ipv4.sysctl_tcp_thin_linear_timeouts, 1048 .maxlen = sizeof(int), 1049 .mode = 0644, 1050 .proc_handler = proc_dointvec 1051 }, 1052 { 1053 .procname = "tcp_slow_start_after_idle", 1054 .data = &init_net.ipv4.sysctl_tcp_slow_start_after_idle, 1055 .maxlen = sizeof(int), 1056 .mode = 0644, 1057 .proc_handler = proc_dointvec 1058 }, 1059 { 1060 .procname = "tcp_retrans_collapse", 1061 .data = &init_net.ipv4.sysctl_tcp_retrans_collapse, 1062 .maxlen = sizeof(int), 1063 .mode = 0644, 1064 .proc_handler = proc_dointvec 1065 }, 1066 { 1067 .procname = "tcp_stdurg", 1068 .data = &init_net.ipv4.sysctl_tcp_stdurg, 1069 .maxlen = sizeof(int), 1070 .mode = 0644, 1071 .proc_handler = proc_dointvec 1072 }, 1073 { 1074 .procname = "tcp_rfc1337", 1075 .data = &init_net.ipv4.sysctl_tcp_rfc1337, 1076 .maxlen = sizeof(int), 1077 .mode = 0644, 1078 .proc_handler = proc_dointvec 1079 }, 1080 { 1081 .procname = "tcp_abort_on_overflow", 1082 .data = &init_net.ipv4.sysctl_tcp_abort_on_overflow, 1083 .maxlen = sizeof(int), 1084 .mode = 0644, 1085 .proc_handler = proc_dointvec 1086 }, 1087 { 1088 .procname = "tcp_fack", 1089 .data = &init_net.ipv4.sysctl_tcp_fack, 1090 .maxlen = sizeof(int), 1091 .mode = 0644, 1092 .proc_handler = proc_dointvec 1093 }, 1094 { 1095 .procname = "tcp_max_reordering", 1096 .data = &init_net.ipv4.sysctl_tcp_max_reordering, 1097 .maxlen = sizeof(int), 1098 .mode = 0644, 1099 .proc_handler = proc_dointvec 1100 }, 1101 { 1102 .procname = "tcp_dsack", 1103 .data = &init_net.ipv4.sysctl_tcp_dsack, 1104 .maxlen = sizeof(int), 1105 .mode = 0644, 1106 .proc_handler = proc_dointvec 1107 }, 1108 { 1109 .procname = "tcp_app_win", 1110 .data = &init_net.ipv4.sysctl_tcp_app_win, 1111 .maxlen = sizeof(int), 1112 .mode = 0644, 1113 .proc_handler = proc_dointvec 1114 }, 1115 { 1116 .procname = "tcp_adv_win_scale", 1117 .data = &init_net.ipv4.sysctl_tcp_adv_win_scale, 1118 .maxlen = sizeof(int), 1119 .mode = 0644, 1120 .proc_handler = proc_dointvec_minmax, 1121 .extra1 = &tcp_adv_win_scale_min, 1122 .extra2 = &tcp_adv_win_scale_max, 1123 }, 1124 { 1125 .procname = "tcp_frto", 1126 .data = &init_net.ipv4.sysctl_tcp_frto, 1127 .maxlen = sizeof(int), 1128 .mode = 0644, 1129 .proc_handler = proc_dointvec 1130 }, 1131 { 1132 .procname = "tcp_no_metrics_save", 1133 .data = &init_net.ipv4.sysctl_tcp_nometrics_save, 1134 .maxlen = sizeof(int), 1135 .mode = 0644, 1136 .proc_handler = proc_dointvec, 1137 }, 1138 { 1139 .procname = "tcp_moderate_rcvbuf", 1140 .data = &init_net.ipv4.sysctl_tcp_moderate_rcvbuf, 1141 .maxlen = sizeof(int), 1142 .mode = 0644, 1143 .proc_handler = proc_dointvec, 1144 }, 1145 { 1146 .procname = "tcp_tso_win_divisor", 1147 .data = &init_net.ipv4.sysctl_tcp_tso_win_divisor, 1148 .maxlen = sizeof(int), 1149 .mode = 0644, 1150 .proc_handler = proc_dointvec, 1151 }, 1152 { 1153 .procname = "tcp_workaround_signed_windows", 1154 .data = &init_net.ipv4.sysctl_tcp_workaround_signed_windows, 1155 .maxlen = sizeof(int), 1156 .mode = 0644, 1157 .proc_handler = proc_dointvec 1158 }, 1159 { 1160 .procname = "tcp_limit_output_bytes", 1161 .data = &init_net.ipv4.sysctl_tcp_limit_output_bytes, 1162 .maxlen = sizeof(int), 1163 .mode = 0644, 1164 .proc_handler = proc_dointvec 1165 }, 1166 { 1167 .procname = "tcp_challenge_ack_limit", 1168 .data = &init_net.ipv4.sysctl_tcp_challenge_ack_limit, 1169 .maxlen = sizeof(int), 1170 .mode = 0644, 1171 .proc_handler = proc_dointvec 1172 }, 1173 { 1174 .procname = "tcp_min_tso_segs", 1175 .data = &init_net.ipv4.sysctl_tcp_min_tso_segs, 1176 .maxlen = sizeof(int), 1177 .mode = 0644, 1178 .proc_handler = proc_dointvec_minmax, 1179 .extra1 = &one, 1180 .extra2 = &gso_max_segs, 1181 }, 1182 { 1183 .procname = "tcp_min_rtt_wlen", 1184 .data = &init_net.ipv4.sysctl_tcp_min_rtt_wlen, 1185 .maxlen = sizeof(int), 1186 .mode = 0644, 1187 .proc_handler = proc_dointvec_minmax, 1188 .extra1 = &zero, 1189 .extra2 = &one_day_secs 1190 }, 1191 { 1192 .procname = "tcp_autocorking", 1193 .data = &init_net.ipv4.sysctl_tcp_autocorking, 1194 .maxlen = sizeof(int), 1195 .mode = 0644, 1196 .proc_handler = proc_dointvec_minmax, 1197 .extra1 = &zero, 1198 .extra2 = &one, 1199 }, 1200 { 1201 .procname = "tcp_invalid_ratelimit", 1202 .data = &init_net.ipv4.sysctl_tcp_invalid_ratelimit, 1203 .maxlen = sizeof(int), 1204 .mode = 0644, 1205 .proc_handler = proc_dointvec_ms_jiffies, 1206 }, 1207 { 1208 .procname = "tcp_pacing_ss_ratio", 1209 .data = &init_net.ipv4.sysctl_tcp_pacing_ss_ratio, 1210 .maxlen = sizeof(int), 1211 .mode = 0644, 1212 .proc_handler = proc_dointvec_minmax, 1213 .extra1 = &zero, 1214 .extra2 = &thousand, 1215 }, 1216 { 1217 .procname = "tcp_pacing_ca_ratio", 1218 .data = &init_net.ipv4.sysctl_tcp_pacing_ca_ratio, 1219 .maxlen = sizeof(int), 1220 .mode = 0644, 1221 .proc_handler = proc_dointvec_minmax, 1222 .extra1 = &zero, 1223 .extra2 = &thousand, 1224 }, 1225 { 1226 .procname = "tcp_wmem", 1227 .data = &init_net.ipv4.sysctl_tcp_wmem, 1228 .maxlen = sizeof(init_net.ipv4.sysctl_tcp_wmem), 1229 .mode = 0644, 1230 .proc_handler = proc_dointvec_minmax, 1231 .extra1 = &one, 1232 }, 1233 { 1234 .procname = "tcp_rmem", 1235 .data = &init_net.ipv4.sysctl_tcp_rmem, 1236 .maxlen = sizeof(init_net.ipv4.sysctl_tcp_rmem), 1237 .mode = 0644, 1238 .proc_handler = proc_dointvec_minmax, 1239 .extra1 = &one, 1240 }, 1241 { 1242 .procname = "tcp_comp_sack_delay_ns", 1243 .data = &init_net.ipv4.sysctl_tcp_comp_sack_delay_ns, 1244 .maxlen = sizeof(unsigned long), 1245 .mode = 0644, 1246 .proc_handler = proc_doulongvec_minmax, 1247 }, 1248 { 1249 .procname = "tcp_comp_sack_nr", 1250 .data = &init_net.ipv4.sysctl_tcp_comp_sack_nr, 1251 .maxlen = sizeof(int), 1252 .mode = 0644, 1253 .proc_handler = proc_dointvec_minmax, 1254 .extra1 = &zero, 1255 .extra2 = &comp_sack_nr_max, 1256 }, 1257 { 1258 .procname = "udp_rmem_min", 1259 .data = &init_net.ipv4.sysctl_udp_rmem_min, 1260 .maxlen = sizeof(init_net.ipv4.sysctl_udp_rmem_min), 1261 .mode = 0644, 1262 .proc_handler = proc_dointvec_minmax, 1263 .extra1 = &one 1264 }, 1265 { 1266 .procname = "udp_wmem_min", 1267 .data = &init_net.ipv4.sysctl_udp_wmem_min, 1268 .maxlen = sizeof(init_net.ipv4.sysctl_udp_wmem_min), 1269 .mode = 0644, 1270 .proc_handler = proc_dointvec_minmax, 1271 .extra1 = &one 1272 }, 1273 { } 1274 }; 1275 1276 static __net_init int ipv4_sysctl_init_net(struct net *net) 1277 { 1278 struct ctl_table *table; 1279 1280 table = ipv4_net_table; 1281 if (!net_eq(net, &init_net)) { 1282 int i; 1283 1284 table = kmemdup(table, sizeof(ipv4_net_table), GFP_KERNEL); 1285 if (!table) 1286 goto err_alloc; 1287 1288 /* Update the variables to point into the current struct net */ 1289 for (i = 0; i < ARRAY_SIZE(ipv4_net_table) - 1; i++) 1290 table[i].data += (void *)net - (void *)&init_net; 1291 } 1292 1293 net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table); 1294 if (!net->ipv4.ipv4_hdr) 1295 goto err_reg; 1296 1297 net->ipv4.sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL); 1298 if (!net->ipv4.sysctl_local_reserved_ports) 1299 goto err_ports; 1300 1301 return 0; 1302 1303 err_ports: 1304 unregister_net_sysctl_table(net->ipv4.ipv4_hdr); 1305 err_reg: 1306 if (!net_eq(net, &init_net)) 1307 kfree(table); 1308 err_alloc: 1309 return -ENOMEM; 1310 } 1311 1312 static __net_exit void ipv4_sysctl_exit_net(struct net *net) 1313 { 1314 struct ctl_table *table; 1315 1316 kfree(net->ipv4.sysctl_local_reserved_ports); 1317 table = net->ipv4.ipv4_hdr->ctl_table_arg; 1318 unregister_net_sysctl_table(net->ipv4.ipv4_hdr); 1319 kfree(table); 1320 } 1321 1322 static __net_initdata struct pernet_operations ipv4_sysctl_ops = { 1323 .init = ipv4_sysctl_init_net, 1324 .exit = ipv4_sysctl_exit_net, 1325 }; 1326 1327 static __init int sysctl_ipv4_init(void) 1328 { 1329 struct ctl_table_header *hdr; 1330 1331 hdr = register_net_sysctl(&init_net, "net/ipv4", ipv4_table); 1332 if (!hdr) 1333 return -ENOMEM; 1334 1335 if (register_pernet_subsys(&ipv4_sysctl_ops)) { 1336 unregister_net_sysctl_table(hdr); 1337 return -ENOMEM; 1338 } 1339 1340 return 0; 1341 } 1342 1343 __initcall(sysctl_ipv4_init); 1344