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 224b2f13a2SJeff Kirsher * along with GNU CC; see the file COPYING. If not, see 234b2f13a2SJeff Kirsher * <http://www.gnu.org/licenses/>. 241da177e4SLinus Torvalds * 251da177e4SLinus Torvalds * Please send any bug reports or fixes you make to the 261da177e4SLinus Torvalds * email address(es): 2791705c61SDaniel Borkmann * lksctp developers <linux-sctp@vger.kernel.org> 281da177e4SLinus Torvalds * 291da177e4SLinus Torvalds * Written or modified by: 301da177e4SLinus Torvalds * Mingqin Liu <liuming@us.ibm.com> 311da177e4SLinus Torvalds * Jon Grimm <jgrimm@us.ibm.com> 321da177e4SLinus Torvalds * Ardelle Fan <ardelle.fan@intel.com> 331da177e4SLinus Torvalds * Ryan Layer <rmlayer@us.ibm.com> 341da177e4SLinus Torvalds * Sridhar Samudrala <sri@us.ibm.com> 351da177e4SLinus Torvalds */ 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds #include <net/sctp/structs.h> 388c5955d8SAdrian Bunk #include <net/sctp/sctp.h> 391da177e4SLinus Torvalds #include <linux/sysctl.h> 401da177e4SLinus Torvalds 413fd091e7SVladislav Yasevich static int zero = 0; 423fd091e7SVladislav Yasevich static int one = 1; 433fd091e7SVladislav Yasevich static int timer_max = 86400000; /* ms in one day */ 443fd091e7SVladislav Yasevich static int int_max = INT_MAX; 45d48e074dSJean-Mickael Guerin static int sack_timer_min = 1; 46d48e074dSJean-Mickael Guerin static int sack_timer_max = 500; 4772388433SBhaskar Dutta static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ 4890f2f531SVlad Yasevich static int rwnd_scale_max = 16; 492692ba61SXi Wang static unsigned long max_autoclose_min = 0; 502692ba61SXi Wang static unsigned long max_autoclose_max = 512692ba61SXi Wang (MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX) 522692ba61SXi Wang ? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ; 531da177e4SLinus Torvalds 548d987e5cSEric Dumazet extern long sysctl_sctp_mem[3]; 55007e3936SVlad Yasevich extern int sysctl_sctp_rmem[3]; 56007e3936SVlad Yasevich extern int sysctl_sctp_wmem[3]; 574d93df0aSNeil Horman 58b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, 593c68198eSNeil Horman void __user *buffer, size_t *lenp, 603c68198eSNeil Horman loff_t *ppos); 614f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, 624f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 634f3fdf3bSwangweidong loff_t *ppos); 644f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, 654f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 664f3fdf3bSwangweidong loff_t *ppos); 674f3fdf3bSwangweidong 68fe2c6338SJoe Perches static struct ctl_table sctp_table[] = { 691da177e4SLinus Torvalds { 704d93df0aSNeil Horman .procname = "sctp_mem", 714d93df0aSNeil Horman .data = &sysctl_sctp_mem, 724d93df0aSNeil Horman .maxlen = sizeof(sysctl_sctp_mem), 734d93df0aSNeil Horman .mode = 0644, 748d987e5cSEric Dumazet .proc_handler = proc_doulongvec_minmax 754d93df0aSNeil Horman }, 764d93df0aSNeil Horman { 774d93df0aSNeil Horman .procname = "sctp_rmem", 784d93df0aSNeil Horman .data = &sysctl_sctp_rmem, 794d93df0aSNeil Horman .maxlen = sizeof(sysctl_sctp_rmem), 804d93df0aSNeil Horman .mode = 0644, 816d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec, 824d93df0aSNeil Horman }, 834d93df0aSNeil Horman { 844d93df0aSNeil Horman .procname = "sctp_wmem", 854d93df0aSNeil Horman .data = &sysctl_sctp_wmem, 864d93df0aSNeil Horman .maxlen = sizeof(sysctl_sctp_wmem), 874d93df0aSNeil Horman .mode = 0644, 886d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec, 894d93df0aSNeil Horman }, 90e1fc3b14SEric W. Biederman 91e1fc3b14SEric W. Biederman { /* sentinel */ } 92e1fc3b14SEric W. Biederman }; 93e1fc3b14SEric W. Biederman 94fe2c6338SJoe Perches static struct ctl_table sctp_net_table[] = { 95a29a5bd4SVlad Yasevich { 96e1fc3b14SEric W. Biederman .procname = "rto_initial", 97e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_initial, 98e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 99e1fc3b14SEric W. Biederman .mode = 0644, 100e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 101e1fc3b14SEric W. Biederman .extra1 = &one, 102e1fc3b14SEric W. Biederman .extra2 = &timer_max 103e1fc3b14SEric W. Biederman }, 104e1fc3b14SEric W. Biederman { 105e1fc3b14SEric W. Biederman .procname = "rto_min", 106e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_min, 107e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 108e1fc3b14SEric W. Biederman .mode = 0644, 1094f3fdf3bSwangweidong .proc_handler = proc_sctp_do_rto_min, 110e1fc3b14SEric W. Biederman .extra1 = &one, 1114f3fdf3bSwangweidong .extra2 = &init_net.sctp.rto_max 112e1fc3b14SEric W. Biederman }, 113e1fc3b14SEric W. Biederman { 114e1fc3b14SEric W. Biederman .procname = "rto_max", 115e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_max, 116e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 117e1fc3b14SEric W. Biederman .mode = 0644, 1184f3fdf3bSwangweidong .proc_handler = proc_sctp_do_rto_max, 1194f3fdf3bSwangweidong .extra1 = &init_net.sctp.rto_min, 120e1fc3b14SEric W. Biederman .extra2 = &timer_max 121e1fc3b14SEric W. Biederman }, 122e1fc3b14SEric W. Biederman { 123e1fc3b14SEric W. Biederman .procname = "rto_alpha_exp_divisor", 124e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_alpha, 125e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 126e1fc3b14SEric W. Biederman .mode = 0444, 127e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 128e1fc3b14SEric W. Biederman }, 129e1fc3b14SEric W. Biederman { 130e1fc3b14SEric W. Biederman .procname = "rto_beta_exp_divisor", 131e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_beta, 132e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 133e1fc3b14SEric W. Biederman .mode = 0444, 134e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 135e1fc3b14SEric W. Biederman }, 136e1fc3b14SEric W. Biederman { 137e1fc3b14SEric W. Biederman .procname = "max_burst", 138e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_burst, 139e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 140e1fc3b14SEric W. Biederman .mode = 0644, 141e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 142e1fc3b14SEric W. Biederman .extra1 = &zero, 143e1fc3b14SEric W. Biederman .extra2 = &int_max 144e1fc3b14SEric W. Biederman }, 145e1fc3b14SEric W. Biederman { 146e1fc3b14SEric W. Biederman .procname = "cookie_preserve_enable", 147e1fc3b14SEric W. Biederman .data = &init_net.sctp.cookie_preserve_enable, 148e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 149e1fc3b14SEric W. Biederman .mode = 0644, 150e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 151e1fc3b14SEric W. Biederman }, 152e1fc3b14SEric W. Biederman { 1533c68198eSNeil Horman .procname = "cookie_hmac_alg", 15422a1f514Swangweidong .data = &init_net.sctp.sctp_hmac_alg, 1553c68198eSNeil Horman .maxlen = 8, 1563c68198eSNeil Horman .mode = 0644, 1573c68198eSNeil Horman .proc_handler = proc_sctp_do_hmac_alg, 1583c68198eSNeil Horman }, 1593c68198eSNeil Horman { 160e1fc3b14SEric W. Biederman .procname = "valid_cookie_life", 161e1fc3b14SEric W. Biederman .data = &init_net.sctp.valid_cookie_life, 162e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 163e1fc3b14SEric W. Biederman .mode = 0644, 164e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 165e1fc3b14SEric W. Biederman .extra1 = &one, 166e1fc3b14SEric W. Biederman .extra2 = &timer_max 167e1fc3b14SEric W. Biederman }, 168e1fc3b14SEric W. Biederman { 169e1fc3b14SEric W. Biederman .procname = "sack_timeout", 170e1fc3b14SEric W. Biederman .data = &init_net.sctp.sack_timeout, 171e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 172e1fc3b14SEric W. Biederman .mode = 0644, 173e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 174e1fc3b14SEric W. Biederman .extra1 = &sack_timer_min, 175e1fc3b14SEric W. Biederman .extra2 = &sack_timer_max, 176e1fc3b14SEric W. Biederman }, 177e1fc3b14SEric W. Biederman { 178e1fc3b14SEric W. Biederman .procname = "hb_interval", 179e1fc3b14SEric W. Biederman .data = &init_net.sctp.hb_interval, 180e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 181e1fc3b14SEric W. Biederman .mode = 0644, 182e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 183e1fc3b14SEric W. Biederman .extra1 = &one, 184e1fc3b14SEric W. Biederman .extra2 = &timer_max 185e1fc3b14SEric W. Biederman }, 186e1fc3b14SEric W. Biederman { 187e1fc3b14SEric W. Biederman .procname = "association_max_retrans", 188e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_retrans_association, 189e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 190e1fc3b14SEric W. Biederman .mode = 0644, 191e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 192e1fc3b14SEric W. Biederman .extra1 = &one, 193e1fc3b14SEric W. Biederman .extra2 = &int_max 194e1fc3b14SEric W. Biederman }, 195e1fc3b14SEric W. Biederman { 196e1fc3b14SEric W. Biederman .procname = "path_max_retrans", 197e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_retrans_path, 198e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 199e1fc3b14SEric W. Biederman .mode = 0644, 200e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 201e1fc3b14SEric W. Biederman .extra1 = &one, 202e1fc3b14SEric W. Biederman .extra2 = &int_max 203e1fc3b14SEric W. Biederman }, 204e1fc3b14SEric W. Biederman { 205e1fc3b14SEric W. Biederman .procname = "max_init_retransmits", 206e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_retrans_init, 207e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 208e1fc3b14SEric W. Biederman .mode = 0644, 209e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 210e1fc3b14SEric W. Biederman .extra1 = &one, 211e1fc3b14SEric W. Biederman .extra2 = &int_max 212e1fc3b14SEric W. Biederman }, 213e1fc3b14SEric W. Biederman { 214e1fc3b14SEric W. Biederman .procname = "pf_retrans", 215e1fc3b14SEric W. Biederman .data = &init_net.sctp.pf_retrans, 216e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 217e1fc3b14SEric W. Biederman .mode = 0644, 218e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 219e1fc3b14SEric W. Biederman .extra1 = &zero, 220e1fc3b14SEric W. Biederman .extra2 = &int_max 221e1fc3b14SEric W. Biederman }, 222e1fc3b14SEric W. Biederman { 223e1fc3b14SEric W. Biederman .procname = "sndbuf_policy", 224e1fc3b14SEric W. Biederman .data = &init_net.sctp.sndbuf_policy, 225e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 226e1fc3b14SEric W. Biederman .mode = 0644, 227e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 228e1fc3b14SEric W. Biederman }, 229e1fc3b14SEric W. Biederman { 230e1fc3b14SEric W. Biederman .procname = "rcvbuf_policy", 231e1fc3b14SEric W. Biederman .data = &init_net.sctp.rcvbuf_policy, 232e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 233e1fc3b14SEric W. Biederman .mode = 0644, 234e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 235e1fc3b14SEric W. Biederman }, 236e1fc3b14SEric W. Biederman { 237e1fc3b14SEric W. Biederman .procname = "default_auto_asconf", 238e1fc3b14SEric W. Biederman .data = &init_net.sctp.default_auto_asconf, 239e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 240e1fc3b14SEric W. Biederman .mode = 0644, 241e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 242e1fc3b14SEric W. Biederman }, 243e1fc3b14SEric W. Biederman { 244e1fc3b14SEric W. Biederman .procname = "addip_enable", 245e1fc3b14SEric W. Biederman .data = &init_net.sctp.addip_enable, 246a29a5bd4SVlad Yasevich .maxlen = sizeof(int), 247a29a5bd4SVlad Yasevich .mode = 0644, 2486d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec, 249a29a5bd4SVlad Yasevich }, 25073d9c4fdSVlad Yasevich { 25173d9c4fdSVlad Yasevich .procname = "addip_noauth_enable", 252e1fc3b14SEric W. Biederman .data = &init_net.sctp.addip_noauth, 253e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 254e1fc3b14SEric W. Biederman .mode = 0644, 255e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 256e1fc3b14SEric W. Biederman }, 257e1fc3b14SEric W. Biederman { 258e1fc3b14SEric W. Biederman .procname = "prsctp_enable", 259e1fc3b14SEric W. Biederman .data = &init_net.sctp.prsctp_enable, 260e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 261e1fc3b14SEric W. Biederman .mode = 0644, 262e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 263e1fc3b14SEric W. Biederman }, 264e1fc3b14SEric W. Biederman { 265e1fc3b14SEric W. Biederman .procname = "auth_enable", 266e1fc3b14SEric W. Biederman .data = &init_net.sctp.auth_enable, 26773d9c4fdSVlad Yasevich .maxlen = sizeof(int), 26873d9c4fdSVlad Yasevich .mode = 0644, 2696d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec, 27073d9c4fdSVlad Yasevich }, 27172388433SBhaskar Dutta { 27272388433SBhaskar Dutta .procname = "addr_scope_policy", 273e1fc3b14SEric W. Biederman .data = &init_net.sctp.scope_policy, 27472388433SBhaskar Dutta .maxlen = sizeof(int), 27572388433SBhaskar Dutta .mode = 0644, 2766d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 27772388433SBhaskar Dutta .extra1 = &zero, 27872388433SBhaskar Dutta .extra2 = &addr_scope_max, 27972388433SBhaskar Dutta }, 28090f2f531SVlad Yasevich { 28190f2f531SVlad Yasevich .procname = "rwnd_update_shift", 282e1fc3b14SEric W. Biederman .data = &init_net.sctp.rwnd_upd_shift, 28390f2f531SVlad Yasevich .maxlen = sizeof(int), 28490f2f531SVlad Yasevich .mode = 0644, 28590f2f531SVlad Yasevich .proc_handler = &proc_dointvec_minmax, 28690f2f531SVlad Yasevich .extra1 = &one, 28790f2f531SVlad Yasevich .extra2 = &rwnd_scale_max, 28890f2f531SVlad Yasevich }, 2892692ba61SXi Wang { 2902692ba61SXi Wang .procname = "max_autoclose", 291e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_autoclose, 2922692ba61SXi Wang .maxlen = sizeof(unsigned long), 2932692ba61SXi Wang .mode = 0644, 2942692ba61SXi Wang .proc_handler = &proc_doulongvec_minmax, 2952692ba61SXi Wang .extra1 = &max_autoclose_min, 2962692ba61SXi Wang .extra2 = &max_autoclose_max, 2972692ba61SXi Wang }, 29871acc0ddSDavid S. Miller 299d7fc02c7SLinus Torvalds { /* sentinel */ } 3001da177e4SLinus Torvalds }; 3011da177e4SLinus Torvalds 302b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, 3033c68198eSNeil Horman void __user *buffer, size_t *lenp, 3043c68198eSNeil Horman loff_t *ppos) 3053c68198eSNeil Horman { 3063c68198eSNeil Horman struct net *net = current->nsproxy->net_ns; 3073c68198eSNeil Horman char tmp[8]; 308fe2c6338SJoe Perches struct ctl_table tbl; 3093c68198eSNeil Horman int ret; 3103c68198eSNeil Horman int changed = 0; 3113c68198eSNeil Horman char *none = "none"; 3123c68198eSNeil Horman 3133c68198eSNeil Horman memset(&tbl, 0, sizeof(struct ctl_table)); 3143c68198eSNeil Horman 3153c68198eSNeil Horman if (write) { 3163c68198eSNeil Horman tbl.data = tmp; 3173c68198eSNeil Horman tbl.maxlen = 8; 3183c68198eSNeil Horman } else { 3193c68198eSNeil Horman tbl.data = net->sctp.sctp_hmac_alg ? : none; 3203c68198eSNeil Horman tbl.maxlen = strlen(tbl.data); 3213c68198eSNeil Horman } 3223c68198eSNeil Horman ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 3233c68198eSNeil Horman 3243c68198eSNeil Horman if (write) { 3253c68198eSNeil Horman #ifdef CONFIG_CRYPTO_MD5 3263c68198eSNeil Horman if (!strncmp(tmp, "md5", 3)) { 3273c68198eSNeil Horman net->sctp.sctp_hmac_alg = "md5"; 3283c68198eSNeil Horman changed = 1; 3293c68198eSNeil Horman } 3303c68198eSNeil Horman #endif 3313c68198eSNeil Horman #ifdef CONFIG_CRYPTO_SHA1 3323c68198eSNeil Horman if (!strncmp(tmp, "sha1", 4)) { 3333c68198eSNeil Horman net->sctp.sctp_hmac_alg = "sha1"; 3343c68198eSNeil Horman changed = 1; 3353c68198eSNeil Horman } 3363c68198eSNeil Horman #endif 3373c68198eSNeil Horman if (!strncmp(tmp, "none", 4)) { 3383c68198eSNeil Horman net->sctp.sctp_hmac_alg = NULL; 3393c68198eSNeil Horman changed = 1; 3403c68198eSNeil Horman } 3413c68198eSNeil Horman 3423c68198eSNeil Horman if (!changed) 3433c68198eSNeil Horman ret = -EINVAL; 3443c68198eSNeil Horman } 3453c68198eSNeil Horman 3463c68198eSNeil Horman return ret; 3473c68198eSNeil Horman } 3483c68198eSNeil Horman 3494f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, 3504f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 3514f3fdf3bSwangweidong loff_t *ppos) 3524f3fdf3bSwangweidong { 3534f3fdf3bSwangweidong struct net *net = current->nsproxy->net_ns; 3544f3fdf3bSwangweidong int new_value; 3554f3fdf3bSwangweidong struct ctl_table tbl; 3564f3fdf3bSwangweidong unsigned int min = *(unsigned int *) ctl->extra1; 3574f3fdf3bSwangweidong unsigned int max = *(unsigned int *) ctl->extra2; 3584f3fdf3bSwangweidong int ret; 3594f3fdf3bSwangweidong 3604f3fdf3bSwangweidong memset(&tbl, 0, sizeof(struct ctl_table)); 3614f3fdf3bSwangweidong tbl.maxlen = sizeof(unsigned int); 3624f3fdf3bSwangweidong 3634f3fdf3bSwangweidong if (write) 3644f3fdf3bSwangweidong tbl.data = &new_value; 3654f3fdf3bSwangweidong else 3664f3fdf3bSwangweidong tbl.data = &net->sctp.rto_min; 3674f3fdf3bSwangweidong ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); 3684f3fdf3bSwangweidong if (write) { 3694f3fdf3bSwangweidong if (ret || new_value > max || new_value < min) 3704f3fdf3bSwangweidong return -EINVAL; 3714f3fdf3bSwangweidong net->sctp.rto_min = new_value; 3724f3fdf3bSwangweidong } 3734f3fdf3bSwangweidong return ret; 3744f3fdf3bSwangweidong } 3754f3fdf3bSwangweidong 3764f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, 3774f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 3784f3fdf3bSwangweidong loff_t *ppos) 3794f3fdf3bSwangweidong { 3804f3fdf3bSwangweidong struct net *net = current->nsproxy->net_ns; 3814f3fdf3bSwangweidong int new_value; 3824f3fdf3bSwangweidong struct ctl_table tbl; 3834f3fdf3bSwangweidong unsigned int min = *(unsigned int *) ctl->extra1; 3844f3fdf3bSwangweidong unsigned int max = *(unsigned int *) ctl->extra2; 3854f3fdf3bSwangweidong int ret; 3864f3fdf3bSwangweidong 3874f3fdf3bSwangweidong memset(&tbl, 0, sizeof(struct ctl_table)); 3884f3fdf3bSwangweidong tbl.maxlen = sizeof(unsigned int); 3894f3fdf3bSwangweidong 3904f3fdf3bSwangweidong if (write) 3914f3fdf3bSwangweidong tbl.data = &new_value; 3924f3fdf3bSwangweidong else 3934f3fdf3bSwangweidong tbl.data = &net->sctp.rto_max; 3944f3fdf3bSwangweidong ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); 3954f3fdf3bSwangweidong if (write) { 3964f3fdf3bSwangweidong if (ret || new_value > max || new_value < min) 3974f3fdf3bSwangweidong return -EINVAL; 3984f3fdf3bSwangweidong net->sctp.rto_max = new_value; 3994f3fdf3bSwangweidong } 4004f3fdf3bSwangweidong return ret; 4014f3fdf3bSwangweidong } 4024f3fdf3bSwangweidong 403ebb7e95dSEric W. Biederman int sctp_sysctl_net_register(struct net *net) 404ebb7e95dSEric W. Biederman { 405ebb7e95dSEric W. Biederman struct ctl_table *table; 406e1fc3b14SEric W. Biederman int i; 407ebb7e95dSEric W. Biederman 408ebb7e95dSEric W. Biederman table = kmemdup(sctp_net_table, sizeof(sctp_net_table), GFP_KERNEL); 409ebb7e95dSEric W. Biederman if (!table) 410ebb7e95dSEric W. Biederman return -ENOMEM; 411ebb7e95dSEric W. Biederman 412e1fc3b14SEric W. Biederman for (i = 0; table[i].data; i++) 413e1fc3b14SEric W. Biederman table[i].data += (char *)(&net->sctp) - (char *)&init_net.sctp; 414e1fc3b14SEric W. Biederman 415ebb7e95dSEric W. Biederman net->sctp.sysctl_header = register_net_sysctl(net, "net/sctp", table); 416ebb7e95dSEric W. Biederman return 0; 417ebb7e95dSEric W. Biederman } 418ebb7e95dSEric W. Biederman 419ebb7e95dSEric W. Biederman void sctp_sysctl_net_unregister(struct net *net) 420ebb7e95dSEric W. Biederman { 4215f19d121SVlad Yasevich struct ctl_table *table; 4225f19d121SVlad Yasevich 4235f19d121SVlad Yasevich table = net->sctp.sysctl_header->ctl_table_arg; 424ebb7e95dSEric W. Biederman unregister_net_sysctl_table(net->sctp.sysctl_header); 4255f19d121SVlad Yasevich kfree(table); 426ebb7e95dSEric W. Biederman } 427ebb7e95dSEric W. Biederman 4281da177e4SLinus Torvalds static struct ctl_table_header *sctp_sysctl_header; 4291da177e4SLinus Torvalds 4301da177e4SLinus Torvalds /* Sysctl registration. */ 4311da177e4SLinus Torvalds void sctp_sysctl_register(void) 4321da177e4SLinus Torvalds { 433ec8f23ceSEric W. Biederman sctp_sysctl_header = register_net_sysctl(&init_net, "net/sctp", sctp_table); 4341da177e4SLinus Torvalds } 4351da177e4SLinus Torvalds 4361da177e4SLinus Torvalds /* Sysctl deregistration. */ 4371da177e4SLinus Torvalds void sctp_sysctl_unregister(void) 4381da177e4SLinus Torvalds { 4395dd3df10SEric W. Biederman unregister_net_sysctl_table(sctp_sysctl_header); 4401da177e4SLinus Torvalds } 441