xref: /openbmc/linux/net/sctp/sysctl.c (revision ff5e92c1)
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 
37b58537a1SDaniel Borkmann #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
38b58537a1SDaniel Borkmann 
391da177e4SLinus Torvalds #include <net/sctp/structs.h>
408c5955d8SAdrian Bunk #include <net/sctp/sctp.h>
411da177e4SLinus Torvalds #include <linux/sysctl.h>
421da177e4SLinus Torvalds 
433fd091e7SVladislav Yasevich static int zero = 0;
443fd091e7SVladislav Yasevich static int one = 1;
453fd091e7SVladislav Yasevich static int timer_max = 86400000; /* ms in one day */
463fd091e7SVladislav Yasevich static int int_max = INT_MAX;
47d48e074dSJean-Mickael Guerin static int sack_timer_min = 1;
48d48e074dSJean-Mickael Guerin static int sack_timer_max = 500;
4972388433SBhaskar Dutta static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */
5090f2f531SVlad Yasevich static int rwnd_scale_max = 16;
51b58537a1SDaniel Borkmann static int rto_alpha_min = 0;
52b58537a1SDaniel Borkmann static int rto_beta_min = 0;
53b58537a1SDaniel Borkmann static int rto_alpha_max = 1000;
54b58537a1SDaniel Borkmann static int rto_beta_max = 1000;
55b58537a1SDaniel Borkmann 
562692ba61SXi Wang static unsigned long max_autoclose_min = 0;
572692ba61SXi Wang static unsigned long max_autoclose_max =
582692ba61SXi Wang 	(MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX)
592692ba61SXi Wang 	? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ;
601da177e4SLinus Torvalds 
618d987e5cSEric Dumazet extern long sysctl_sctp_mem[3];
62007e3936SVlad Yasevich extern int sysctl_sctp_rmem[3];
63007e3936SVlad Yasevich extern int sysctl_sctp_wmem[3];
644d93df0aSNeil Horman 
65b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
663c68198eSNeil Horman 				void __user *buffer, size_t *lenp,
673c68198eSNeil Horman 				loff_t *ppos);
684f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
694f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
704f3fdf3bSwangweidong 				loff_t *ppos);
714f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
724f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
734f3fdf3bSwangweidong 				loff_t *ppos);
74b58537a1SDaniel Borkmann static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write,
75b58537a1SDaniel Borkmann 				   void __user *buffer, size_t *lenp,
76b58537a1SDaniel Borkmann 				   loff_t *ppos);
77b14878ccSVlad Yasevich static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
78b14878ccSVlad Yasevich 			     void __user *buffer, size_t *lenp,
79b14878ccSVlad Yasevich 			     loff_t *ppos);
804f3fdf3bSwangweidong 
81fe2c6338SJoe Perches static struct ctl_table sctp_table[] = {
821da177e4SLinus Torvalds 	{
834d93df0aSNeil Horman 		.procname	= "sctp_mem",
844d93df0aSNeil Horman 		.data		= &sysctl_sctp_mem,
854d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_mem),
864d93df0aSNeil Horman 		.mode		= 0644,
878d987e5cSEric Dumazet 		.proc_handler	= proc_doulongvec_minmax
884d93df0aSNeil Horman 	},
894d93df0aSNeil Horman 	{
904d93df0aSNeil Horman 		.procname	= "sctp_rmem",
914d93df0aSNeil Horman 		.data		= &sysctl_sctp_rmem,
924d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_rmem),
934d93df0aSNeil Horman 		.mode		= 0644,
946d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
954d93df0aSNeil Horman 	},
964d93df0aSNeil Horman 	{
974d93df0aSNeil Horman 		.procname	= "sctp_wmem",
984d93df0aSNeil Horman 		.data		= &sysctl_sctp_wmem,
994d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_wmem),
1004d93df0aSNeil Horman 		.mode		= 0644,
1016d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
1024d93df0aSNeil Horman 	},
103e1fc3b14SEric W. Biederman 
104e1fc3b14SEric W. Biederman 	{ /* sentinel */ }
105e1fc3b14SEric W. Biederman };
106e1fc3b14SEric W. Biederman 
107fe2c6338SJoe Perches static struct ctl_table sctp_net_table[] = {
108a29a5bd4SVlad Yasevich 	{
109e1fc3b14SEric W. Biederman 		.procname	= "rto_initial",
110e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_initial,
111e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
112e1fc3b14SEric W. Biederman 		.mode		= 0644,
113e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
114e1fc3b14SEric W. Biederman 		.extra1         = &one,
115e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
116e1fc3b14SEric W. Biederman 	},
117e1fc3b14SEric W. Biederman 	{
118e1fc3b14SEric W. Biederman 		.procname	= "rto_min",
119e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_min,
120e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
121e1fc3b14SEric W. Biederman 		.mode		= 0644,
1224f3fdf3bSwangweidong 		.proc_handler	= proc_sctp_do_rto_min,
123e1fc3b14SEric W. Biederman 		.extra1         = &one,
1244f3fdf3bSwangweidong 		.extra2         = &init_net.sctp.rto_max
125e1fc3b14SEric W. Biederman 	},
126e1fc3b14SEric W. Biederman 	{
127e1fc3b14SEric W. Biederman 		.procname	= "rto_max",
128e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_max,
129e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
130e1fc3b14SEric W. Biederman 		.mode		= 0644,
1314f3fdf3bSwangweidong 		.proc_handler	= proc_sctp_do_rto_max,
1324f3fdf3bSwangweidong 		.extra1         = &init_net.sctp.rto_min,
133e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
134e1fc3b14SEric W. Biederman 	},
135e1fc3b14SEric W. Biederman 	{
136e1fc3b14SEric W. Biederman 		.procname	= "rto_alpha_exp_divisor",
137e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_alpha,
138e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
139b58537a1SDaniel Borkmann 		.mode		= 0644,
140b58537a1SDaniel Borkmann 		.proc_handler	= proc_sctp_do_alpha_beta,
141b58537a1SDaniel Borkmann 		.extra1		= &rto_alpha_min,
142b58537a1SDaniel Borkmann 		.extra2		= &rto_alpha_max,
143e1fc3b14SEric W. Biederman 	},
144e1fc3b14SEric W. Biederman 	{
145e1fc3b14SEric W. Biederman 		.procname	= "rto_beta_exp_divisor",
146e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rto_beta,
147e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
148b58537a1SDaniel Borkmann 		.mode		= 0644,
149b58537a1SDaniel Borkmann 		.proc_handler	= proc_sctp_do_alpha_beta,
150b58537a1SDaniel Borkmann 		.extra1		= &rto_beta_min,
151b58537a1SDaniel Borkmann 		.extra2		= &rto_beta_max,
152e1fc3b14SEric W. Biederman 	},
153e1fc3b14SEric W. Biederman 	{
154e1fc3b14SEric W. Biederman 		.procname	= "max_burst",
155e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_burst,
156e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
157e1fc3b14SEric W. Biederman 		.mode		= 0644,
158e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
159e1fc3b14SEric W. Biederman 		.extra1		= &zero,
160e1fc3b14SEric W. Biederman 		.extra2		= &int_max
161e1fc3b14SEric W. Biederman 	},
162e1fc3b14SEric W. Biederman 	{
163e1fc3b14SEric W. Biederman 		.procname	= "cookie_preserve_enable",
164e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.cookie_preserve_enable,
165e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
166e1fc3b14SEric W. Biederman 		.mode		= 0644,
167e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
168e1fc3b14SEric W. Biederman 	},
169e1fc3b14SEric W. Biederman 	{
1703c68198eSNeil Horman 		.procname	= "cookie_hmac_alg",
17122a1f514Swangweidong 		.data		= &init_net.sctp.sctp_hmac_alg,
1723c68198eSNeil Horman 		.maxlen		= 8,
1733c68198eSNeil Horman 		.mode		= 0644,
1743c68198eSNeil Horman 		.proc_handler	= proc_sctp_do_hmac_alg,
1753c68198eSNeil Horman 	},
1763c68198eSNeil Horman 	{
177e1fc3b14SEric W. Biederman 		.procname	= "valid_cookie_life",
178e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.valid_cookie_life,
179e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
180e1fc3b14SEric W. Biederman 		.mode		= 0644,
181e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
182e1fc3b14SEric W. Biederman 		.extra1         = &one,
183e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
184e1fc3b14SEric W. Biederman 	},
185e1fc3b14SEric W. Biederman 	{
186e1fc3b14SEric W. Biederman 		.procname	= "sack_timeout",
187e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.sack_timeout,
188e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
189e1fc3b14SEric W. Biederman 		.mode		= 0644,
190e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
191e1fc3b14SEric W. Biederman 		.extra1         = &sack_timer_min,
192e1fc3b14SEric W. Biederman 		.extra2         = &sack_timer_max,
193e1fc3b14SEric W. Biederman 	},
194e1fc3b14SEric W. Biederman 	{
195e1fc3b14SEric W. Biederman 		.procname	= "hb_interval",
196e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.hb_interval,
197e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(unsigned int),
198e1fc3b14SEric W. Biederman 		.mode		= 0644,
199e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
200e1fc3b14SEric W. Biederman 		.extra1         = &one,
201e1fc3b14SEric W. Biederman 		.extra2         = &timer_max
202e1fc3b14SEric W. Biederman 	},
203e1fc3b14SEric W. Biederman 	{
204e1fc3b14SEric W. Biederman 		.procname	= "association_max_retrans",
205e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_retrans_association,
206e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
207e1fc3b14SEric W. Biederman 		.mode		= 0644,
208e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
209e1fc3b14SEric W. Biederman 		.extra1		= &one,
210e1fc3b14SEric W. Biederman 		.extra2		= &int_max
211e1fc3b14SEric W. Biederman 	},
212e1fc3b14SEric W. Biederman 	{
213e1fc3b14SEric W. Biederman 		.procname	= "path_max_retrans",
214e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_retrans_path,
215e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
216e1fc3b14SEric W. Biederman 		.mode		= 0644,
217e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
218e1fc3b14SEric W. Biederman 		.extra1		= &one,
219e1fc3b14SEric W. Biederman 		.extra2		= &int_max
220e1fc3b14SEric W. Biederman 	},
221e1fc3b14SEric W. Biederman 	{
222e1fc3b14SEric W. Biederman 		.procname	= "max_init_retransmits",
223e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_retrans_init,
224e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
225e1fc3b14SEric W. Biederman 		.mode		= 0644,
226e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
227e1fc3b14SEric W. Biederman 		.extra1		= &one,
228e1fc3b14SEric W. Biederman 		.extra2		= &int_max
229e1fc3b14SEric W. Biederman 	},
230e1fc3b14SEric W. Biederman 	{
231e1fc3b14SEric W. Biederman 		.procname	= "pf_retrans",
232e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.pf_retrans,
233e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
234e1fc3b14SEric W. Biederman 		.mode		= 0644,
235e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
236e1fc3b14SEric W. Biederman 		.extra1		= &zero,
237e1fc3b14SEric W. Biederman 		.extra2		= &int_max
238e1fc3b14SEric W. Biederman 	},
239e1fc3b14SEric W. Biederman 	{
240e1fc3b14SEric W. Biederman 		.procname	= "sndbuf_policy",
241e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.sndbuf_policy,
242e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
243e1fc3b14SEric W. Biederman 		.mode		= 0644,
244e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
245e1fc3b14SEric W. Biederman 	},
246e1fc3b14SEric W. Biederman 	{
247e1fc3b14SEric W. Biederman 		.procname	= "rcvbuf_policy",
248e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rcvbuf_policy,
249e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
250e1fc3b14SEric W. Biederman 		.mode		= 0644,
251e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
252e1fc3b14SEric W. Biederman 	},
253e1fc3b14SEric W. Biederman 	{
254e1fc3b14SEric W. Biederman 		.procname	= "default_auto_asconf",
255e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.default_auto_asconf,
256e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
257e1fc3b14SEric W. Biederman 		.mode		= 0644,
258e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
259e1fc3b14SEric W. Biederman 	},
260e1fc3b14SEric W. Biederman 	{
261e1fc3b14SEric W. Biederman 		.procname	= "addip_enable",
262e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.addip_enable,
263a29a5bd4SVlad Yasevich 		.maxlen		= sizeof(int),
264a29a5bd4SVlad Yasevich 		.mode		= 0644,
2656d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
266a29a5bd4SVlad Yasevich 	},
26773d9c4fdSVlad Yasevich 	{
26873d9c4fdSVlad Yasevich 		.procname	= "addip_noauth_enable",
269e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.addip_noauth,
270e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
271e1fc3b14SEric W. Biederman 		.mode		= 0644,
272e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
273e1fc3b14SEric W. Biederman 	},
274e1fc3b14SEric W. Biederman 	{
275e1fc3b14SEric W. Biederman 		.procname	= "prsctp_enable",
276e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.prsctp_enable,
277e1fc3b14SEric W. Biederman 		.maxlen		= sizeof(int),
278e1fc3b14SEric W. Biederman 		.mode		= 0644,
279e1fc3b14SEric W. Biederman 		.proc_handler	= proc_dointvec,
280e1fc3b14SEric W. Biederman 	},
281e1fc3b14SEric W. Biederman 	{
282e1fc3b14SEric W. Biederman 		.procname	= "auth_enable",
283e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.auth_enable,
28473d9c4fdSVlad Yasevich 		.maxlen		= sizeof(int),
28573d9c4fdSVlad Yasevich 		.mode		= 0644,
286b14878ccSVlad Yasevich 		.proc_handler	= proc_sctp_do_auth,
28773d9c4fdSVlad Yasevich 	},
28872388433SBhaskar Dutta 	{
28972388433SBhaskar Dutta 		.procname	= "addr_scope_policy",
290e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.scope_policy,
29172388433SBhaskar Dutta 		.maxlen		= sizeof(int),
29272388433SBhaskar Dutta 		.mode		= 0644,
2936d456111SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
29472388433SBhaskar Dutta 		.extra1		= &zero,
29572388433SBhaskar Dutta 		.extra2		= &addr_scope_max,
29672388433SBhaskar Dutta 	},
29790f2f531SVlad Yasevich 	{
29890f2f531SVlad Yasevich 		.procname	= "rwnd_update_shift",
299e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.rwnd_upd_shift,
30090f2f531SVlad Yasevich 		.maxlen		= sizeof(int),
30190f2f531SVlad Yasevich 		.mode		= 0644,
30290f2f531SVlad Yasevich 		.proc_handler	= &proc_dointvec_minmax,
30390f2f531SVlad Yasevich 		.extra1		= &one,
30490f2f531SVlad Yasevich 		.extra2		= &rwnd_scale_max,
30590f2f531SVlad Yasevich 	},
3062692ba61SXi Wang 	{
3072692ba61SXi Wang 		.procname	= "max_autoclose",
308e1fc3b14SEric W. Biederman 		.data		= &init_net.sctp.max_autoclose,
3092692ba61SXi Wang 		.maxlen		= sizeof(unsigned long),
3102692ba61SXi Wang 		.mode		= 0644,
3112692ba61SXi Wang 		.proc_handler	= &proc_doulongvec_minmax,
3122692ba61SXi Wang 		.extra1		= &max_autoclose_min,
3132692ba61SXi Wang 		.extra2		= &max_autoclose_max,
3142692ba61SXi Wang 	},
31571acc0ddSDavid S. Miller 
316d7fc02c7SLinus Torvalds 	{ /* sentinel */ }
3171da177e4SLinus Torvalds };
3181da177e4SLinus Torvalds 
319b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
3203c68198eSNeil Horman 				void __user *buffer, size_t *lenp,
3213c68198eSNeil Horman 				loff_t *ppos)
3223c68198eSNeil Horman {
3233c68198eSNeil Horman 	struct net *net = current->nsproxy->net_ns;
324fe2c6338SJoe Perches 	struct ctl_table tbl;
325ff5e92c1SDaniel Borkmann 	bool changed = false;
3263c68198eSNeil Horman 	char *none = "none";
327ff5e92c1SDaniel Borkmann 	char tmp[8];
328ff5e92c1SDaniel Borkmann 	int ret;
3293c68198eSNeil Horman 
3303c68198eSNeil Horman 	memset(&tbl, 0, sizeof(struct ctl_table));
3313c68198eSNeil Horman 
3323c68198eSNeil Horman 	if (write) {
3333c68198eSNeil Horman 		tbl.data = tmp;
334ff5e92c1SDaniel Borkmann 		tbl.maxlen = sizeof(tmp);
3353c68198eSNeil Horman 	} else {
3363c68198eSNeil Horman 		tbl.data = net->sctp.sctp_hmac_alg ? : none;
3373c68198eSNeil Horman 		tbl.maxlen = strlen(tbl.data);
3383c68198eSNeil Horman 	}
3393c68198eSNeil Horman 
340ff5e92c1SDaniel Borkmann 	ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
341ff5e92c1SDaniel Borkmann 	if (write && ret == 0) {
3423c68198eSNeil Horman #ifdef CONFIG_CRYPTO_MD5
3433c68198eSNeil Horman 		if (!strncmp(tmp, "md5", 3)) {
3443c68198eSNeil Horman 			net->sctp.sctp_hmac_alg = "md5";
345ff5e92c1SDaniel Borkmann 			changed = true;
3463c68198eSNeil Horman 		}
3473c68198eSNeil Horman #endif
3483c68198eSNeil Horman #ifdef CONFIG_CRYPTO_SHA1
3493c68198eSNeil Horman 		if (!strncmp(tmp, "sha1", 4)) {
3503c68198eSNeil Horman 			net->sctp.sctp_hmac_alg = "sha1";
351ff5e92c1SDaniel Borkmann 			changed = true;
3523c68198eSNeil Horman 		}
3533c68198eSNeil Horman #endif
3543c68198eSNeil Horman 		if (!strncmp(tmp, "none", 4)) {
3553c68198eSNeil Horman 			net->sctp.sctp_hmac_alg = NULL;
356ff5e92c1SDaniel Borkmann 			changed = true;
3573c68198eSNeil Horman 		}
3583c68198eSNeil Horman 		if (!changed)
3593c68198eSNeil Horman 			ret = -EINVAL;
3603c68198eSNeil Horman 	}
3613c68198eSNeil Horman 
3623c68198eSNeil Horman 	return ret;
3633c68198eSNeil Horman }
3643c68198eSNeil Horman 
3654f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
3664f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
3674f3fdf3bSwangweidong 				loff_t *ppos)
3684f3fdf3bSwangweidong {
3694f3fdf3bSwangweidong 	struct net *net = current->nsproxy->net_ns;
3704f3fdf3bSwangweidong 	unsigned int min = *(unsigned int *) ctl->extra1;
3714f3fdf3bSwangweidong 	unsigned int max = *(unsigned int *) ctl->extra2;
372ff5e92c1SDaniel Borkmann 	struct ctl_table tbl;
373ff5e92c1SDaniel Borkmann 	int ret, new_value;
3744f3fdf3bSwangweidong 
3754f3fdf3bSwangweidong 	memset(&tbl, 0, sizeof(struct ctl_table));
3764f3fdf3bSwangweidong 	tbl.maxlen = sizeof(unsigned int);
3774f3fdf3bSwangweidong 
3784f3fdf3bSwangweidong 	if (write)
3794f3fdf3bSwangweidong 		tbl.data = &new_value;
3804f3fdf3bSwangweidong 	else
3814f3fdf3bSwangweidong 		tbl.data = &net->sctp.rto_min;
382ff5e92c1SDaniel Borkmann 
3834f3fdf3bSwangweidong 	ret = proc_dointvec(&tbl, write, buffer, lenp, ppos);
384ff5e92c1SDaniel Borkmann 	if (write && ret == 0) {
385ff5e92c1SDaniel Borkmann 		if (new_value > max || new_value < min)
3864f3fdf3bSwangweidong 			return -EINVAL;
387ff5e92c1SDaniel Borkmann 
3884f3fdf3bSwangweidong 		net->sctp.rto_min = new_value;
3894f3fdf3bSwangweidong 	}
390ff5e92c1SDaniel Borkmann 
3914f3fdf3bSwangweidong 	return ret;
3924f3fdf3bSwangweidong }
3934f3fdf3bSwangweidong 
3944f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
3954f3fdf3bSwangweidong 				void __user *buffer, size_t *lenp,
3964f3fdf3bSwangweidong 				loff_t *ppos)
3974f3fdf3bSwangweidong {
3984f3fdf3bSwangweidong 	struct net *net = current->nsproxy->net_ns;
3994f3fdf3bSwangweidong 	unsigned int min = *(unsigned int *) ctl->extra1;
4004f3fdf3bSwangweidong 	unsigned int max = *(unsigned int *) ctl->extra2;
401ff5e92c1SDaniel Borkmann 	struct ctl_table tbl;
402ff5e92c1SDaniel Borkmann 	int ret, new_value;
4034f3fdf3bSwangweidong 
4044f3fdf3bSwangweidong 	memset(&tbl, 0, sizeof(struct ctl_table));
4054f3fdf3bSwangweidong 	tbl.maxlen = sizeof(unsigned int);
4064f3fdf3bSwangweidong 
4074f3fdf3bSwangweidong 	if (write)
4084f3fdf3bSwangweidong 		tbl.data = &new_value;
4094f3fdf3bSwangweidong 	else
4104f3fdf3bSwangweidong 		tbl.data = &net->sctp.rto_max;
411ff5e92c1SDaniel Borkmann 
4124f3fdf3bSwangweidong 	ret = proc_dointvec(&tbl, write, buffer, lenp, ppos);
413ff5e92c1SDaniel Borkmann 	if (write && ret == 0) {
414ff5e92c1SDaniel Borkmann 		if (new_value > max || new_value < min)
4154f3fdf3bSwangweidong 			return -EINVAL;
416ff5e92c1SDaniel Borkmann 
4174f3fdf3bSwangweidong 		net->sctp.rto_max = new_value;
4184f3fdf3bSwangweidong 	}
419ff5e92c1SDaniel Borkmann 
4204f3fdf3bSwangweidong 	return ret;
4214f3fdf3bSwangweidong }
4224f3fdf3bSwangweidong 
423b58537a1SDaniel Borkmann static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write,
424b58537a1SDaniel Borkmann 				   void __user *buffer, size_t *lenp,
425b58537a1SDaniel Borkmann 				   loff_t *ppos)
426b58537a1SDaniel Borkmann {
427b58537a1SDaniel Borkmann 	pr_warn_once("Changing rto_alpha or rto_beta may lead to "
428b58537a1SDaniel Borkmann 		     "suboptimal rtt/srtt estimations!\n");
429b58537a1SDaniel Borkmann 
430b58537a1SDaniel Borkmann 	return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
431b58537a1SDaniel Borkmann }
432b58537a1SDaniel Borkmann 
433b14878ccSVlad Yasevich static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
434b14878ccSVlad Yasevich 			     void __user *buffer, size_t *lenp,
435b14878ccSVlad Yasevich 			     loff_t *ppos)
436b14878ccSVlad Yasevich {
437b14878ccSVlad Yasevich 	struct net *net = current->nsproxy->net_ns;
438b14878ccSVlad Yasevich 	struct ctl_table tbl;
439b14878ccSVlad Yasevich 	int new_value, ret;
440b14878ccSVlad Yasevich 
441b14878ccSVlad Yasevich 	memset(&tbl, 0, sizeof(struct ctl_table));
442b14878ccSVlad Yasevich 	tbl.maxlen = sizeof(unsigned int);
443b14878ccSVlad Yasevich 
444b14878ccSVlad Yasevich 	if (write)
445b14878ccSVlad Yasevich 		tbl.data = &new_value;
446b14878ccSVlad Yasevich 	else
447b14878ccSVlad Yasevich 		tbl.data = &net->sctp.auth_enable;
448b14878ccSVlad Yasevich 
449b14878ccSVlad Yasevich 	ret = proc_dointvec(&tbl, write, buffer, lenp, ppos);
450b14878ccSVlad Yasevich 
451b14878ccSVlad Yasevich 	if (write) {
452b14878ccSVlad Yasevich 		struct sock *sk = net->sctp.ctl_sock;
453b14878ccSVlad Yasevich 
454b14878ccSVlad Yasevich 		net->sctp.auth_enable = new_value;
455b14878ccSVlad Yasevich 		/* Update the value in the control socket */
456b14878ccSVlad Yasevich 		lock_sock(sk);
457b14878ccSVlad Yasevich 		sctp_sk(sk)->ep->auth_enable = new_value;
458b14878ccSVlad Yasevich 		release_sock(sk);
459b14878ccSVlad Yasevich 	}
460b14878ccSVlad Yasevich 
461b14878ccSVlad Yasevich 	return ret;
462b14878ccSVlad Yasevich }
463b14878ccSVlad Yasevich 
464ebb7e95dSEric W. Biederman int sctp_sysctl_net_register(struct net *net)
465ebb7e95dSEric W. Biederman {
466eb9f3705Swangweidong 	struct ctl_table *table;
467e1fc3b14SEric W. Biederman 	int i;
468ebb7e95dSEric W. Biederman 
469ebb7e95dSEric W. Biederman 	table = kmemdup(sctp_net_table, sizeof(sctp_net_table), GFP_KERNEL);
470ebb7e95dSEric W. Biederman 	if (!table)
471ebb7e95dSEric W. Biederman 		return -ENOMEM;
472ebb7e95dSEric W. Biederman 
473e1fc3b14SEric W. Biederman 	for (i = 0; table[i].data; i++)
474e1fc3b14SEric W. Biederman 		table[i].data += (char *)(&net->sctp) - (char *)&init_net.sctp;
475e1fc3b14SEric W. Biederman 
476ebb7e95dSEric W. Biederman 	net->sctp.sysctl_header = register_net_sysctl(net, "net/sctp", table);
477f66138c8Swangweidong 	if (net->sctp.sysctl_header == NULL) {
478f66138c8Swangweidong 		kfree(table);
479f66138c8Swangweidong 		return -ENOMEM;
480f66138c8Swangweidong 	}
481ebb7e95dSEric W. Biederman 	return 0;
482ebb7e95dSEric W. Biederman }
483ebb7e95dSEric W. Biederman 
484ebb7e95dSEric W. Biederman void sctp_sysctl_net_unregister(struct net *net)
485ebb7e95dSEric W. Biederman {
4865f19d121SVlad Yasevich 	struct ctl_table *table;
4875f19d121SVlad Yasevich 
4885f19d121SVlad Yasevich 	table = net->sctp.sysctl_header->ctl_table_arg;
489ebb7e95dSEric W. Biederman 	unregister_net_sysctl_table(net->sctp.sysctl_header);
4905f19d121SVlad Yasevich 	kfree(table);
491ebb7e95dSEric W. Biederman }
492ebb7e95dSEric W. Biederman 
4931da177e4SLinus Torvalds static struct ctl_table_header *sctp_sysctl_header;
4941da177e4SLinus Torvalds 
4951da177e4SLinus Torvalds /* Sysctl registration.  */
4961da177e4SLinus Torvalds void sctp_sysctl_register(void)
4971da177e4SLinus Torvalds {
498ec8f23ceSEric W. Biederman 	sctp_sysctl_header = register_net_sysctl(&init_net, "net/sctp", sctp_table);
4991da177e4SLinus Torvalds }
5001da177e4SLinus Torvalds 
5011da177e4SLinus Torvalds /* Sysctl deregistration.  */
5021da177e4SLinus Torvalds void sctp_sysctl_unregister(void)
5031da177e4SLinus Torvalds {
5045dd3df10SEric W. Biederman 	unregister_net_sysctl_table(sctp_sysctl_header);
5051da177e4SLinus Torvalds }
506