xref: /openbmc/linux/net/sctp/sysctl.c (revision 4eb701df)
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 */
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds static ctl_table sctp_table[] = {
521da177e4SLinus Torvalds 	{
531da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_INITIAL,
541da177e4SLinus Torvalds 		.procname	= "rto_initial",
551da177e4SLinus Torvalds 		.data		= &sctp_rto_initial,
561da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
571da177e4SLinus Torvalds 		.mode		= 0644,
581da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
591da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
601da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
611da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
621da177e4SLinus Torvalds 	},
631da177e4SLinus Torvalds 	{
641da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_MIN,
651da177e4SLinus Torvalds 		.procname	= "rto_min",
661da177e4SLinus Torvalds 		.data		= &sctp_rto_min,
671da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
681da177e4SLinus Torvalds 		.mode		= 0644,
691da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
701da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
711da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
721da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
731da177e4SLinus Torvalds 	},
741da177e4SLinus Torvalds 	{
751da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_MAX,
761da177e4SLinus Torvalds 		.procname	= "rto_max",
771da177e4SLinus Torvalds 		.data		= &sctp_rto_max,
781da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
791da177e4SLinus Torvalds 		.mode		= 0644,
801da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
811da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
821da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
831da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
841da177e4SLinus Torvalds 	},
851da177e4SLinus Torvalds 	{
861da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_VALID_COOKIE_LIFE,
871da177e4SLinus Torvalds 		.procname	= "valid_cookie_life",
881da177e4SLinus Torvalds 		.data		= &sctp_valid_cookie_life,
891da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
901da177e4SLinus Torvalds 		.mode		= 0644,
911da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
921da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
931da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
941da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
951da177e4SLinus Torvalds 	},
961da177e4SLinus Torvalds 	{
971da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_MAX_BURST,
981da177e4SLinus Torvalds 		.procname	= "max_burst",
991da177e4SLinus Torvalds 		.data		= &sctp_max_burst,
1001da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1011da177e4SLinus Torvalds 		.mode		= 0644,
1021da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1031da177e4SLinus Torvalds 	},
1041da177e4SLinus Torvalds 	{
1051da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_ASSOCIATION_MAX_RETRANS,
1061da177e4SLinus Torvalds 		.procname	= "association_max_retrans",
1071da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_association,
1081da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1091da177e4SLinus Torvalds 		.mode		= 0644,
1101da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1111da177e4SLinus Torvalds 	},
1121da177e4SLinus Torvalds 	{
1134eb701dfSNeil Horman 		.ctl_name	= NET_SCTP_SNDBUF_POLICY,
1144eb701dfSNeil Horman 		.procname	= "sndbuf_policy",
1154eb701dfSNeil Horman 		.data		= &sctp_sndbuf_policy,
1164eb701dfSNeil Horman 		.maxlen		= sizeof(int),
1174eb701dfSNeil Horman 		.mode		= 0644,
1184eb701dfSNeil Horman 		.proc_handler	= &proc_dointvec
1194eb701dfSNeil Horman 	},
1204eb701dfSNeil Horman 	{
1211da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_PATH_MAX_RETRANS,
1221da177e4SLinus Torvalds 		.procname	= "path_max_retrans",
1231da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_path,
1241da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1251da177e4SLinus Torvalds 		.mode		= 0644,
1261da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1271da177e4SLinus Torvalds 	},
1281da177e4SLinus Torvalds 	{
1291da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_MAX_INIT_RETRANSMITS,
1301da177e4SLinus Torvalds 		.procname	= "max_init_retransmits",
1311da177e4SLinus Torvalds 		.data		= &sctp_max_retrans_init,
1321da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1331da177e4SLinus Torvalds 		.mode		= 0644,
1341da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1351da177e4SLinus Torvalds 	},
1361da177e4SLinus Torvalds 	{
1371da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_HB_INTERVAL,
1381da177e4SLinus Torvalds 		.procname	= "hb_interval",
1391da177e4SLinus Torvalds 		.data		= &sctp_hb_interval,
1401da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
1411da177e4SLinus Torvalds 		.mode		= 0644,
1421da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
1431da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
1441da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
1451da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
1461da177e4SLinus Torvalds 	},
1471da177e4SLinus Torvalds 	{
1481da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_PRESERVE_ENABLE,
1491da177e4SLinus Torvalds 		.procname	= "cookie_preserve_enable",
1501da177e4SLinus Torvalds 		.data		= &sctp_cookie_preserve_enable,
1511da177e4SLinus Torvalds 		.maxlen		= sizeof(long),
1521da177e4SLinus Torvalds 		.mode		= 0644,
1531da177e4SLinus Torvalds 		.proc_handler	= &proc_doulongvec_ms_jiffies_minmax,
1541da177e4SLinus Torvalds 		.strategy	= &sctp_sysctl_jiffies_ms,
1551da177e4SLinus Torvalds 		.extra1         = &rto_timer_min,
1561da177e4SLinus Torvalds 		.extra2         = &rto_timer_max
1571da177e4SLinus Torvalds 	},
1581da177e4SLinus Torvalds 	{
1591da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_ALPHA,
1601da177e4SLinus Torvalds 		.procname	= "rto_alpha_exp_divisor",
1611da177e4SLinus Torvalds 		.data		= &sctp_rto_alpha,
1621da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1631da177e4SLinus Torvalds 		.mode		= 0644,
1641da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1651da177e4SLinus Torvalds 	},
1661da177e4SLinus Torvalds 	{
1671da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_RTO_BETA,
1681da177e4SLinus Torvalds 		.procname	= "rto_beta_exp_divisor",
1691da177e4SLinus Torvalds 		.data		= &sctp_rto_beta,
1701da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1711da177e4SLinus Torvalds 		.mode		= 0644,
1721da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1731da177e4SLinus Torvalds 	},
1741da177e4SLinus Torvalds 	{
1751da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_ADDIP_ENABLE,
1761da177e4SLinus Torvalds 		.procname	= "addip_enable",
1771da177e4SLinus Torvalds 		.data		= &sctp_addip_enable,
1781da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1791da177e4SLinus Torvalds 		.mode		= 0644,
1801da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1811da177e4SLinus Torvalds 	},
1821da177e4SLinus Torvalds 	{
1831da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP_PRSCTP_ENABLE,
1841da177e4SLinus Torvalds 		.procname	= "prsctp_enable",
1851da177e4SLinus Torvalds 		.data		= &sctp_prsctp_enable,
1861da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1871da177e4SLinus Torvalds 		.mode		= 0644,
1881da177e4SLinus Torvalds 		.proc_handler	= &proc_dointvec
1891da177e4SLinus Torvalds 	},
1901da177e4SLinus Torvalds 	{ .ctl_name = 0 }
1911da177e4SLinus Torvalds };
1921da177e4SLinus Torvalds 
1931da177e4SLinus Torvalds static ctl_table sctp_net_table[] = {
1941da177e4SLinus Torvalds 	{
1951da177e4SLinus Torvalds 		.ctl_name	= NET_SCTP,
1961da177e4SLinus Torvalds 		.procname	= "sctp",
1971da177e4SLinus Torvalds 		.mode		= 0555,
1981da177e4SLinus Torvalds 		.child		= sctp_table
1991da177e4SLinus Torvalds 	},
2001da177e4SLinus Torvalds 	{ .ctl_name = 0 }
2011da177e4SLinus Torvalds };
2021da177e4SLinus Torvalds 
2031da177e4SLinus Torvalds static ctl_table sctp_root_table[] = {
2041da177e4SLinus Torvalds 	{
2051da177e4SLinus Torvalds 		.ctl_name	= CTL_NET,
2061da177e4SLinus Torvalds 		.procname	= "net",
2071da177e4SLinus Torvalds 		.mode		= 0555,
2081da177e4SLinus Torvalds 		.child		= sctp_net_table
2091da177e4SLinus Torvalds 	},
2101da177e4SLinus Torvalds 	{ .ctl_name = 0 }
2111da177e4SLinus Torvalds };
2121da177e4SLinus Torvalds 
2131da177e4SLinus Torvalds static struct ctl_table_header * sctp_sysctl_header;
2141da177e4SLinus Torvalds 
2151da177e4SLinus Torvalds /* Sysctl registration.  */
2161da177e4SLinus Torvalds void sctp_sysctl_register(void)
2171da177e4SLinus Torvalds {
2181da177e4SLinus Torvalds 	sctp_sysctl_header = register_sysctl_table(sctp_root_table, 0);
2191da177e4SLinus Torvalds }
2201da177e4SLinus Torvalds 
2211da177e4SLinus Torvalds /* Sysctl deregistration.  */
2221da177e4SLinus Torvalds void sctp_sysctl_unregister(void)
2231da177e4SLinus Torvalds {
2241da177e4SLinus Torvalds 	unregister_sysctl_table(sctp_sysctl_header);
2251da177e4SLinus Torvalds }
2261da177e4SLinus Torvalds 
2271da177e4SLinus Torvalds /* Strategy function to convert jiffies to milliseconds.  */
2281da177e4SLinus Torvalds static int sctp_sysctl_jiffies_ms(ctl_table *table, int __user *name, int nlen,
2291da177e4SLinus Torvalds 		void __user *oldval, size_t __user *oldlenp,
2301da177e4SLinus Torvalds 		void __user *newval, size_t newlen, void **context) {
2311da177e4SLinus Torvalds 
2321da177e4SLinus Torvalds 	if (oldval) {
2331da177e4SLinus Torvalds 		size_t olen;
2341da177e4SLinus Torvalds 
2351da177e4SLinus Torvalds 		if (oldlenp) {
2361da177e4SLinus Torvalds 			if (get_user(olen, oldlenp))
2371da177e4SLinus Torvalds 				return -EFAULT;
2381da177e4SLinus Torvalds 
2391da177e4SLinus Torvalds 			if (olen != sizeof (int))
2401da177e4SLinus Torvalds 				return -EINVAL;
2411da177e4SLinus Torvalds 		}
2421da177e4SLinus Torvalds 		if (put_user((*(int *)(table->data) * 1000) / HZ,
2431da177e4SLinus Torvalds 			(int __user *)oldval) ||
2441da177e4SLinus Torvalds 		    (oldlenp && put_user(sizeof (int), oldlenp)))
2451da177e4SLinus Torvalds 			return -EFAULT;
2461da177e4SLinus Torvalds 	}
2471da177e4SLinus Torvalds 	if (newval && newlen) {
2481da177e4SLinus Torvalds 		int new;
2491da177e4SLinus Torvalds 
2501da177e4SLinus Torvalds 		if (newlen != sizeof (int))
2511da177e4SLinus Torvalds 			return -EINVAL;
2521da177e4SLinus Torvalds 
2531da177e4SLinus Torvalds 		if (get_user(new, (int __user *)newval))
2541da177e4SLinus Torvalds 			return -EFAULT;
2551da177e4SLinus Torvalds 
2561da177e4SLinus Torvalds 		*(int *)(table->data) = (new * HZ) / 1000;
2571da177e4SLinus Torvalds 	}
2581da177e4SLinus Torvalds 	return 1;
2591da177e4SLinus Torvalds }
260