xref: /openbmc/linux/net/sctp/sysctl.c (revision 2f85a429)
11da177e4SLinus Torvalds /* SCTP kernel reference Implementation
21da177e4SLinus Torvalds  * (C) Copyright IBM Corp. 2002, 2004
31da177e4SLinus Torvalds  * Copyright (c) 2002 Intel Corp.
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * This file is part of the SCTP kernel reference Implementation
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * Sysctl related interfaces for SCTP.
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  * The SCTP reference 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  *
151da177e4SLinus Torvalds  * The SCTP reference 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>
451da177e4SLinus Torvalds #include <linux/sysctl.h>
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds static ctl_handler sctp_sysctl_jiffies_ms;
481da177e4SLinus Torvalds static long rto_timer_min = 1;
491da177e4SLinus Torvalds static long rto_timer_max = 86400000; /* One day */
502f85a429SVlad Yasevich static long sack_timer_min = 1;
512f85a429SVlad Yasevich static long sack_timer_max = 500;
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds static ctl_table sctp_table[] = {
541da177e4SLinus Torvalds 	{
551da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_INITIAL,
561da177e4SLinus Torvalds 		.procname	= "rto_initial",
571da177e4SLinus Torvalds 		.data		= &sctp_rto_initial,
581da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
591da177e4SLinus Torvalds 		.mode		= 0644,
601da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
611da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
621da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
631da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
641da177e4SLinus Torvalds 	},
651da177e4SLinus Torvalds 	{
661da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_MIN,
671da177e4SLinus Torvalds 		.procname	= "rto_min",
681da177e4SLinus Torvalds 		.data		= &sctp_rto_min,
691da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
701da177e4SLinus Torvalds 		.mode		= 0644,
711da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
721da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
731da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
741da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
751da177e4SLinus Torvalds 	},
761da177e4SLinus Torvalds 	{
771da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_MAX,
781da177e4SLinus Torvalds 		.procname	= "rto_max",
791da177e4SLinus Torvalds 		.data		= &sctp_rto_max,
801da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
811da177e4SLinus Torvalds 		.mode		= 0644,
821da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
831da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
841da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
851da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
861da177e4SLinus Torvalds 	},
871da177e4SLinus Torvalds 	{
881da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_VALID_COOKIE_LIFE,
891da177e4SLinus Torvalds 		.procname	= "valid_cookie_life",
901da177e4SLinus Torvalds 		.data		= &sctp_valid_cookie_life,
911da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
921da177e4SLinus Torvalds 		.mode		= 0644,
931da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
941da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
951da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
961da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
971da177e4SLinus Torvalds 	},
981da177e4SLinus Torvalds 	{
991da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_MAX_BURST,
1001da177e4SLinus Torvalds 		.procname	= "max_burst",
1011da177e4SLinus Torvalds 		.data		= &sctp_max_burst,
1021da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1031da177e4SLinus Torvalds 		.mode		= 0644,
1041da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1051da177e4SLinus Torvalds 	},
1061da177e4SLinus Torvalds 	{
1071da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_ASSOCIATION_MAX_RETRANS,
1081da177e4SLinus Torvalds 		.procname	= "association_max_retrans",
1091da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_association,
1101da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1111da177e4SLinus Torvalds 		.mode		= 0644,
1121da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1131da177e4SLinus Torvalds 	},
1141da177e4SLinus Torvalds 	{
1154eb701dfSNeil Horman 		.ctl_name	= NET_SCTP_SNDBUF_POLICY,
1164eb701dfSNeil Horman 		.procname	= "sndbuf_policy",
1174eb701dfSNeil Horman 		.data		= &sctp_sndbuf_policy,
1184eb701dfSNeil Horman 		.maxlen		= sizeof(int),
1194eb701dfSNeil Horman 		.mode		= 0644,
1204eb701dfSNeil Horman 		.proc_handler	= &proc_dointvec
1214eb701dfSNeil Horman 	},
1224eb701dfSNeil Horman 	{
1231da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_PATH_MAX_RETRANS,
1241da177e4SLinus Torvalds 		.procname	= "path_max_retrans",
1251da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_path,
1261da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1271da177e4SLinus Torvalds 		.mode		= 0644,
1281da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1291da177e4SLinus Torvalds 	},
1301da177e4SLinus Torvalds 	{
1311da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_MAX_INIT_RETRANSMITS,
1321da177e4SLinus Torvalds 		.procname	= "max_init_retransmits",
1331da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_init,
1341da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1351da177e4SLinus Torvalds 		.mode		= 0644,
1361da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1371da177e4SLinus Torvalds 	},
1381da177e4SLinus Torvalds 	{
1391da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_HB_INTERVAL,
1401da177e4SLinus Torvalds 		.procname	= "hb_interval",
1411da177e4SLinus Torvalds 		.data		= &sctp_hb_interval,
1421da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
1431da177e4SLinus Torvalds 		.mode		= 0644,
1441da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
1451da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
1461da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
1471da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
1481da177e4SLinus Torvalds 	},
1491da177e4SLinus Torvalds 	{
1501da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_PRESERVE_ENABLE,
1511da177e4SLinus Torvalds 		.procname	= "cookie_preserve_enable",
1521da177e4SLinus Torvalds 		.data		= &sctp_cookie_preserve_enable,
1531da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
1541da177e4SLinus Torvalds 		.mode		= 0644,
1551da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
1561da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
1571da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
1581da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
1591da177e4SLinus Torvalds 	},
1601da177e4SLinus Torvalds 	{
1611da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_ALPHA,
1621da177e4SLinus Torvalds 		.procname	= "rto_alpha_exp_divisor",
1631da177e4SLinus Torvalds 		.data		= &sctp_rto_alpha,
1641da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1651da177e4SLinus Torvalds 		.mode		= 0644,
1661da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1671da177e4SLinus Torvalds 	},
1681da177e4SLinus Torvalds 	{
1691da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_BETA,
1701da177e4SLinus Torvalds 		.procname	= "rto_beta_exp_divisor",
1711da177e4SLinus Torvalds 		.data		= &sctp_rto_beta,
1721da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1731da177e4SLinus Torvalds 		.mode		= 0644,
1741da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1751da177e4SLinus Torvalds 	},
1761da177e4SLinus Torvalds 	{
1771da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_ADDIP_ENABLE,
1781da177e4SLinus Torvalds 		.procname	= "addip_enable",
1791da177e4SLinus Torvalds 		.data		= &sctp_addip_enable,
1801da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1811da177e4SLinus Torvalds 		.mode		= 0644,
1821da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1831da177e4SLinus Torvalds 	},
1841da177e4SLinus Torvalds 	{
1851da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_PRSCTP_ENABLE,
1861da177e4SLinus Torvalds 		.procname	= "prsctp_enable",
1871da177e4SLinus Torvalds 		.data		= &sctp_prsctp_enable,
1881da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1891da177e4SLinus Torvalds 		.mode		= 0644,
1901da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1911da177e4SLinus Torvalds 	},
1922f85a429SVlad Yasevich 	{
1932f85a429SVlad Yasevich 		.ctl_name	= NET_SCTP_SACK_TIMEOUT,
1942f85a429SVlad Yasevich 		.procname	= "sack_timeout",
1952f85a429SVlad Yasevich 		.data		= &sctp_sack_timeout,
1962f85a429SVlad Yasevich 		.maxlen		= sizeof(long),
1972f85a429SVlad Yasevich 		.mode		= 0644,
1982f85a429SVlad Yasevich 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
1992f85a429SVlad Yasevich 		.strategy	= &sctp_sysctl_jiffies_ms,
2002f85a429SVlad Yasevich 		.extra1         = &sack_timer_min,
2012f85a429SVlad Yasevich 		.extra2         = &sack_timer_max,
2022f85a429SVlad Yasevich 	},
2031da177e4SLinus Torvalds 	{ .ctl_name = 0 }
2041da177e4SLinus Torvalds };
2051da177e4SLinus Torvalds 
2061da177e4SLinus Torvalds static ctl_table sctp_net_table[] = {
2071da177e4SLinus Torvalds 	{
2081da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP,
2091da177e4SLinus Torvalds 		.procname	= "sctp",
2101da177e4SLinus Torvalds 		.mode		= 0555,
2111da177e4SLinus Torvalds 		.child		= sctp_table
2121da177e4SLinus Torvalds 	},
2131da177e4SLinus Torvalds 	{ .ctl_name = 0 }
2141da177e4SLinus Torvalds };
2151da177e4SLinus Torvalds 
2161da177e4SLinus Torvalds static ctl_table sctp_root_table[] = {
2171da177e4SLinus Torvalds 	{
2181da177e4SLinus Torvalds 		.ctl_name	= CTL_NET,
2191da177e4SLinus Torvalds 		.procname	= "net",
2201da177e4SLinus Torvalds 		.mode		= 0555,
2211da177e4SLinus Torvalds 		.child		= sctp_net_table
2221da177e4SLinus Torvalds 	},
2231da177e4SLinus Torvalds 	{ .ctl_name = 0 }
2241da177e4SLinus Torvalds };
2251da177e4SLinus Torvalds 
2261da177e4SLinus Torvalds static struct ctl_table_header * sctp_sysctl_header;
2271da177e4SLinus Torvalds 
2281da177e4SLinus Torvalds /* Sysctl registration.  */
2291da177e4SLinus Torvalds void sctp_sysctl_register(void)
2301da177e4SLinus Torvalds {
2311da177e4SLinus Torvalds 	sctp_sysctl_header = register_sysctl_table(sctp_root_table, 0);
2321da177e4SLinus Torvalds }
2331da177e4SLinus Torvalds 
2341da177e4SLinus Torvalds /* Sysctl deregistration.  */
2351da177e4SLinus Torvalds void sctp_sysctl_unregister(void)
2361da177e4SLinus Torvalds {
2371da177e4SLinus Torvalds 	unregister_sysctl_table(sctp_sysctl_header);
2381da177e4SLinus Torvalds }
2391da177e4SLinus Torvalds 
2401da177e4SLinus Torvalds /* Strategy function to convert jiffies to milliseconds.  */
2411da177e4SLinus Torvalds static int sctp_sysctl_jiffies_ms(ctl_table *table, int __user *name, int nlen,
2421da177e4SLinus Torvalds 		void __user *oldval, size_t __user *oldlenp,
2431da177e4SLinus Torvalds 		void __user *newval, size_t newlen, void **context) {
2441da177e4SLinus Torvalds 
2451da177e4SLinus Torvalds 	if (oldval) {
2461da177e4SLinus Torvalds 		size_t olen;
2471da177e4SLinus Torvalds 
2481da177e4SLinus Torvalds 		if (oldlenp) {
2491da177e4SLinus Torvalds 			if (get_user(olen, oldlenp))
2501da177e4SLinus Torvalds 				return -EFAULT;
2511da177e4SLinus Torvalds 
2521da177e4SLinus Torvalds 			if (olen != sizeof (int))
2531da177e4SLinus Torvalds 				return -EINVAL;
2541da177e4SLinus Torvalds 		}
2551da177e4SLinus Torvalds 		if (put_user((*(int *)(table->data) * 1000) / HZ,
2561da177e4SLinus Torvalds 			(int __user *)oldval) ||
2571da177e4SLinus Torvalds 		    (oldlenp && put_user(sizeof (int), oldlenp)))
2581da177e4SLinus Torvalds 			return -EFAULT;
2591da177e4SLinus Torvalds 	}
2601da177e4SLinus Torvalds 	if (newval && newlen) {
2611da177e4SLinus Torvalds 		int new;
2621da177e4SLinus Torvalds 
2631da177e4SLinus Torvalds 		if (newlen != sizeof (int))
2641da177e4SLinus Torvalds 			return -EINVAL;
2651da177e4SLinus Torvalds 
2661da177e4SLinus Torvalds 		if (get_user(new, (int __user *)newval))
2671da177e4SLinus Torvalds 			return -EFAULT;
2681da177e4SLinus Torvalds 
2691da177e4SLinus Torvalds 		*(int *)(table->data) = (new * HZ) / 1000;
2701da177e4SLinus Torvalds 	}
2711da177e4SLinus Torvalds 	return 1;
2721da177e4SLinus Torvalds }
273