xref: /openbmc/linux/net/sctp/sysctl.c (revision 22a1f514)
160c778b2SVlad Yasevich /* SCTP kernel implementation
21da177e4SLinus Torvalds  * (C) Copyright IBM Corp. 2002, 2004
31da177e4SLinus Torvalds  * Copyright (c) 2002 Intel Corp.
41da177e4SLinus Torvalds  *
560c778b2SVlad Yasevich  * This file is part of the SCTP kernel implementation
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * Sysctl related interfaces for SCTP.
81da177e4SLinus Torvalds  *
960c778b2SVlad Yasevich  * This SCTP implementation is free software;
101da177e4SLinus Torvalds  * you can redistribute it and/or modify it under the terms of
111da177e4SLinus Torvalds  * the GNU General Public License as published by
121da177e4SLinus Torvalds  * the Free Software Foundation; either version 2, or (at your option)
131da177e4SLinus Torvalds  * any later version.
141da177e4SLinus Torvalds  *
1560c778b2SVlad Yasevich  * This SCTP implementation is distributed in the hope that it
161da177e4SLinus Torvalds  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
171da177e4SLinus Torvalds  *                 ************************
181da177e4SLinus Torvalds  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
191da177e4SLinus Torvalds  * See the GNU General Public License for more details.
201da177e4SLinus Torvalds  *
211da177e4SLinus Torvalds  * You should have received a copy of the GNU General Public License
224b2f13a2SJeff Kirsher  * along with GNU CC; see the file COPYING.  If not, see
234b2f13a2SJeff Kirsher  * <http://www.gnu.org/licenses/>.
241da177e4SLinus Torvalds  *
251da177e4SLinus Torvalds  * Please send any bug reports or fixes you make to the
261da177e4SLinus Torvalds  * email address(es):
2791705c61SDaniel Borkmann  *    lksctp developers <linux-sctp@vger.kernel.org>
281da177e4SLinus Torvalds  *
291da177e4SLinus Torvalds  * Written or modified by:
301da177e4SLinus Torvalds  *    Mingqin Liu           <liuming@us.ibm.com>
311da177e4SLinus Torvalds  *    Jon Grimm             <jgrimm@us.ibm.com>
321da177e4SLinus Torvalds  *    Ardelle Fan           <ardelle.fan@intel.com>
331da177e4SLinus Torvalds  *    Ryan Layer            <rmlayer@us.ibm.com>
341da177e4SLinus Torvalds  *    Sridhar Samudrala     <sri@us.ibm.com>
351da177e4SLinus Torvalds  */
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds #include <net/sctp/structs.h>
388c5955d8SAdrian Bunk #include <net/sctp/sctp.h>
391da177e4SLinus Torvalds #include <linux/sysctl.h>
401da177e4SLinus Torvalds 
413fd091e7SVladislav Yasevich static int zero = 0;
423fd091e7SVladislav Yasevich static int one = 1;
433fd091e7SVladislav Yasevich static int timer_max = 86400000; /* ms in one day */
443fd091e7SVladislav Yasevich static int int_max = INT_MAX;
45d48e074dSJean-Mickael Guerin static int sack_timer_min = 1;
46d48e074dSJean-Mickael Guerin static int sack_timer_max = 500;
4772388433SBhaskar Dutta static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */
4890f2f531SVlad Yasevich static int rwnd_scale_max = 16;
492692ba61SXi Wang static unsigned long max_autoclose_min = 0;
502692ba61SXi Wang static unsigned long max_autoclose_max =
512692ba61SXi Wang 	(MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX)
522692ba61SXi Wang 	? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ;
531da177e4SLinus Torvalds 
548d987e5cSEric Dumazet extern long sysctl_sctp_mem[3];
55007e3936SVlad Yasevich extern int sysctl_sctp_rmem[3];
56007e3936SVlad Yasevich extern int sysctl_sctp_wmem[3];
574d93df0aSNeil Horman 
58b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
593c68198eSNeil Horman 				void __user *buffer, size_t *lenp,
603c68198eSNeil Horman 				loff_t *ppos);
614f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
624f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
634f3fdf3bSwangweidong 				loff_t *ppos);
644f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
654f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
664f3fdf3bSwangweidong 				loff_t *ppos);
674f3fdf3bSwangweidong 
68fe2c6338SJoe Perches static struct ctl_table sctp_table[] = {
691da177e4SLinus Torvalds 	{
704d93df0aSNeil Horman 		.procname	= "sctp_mem",
714d93df0aSNeil Horman 		.data		= &sysctl_sctp_mem,
724d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_mem),
734d93df0aSNeil Horman 		.mode		= 0644,
748d987e5cSEric Dumazet 		.proc_handler	= proc_doulongvec_minmax
754d93df0aSNeil Horman 	},
764d93df0aSNeil Horman 	{
774d93df0aSNeil Horman 		.procname	= "sctp_rmem",
784d93df0aSNeil Horman 		.data		= &sysctl_sctp_rmem,
794d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_rmem),
804d93df0aSNeil Horman 		.mode		= 0644,
816d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
824d93df0aSNeil Horman 	},
834d93df0aSNeil Horman 	{
844d93df0aSNeil Horman 		.procname	= "sctp_wmem",
854d93df0aSNeil Horman 		.data		= &sysctl_sctp_wmem,
864d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_wmem),
874d93df0aSNeil Horman 		.mode		= 0644,
886d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
894d93df0aSNeil Horman 	},
90e1fc3b14SEric W. Biederman 
91e1fc3b14SEric W. Biederman 	{ /* sentinel */ }
92e1fc3b14SEric W. Biederman };
93e1fc3b14SEric W. Biederman 
94fe2c6338SJoe Perches static struct ctl_table sctp_net_table[] = {
95a29a5bd4SVlad Yasevich 	{
96e1fc3b14SEric W. Biederman 		.procname	= "rto_initial",
97e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_initial,
98e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
99e1fc3b14SEric W. Biederman 		.mode		= 0644,
100e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
101e1fc3b14SEric W. Biederman 		.extra1         = &one,
102e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
103e1fc3b14SEric W. Biederman 	},
104e1fc3b14SEric W. Biederman 	{
105e1fc3b14SEric W. Biederman 		.procname	= "rto_min",
106e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_min,
107e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
108e1fc3b14SEric W. Biederman 		.mode		= 0644,
1094f3fdf3bSwangweidong 		.proc_handler	= proc_sctp_do_rto_min,
110e1fc3b14SEric W. Biederman 		.extra1         = &one,
1114f3fdf3bSwangweidong 		.extra2         = &init_net.sctp.rto_max
112e1fc3b14SEric W. Biederman 	},
113e1fc3b14SEric W. Biederman 	{
114e1fc3b14SEric W. Biederman 		.procname	= "rto_max",
115e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_max,
116e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
117e1fc3b14SEric W. Biederman 		.mode		= 0644,
1184f3fdf3bSwangweidong 		.proc_handler	= proc_sctp_do_rto_max,
1194f3fdf3bSwangweidong 		.extra1         = &init_net.sctp.rto_min,
120e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
121e1fc3b14SEric W. Biederman 	},
122e1fc3b14SEric W. Biederman 	{
123e1fc3b14SEric W. Biederman 		.procname	= "rto_alpha_exp_divisor",
124e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_alpha,
125e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
126e1fc3b14SEric W. Biederman 		.mode		= 0444,
127e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
128e1fc3b14SEric W. Biederman 	},
129e1fc3b14SEric W. Biederman 	{
130e1fc3b14SEric W. Biederman 		.procname	= "rto_beta_exp_divisor",
131e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_beta,
132e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
133e1fc3b14SEric W. Biederman 		.mode		= 0444,
134e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
135e1fc3b14SEric W. Biederman 	},
136e1fc3b14SEric W. Biederman 	{
137e1fc3b14SEric W. Biederman 		.procname	= "max_burst",
138e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_burst,
139e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
140e1fc3b14SEric W. Biederman 		.mode		= 0644,
141e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
142e1fc3b14SEric W. Biederman 		.extra1		= &zero,
143e1fc3b14SEric W. Biederman 		.extra2		= &int_max
144e1fc3b14SEric W. Biederman 	},
145e1fc3b14SEric W. Biederman 	{
146e1fc3b14SEric W. Biederman 		.procname	= "cookie_preserve_enable",
147e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.cookie_preserve_enable,
148e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
149e1fc3b14SEric W. Biederman 		.mode		= 0644,
150e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
151e1fc3b14SEric W. Biederman 	},
152e1fc3b14SEric W. Biederman 	{
1533c68198eSNeil Horman 		.procname	= "cookie_hmac_alg",
15422a1f514Swangweidong 		.data		= &init_net.sctp.sctp_hmac_alg,
1553c68198eSNeil Horman 		.maxlen		= 8,
1563c68198eSNeil Horman 		.mode		= 0644,
1573c68198eSNeil Horman 		.proc_handler	= proc_sctp_do_hmac_alg,
1583c68198eSNeil Horman 	},
1593c68198eSNeil Horman 	{
160e1fc3b14SEric W. Biederman 		.procname	= "valid_cookie_life",
161e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.valid_cookie_life,
162e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
163e1fc3b14SEric W. Biederman 		.mode		= 0644,
164e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
165e1fc3b14SEric W. Biederman 		.extra1         = &one,
166e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
167e1fc3b14SEric W. Biederman 	},
168e1fc3b14SEric W. Biederman 	{
169e1fc3b14SEric W. Biederman 		.procname	= "sack_timeout",
170e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.sack_timeout,
171e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
172e1fc3b14SEric W. Biederman 		.mode		= 0644,
173e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
174e1fc3b14SEric W. Biederman 		.extra1         = &sack_timer_min,
175e1fc3b14SEric W. Biederman 		.extra2         = &sack_timer_max,
176e1fc3b14SEric W. Biederman 	},
177e1fc3b14SEric W. Biederman 	{
178e1fc3b14SEric W. Biederman 		.procname	= "hb_interval",
179e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.hb_interval,
180e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
181e1fc3b14SEric W. Biederman 		.mode		= 0644,
182e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
183e1fc3b14SEric W. Biederman 		.extra1         = &one,
184e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
185e1fc3b14SEric W. Biederman 	},
186e1fc3b14SEric W. Biederman 	{
187e1fc3b14SEric W. Biederman 		.procname	= "association_max_retrans",
188e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_retrans_association,
189e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
190e1fc3b14SEric W. Biederman 		.mode		= 0644,
191e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
192e1fc3b14SEric W. Biederman 		.extra1		= &one,
193e1fc3b14SEric W. Biederman 		.extra2		= &int_max
194e1fc3b14SEric W. Biederman 	},
195e1fc3b14SEric W. Biederman 	{
196e1fc3b14SEric W. Biederman 		.procname	= "path_max_retrans",
197e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_retrans_path,
198e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
199e1fc3b14SEric W. Biederman 		.mode		= 0644,
200e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
201e1fc3b14SEric W. Biederman 		.extra1		= &one,
202e1fc3b14SEric W. Biederman 		.extra2		= &int_max
203e1fc3b14SEric W. Biederman 	},
204e1fc3b14SEric W. Biederman 	{
205e1fc3b14SEric W. Biederman 		.procname	= "max_init_retransmits",
206e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_retrans_init,
207e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
208e1fc3b14SEric W. Biederman 		.mode		= 0644,
209e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
210e1fc3b14SEric W. Biederman 		.extra1		= &one,
211e1fc3b14SEric W. Biederman 		.extra2		= &int_max
212e1fc3b14SEric W. Biederman 	},
213e1fc3b14SEric W. Biederman 	{
214e1fc3b14SEric W. Biederman 		.procname	= "pf_retrans",
215e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.pf_retrans,
216e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
217e1fc3b14SEric W. Biederman 		.mode		= 0644,
218e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
219e1fc3b14SEric W. Biederman 		.extra1		= &zero,
220e1fc3b14SEric W. Biederman 		.extra2		= &int_max
221e1fc3b14SEric W. Biederman 	},
222e1fc3b14SEric W. Biederman 	{
223e1fc3b14SEric W. Biederman 		.procname	= "sndbuf_policy",
224e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.sndbuf_policy,
225e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
226e1fc3b14SEric W. Biederman 		.mode		= 0644,
227e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
228e1fc3b14SEric W. Biederman 	},
229e1fc3b14SEric W. Biederman 	{
230e1fc3b14SEric W. Biederman 		.procname	= "rcvbuf_policy",
231e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rcvbuf_policy,
232e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
233e1fc3b14SEric W. Biederman 		.mode		= 0644,
234e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
235e1fc3b14SEric W. Biederman 	},
236e1fc3b14SEric W. Biederman 	{
237e1fc3b14SEric W. Biederman 		.procname	= "default_auto_asconf",
238e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.default_auto_asconf,
239e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
240e1fc3b14SEric W. Biederman 		.mode		= 0644,
241e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
242e1fc3b14SEric W. Biederman 	},
243e1fc3b14SEric W. Biederman 	{
244e1fc3b14SEric W. Biederman 		.procname	= "addip_enable",
245e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.addip_enable,
246a29a5bd4SVlad Yasevich 		.maxlen		= sizeof(int),
247a29a5bd4SVlad Yasevich 		.mode		= 0644,
2486d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
249a29a5bd4SVlad Yasevich 	},
25073d9c4fdSVlad Yasevich 	{
25173d9c4fdSVlad Yasevich 		.procname	= "addip_noauth_enable",
252e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.addip_noauth,
253e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
254e1fc3b14SEric W. Biederman 		.mode		= 0644,
255e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
256e1fc3b14SEric W. Biederman 	},
257e1fc3b14SEric W. Biederman 	{
258e1fc3b14SEric W. Biederman 		.procname	= "prsctp_enable",
259e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.prsctp_enable,
260e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
261e1fc3b14SEric W. Biederman 		.mode		= 0644,
262e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
263e1fc3b14SEric W. Biederman 	},
264e1fc3b14SEric W. Biederman 	{
265e1fc3b14SEric W. Biederman 		.procname	= "auth_enable",
266e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.auth_enable,
26773d9c4fdSVlad Yasevich 		.maxlen		= sizeof(int),
26873d9c4fdSVlad Yasevich 		.mode		= 0644,
2696d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
27073d9c4fdSVlad Yasevich 	},
27172388433SBhaskar Dutta 	{
27272388433SBhaskar Dutta 		.procname	= "addr_scope_policy",
273e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.scope_policy,
27472388433SBhaskar Dutta 		.maxlen		= sizeof(int),
27572388433SBhaskar Dutta 		.mode		= 0644,
2766d456111SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
27772388433SBhaskar Dutta 		.extra1		= &zero,
27872388433SBhaskar Dutta 		.extra2		= &addr_scope_max,
27972388433SBhaskar Dutta 	},
28090f2f531SVlad Yasevich 	{
28190f2f531SVlad Yasevich 		.procname	= "rwnd_update_shift",
282e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rwnd_upd_shift,
28390f2f531SVlad Yasevich 		.maxlen		= sizeof(int),
28490f2f531SVlad Yasevich 		.mode		= 0644,
28590f2f531SVlad Yasevich 		.proc_handler	= &proc_dointvec_minmax,
28690f2f531SVlad Yasevich 		.extra1		= &one,
28790f2f531SVlad Yasevich 		.extra2		= &rwnd_scale_max,
28890f2f531SVlad Yasevich 	},
2892692ba61SXi Wang 	{
2902692ba61SXi Wang 		.procname	= "max_autoclose",
291e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_autoclose,
2922692ba61SXi Wang 		.maxlen		= sizeof(unsigned long),
2932692ba61SXi Wang 		.mode		= 0644,
2942692ba61SXi Wang 		.proc_handler	= &proc_doulongvec_minmax,
2952692ba61SXi Wang 		.extra1		= &max_autoclose_min,
2962692ba61SXi Wang 		.extra2		= &max_autoclose_max,
2972692ba61SXi Wang 	},
29871acc0ddSDavid S. Miller 
299d7fc02c7SLinus Torvalds 	{ /* sentinel */ }
3001da177e4SLinus Torvalds };
3011da177e4SLinus Torvalds 
302b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
3033c68198eSNeil Horman 				void __user *buffer, size_t *lenp,
3043c68198eSNeil Horman 				loff_t *ppos)
3053c68198eSNeil Horman {
3063c68198eSNeil Horman 	struct net *net = current->nsproxy->net_ns;
3073c68198eSNeil Horman 	char tmp[8];
308fe2c6338SJoe Perches 	struct ctl_table tbl;
3093c68198eSNeil Horman 	int ret;
3103c68198eSNeil Horman 	int changed = 0;
3113c68198eSNeil Horman 	char *none = "none";
3123c68198eSNeil Horman 
3133c68198eSNeil Horman 	memset(&tbl, 0, sizeof(struct ctl_table));
3143c68198eSNeil Horman 
3153c68198eSNeil Horman 	if (write) {
3163c68198eSNeil Horman 		tbl.data = tmp;
3173c68198eSNeil Horman 		tbl.maxlen = 8;
3183c68198eSNeil Horman 	} else {
3193c68198eSNeil Horman 		tbl.data = net->sctp.sctp_hmac_alg ? : none;
3203c68198eSNeil Horman 		tbl.maxlen = strlen(tbl.data);
3213c68198eSNeil Horman 	}
3223c68198eSNeil Horman 		ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
3233c68198eSNeil Horman 
3243c68198eSNeil Horman 	if (write) {
3253c68198eSNeil Horman #ifdef CONFIG_CRYPTO_MD5
3263c68198eSNeil Horman 		if (!strncmp(tmp, "md5", 3)) {
3273c68198eSNeil Horman 			net->sctp.sctp_hmac_alg = "md5";
3283c68198eSNeil Horman 			changed = 1;
3293c68198eSNeil Horman 		}
3303c68198eSNeil Horman #endif
3313c68198eSNeil Horman #ifdef CONFIG_CRYPTO_SHA1
3323c68198eSNeil Horman 		if (!strncmp(tmp, "sha1", 4)) {
3333c68198eSNeil Horman 			net->sctp.sctp_hmac_alg = "sha1";
3343c68198eSNeil Horman 			changed = 1;
3353c68198eSNeil Horman 		}
3363c68198eSNeil Horman #endif
3373c68198eSNeil Horman 		if (!strncmp(tmp, "none", 4)) {
3383c68198eSNeil Horman 			net->sctp.sctp_hmac_alg = NULL;
3393c68198eSNeil Horman 			changed = 1;
3403c68198eSNeil Horman 		}
3413c68198eSNeil Horman 
3423c68198eSNeil Horman 		if (!changed)
3433c68198eSNeil Horman 			ret = -EINVAL;
3443c68198eSNeil Horman 	}
3453c68198eSNeil Horman 
3463c68198eSNeil Horman 	return ret;
3473c68198eSNeil Horman }
3483c68198eSNeil Horman 
3494f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
3504f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
3514f3fdf3bSwangweidong 				loff_t *ppos)
3524f3fdf3bSwangweidong {
3534f3fdf3bSwangweidong 	struct net *net = current->nsproxy->net_ns;
3544f3fdf3bSwangweidong 	int new_value;
3554f3fdf3bSwangweidong 	struct ctl_table tbl;
3564f3fdf3bSwangweidong 	unsigned int min = *(unsigned int *) ctl->extra1;
3574f3fdf3bSwangweidong 	unsigned int max = *(unsigned int *) ctl->extra2;
3584f3fdf3bSwangweidong 	int ret;
3594f3fdf3bSwangweidong 
3604f3fdf3bSwangweidong 	memset(&tbl, 0, sizeof(struct ctl_table));
3614f3fdf3bSwangweidong 	tbl.maxlen = sizeof(unsigned int);
3624f3fdf3bSwangweidong 
3634f3fdf3bSwangweidong 	if (write)
3644f3fdf3bSwangweidong 		tbl.data = &new_value;
3654f3fdf3bSwangweidong 	else
3664f3fdf3bSwangweidong 		tbl.data = &net->sctp.rto_min;
3674f3fdf3bSwangweidong 	ret = proc_dointvec(&tbl, write, buffer, lenp, ppos);
3684f3fdf3bSwangweidong 	if (write) {
3694f3fdf3bSwangweidong 		if (ret || new_value > max || new_value < min)
3704f3fdf3bSwangweidong 			return -EINVAL;
3714f3fdf3bSwangweidong 		net->sctp.rto_min = new_value;
3724f3fdf3bSwangweidong 	}
3734f3fdf3bSwangweidong 	return ret;
3744f3fdf3bSwangweidong }
3754f3fdf3bSwangweidong 
3764f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
3774f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
3784f3fdf3bSwangweidong 				loff_t *ppos)
3794f3fdf3bSwangweidong {
3804f3fdf3bSwangweidong 	struct net *net = current->nsproxy->net_ns;
3814f3fdf3bSwangweidong 	int new_value;
3824f3fdf3bSwangweidong 	struct ctl_table tbl;
3834f3fdf3bSwangweidong 	unsigned int min = *(unsigned int *) ctl->extra1;
3844f3fdf3bSwangweidong 	unsigned int max = *(unsigned int *) ctl->extra2;
3854f3fdf3bSwangweidong 	int ret;
3864f3fdf3bSwangweidong 
3874f3fdf3bSwangweidong 	memset(&tbl, 0, sizeof(struct ctl_table));
3884f3fdf3bSwangweidong 	tbl.maxlen = sizeof(unsigned int);
3894f3fdf3bSwangweidong 
3904f3fdf3bSwangweidong 	if (write)
3914f3fdf3bSwangweidong 		tbl.data = &new_value;
3924f3fdf3bSwangweidong 	else
3934f3fdf3bSwangweidong 		tbl.data = &net->sctp.rto_max;
3944f3fdf3bSwangweidong 	ret = proc_dointvec(&tbl, write, buffer, lenp, ppos);
3954f3fdf3bSwangweidong 	if (write) {
3964f3fdf3bSwangweidong 		if (ret || new_value > max || new_value < min)
3974f3fdf3bSwangweidong 			return -EINVAL;
3984f3fdf3bSwangweidong 		net->sctp.rto_max = new_value;
3994f3fdf3bSwangweidong 	}
4004f3fdf3bSwangweidong 	return ret;
4014f3fdf3bSwangweidong }
4024f3fdf3bSwangweidong 
403ebb7e95dSEric W. Biederman int sctp_sysctl_net_register(struct net *net)
404ebb7e95dSEric W. Biederman {
405ebb7e95dSEric W. Biederman 	struct ctl_table *table;
406e1fc3b14SEric W. Biederman 	int i;
407ebb7e95dSEric W. Biederman 
408ebb7e95dSEric W. Biederman 	table = kmemdup(sctp_net_table, sizeof(sctp_net_table), GFP_KERNEL);
409ebb7e95dSEric W. Biederman 	if (!table)
410ebb7e95dSEric W. Biederman 		return -ENOMEM;
411ebb7e95dSEric W. Biederman 
412e1fc3b14SEric W. Biederman 	for (i = 0; table[i].data; i++)
413e1fc3b14SEric W. Biederman 		table[i].data += (char *)(&net->sctp) - (char *)&init_net.sctp;
414e1fc3b14SEric W. Biederman 
415ebb7e95dSEric W. Biederman 	net->sctp.sysctl_header = register_net_sysctl(net, "net/sctp", table);
416ebb7e95dSEric W. Biederman 	return 0;
417ebb7e95dSEric W. Biederman }
418ebb7e95dSEric W. Biederman 
419ebb7e95dSEric W. Biederman void sctp_sysctl_net_unregister(struct net *net)
420ebb7e95dSEric W. Biederman {
4215f19d121SVlad Yasevich 	struct ctl_table *table;
4225f19d121SVlad Yasevich 
4235f19d121SVlad Yasevich 	table = net->sctp.sysctl_header->ctl_table_arg;
424ebb7e95dSEric W. Biederman 	unregister_net_sysctl_table(net->sctp.sysctl_header);
4255f19d121SVlad Yasevich 	kfree(table);
426ebb7e95dSEric W. Biederman }
427ebb7e95dSEric W. Biederman 
4281da177e4SLinus Torvalds static struct ctl_table_header *sctp_sysctl_header;
4291da177e4SLinus Torvalds 
4301da177e4SLinus Torvalds /* Sysctl registration.  */
4311da177e4SLinus Torvalds void sctp_sysctl_register(void)
4321da177e4SLinus Torvalds {
433ec8f23ceSEric W. Biederman 	sctp_sysctl_header = register_net_sysctl(&init_net, "net/sctp", sctp_table);
4341da177e4SLinus Torvalds }
4351da177e4SLinus Torvalds 
4361da177e4SLinus Torvalds /* Sysctl deregistration.  */
4371da177e4SLinus Torvalds void sctp_sysctl_unregister(void)
4381da177e4SLinus Torvalds {
4395dd3df10SEric W. Biederman 	unregister_net_sysctl_table(sctp_sysctl_header);
4401da177e4SLinus Torvalds }
441