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