11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* -*- linux-c -*-
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sysctl_net_core.c: sysctl interface to net core subsystem.
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Begun April 1, 1996, Mike Shaver.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added /proc/sys/net/core directory entry (empty =) ). [MS]
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sysctl.h>
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
1120380731bc2897f2952ae055420972ded4cd786eArnaldo Carvalho de Melo#include <linux/socket.h>
12a37ae4086e7e804db534bc8f2d31c2fbf89c5761Pavel Emelyanov#include <linux/netdevice.h>
133fff4c42bd0a89869a0eb1e7874cc06ffa4aa0f5Ingo Molnar#include <linux/ratelimit.h>
14fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert#include <linux/vmalloc.h>
1533eb9cfc700ae9ce621d47d6ca6d6b4ad7cd97f3Pavel Emelyanov#include <linux/init.h>
165a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
177426a5645f3d18daec1f7d6a24b529ec7286b800Shan Wei#include <linux/kmemleak.h>
183fff4c42bd0a89869a0eb1e7874cc06ffa4aa0f5Ingo Molnar
1963d819caebcc3ca260ca0214d29044293969aa2fHannes Eder#include <net/ip.h>
2020380731bc2897f2952ae055420972ded4cd786eArnaldo Carvalho de Melo#include <net/sock.h>
21c5c177b4aca83338781e72be2e6dd1601c560cb3David S. Miller#include <net/net_ratelimit.h>
22076bb0c82a44fbe46fe2c8527a5b5b64b69f679dEliezer Tamir#include <net/busy_poll.h>
236da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger#include <net/pkt_sched.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
255f671d6b4ec3e6d66c2a868738af2cdea09e7509Roman Gushchinstatic int zero = 0;
26cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.comstatic int one = 1;
275f671d6b4ec3e6d66c2a868738af2cdea09e7509Roman Gushchinstatic int ushort_max = USHRT_MAX;
28cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com
29fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert#ifdef CONFIG_RPS
30fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic int rps_sock_flow_sysctl(struct ctl_table *table, int write,
31fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				void __user *buffer, size_t *lenp, loff_t *ppos)
32fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert{
33fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	unsigned int orig_size, size;
34fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	int ret, i;
35fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perches	struct ctl_table tmp = {
36fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		.data = &size,
37fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		.maxlen = sizeof(size),
38fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		.mode = table->mode
39fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	};
40fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	struct rps_sock_flow_table *orig_sock_table, *sock_table;
41fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	static DEFINE_MUTEX(sock_flow_mutex);
42fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
43fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	mutex_lock(&sock_flow_mutex);
44fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
456e3f7faf3e8a3e226b1a6b955aac12abf2f2e1b6Eric Dumazet	orig_sock_table = rcu_dereference_protected(rps_sock_flow_table,
466e3f7faf3e8a3e226b1a6b955aac12abf2f2e1b6Eric Dumazet					lockdep_is_held(&sock_flow_mutex));
47fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	size = orig_size = orig_sock_table ? orig_sock_table->mask + 1 : 0;
48fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
49fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	ret = proc_dointvec(&tmp, write, buffer, lenp, ppos);
50fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
51fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	if (write) {
52fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		if (size) {
53fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			if (size > 1<<30) {
54fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				/* Enforce limit to prevent overflow */
55fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				mutex_unlock(&sock_flow_mutex);
56fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				return -EINVAL;
57fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			}
58fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			size = roundup_pow_of_two(size);
59fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			if (size != orig_size) {
60fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				sock_table =
61fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				    vmalloc(RPS_SOCK_FLOW_TABLE_SIZE(size));
62fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				if (!sock_table) {
63fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert					mutex_unlock(&sock_flow_mutex);
64fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert					return -ENOMEM;
65fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				}
66fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
67fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				sock_table->mask = size - 1;
68fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			} else
69fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				sock_table = orig_sock_table;
70fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
71fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			for (i = 0; i < size; i++)
72fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert				sock_table->ents[i] = RPS_NO_CPU;
73fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		} else
74fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			sock_table = NULL;
75fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
76fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		if (sock_table != orig_sock_table) {
77fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert			rcu_assign_pointer(rps_sock_flow_table, sock_table);
78adc9300e78e6091a7eaa1821213836379d4dbaa8Eric Dumazet			if (sock_table)
79c5905afb0ee6550b42c49213da1c22d67316c194Ingo Molnar				static_key_slow_inc(&rps_needed);
80adc9300e78e6091a7eaa1821213836379d4dbaa8Eric Dumazet			if (orig_sock_table) {
81c5905afb0ee6550b42c49213da1c22d67316c194Ingo Molnar				static_key_slow_dec(&rps_needed);
82adc9300e78e6091a7eaa1821213836379d4dbaa8Eric Dumazet				synchronize_rcu();
83adc9300e78e6091a7eaa1821213836379d4dbaa8Eric Dumazet				vfree(orig_sock_table);
84adc9300e78e6091a7eaa1821213836379d4dbaa8Eric Dumazet			}
85fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		}
86fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	}
87fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
88fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	mutex_unlock(&sock_flow_mutex);
89fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
90fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	return ret;
91fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert}
92fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert#endif /* CONFIG_RPS */
93fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert
9499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn#ifdef CONFIG_NET_FLOW_LIMIT
9599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijnstatic DEFINE_MUTEX(flow_limit_update_mutex);
9699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
97fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic int flow_limit_cpu_sysctl(struct ctl_table *table, int write,
9899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				 void __user *buffer, size_t *lenp,
9999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				 loff_t *ppos)
10099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn{
10199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	struct sd_flow_limit *cur;
10299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	struct softnet_data *sd;
10399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	cpumask_var_t mask;
10499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	int i, len, ret = 0;
10599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
10699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	if (!alloc_cpumask_var(&mask, GFP_KERNEL))
10799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		return -ENOMEM;
10899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
10999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	if (write) {
11099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		ret = cpumask_parse_user(buffer, *lenp, mask);
11199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		if (ret)
11299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			goto done;
11399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
11499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		mutex_lock(&flow_limit_update_mutex);
11599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		len = sizeof(*cur) + netdev_flow_limit_table_len;
11699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		for_each_possible_cpu(i) {
11799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			sd = &per_cpu(softnet_data, i);
11899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			cur = rcu_dereference_protected(sd->flow_limit,
11999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				     lockdep_is_held(&flow_limit_update_mutex));
12099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			if (cur && !cpumask_test_cpu(i, mask)) {
12199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				RCU_INIT_POINTER(sd->flow_limit, NULL);
12299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				synchronize_rcu();
12399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				kfree(cur);
12499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			} else if (!cur && cpumask_test_cpu(i, mask)) {
1255b59d467ad9ff9c014b99f4cfc2ea627b0806d07Eric Dumazet				cur = kzalloc_node(len, GFP_KERNEL,
1265b59d467ad9ff9c014b99f4cfc2ea627b0806d07Eric Dumazet						   cpu_to_node(i));
12799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				if (!cur) {
12899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn					/* not unwinding previous changes */
12999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn					ret = -ENOMEM;
13099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn					goto write_unlock;
13199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				}
13299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				cur->num_buckets = netdev_flow_limit_table_len;
13399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				rcu_assign_pointer(sd->flow_limit, cur);
13499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			}
13599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		}
13699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijnwrite_unlock:
13799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		mutex_unlock(&flow_limit_update_mutex);
13899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	} else {
1395f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		char kbuf[128];
1405f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn
14199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		if (*ppos || !*lenp) {
14299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			*lenp = 0;
14399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			goto done;
14499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		}
14599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
14699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		cpumask_clear(mask);
14799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		rcu_read_lock();
14899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		for_each_possible_cpu(i) {
14999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			sd = &per_cpu(softnet_data, i);
15099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn			if (rcu_dereference(sd->flow_limit))
15199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				cpumask_set_cpu(i, mask);
15299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		}
15399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		rcu_read_unlock();
15499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
1555f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		len = min(sizeof(kbuf) - 1, *lenp);
1565f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		len = cpumask_scnprintf(kbuf, len, mask);
1575f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		if (!len) {
1585f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn			*lenp = 0;
1595f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn			goto done;
1605f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		}
1615f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		if (len < *lenp)
1625f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn			kbuf[len++] = '\n';
1635f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		if (copy_to_user(buffer, kbuf, len)) {
1645f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn			ret = -EFAULT;
1655f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn			goto done;
1665f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		}
1675f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		*lenp = len;
1685f121b9a83b499a61ed44e5ba619c7de8f7271adWillem de Bruijn		*ppos += len;
16999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	}
17099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
17199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijndone:
17299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	free_cpumask_var(mask);
17399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	return ret;
17499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn}
17599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
176fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic int flow_limit_table_len_sysctl(struct ctl_table *table, int write,
17799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				       void __user *buffer, size_t *lenp,
17899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn				       loff_t *ppos)
17999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn{
18099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	unsigned int old, *ptr;
18199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	int ret;
18299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
18399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	mutex_lock(&flow_limit_update_mutex);
18499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
18599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	ptr = table->data;
18699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	old = *ptr;
18799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	ret = proc_dointvec(table, write, buffer, lenp, ppos);
18899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	if (!ret && write && !is_power_of_2(*ptr)) {
18999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		*ptr = old;
19099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		ret = -EINVAL;
19199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	}
19299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
19399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	mutex_unlock(&flow_limit_update_mutex);
19499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	return ret;
19599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn}
19699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn#endif /* CONFIG_NET_FLOW_LIMIT */
19799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn
1986da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger#ifdef CONFIG_NET_SCHED
1996da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemmingerstatic int set_default_qdisc(struct ctl_table *table, int write,
2006da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger			     void __user *buffer, size_t *lenp, loff_t *ppos)
2016da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger{
2026da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	char id[IFNAMSIZ];
2036da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	struct ctl_table tbl = {
2046da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger		.data = id,
2056da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger		.maxlen = IFNAMSIZ,
2066da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	};
2076da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	int ret;
2086da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger
2096da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	qdisc_get_default(id, IFNAMSIZ);
2106da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger
2116da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
2126da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	if (write && ret == 0)
2136da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger		ret = qdisc_set_default(id);
2146da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	return ret;
2156da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger}
2166da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger#endif
2176da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger
21833eb9cfc700ae9ce621d47d6ca6d6b4ad7cd97f3Pavel Emelyanovstatic struct ctl_table net_core_table[] = {
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_NET
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "wmem_max",
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data		= &sysctl_wmem_max,
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
225cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.proc_handler	= proc_dointvec_minmax,
226cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.extra1		= &one,
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "rmem_max",
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data		= &sysctl_rmem_max,
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
233cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.proc_handler	= proc_dointvec_minmax,
234cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.extra1		= &one,
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "wmem_default",
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data		= &sysctl_wmem_default,
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
241cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.proc_handler	= proc_dointvec_minmax,
242cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.extra1		= &one,
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "rmem_default",
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data		= &sysctl_rmem_default,
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
249cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.proc_handler	= proc_dointvec_minmax,
250cdda88912d62f9603d27433338a18be83ef23ac1bingtian.ly@taobao.com		.extra1		= &one,
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "dev_weight",
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data		= &weight_p,
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
2576d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler	= proc_dointvec
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "netdev_max_backlog",
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data		= &netdev_max_backlog,
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
2646d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler	= proc_dointvec
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2660a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet#ifdef CONFIG_BPF_JIT
2670a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet	{
2680a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet		.procname	= "bpf_jit_enable",
2690a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet		.data		= &bpf_jit_enable,
2700a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet		.maxlen		= sizeof(int),
2710a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet		.mode		= 0644,
2720a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet		.proc_handler	= proc_dointvec
2730a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet	},
2740a14842f5a3c0e88a1e59fac5c3025db39721f74Eric Dumazet#endif
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2763b098e2d7c693796cc4dffb07caa249fc0f70771Eric Dumazet		.procname	= "netdev_tstamp_prequeue",
2773b098e2d7c693796cc4dffb07caa249fc0f70771Eric Dumazet		.data		= &netdev_tstamp_prequeue,
2783b098e2d7c693796cc4dffb07caa249fc0f70771Eric Dumazet		.maxlen		= sizeof(int),
2793b098e2d7c693796cc4dffb07caa249fc0f70771Eric Dumazet		.mode		= 0644,
2803b098e2d7c693796cc4dffb07caa249fc0f70771Eric Dumazet		.proc_handler	= proc_dointvec
2813b098e2d7c693796cc4dffb07caa249fc0f70771Eric Dumazet	},
2823b098e2d7c693796cc4dffb07caa249fc0f70771Eric Dumazet	{
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "message_cost",
284717115e1a5856b57af0f71e1df7149108294fc10Dave Young		.data		= &net_ratelimit_state.interval,
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
2876d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler	= proc_dointvec_jiffies,
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "message_burst",
291717115e1a5856b57af0f71e1df7149108294fc10Dave Young		.data		= &net_ratelimit_state.burst,
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
2946d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler	= proc_dointvec,
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname	= "optmem_max",
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data		= &sysctl_optmem_max,
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen		= sizeof(int),
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode		= 0644,
3016d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler	= proc_dointvec
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
303fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert#ifdef CONFIG_RPS
304fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	{
305fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		.procname	= "rps_sock_flow_entries",
306fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		.maxlen		= sizeof(int),
307fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		.mode		= 0644,
308fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert		.proc_handler	= rps_sock_flow_sysctl
309fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert	},
310fec5e652e58fa6017b2c9e06466cb2a6538de5b4Tom Herbert#endif
31199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn#ifdef CONFIG_NET_FLOW_LIMIT
31299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	{
31399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.procname	= "flow_limit_cpu_bitmap",
31499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.mode		= 0644,
31599bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.proc_handler	= flow_limit_cpu_sysctl
31699bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	},
31799bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	{
31899bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.procname	= "flow_limit_table_len",
31999bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.data		= &netdev_flow_limit_table_len,
32099bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.maxlen		= sizeof(int),
32199bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.mode		= 0644,
32299bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn		.proc_handler	= flow_limit_table_len_sysctl
32399bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn	},
32499bbc70741903c063b3ccad90a3e06fc55df9245Willem de Bruijn#endif /* CONFIG_NET_FLOW_LIMIT */
325e0d1095ae3405404d247afb00233ef837d58da83Cong Wang#ifdef CONFIG_NET_RX_BUSY_POLL
326060212928670593fb89243640bf05cf89560b023Eliezer Tamir	{
32764b0dc517ea1b35d02565a779e6cb77ae9045685Eliezer Tamir		.procname	= "busy_poll",
32864b0dc517ea1b35d02565a779e6cb77ae9045685Eliezer Tamir		.data		= &sysctl_net_busy_poll,
329eb6db622825b2028df74f490b8c36887cf3c2f50Eliezer Tamir		.maxlen		= sizeof(unsigned int),
330060212928670593fb89243640bf05cf89560b023Eliezer Tamir		.mode		= 0644,
331eb6db622825b2028df74f490b8c36887cf3c2f50Eliezer Tamir		.proc_handler	= proc_dointvec
332060212928670593fb89243640bf05cf89560b023Eliezer Tamir	},
3332d48d67fa8cd129ea85ea02d91b4a793286866f8Eliezer Tamir	{
33464b0dc517ea1b35d02565a779e6cb77ae9045685Eliezer Tamir		.procname	= "busy_read",
33564b0dc517ea1b35d02565a779e6cb77ae9045685Eliezer Tamir		.data		= &sysctl_net_busy_read,
3362d48d67fa8cd129ea85ea02d91b4a793286866f8Eliezer Tamir		.maxlen		= sizeof(unsigned int),
3372d48d67fa8cd129ea85ea02d91b4a793286866f8Eliezer Tamir		.mode		= 0644,
3382d48d67fa8cd129ea85ea02d91b4a793286866f8Eliezer Tamir		.proc_handler	= proc_dointvec
3392d48d67fa8cd129ea85ea02d91b4a793286866f8Eliezer Tamir	},
3406da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger#endif
3416da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger#ifdef CONFIG_NET_SCHED
3426da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	{
3436da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger		.procname	= "default_qdisc",
3446da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger		.mode		= 0644,
3456da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger		.maxlen		= IFNAMSIZ,
3466da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger		.proc_handler	= set_default_qdisc
3476da7c8fcbcbdb50ec68c61b40d554c74850fdb91stephen hemminger	},
348060212928670593fb89243640bf05cf89560b023Eliezer Tamir#endif
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_NET */
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
35151b0bdedb8e784d0d969a6b77151911130812400Stephen Hemminger		.procname	= "netdev_budget",
35251b0bdedb8e784d0d969a6b77151911130812400Stephen Hemminger		.data		= &netdev_budget,
35351b0bdedb8e784d0d969a6b77151911130812400Stephen Hemminger		.maxlen		= sizeof(int),
35451b0bdedb8e784d0d969a6b77151911130812400Stephen Hemminger		.mode		= 0644,
3556d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler	= proc_dointvec
35651b0bdedb8e784d0d969a6b77151911130812400Stephen Hemminger	},
357a2a316fd068c455c609ecc155dcfaa7e208d29feStephen Hemminger	{
358a2a316fd068c455c609ecc155dcfaa7e208d29feStephen Hemminger		.procname	= "warnings",
359a2a316fd068c455c609ecc155dcfaa7e208d29feStephen Hemminger		.data		= &net_msg_warn,
360a2a316fd068c455c609ecc155dcfaa7e208d29feStephen Hemminger		.maxlen		= sizeof(int),
361a2a316fd068c455c609ecc155dcfaa7e208d29feStephen Hemminger		.mode		= 0644,
3626d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler	= proc_dointvec
363a2a316fd068c455c609ecc155dcfaa7e208d29feStephen Hemminger	},
364f8572d8f2a2ba75408b97dc24ef47c83671795d7Eric W. Biederman	{ }
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
36633eb9cfc700ae9ce621d47d6ca6d6b4ad7cd97f3Pavel Emelyanov
367d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanovstatic struct ctl_table netns_core_table[] = {
368d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov	{
369d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov		.procname	= "somaxconn",
370d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov		.data		= &init_net.core.sysctl_somaxconn,
371d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov		.maxlen		= sizeof(int),
372d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov		.mode		= 0644,
3735f671d6b4ec3e6d66c2a868738af2cdea09e7509Roman Gushchin		.extra1		= &zero,
3745f671d6b4ec3e6d66c2a868738af2cdea09e7509Roman Gushchin		.extra2		= &ushort_max,
3755f671d6b4ec3e6d66c2a868738af2cdea09e7509Roman Gushchin		.proc_handler	= proc_dointvec_minmax
376d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov	},
377f8572d8f2a2ba75408b97dc24ef47c83671795d7Eric W. Biederman	{ }
378d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov};
379d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov
380024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanovstatic __net_init int sysctl_core_net_init(struct net *net)
38133eb9cfc700ae9ce621d47d6ca6d6b4ad7cd97f3Pavel Emelyanov{
382d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov	struct ctl_table *tbl;
383024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
3848efa6e93cb2666dceafc4844057fdcb9aa324fb7Pavel Emelyanov	net->core.sysctl_somaxconn = SOMAXCONN;
385b8e1f9b5c37e77cc8f978a58859b35fe5edd5542Pavel Emelyanov
386d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov	tbl = netns_core_table;
38709ad9bc752519cc167d0a573e1acf69b5c707c67Octavian Purdila	if (!net_eq(net, &init_net)) {
388d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov		tbl = kmemdup(tbl, sizeof(netns_core_table), GFP_KERNEL);
389024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov		if (tbl == NULL)
390024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov			goto err_dup;
391024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
392d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov		tbl[0].data = &net->core.sysctl_somaxconn;
393464dc801c76aa0db88e16e8f5f47c6879858b9b2Eric W. Biederman
394464dc801c76aa0db88e16e8f5f47c6879858b9b2Eric W. Biederman		/* Don't export any sysctls to unprivileged users */
395464dc801c76aa0db88e16e8f5f47c6879858b9b2Eric W. Biederman		if (net->user_ns != &init_user_ns) {
396464dc801c76aa0db88e16e8f5f47c6879858b9b2Eric W. Biederman			tbl[0].procname = NULL;
397464dc801c76aa0db88e16e8f5f47c6879858b9b2Eric W. Biederman		}
398024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	}
399024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
400ec8f23ce0f4005b74013d4d122e0d540397a93c9Eric W. Biederman	net->core.sysctl_hdr = register_net_sysctl(net, "net/core", tbl);
4018efa6e93cb2666dceafc4844057fdcb9aa324fb7Pavel Emelyanov	if (net->core.sysctl_hdr == NULL)
402024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov		goto err_reg;
40333eb9cfc700ae9ce621d47d6ca6d6b4ad7cd97f3Pavel Emelyanov
404024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	return 0;
405024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
406024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanoverr_reg:
407d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov	if (tbl != netns_core_table)
408024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov		kfree(tbl);
409024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanoverr_dup:
410024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	return -ENOMEM;
411024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov}
412024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
413024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanovstatic __net_exit void sysctl_core_net_exit(struct net *net)
414024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov{
415024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	struct ctl_table *tbl;
416024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
4178efa6e93cb2666dceafc4844057fdcb9aa324fb7Pavel Emelyanov	tbl = net->core.sysctl_hdr->ctl_table_arg;
4188efa6e93cb2666dceafc4844057fdcb9aa324fb7Pavel Emelyanov	unregister_net_sysctl_table(net->core.sysctl_hdr);
419d5a4502e9efa534212484fd691339f6469cf95ffPavel Emelyanov	BUG_ON(tbl == netns_core_table);
420024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	kfree(tbl);
421024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov}
422024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
423024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanovstatic __net_initdata struct pernet_operations sysctl_core_ops = {
424024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	.init = sysctl_core_net_init,
425024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	.exit = sysctl_core_net_exit,
426024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov};
427024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov
428024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanovstatic __init int sysctl_core_init(void)
429024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov{
4304344475797a16ef948385780943f7a5cf09f0675Eric W. Biederman	register_net_sysctl(&init_net, "net/core", net_core_table);
431024626e36d75fc8c6e32d50d4c68bfc3b8df5fdfPavel Emelyanov	return register_pernet_subsys(&sysctl_core_ops);
43233eb9cfc700ae9ce621d47d6ca6d6b4ad7cd97f3Pavel Emelyanov}
43333eb9cfc700ae9ce621d47d6ca6d6b4ad7cd97f3Pavel Emelyanov
434b27aeadb5948d400df83db4d29590fb9862ba49dAlexey Dobriyanfs_initcall(sysctl_core_init);
435