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