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