1 // SPDX-License-Identifier: GPL-2.0 2 /* -*- linux-c -*- 3 * sysctl_net_core.c: sysctl interface to net core subsystem. 4 * 5 * Begun April 1, 1996, Mike Shaver. 6 * Added /proc/sys/net/core directory entry (empty =) ). [MS] 7 */ 8 9 #include <linux/filter.h> 10 #include <linux/mm.h> 11 #include <linux/sysctl.h> 12 #include <linux/module.h> 13 #include <linux/socket.h> 14 #include <linux/netdevice.h> 15 #include <linux/ratelimit.h> 16 #include <linux/vmalloc.h> 17 #include <linux/init.h> 18 #include <linux/slab.h> 19 #include <linux/sched/isolation.h> 20 21 #include <net/ip.h> 22 #include <net/sock.h> 23 #include <net/net_ratelimit.h> 24 #include <net/busy_poll.h> 25 #include <net/pkt_sched.h> 26 #include <net/hotdata.h> 27 #include <net/rps.h> 28 29 #include "dev.h" 30 31 static int int_3600 = 3600; 32 static int min_sndbuf = SOCK_MIN_SNDBUF; 33 static int min_rcvbuf = SOCK_MIN_RCVBUF; 34 static int max_skb_frags = MAX_SKB_FRAGS; 35 static int min_mem_pcpu_rsv = SK_MEMORY_PCPU_RESERVE; 36 37 static int net_msg_warn; /* Unused, but still a sysctl */ 38 39 int sysctl_fb_tunnels_only_for_init_net __read_mostly = 0; 40 EXPORT_SYMBOL(sysctl_fb_tunnels_only_for_init_net); 41 42 /* 0 - Keep current behavior: 43 * IPv4: inherit all current settings from init_net 44 * IPv6: reset all settings to default 45 * 1 - Both inherit all current settings from init_net 46 * 2 - Both reset all settings to default 47 * 3 - Both inherit all settings from current netns 48 */ 49 int sysctl_devconf_inherit_init_net __read_mostly; 50 EXPORT_SYMBOL(sysctl_devconf_inherit_init_net); 51 52 #if IS_ENABLED(CONFIG_NET_FLOW_LIMIT) || IS_ENABLED(CONFIG_RPS) 53 static void dump_cpumask(void *buffer, size_t *lenp, loff_t *ppos, 54 struct cpumask *mask) 55 { 56 char kbuf[128]; 57 int len; 58 59 if (*ppos || !*lenp) { 60 *lenp = 0; 61 return; 62 } 63 64 len = min(sizeof(kbuf) - 1, *lenp); 65 len = scnprintf(kbuf, len, "%*pb", cpumask_pr_args(mask)); 66 if (!len) { 67 *lenp = 0; 68 return; 69 } 70 71 if (len < *lenp) 72 kbuf[len++] = '\n'; 73 memcpy(buffer, kbuf, len); 74 *lenp = len; 75 *ppos += len; 76 } 77 #endif 78 79 #ifdef CONFIG_RPS 80 81 static struct cpumask *rps_default_mask_cow_alloc(struct net *net) 82 { 83 struct cpumask *rps_default_mask; 84 85 if (net->core.rps_default_mask) 86 return net->core.rps_default_mask; 87 88 rps_default_mask = kzalloc(cpumask_size(), GFP_KERNEL); 89 if (!rps_default_mask) 90 return NULL; 91 92 /* pairs with READ_ONCE in rx_queue_default_mask() */ 93 WRITE_ONCE(net->core.rps_default_mask, rps_default_mask); 94 return rps_default_mask; 95 } 96 97 static int rps_default_mask_sysctl(struct ctl_table *table, int write, 98 void *buffer, size_t *lenp, loff_t *ppos) 99 { 100 struct net *net = (struct net *)table->data; 101 int err = 0; 102 103 rtnl_lock(); 104 if (write) { 105 struct cpumask *rps_default_mask = rps_default_mask_cow_alloc(net); 106 107 err = -ENOMEM; 108 if (!rps_default_mask) 109 goto done; 110 111 err = cpumask_parse(buffer, rps_default_mask); 112 if (err) 113 goto done; 114 115 err = rps_cpumask_housekeeping(rps_default_mask); 116 if (err) 117 goto done; 118 } else { 119 dump_cpumask(buffer, lenp, ppos, 120 net->core.rps_default_mask ? : cpu_none_mask); 121 } 122 123 done: 124 rtnl_unlock(); 125 return err; 126 } 127 128 static int rps_sock_flow_sysctl(struct ctl_table *table, int write, 129 void *buffer, size_t *lenp, loff_t *ppos) 130 { 131 unsigned int orig_size, size; 132 int ret, i; 133 struct ctl_table tmp = { 134 .data = &size, 135 .maxlen = sizeof(size), 136 .mode = table->mode 137 }; 138 struct rps_sock_flow_table *orig_sock_table, *sock_table; 139 static DEFINE_MUTEX(sock_flow_mutex); 140 141 mutex_lock(&sock_flow_mutex); 142 143 orig_sock_table = rcu_dereference_protected(rps_sock_flow_table, 144 lockdep_is_held(&sock_flow_mutex)); 145 size = orig_size = orig_sock_table ? orig_sock_table->mask + 1 : 0; 146 147 ret = proc_dointvec(&tmp, write, buffer, lenp, ppos); 148 149 if (write) { 150 if (size) { 151 if (size > 1<<29) { 152 /* Enforce limit to prevent overflow */ 153 mutex_unlock(&sock_flow_mutex); 154 return -EINVAL; 155 } 156 size = roundup_pow_of_two(size); 157 if (size != orig_size) { 158 sock_table = 159 vmalloc(RPS_SOCK_FLOW_TABLE_SIZE(size)); 160 if (!sock_table) { 161 mutex_unlock(&sock_flow_mutex); 162 return -ENOMEM; 163 } 164 rps_cpu_mask = roundup_pow_of_two(nr_cpu_ids) - 1; 165 sock_table->mask = size - 1; 166 } else 167 sock_table = orig_sock_table; 168 169 for (i = 0; i < size; i++) 170 sock_table->ents[i] = RPS_NO_CPU; 171 } else 172 sock_table = NULL; 173 174 if (sock_table != orig_sock_table) { 175 rcu_assign_pointer(rps_sock_flow_table, sock_table); 176 if (sock_table) { 177 static_branch_inc(&rps_needed); 178 static_branch_inc(&rfs_needed); 179 } 180 if (orig_sock_table) { 181 static_branch_dec(&rps_needed); 182 static_branch_dec(&rfs_needed); 183 kvfree_rcu_mightsleep(orig_sock_table); 184 } 185 } 186 } 187 188 mutex_unlock(&sock_flow_mutex); 189 190 return ret; 191 } 192 #endif /* CONFIG_RPS */ 193 194 #ifdef CONFIG_NET_FLOW_LIMIT 195 static DEFINE_MUTEX(flow_limit_update_mutex); 196 197 static int flow_limit_cpu_sysctl(struct ctl_table *table, int write, 198 void *buffer, size_t *lenp, loff_t *ppos) 199 { 200 struct sd_flow_limit *cur; 201 struct softnet_data *sd; 202 cpumask_var_t mask; 203 int i, len, ret = 0; 204 205 if (!alloc_cpumask_var(&mask, GFP_KERNEL)) 206 return -ENOMEM; 207 208 if (write) { 209 ret = cpumask_parse(buffer, mask); 210 if (ret) 211 goto done; 212 213 mutex_lock(&flow_limit_update_mutex); 214 len = sizeof(*cur) + netdev_flow_limit_table_len; 215 for_each_possible_cpu(i) { 216 sd = &per_cpu(softnet_data, i); 217 cur = rcu_dereference_protected(sd->flow_limit, 218 lockdep_is_held(&flow_limit_update_mutex)); 219 if (cur && !cpumask_test_cpu(i, mask)) { 220 RCU_INIT_POINTER(sd->flow_limit, NULL); 221 kfree_rcu_mightsleep(cur); 222 } else if (!cur && cpumask_test_cpu(i, mask)) { 223 cur = kzalloc_node(len, GFP_KERNEL, 224 cpu_to_node(i)); 225 if (!cur) { 226 /* not unwinding previous changes */ 227 ret = -ENOMEM; 228 goto write_unlock; 229 } 230 cur->num_buckets = netdev_flow_limit_table_len; 231 rcu_assign_pointer(sd->flow_limit, cur); 232 } 233 } 234 write_unlock: 235 mutex_unlock(&flow_limit_update_mutex); 236 } else { 237 cpumask_clear(mask); 238 rcu_read_lock(); 239 for_each_possible_cpu(i) { 240 sd = &per_cpu(softnet_data, i); 241 if (rcu_dereference(sd->flow_limit)) 242 cpumask_set_cpu(i, mask); 243 } 244 rcu_read_unlock(); 245 246 dump_cpumask(buffer, lenp, ppos, mask); 247 } 248 249 done: 250 free_cpumask_var(mask); 251 return ret; 252 } 253 254 static int flow_limit_table_len_sysctl(struct ctl_table *table, int write, 255 void *buffer, size_t *lenp, loff_t *ppos) 256 { 257 unsigned int old, *ptr; 258 int ret; 259 260 mutex_lock(&flow_limit_update_mutex); 261 262 ptr = table->data; 263 old = *ptr; 264 ret = proc_dointvec(table, write, buffer, lenp, ppos); 265 if (!ret && write && !is_power_of_2(*ptr)) { 266 *ptr = old; 267 ret = -EINVAL; 268 } 269 270 mutex_unlock(&flow_limit_update_mutex); 271 return ret; 272 } 273 #endif /* CONFIG_NET_FLOW_LIMIT */ 274 275 #ifdef CONFIG_NET_SCHED 276 static int set_default_qdisc(struct ctl_table *table, int write, 277 void *buffer, size_t *lenp, loff_t *ppos) 278 { 279 char id[IFNAMSIZ]; 280 struct ctl_table tbl = { 281 .data = id, 282 .maxlen = IFNAMSIZ, 283 }; 284 int ret; 285 286 qdisc_get_default(id, IFNAMSIZ); 287 288 ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 289 if (write && ret == 0) 290 ret = qdisc_set_default(id); 291 return ret; 292 } 293 #endif 294 295 static int proc_do_dev_weight(struct ctl_table *table, int write, 296 void *buffer, size_t *lenp, loff_t *ppos) 297 { 298 static DEFINE_MUTEX(dev_weight_mutex); 299 int ret, weight; 300 301 mutex_lock(&dev_weight_mutex); 302 ret = proc_dointvec(table, write, buffer, lenp, ppos); 303 if (!ret && write) { 304 weight = READ_ONCE(weight_p); 305 WRITE_ONCE(net_hotdata.dev_rx_weight, weight * dev_weight_rx_bias); 306 WRITE_ONCE(net_hotdata.dev_tx_weight, weight * dev_weight_tx_bias); 307 } 308 mutex_unlock(&dev_weight_mutex); 309 310 return ret; 311 } 312 313 static int proc_do_rss_key(struct ctl_table *table, int write, 314 void *buffer, size_t *lenp, loff_t *ppos) 315 { 316 struct ctl_table fake_table; 317 char buf[NETDEV_RSS_KEY_LEN * 3]; 318 319 snprintf(buf, sizeof(buf), "%*phC", NETDEV_RSS_KEY_LEN, netdev_rss_key); 320 fake_table.data = buf; 321 fake_table.maxlen = sizeof(buf); 322 return proc_dostring(&fake_table, write, buffer, lenp, ppos); 323 } 324 325 #ifdef CONFIG_BPF_JIT 326 static int proc_dointvec_minmax_bpf_enable(struct ctl_table *table, int write, 327 void *buffer, size_t *lenp, 328 loff_t *ppos) 329 { 330 int ret, jit_enable = *(int *)table->data; 331 int min = *(int *)table->extra1; 332 int max = *(int *)table->extra2; 333 struct ctl_table tmp = *table; 334 335 if (write && !capable(CAP_SYS_ADMIN)) 336 return -EPERM; 337 338 tmp.data = &jit_enable; 339 ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); 340 if (write && !ret) { 341 if (jit_enable < 2 || 342 (jit_enable == 2 && bpf_dump_raw_ok(current_cred()))) { 343 *(int *)table->data = jit_enable; 344 if (jit_enable == 2) 345 pr_warn("bpf_jit_enable = 2 was set! NEVER use this in production, only for JIT debugging!\n"); 346 } else { 347 ret = -EPERM; 348 } 349 } 350 351 if (write && ret && min == max) 352 pr_info_once("CONFIG_BPF_JIT_ALWAYS_ON is enabled, bpf_jit_enable is permanently set to 1.\n"); 353 354 return ret; 355 } 356 357 # ifdef CONFIG_HAVE_EBPF_JIT 358 static int 359 proc_dointvec_minmax_bpf_restricted(struct ctl_table *table, int write, 360 void *buffer, size_t *lenp, loff_t *ppos) 361 { 362 if (!capable(CAP_SYS_ADMIN)) 363 return -EPERM; 364 365 return proc_dointvec_minmax(table, write, buffer, lenp, ppos); 366 } 367 # endif /* CONFIG_HAVE_EBPF_JIT */ 368 369 static int 370 proc_dolongvec_minmax_bpf_restricted(struct ctl_table *table, int write, 371 void *buffer, size_t *lenp, loff_t *ppos) 372 { 373 if (!capable(CAP_SYS_ADMIN)) 374 return -EPERM; 375 376 return proc_doulongvec_minmax(table, write, buffer, lenp, ppos); 377 } 378 #endif 379 380 static struct ctl_table net_core_table[] = { 381 { 382 .procname = "wmem_max", 383 .data = &sysctl_wmem_max, 384 .maxlen = sizeof(int), 385 .mode = 0644, 386 .proc_handler = proc_dointvec_minmax, 387 .extra1 = &min_sndbuf, 388 }, 389 { 390 .procname = "rmem_max", 391 .data = &sysctl_rmem_max, 392 .maxlen = sizeof(int), 393 .mode = 0644, 394 .proc_handler = proc_dointvec_minmax, 395 .extra1 = &min_rcvbuf, 396 }, 397 { 398 .procname = "wmem_default", 399 .data = &sysctl_wmem_default, 400 .maxlen = sizeof(int), 401 .mode = 0644, 402 .proc_handler = proc_dointvec_minmax, 403 .extra1 = &min_sndbuf, 404 }, 405 { 406 .procname = "rmem_default", 407 .data = &sysctl_rmem_default, 408 .maxlen = sizeof(int), 409 .mode = 0644, 410 .proc_handler = proc_dointvec_minmax, 411 .extra1 = &min_rcvbuf, 412 }, 413 { 414 .procname = "mem_pcpu_rsv", 415 .data = &sysctl_mem_pcpu_rsv, 416 .maxlen = sizeof(int), 417 .mode = 0644, 418 .proc_handler = proc_dointvec_minmax, 419 .extra1 = &min_mem_pcpu_rsv, 420 }, 421 { 422 .procname = "dev_weight", 423 .data = &weight_p, 424 .maxlen = sizeof(int), 425 .mode = 0644, 426 .proc_handler = proc_do_dev_weight, 427 }, 428 { 429 .procname = "dev_weight_rx_bias", 430 .data = &dev_weight_rx_bias, 431 .maxlen = sizeof(int), 432 .mode = 0644, 433 .proc_handler = proc_do_dev_weight, 434 }, 435 { 436 .procname = "dev_weight_tx_bias", 437 .data = &dev_weight_tx_bias, 438 .maxlen = sizeof(int), 439 .mode = 0644, 440 .proc_handler = proc_do_dev_weight, 441 }, 442 { 443 .procname = "netdev_max_backlog", 444 .data = &net_hotdata.max_backlog, 445 .maxlen = sizeof(int), 446 .mode = 0644, 447 .proc_handler = proc_dointvec 448 }, 449 { 450 .procname = "netdev_rss_key", 451 .data = &netdev_rss_key, 452 .maxlen = sizeof(int), 453 .mode = 0444, 454 .proc_handler = proc_do_rss_key, 455 }, 456 #ifdef CONFIG_BPF_JIT 457 { 458 .procname = "bpf_jit_enable", 459 .data = &bpf_jit_enable, 460 .maxlen = sizeof(int), 461 .mode = 0644, 462 .proc_handler = proc_dointvec_minmax_bpf_enable, 463 # ifdef CONFIG_BPF_JIT_ALWAYS_ON 464 .extra1 = SYSCTL_ONE, 465 .extra2 = SYSCTL_ONE, 466 # else 467 .extra1 = SYSCTL_ZERO, 468 .extra2 = SYSCTL_TWO, 469 # endif 470 }, 471 # ifdef CONFIG_HAVE_EBPF_JIT 472 { 473 .procname = "bpf_jit_harden", 474 .data = &bpf_jit_harden, 475 .maxlen = sizeof(int), 476 .mode = 0600, 477 .proc_handler = proc_dointvec_minmax_bpf_restricted, 478 .extra1 = SYSCTL_ZERO, 479 .extra2 = SYSCTL_TWO, 480 }, 481 { 482 .procname = "bpf_jit_kallsyms", 483 .data = &bpf_jit_kallsyms, 484 .maxlen = sizeof(int), 485 .mode = 0600, 486 .proc_handler = proc_dointvec_minmax_bpf_restricted, 487 .extra1 = SYSCTL_ZERO, 488 .extra2 = SYSCTL_ONE, 489 }, 490 # endif 491 { 492 .procname = "bpf_jit_limit", 493 .data = &bpf_jit_limit, 494 .maxlen = sizeof(long), 495 .mode = 0600, 496 .proc_handler = proc_dolongvec_minmax_bpf_restricted, 497 .extra1 = SYSCTL_LONG_ONE, 498 .extra2 = &bpf_jit_limit_max, 499 }, 500 #endif 501 { 502 .procname = "netdev_tstamp_prequeue", 503 .data = &net_hotdata.tstamp_prequeue, 504 .maxlen = sizeof(int), 505 .mode = 0644, 506 .proc_handler = proc_dointvec 507 }, 508 { 509 .procname = "message_cost", 510 .data = &net_ratelimit_state.interval, 511 .maxlen = sizeof(int), 512 .mode = 0644, 513 .proc_handler = proc_dointvec_jiffies, 514 }, 515 { 516 .procname = "message_burst", 517 .data = &net_ratelimit_state.burst, 518 .maxlen = sizeof(int), 519 .mode = 0644, 520 .proc_handler = proc_dointvec, 521 }, 522 { 523 .procname = "tstamp_allow_data", 524 .data = &sysctl_tstamp_allow_data, 525 .maxlen = sizeof(int), 526 .mode = 0644, 527 .proc_handler = proc_dointvec_minmax, 528 .extra1 = SYSCTL_ZERO, 529 .extra2 = SYSCTL_ONE 530 }, 531 #ifdef CONFIG_RPS 532 { 533 .procname = "rps_sock_flow_entries", 534 .maxlen = sizeof(int), 535 .mode = 0644, 536 .proc_handler = rps_sock_flow_sysctl 537 }, 538 #endif 539 #ifdef CONFIG_NET_FLOW_LIMIT 540 { 541 .procname = "flow_limit_cpu_bitmap", 542 .mode = 0644, 543 .proc_handler = flow_limit_cpu_sysctl 544 }, 545 { 546 .procname = "flow_limit_table_len", 547 .data = &netdev_flow_limit_table_len, 548 .maxlen = sizeof(int), 549 .mode = 0644, 550 .proc_handler = flow_limit_table_len_sysctl 551 }, 552 #endif /* CONFIG_NET_FLOW_LIMIT */ 553 #ifdef CONFIG_NET_RX_BUSY_POLL 554 { 555 .procname = "busy_poll", 556 .data = &sysctl_net_busy_poll, 557 .maxlen = sizeof(unsigned int), 558 .mode = 0644, 559 .proc_handler = proc_dointvec_minmax, 560 .extra1 = SYSCTL_ZERO, 561 }, 562 { 563 .procname = "busy_read", 564 .data = &sysctl_net_busy_read, 565 .maxlen = sizeof(unsigned int), 566 .mode = 0644, 567 .proc_handler = proc_dointvec_minmax, 568 .extra1 = SYSCTL_ZERO, 569 }, 570 #endif 571 #ifdef CONFIG_NET_SCHED 572 { 573 .procname = "default_qdisc", 574 .mode = 0644, 575 .maxlen = IFNAMSIZ, 576 .proc_handler = set_default_qdisc 577 }, 578 #endif 579 { 580 .procname = "netdev_budget", 581 .data = &net_hotdata.netdev_budget, 582 .maxlen = sizeof(int), 583 .mode = 0644, 584 .proc_handler = proc_dointvec 585 }, 586 { 587 .procname = "warnings", 588 .data = &net_msg_warn, 589 .maxlen = sizeof(int), 590 .mode = 0644, 591 .proc_handler = proc_dointvec 592 }, 593 { 594 .procname = "max_skb_frags", 595 .data = &sysctl_max_skb_frags, 596 .maxlen = sizeof(int), 597 .mode = 0644, 598 .proc_handler = proc_dointvec_minmax, 599 .extra1 = SYSCTL_ONE, 600 .extra2 = &max_skb_frags, 601 }, 602 { 603 .procname = "netdev_budget_usecs", 604 .data = &net_hotdata.netdev_budget_usecs, 605 .maxlen = sizeof(unsigned int), 606 .mode = 0644, 607 .proc_handler = proc_dointvec_minmax, 608 .extra1 = SYSCTL_ZERO, 609 }, 610 { 611 .procname = "fb_tunnels_only_for_init_net", 612 .data = &sysctl_fb_tunnels_only_for_init_net, 613 .maxlen = sizeof(int), 614 .mode = 0644, 615 .proc_handler = proc_dointvec_minmax, 616 .extra1 = SYSCTL_ZERO, 617 .extra2 = SYSCTL_TWO, 618 }, 619 { 620 .procname = "devconf_inherit_init_net", 621 .data = &sysctl_devconf_inherit_init_net, 622 .maxlen = sizeof(int), 623 .mode = 0644, 624 .proc_handler = proc_dointvec_minmax, 625 .extra1 = SYSCTL_ZERO, 626 .extra2 = SYSCTL_THREE, 627 }, 628 { 629 .procname = "high_order_alloc_disable", 630 .data = &net_high_order_alloc_disable_key.key, 631 .maxlen = sizeof(net_high_order_alloc_disable_key), 632 .mode = 0644, 633 .proc_handler = proc_do_static_key, 634 }, 635 { 636 .procname = "gro_normal_batch", 637 .data = &net_hotdata.gro_normal_batch, 638 .maxlen = sizeof(unsigned int), 639 .mode = 0644, 640 .proc_handler = proc_dointvec_minmax, 641 .extra1 = SYSCTL_ONE, 642 }, 643 { 644 .procname = "netdev_unregister_timeout_secs", 645 .data = &netdev_unregister_timeout_secs, 646 .maxlen = sizeof(unsigned int), 647 .mode = 0644, 648 .proc_handler = proc_dointvec_minmax, 649 .extra1 = SYSCTL_ONE, 650 .extra2 = &int_3600, 651 }, 652 { 653 .procname = "skb_defer_max", 654 .data = &sysctl_skb_defer_max, 655 .maxlen = sizeof(unsigned int), 656 .mode = 0644, 657 .proc_handler = proc_dointvec_minmax, 658 .extra1 = SYSCTL_ZERO, 659 }, 660 { } 661 }; 662 663 static struct ctl_table netns_core_table[] = { 664 #if IS_ENABLED(CONFIG_RPS) 665 { 666 .procname = "rps_default_mask", 667 .data = &init_net, 668 .mode = 0644, 669 .proc_handler = rps_default_mask_sysctl 670 }, 671 #endif 672 { 673 .procname = "somaxconn", 674 .data = &init_net.core.sysctl_somaxconn, 675 .maxlen = sizeof(int), 676 .mode = 0644, 677 .extra1 = SYSCTL_ZERO, 678 .proc_handler = proc_dointvec_minmax 679 }, 680 { 681 .procname = "optmem_max", 682 .data = &init_net.core.sysctl_optmem_max, 683 .maxlen = sizeof(int), 684 .mode = 0644, 685 .extra1 = SYSCTL_ZERO, 686 .proc_handler = proc_dointvec_minmax 687 }, 688 { 689 .procname = "txrehash", 690 .data = &init_net.core.sysctl_txrehash, 691 .maxlen = sizeof(u8), 692 .mode = 0644, 693 .extra1 = SYSCTL_ZERO, 694 .extra2 = SYSCTL_ONE, 695 .proc_handler = proc_dou8vec_minmax, 696 }, 697 { } 698 }; 699 700 static int __init fb_tunnels_only_for_init_net_sysctl_setup(char *str) 701 { 702 /* fallback tunnels for initns only */ 703 if (!strncmp(str, "initns", 6)) 704 sysctl_fb_tunnels_only_for_init_net = 1; 705 /* no fallback tunnels anywhere */ 706 else if (!strncmp(str, "none", 4)) 707 sysctl_fb_tunnels_only_for_init_net = 2; 708 709 return 1; 710 } 711 __setup("fb_tunnels=", fb_tunnels_only_for_init_net_sysctl_setup); 712 713 static __net_init int sysctl_core_net_init(struct net *net) 714 { 715 struct ctl_table *tbl, *tmp; 716 717 tbl = netns_core_table; 718 if (!net_eq(net, &init_net)) { 719 tbl = kmemdup(tbl, sizeof(netns_core_table), GFP_KERNEL); 720 if (tbl == NULL) 721 goto err_dup; 722 723 for (tmp = tbl; tmp->procname; tmp++) 724 tmp->data += (char *)net - (char *)&init_net; 725 } 726 727 net->core.sysctl_hdr = register_net_sysctl_sz(net, "net/core", tbl, 728 ARRAY_SIZE(netns_core_table)); 729 if (net->core.sysctl_hdr == NULL) 730 goto err_reg; 731 732 return 0; 733 734 err_reg: 735 if (tbl != netns_core_table) 736 kfree(tbl); 737 err_dup: 738 return -ENOMEM; 739 } 740 741 static __net_exit void sysctl_core_net_exit(struct net *net) 742 { 743 struct ctl_table *tbl; 744 745 tbl = net->core.sysctl_hdr->ctl_table_arg; 746 unregister_net_sysctl_table(net->core.sysctl_hdr); 747 BUG_ON(tbl == netns_core_table); 748 #if IS_ENABLED(CONFIG_RPS) 749 kfree(net->core.rps_default_mask); 750 #endif 751 kfree(tbl); 752 } 753 754 static __net_initdata struct pernet_operations sysctl_core_ops = { 755 .init = sysctl_core_net_init, 756 .exit = sysctl_core_net_exit, 757 }; 758 759 static __init int sysctl_core_init(void) 760 { 761 register_net_sysctl(&init_net, "net/core", net_core_table); 762 return register_pernet_subsys(&sysctl_core_ops); 763 } 764 765 fs_initcall(sysctl_core_init); 766