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