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