xref: /openbmc/linux/net/sctp/sysctl.c (revision ebb7e95d)
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
221da177e4SLinus Torvalds  * along with GNU CC; see the file COPYING.  If not, write to
231da177e4SLinus Torvalds  * the Free Software Foundation, 59 Temple Place - Suite 330,
241da177e4SLinus Torvalds  * Boston, MA 02111-1307, USA.
251da177e4SLinus Torvalds  *
261da177e4SLinus Torvalds  * Please send any bug reports or fixes you make to the
271da177e4SLinus Torvalds  * email address(es):
281da177e4SLinus Torvalds  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
291da177e4SLinus Torvalds  *
301da177e4SLinus Torvalds  * Or submit a bug report through the following website:
311da177e4SLinus Torvalds  *    http://www.sf.net/projects/lksctp
321da177e4SLinus Torvalds  *
331da177e4SLinus Torvalds  * Written or modified by:
341da177e4SLinus Torvalds  *    Mingqin Liu           <liuming@us.ibm.com>
351da177e4SLinus Torvalds  *    Jon Grimm             <jgrimm@us.ibm.com>
361da177e4SLinus Torvalds  *    Ardelle Fan           <ardelle.fan@intel.com>
371da177e4SLinus Torvalds  *    Ryan Layer            <rmlayer@us.ibm.com>
381da177e4SLinus Torvalds  *    Sridhar Samudrala     <sri@us.ibm.com>
391da177e4SLinus Torvalds  *
401da177e4SLinus Torvalds  * Any bugs reported given to us we will try to fix... any fixes shared will
411da177e4SLinus Torvalds  * be incorporated into the next SCTP release.
421da177e4SLinus Torvalds  */
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds #include <net/sctp/structs.h>
458c5955d8SAdrian Bunk #include <net/sctp/sctp.h>
461da177e4SLinus Torvalds #include <linux/sysctl.h>
471da177e4SLinus Torvalds 
483fd091e7SVladislav Yasevich static int zero = 0;
493fd091e7SVladislav Yasevich static int one = 1;
503fd091e7SVladislav Yasevich static int timer_max = 86400000; /* ms in one day */
513fd091e7SVladislav Yasevich static int int_max = INT_MAX;
52d48e074dSJean-Mickael Guerin static int sack_timer_min = 1;
53d48e074dSJean-Mickael Guerin static int sack_timer_max = 500;
5472388433SBhaskar Dutta static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */
5590f2f531SVlad Yasevich static int rwnd_scale_max = 16;
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 
651da177e4SLinus Torvalds static ctl_table sctp_table[] = {
661da177e4SLinus Torvalds 	{
671da177e4SLinus Torvalds 		.procname	= "rto_initial",
681da177e4SLinus Torvalds 		.data		= &sctp_rto_initial,
693fd091e7SVladislav Yasevich 		.maxlen		= sizeof(unsigned int),
701da177e4SLinus Torvalds 		.mode		= 0644,
716d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
723fd091e7SVladislav Yasevich 		.extra1         = &one,
733fd091e7SVladislav Yasevich 		.extra2         = &timer_max
741da177e4SLinus Torvalds 	},
751da177e4SLinus Torvalds 	{
761da177e4SLinus Torvalds 		.procname	= "rto_min",
771da177e4SLinus Torvalds 		.data		= &sctp_rto_min,
783fd091e7SVladislav Yasevich 		.maxlen		= sizeof(unsigned int),
791da177e4SLinus Torvalds 		.mode		= 0644,
806d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
813fd091e7SVladislav Yasevich 		.extra1         = &one,
823fd091e7SVladislav Yasevich 		.extra2         = &timer_max
831da177e4SLinus Torvalds 	},
841da177e4SLinus Torvalds 	{
851da177e4SLinus Torvalds 		.procname	= "rto_max",
861da177e4SLinus Torvalds 		.data		= &sctp_rto_max,
873fd091e7SVladislav Yasevich 		.maxlen		= sizeof(unsigned int),
881da177e4SLinus Torvalds 		.mode		= 0644,
896d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
903fd091e7SVladislav Yasevich 		.extra1         = &one,
913fd091e7SVladislav Yasevich 		.extra2         = &timer_max
921da177e4SLinus Torvalds 	},
931da177e4SLinus Torvalds 	{
941da177e4SLinus Torvalds 		.procname	= "valid_cookie_life",
951da177e4SLinus Torvalds 		.data		= &sctp_valid_cookie_life,
963fd091e7SVladislav Yasevich 		.maxlen		= sizeof(unsigned int),
971da177e4SLinus Torvalds 		.mode		= 0644,
986d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
993fd091e7SVladislav Yasevich 		.extra1         = &one,
1003fd091e7SVladislav Yasevich 		.extra2         = &timer_max
1011da177e4SLinus Torvalds 	},
1021da177e4SLinus Torvalds 	{
1031da177e4SLinus Torvalds 		.procname	= "max_burst",
1041da177e4SLinus Torvalds 		.data		= &sctp_max_burst,
1051da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1061da177e4SLinus Torvalds 		.mode		= 0644,
1076d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1083fd091e7SVladislav Yasevich 		.extra1		= &zero,
1093fd091e7SVladislav Yasevich 		.extra2		= &int_max
1101da177e4SLinus Torvalds 	},
1111da177e4SLinus Torvalds 	{
1121da177e4SLinus Torvalds 		.procname	= "association_max_retrans",
1131da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_association,
1141da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1151da177e4SLinus Torvalds 		.mode		= 0644,
1166d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1173fd091e7SVladislav Yasevich 		.extra1		= &one,
1183fd091e7SVladislav Yasevich 		.extra2		= &int_max
1191da177e4SLinus Torvalds 	},
1201da177e4SLinus Torvalds 	{
1214eb701dfSNeil Horman 		.procname	= "sndbuf_policy",
1224eb701dfSNeil Horman 		.data		= &sctp_sndbuf_policy,
1234eb701dfSNeil Horman 		.maxlen		= sizeof(int),
1244eb701dfSNeil Horman 		.mode		= 0644,
1256d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
1264eb701dfSNeil Horman 	},
1274eb701dfSNeil Horman 	{
128049b3ff5SNeil Horman 		.procname	= "rcvbuf_policy",
129049b3ff5SNeil Horman 		.data		= &sctp_rcvbuf_policy,
130049b3ff5SNeil Horman 		.maxlen		= sizeof(int),
131049b3ff5SNeil Horman 		.mode		= 0644,
1326d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
133049b3ff5SNeil Horman 	},
134049b3ff5SNeil Horman 	{
1351da177e4SLinus Torvalds 		.procname	= "path_max_retrans",
1361da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_path,
1371da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1381da177e4SLinus Torvalds 		.mode		= 0644,
1396d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1403fd091e7SVladislav Yasevich 		.extra1		= &one,
1413fd091e7SVladislav Yasevich 		.extra2		= &int_max
1421da177e4SLinus Torvalds 	},
1431da177e4SLinus Torvalds 	{
1445aa93bcfSNeil Horman 		.procname	= "pf_retrans",
1455aa93bcfSNeil Horman 		.data		= &sctp_pf_retrans,
1465aa93bcfSNeil Horman 		.maxlen		= sizeof(int),
1475aa93bcfSNeil Horman 		.mode		= 0644,
1485aa93bcfSNeil Horman 		.proc_handler	= proc_dointvec_minmax,
1495aa93bcfSNeil Horman 		.extra1		= &zero,
1505aa93bcfSNeil Horman 		.extra2		= &int_max
1515aa93bcfSNeil Horman 	},
1525aa93bcfSNeil Horman 	{
1531da177e4SLinus Torvalds 		.procname	= "max_init_retransmits",
1541da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_init,
1551da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1561da177e4SLinus Torvalds 		.mode		= 0644,
1576d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1583fd091e7SVladislav Yasevich 		.extra1		= &one,
1593fd091e7SVladislav Yasevich 		.extra2		= &int_max
1601da177e4SLinus Torvalds 	},
1611da177e4SLinus Torvalds 	{
1621da177e4SLinus Torvalds 		.procname	= "hb_interval",
1631da177e4SLinus Torvalds 		.data		= &sctp_hb_interval,
1643fd091e7SVladislav Yasevich 		.maxlen		= sizeof(unsigned int),
1651da177e4SLinus Torvalds 		.mode		= 0644,
1666d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1673fd091e7SVladislav Yasevich 		.extra1         = &one,
1683fd091e7SVladislav Yasevich 		.extra2         = &timer_max
1691da177e4SLinus Torvalds 	},
1701da177e4SLinus Torvalds 	{
1711da177e4SLinus Torvalds 		.procname	= "cookie_preserve_enable",
1721da177e4SLinus Torvalds 		.data		= &sctp_cookie_preserve_enable,
1738116ffadSVlad Yasevich 		.maxlen		= sizeof(int),
1741da177e4SLinus Torvalds 		.mode		= 0644,
1756d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
1761da177e4SLinus Torvalds 	},
1771da177e4SLinus Torvalds 	{
1781da177e4SLinus Torvalds 		.procname	= "rto_alpha_exp_divisor",
1791da177e4SLinus Torvalds 		.data		= &sctp_rto_alpha,
1801da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1813fd091e7SVladislav Yasevich 		.mode		= 0444,
1826d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
1831da177e4SLinus Torvalds 	},
1841da177e4SLinus Torvalds 	{
1851da177e4SLinus Torvalds 		.procname	= "rto_beta_exp_divisor",
1861da177e4SLinus Torvalds 		.data		= &sctp_rto_beta,
1871da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1883fd091e7SVladislav Yasevich 		.mode		= 0444,
1896d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
1901da177e4SLinus Torvalds 	},
1911da177e4SLinus Torvalds 	{
1921da177e4SLinus Torvalds 		.procname	= "addip_enable",
1931da177e4SLinus Torvalds 		.data		= &sctp_addip_enable,
1941da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1951da177e4SLinus Torvalds 		.mode		= 0644,
1966d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
1971da177e4SLinus Torvalds 	},
1981da177e4SLinus Torvalds 	{
199dd51be0fSMichio Honda 		.procname	= "default_auto_asconf",
200dd51be0fSMichio Honda 		.data		= &sctp_default_auto_asconf,
201dd51be0fSMichio Honda 		.maxlen		= sizeof(int),
202dd51be0fSMichio Honda 		.mode		= 0644,
203dd51be0fSMichio Honda 		.proc_handler	= proc_dointvec,
204dd51be0fSMichio Honda 	},
205dd51be0fSMichio Honda 	{
2061da177e4SLinus Torvalds 		.procname	= "prsctp_enable",
2071da177e4SLinus Torvalds 		.data		= &sctp_prsctp_enable,
2081da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
2091da177e4SLinus Torvalds 		.mode		= 0644,
2106d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
2111da177e4SLinus Torvalds 	},
2122f85a429SVlad Yasevich 	{
2132f85a429SVlad Yasevich 		.procname	= "sack_timeout",
2142f85a429SVlad Yasevich 		.data		= &sctp_sack_timeout,
215d48e074dSJean-Mickael Guerin 		.maxlen		= sizeof(int),
2162f85a429SVlad Yasevich 		.mode		= 0644,
2176d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
2182f85a429SVlad Yasevich 		.extra1         = &sack_timer_min,
2192f85a429SVlad Yasevich 		.extra2         = &sack_timer_max,
2202f85a429SVlad Yasevich 	},
2214d93df0aSNeil Horman 	{
2224d93df0aSNeil Horman 		.procname	= "sctp_mem",
2234d93df0aSNeil Horman 		.data		= &sysctl_sctp_mem,
2244d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_mem),
2254d93df0aSNeil Horman 		.mode		= 0644,
2268d987e5cSEric Dumazet 		.proc_handler	= proc_doulongvec_minmax
2274d93df0aSNeil Horman 	},
2284d93df0aSNeil Horman 	{
2294d93df0aSNeil Horman 		.procname	= "sctp_rmem",
2304d93df0aSNeil Horman 		.data		= &sysctl_sctp_rmem,
2314d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_rmem),
2324d93df0aSNeil Horman 		.mode		= 0644,
2336d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
2344d93df0aSNeil Horman 	},
2354d93df0aSNeil Horman 	{
2364d93df0aSNeil Horman 		.procname	= "sctp_wmem",
2374d93df0aSNeil Horman 		.data		= &sysctl_sctp_wmem,
2384d93df0aSNeil Horman 		.maxlen		= sizeof(sysctl_sctp_wmem),
2394d93df0aSNeil Horman 		.mode		= 0644,
2406d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
2414d93df0aSNeil Horman 	},
242a29a5bd4SVlad Yasevich 	{
243a29a5bd4SVlad Yasevich 		.procname	= "auth_enable",
244a29a5bd4SVlad Yasevich 		.data		= &sctp_auth_enable,
245a29a5bd4SVlad Yasevich 		.maxlen		= sizeof(int),
246a29a5bd4SVlad Yasevich 		.mode		= 0644,
2476d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
248a29a5bd4SVlad Yasevich 	},
24973d9c4fdSVlad Yasevich 	{
25073d9c4fdSVlad Yasevich 		.procname	= "addip_noauth_enable",
25173d9c4fdSVlad Yasevich 		.data		= &sctp_addip_noauth,
25273d9c4fdSVlad Yasevich 		.maxlen		= sizeof(int),
25373d9c4fdSVlad Yasevich 		.mode		= 0644,
2546d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec,
25573d9c4fdSVlad Yasevich 	},
25672388433SBhaskar Dutta 	{
25772388433SBhaskar Dutta 		.procname	= "addr_scope_policy",
25872388433SBhaskar Dutta 		.data		= &sctp_scope_policy,
25972388433SBhaskar Dutta 		.maxlen		= sizeof(int),
26072388433SBhaskar Dutta 		.mode		= 0644,
2616d456111SEric W. Biederman 		.proc_handler	= proc_dointvec_minmax,
26272388433SBhaskar Dutta 		.extra1		= &zero,
26372388433SBhaskar Dutta 		.extra2		= &addr_scope_max,
26472388433SBhaskar Dutta 	},
26590f2f531SVlad Yasevich 	{
26690f2f531SVlad Yasevich 		.procname	= "rwnd_update_shift",
26790f2f531SVlad Yasevich 		.data		= &sctp_rwnd_upd_shift,
26890f2f531SVlad Yasevich 		.maxlen		= sizeof(int),
26990f2f531SVlad Yasevich 		.mode		= 0644,
27090f2f531SVlad Yasevich 		.proc_handler	= &proc_dointvec_minmax,
27190f2f531SVlad Yasevich 		.extra1		= &one,
27290f2f531SVlad Yasevich 		.extra2		= &rwnd_scale_max,
27390f2f531SVlad Yasevich 	},
2742692ba61SXi Wang 	{
2752692ba61SXi Wang 		.procname	= "max_autoclose",
2762692ba61SXi Wang 		.data		= &sctp_max_autoclose,
2772692ba61SXi Wang 		.maxlen		= sizeof(unsigned long),
2782692ba61SXi Wang 		.mode		= 0644,
2792692ba61SXi Wang 		.proc_handler	= &proc_doulongvec_minmax,
2802692ba61SXi Wang 		.extra1		= &max_autoclose_min,
2812692ba61SXi Wang 		.extra2		= &max_autoclose_max,
2822692ba61SXi Wang 	},
28390f2f531SVlad Yasevich 
284d7fc02c7SLinus Torvalds 	{ /* sentinel */ }
2851da177e4SLinus Torvalds };
2861da177e4SLinus Torvalds 
287ebb7e95dSEric W. Biederman static ctl_table sctp_net_table[] = {
288ebb7e95dSEric W. Biederman 	{ /* sentinel */ }
289ebb7e95dSEric W. Biederman };
290ebb7e95dSEric W. Biederman 
291ebb7e95dSEric W. Biederman int sctp_sysctl_net_register(struct net *net)
292ebb7e95dSEric W. Biederman {
293ebb7e95dSEric W. Biederman 	struct ctl_table *table;
294ebb7e95dSEric W. Biederman 
295ebb7e95dSEric W. Biederman 	table = kmemdup(sctp_net_table, sizeof(sctp_net_table), GFP_KERNEL);
296ebb7e95dSEric W. Biederman 	if (!table)
297ebb7e95dSEric W. Biederman 		return -ENOMEM;
298ebb7e95dSEric W. Biederman 
299ebb7e95dSEric W. Biederman 	net->sctp.sysctl_header = register_net_sysctl(net, "net/sctp", table);
300ebb7e95dSEric W. Biederman 	return 0;
301ebb7e95dSEric W. Biederman }
302ebb7e95dSEric W. Biederman 
303ebb7e95dSEric W. Biederman void sctp_sysctl_net_unregister(struct net *net)
304ebb7e95dSEric W. Biederman {
305ebb7e95dSEric W. Biederman 	unregister_net_sysctl_table(net->sctp.sysctl_header);
306ebb7e95dSEric W. Biederman }
307ebb7e95dSEric W. Biederman 
3081da177e4SLinus Torvalds static struct ctl_table_header * sctp_sysctl_header;
3091da177e4SLinus Torvalds 
3101da177e4SLinus Torvalds /* Sysctl registration.  */
3111da177e4SLinus Torvalds void sctp_sysctl_register(void)
3121da177e4SLinus Torvalds {
313ec8f23ceSEric W. Biederman 	sctp_sysctl_header = register_net_sysctl(&init_net, "net/sctp", sctp_table);
3141da177e4SLinus Torvalds }
3151da177e4SLinus Torvalds 
3161da177e4SLinus Torvalds /* Sysctl deregistration.  */
3171da177e4SLinus Torvalds void sctp_sysctl_unregister(void)
3181da177e4SLinus Torvalds {
3195dd3df10SEric W. Biederman 	unregister_net_sysctl_table(sctp_sysctl_header);
3201da177e4SLinus Torvalds }
321