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 37b58537a1SDaniel Borkmann #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 38b58537a1SDaniel Borkmann 391da177e4SLinus Torvalds #include <net/sctp/structs.h> 408c5955d8SAdrian Bunk #include <net/sctp/sctp.h> 411da177e4SLinus Torvalds #include <linux/sysctl.h> 421da177e4SLinus Torvalds 433fd091e7SVladislav Yasevich static int zero = 0; 443fd091e7SVladislav Yasevich static int one = 1; 453fd091e7SVladislav Yasevich static int timer_max = 86400000; /* ms in one day */ 463fd091e7SVladislav Yasevich static int int_max = INT_MAX; 47d48e074dSJean-Mickael Guerin static int sack_timer_min = 1; 48d48e074dSJean-Mickael Guerin static int sack_timer_max = 500; 4972388433SBhaskar Dutta static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ 5090f2f531SVlad Yasevich static int rwnd_scale_max = 16; 51b58537a1SDaniel Borkmann static int rto_alpha_min = 0; 52b58537a1SDaniel Borkmann static int rto_beta_min = 0; 53b58537a1SDaniel Borkmann static int rto_alpha_max = 1000; 54b58537a1SDaniel Borkmann static int rto_beta_max = 1000; 55b58537a1SDaniel Borkmann 562692ba61SXi Wang static unsigned long max_autoclose_min = 0; 572692ba61SXi Wang static unsigned long max_autoclose_max = 582692ba61SXi Wang (MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX) 592692ba61SXi Wang ? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ; 601da177e4SLinus Torvalds 618d987e5cSEric Dumazet extern long sysctl_sctp_mem[3]; 62007e3936SVlad Yasevich extern int sysctl_sctp_rmem[3]; 63007e3936SVlad Yasevich extern int sysctl_sctp_wmem[3]; 644d93df0aSNeil Horman 65b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, 663c68198eSNeil Horman void __user *buffer, size_t *lenp, 673c68198eSNeil Horman loff_t *ppos); 684f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, 694f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 704f3fdf3bSwangweidong loff_t *ppos); 714f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, 724f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 734f3fdf3bSwangweidong loff_t *ppos); 74b58537a1SDaniel Borkmann static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write, 75b58537a1SDaniel Borkmann void __user *buffer, size_t *lenp, 76b58537a1SDaniel Borkmann loff_t *ppos); 77b14878ccSVlad Yasevich static int proc_sctp_do_auth(struct ctl_table *ctl, int write, 78b14878ccSVlad Yasevich void __user *buffer, size_t *lenp, 79b14878ccSVlad Yasevich loff_t *ppos); 804f3fdf3bSwangweidong 81fe2c6338SJoe Perches static struct ctl_table sctp_table[] = { 821da177e4SLinus Torvalds { 834d93df0aSNeil Horman .procname = "sctp_mem", 844d93df0aSNeil Horman .data = &sysctl_sctp_mem, 854d93df0aSNeil Horman .maxlen = sizeof(sysctl_sctp_mem), 864d93df0aSNeil Horman .mode = 0644, 878d987e5cSEric Dumazet .proc_handler = proc_doulongvec_minmax 884d93df0aSNeil Horman }, 894d93df0aSNeil Horman { 904d93df0aSNeil Horman .procname = "sctp_rmem", 914d93df0aSNeil Horman .data = &sysctl_sctp_rmem, 924d93df0aSNeil Horman .maxlen = sizeof(sysctl_sctp_rmem), 934d93df0aSNeil Horman .mode = 0644, 946d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec, 954d93df0aSNeil Horman }, 964d93df0aSNeil Horman { 974d93df0aSNeil Horman .procname = "sctp_wmem", 984d93df0aSNeil Horman .data = &sysctl_sctp_wmem, 994d93df0aSNeil Horman .maxlen = sizeof(sysctl_sctp_wmem), 1004d93df0aSNeil Horman .mode = 0644, 1016d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec, 1024d93df0aSNeil Horman }, 103e1fc3b14SEric W. Biederman 104e1fc3b14SEric W. Biederman { /* sentinel */ } 105e1fc3b14SEric W. Biederman }; 106e1fc3b14SEric W. Biederman 107fe2c6338SJoe Perches static struct ctl_table sctp_net_table[] = { 108a29a5bd4SVlad Yasevich { 109e1fc3b14SEric W. Biederman .procname = "rto_initial", 110e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_initial, 111e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 112e1fc3b14SEric W. Biederman .mode = 0644, 113e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 114e1fc3b14SEric W. Biederman .extra1 = &one, 115e1fc3b14SEric W. Biederman .extra2 = &timer_max 116e1fc3b14SEric W. Biederman }, 117e1fc3b14SEric W. Biederman { 118e1fc3b14SEric W. Biederman .procname = "rto_min", 119e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_min, 120e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 121e1fc3b14SEric W. Biederman .mode = 0644, 1224f3fdf3bSwangweidong .proc_handler = proc_sctp_do_rto_min, 123e1fc3b14SEric W. Biederman .extra1 = &one, 1244f3fdf3bSwangweidong .extra2 = &init_net.sctp.rto_max 125e1fc3b14SEric W. Biederman }, 126e1fc3b14SEric W. Biederman { 127e1fc3b14SEric W. Biederman .procname = "rto_max", 128e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_max, 129e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 130e1fc3b14SEric W. Biederman .mode = 0644, 1314f3fdf3bSwangweidong .proc_handler = proc_sctp_do_rto_max, 1324f3fdf3bSwangweidong .extra1 = &init_net.sctp.rto_min, 133e1fc3b14SEric W. Biederman .extra2 = &timer_max 134e1fc3b14SEric W. Biederman }, 135e1fc3b14SEric W. Biederman { 136e1fc3b14SEric W. Biederman .procname = "rto_alpha_exp_divisor", 137e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_alpha, 138e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 139b58537a1SDaniel Borkmann .mode = 0644, 140b58537a1SDaniel Borkmann .proc_handler = proc_sctp_do_alpha_beta, 141b58537a1SDaniel Borkmann .extra1 = &rto_alpha_min, 142b58537a1SDaniel Borkmann .extra2 = &rto_alpha_max, 143e1fc3b14SEric W. Biederman }, 144e1fc3b14SEric W. Biederman { 145e1fc3b14SEric W. Biederman .procname = "rto_beta_exp_divisor", 146e1fc3b14SEric W. Biederman .data = &init_net.sctp.rto_beta, 147e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 148b58537a1SDaniel Borkmann .mode = 0644, 149b58537a1SDaniel Borkmann .proc_handler = proc_sctp_do_alpha_beta, 150b58537a1SDaniel Borkmann .extra1 = &rto_beta_min, 151b58537a1SDaniel Borkmann .extra2 = &rto_beta_max, 152e1fc3b14SEric W. Biederman }, 153e1fc3b14SEric W. Biederman { 154e1fc3b14SEric W. Biederman .procname = "max_burst", 155e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_burst, 156e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 157e1fc3b14SEric W. Biederman .mode = 0644, 158e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 159e1fc3b14SEric W. Biederman .extra1 = &zero, 160e1fc3b14SEric W. Biederman .extra2 = &int_max 161e1fc3b14SEric W. Biederman }, 162e1fc3b14SEric W. Biederman { 163e1fc3b14SEric W. Biederman .procname = "cookie_preserve_enable", 164e1fc3b14SEric W. Biederman .data = &init_net.sctp.cookie_preserve_enable, 165e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 166e1fc3b14SEric W. Biederman .mode = 0644, 167e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 168e1fc3b14SEric W. Biederman }, 169e1fc3b14SEric W. Biederman { 1703c68198eSNeil Horman .procname = "cookie_hmac_alg", 17122a1f514Swangweidong .data = &init_net.sctp.sctp_hmac_alg, 1723c68198eSNeil Horman .maxlen = 8, 1733c68198eSNeil Horman .mode = 0644, 1743c68198eSNeil Horman .proc_handler = proc_sctp_do_hmac_alg, 1753c68198eSNeil Horman }, 1763c68198eSNeil Horman { 177e1fc3b14SEric W. Biederman .procname = "valid_cookie_life", 178e1fc3b14SEric W. Biederman .data = &init_net.sctp.valid_cookie_life, 179e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 180e1fc3b14SEric W. Biederman .mode = 0644, 181e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 182e1fc3b14SEric W. Biederman .extra1 = &one, 183e1fc3b14SEric W. Biederman .extra2 = &timer_max 184e1fc3b14SEric W. Biederman }, 185e1fc3b14SEric W. Biederman { 186e1fc3b14SEric W. Biederman .procname = "sack_timeout", 187e1fc3b14SEric W. Biederman .data = &init_net.sctp.sack_timeout, 188e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 189e1fc3b14SEric W. Biederman .mode = 0644, 190e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 191e1fc3b14SEric W. Biederman .extra1 = &sack_timer_min, 192e1fc3b14SEric W. Biederman .extra2 = &sack_timer_max, 193e1fc3b14SEric W. Biederman }, 194e1fc3b14SEric W. Biederman { 195e1fc3b14SEric W. Biederman .procname = "hb_interval", 196e1fc3b14SEric W. Biederman .data = &init_net.sctp.hb_interval, 197e1fc3b14SEric W. Biederman .maxlen = sizeof(unsigned int), 198e1fc3b14SEric W. Biederman .mode = 0644, 199e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 200e1fc3b14SEric W. Biederman .extra1 = &one, 201e1fc3b14SEric W. Biederman .extra2 = &timer_max 202e1fc3b14SEric W. Biederman }, 203e1fc3b14SEric W. Biederman { 204e1fc3b14SEric W. Biederman .procname = "association_max_retrans", 205e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_retrans_association, 206e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 207e1fc3b14SEric W. Biederman .mode = 0644, 208e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 209e1fc3b14SEric W. Biederman .extra1 = &one, 210e1fc3b14SEric W. Biederman .extra2 = &int_max 211e1fc3b14SEric W. Biederman }, 212e1fc3b14SEric W. Biederman { 213e1fc3b14SEric W. Biederman .procname = "path_max_retrans", 214e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_retrans_path, 215e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 216e1fc3b14SEric W. Biederman .mode = 0644, 217e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 218e1fc3b14SEric W. Biederman .extra1 = &one, 219e1fc3b14SEric W. Biederman .extra2 = &int_max 220e1fc3b14SEric W. Biederman }, 221e1fc3b14SEric W. Biederman { 222e1fc3b14SEric W. Biederman .procname = "max_init_retransmits", 223e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_retrans_init, 224e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 225e1fc3b14SEric W. Biederman .mode = 0644, 226e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 227e1fc3b14SEric W. Biederman .extra1 = &one, 228e1fc3b14SEric W. Biederman .extra2 = &int_max 229e1fc3b14SEric W. Biederman }, 230e1fc3b14SEric W. Biederman { 231e1fc3b14SEric W. Biederman .procname = "pf_retrans", 232e1fc3b14SEric W. Biederman .data = &init_net.sctp.pf_retrans, 233e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 234e1fc3b14SEric W. Biederman .mode = 0644, 235e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec_minmax, 236e1fc3b14SEric W. Biederman .extra1 = &zero, 237e1fc3b14SEric W. Biederman .extra2 = &int_max 238e1fc3b14SEric W. Biederman }, 239e1fc3b14SEric W. Biederman { 240e1fc3b14SEric W. Biederman .procname = "sndbuf_policy", 241e1fc3b14SEric W. Biederman .data = &init_net.sctp.sndbuf_policy, 242e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 243e1fc3b14SEric W. Biederman .mode = 0644, 244e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 245e1fc3b14SEric W. Biederman }, 246e1fc3b14SEric W. Biederman { 247e1fc3b14SEric W. Biederman .procname = "rcvbuf_policy", 248e1fc3b14SEric W. Biederman .data = &init_net.sctp.rcvbuf_policy, 249e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 250e1fc3b14SEric W. Biederman .mode = 0644, 251e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 252e1fc3b14SEric W. Biederman }, 253e1fc3b14SEric W. Biederman { 254e1fc3b14SEric W. Biederman .procname = "default_auto_asconf", 255e1fc3b14SEric W. Biederman .data = &init_net.sctp.default_auto_asconf, 256e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 257e1fc3b14SEric W. Biederman .mode = 0644, 258e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 259e1fc3b14SEric W. Biederman }, 260e1fc3b14SEric W. Biederman { 261e1fc3b14SEric W. Biederman .procname = "addip_enable", 262e1fc3b14SEric W. Biederman .data = &init_net.sctp.addip_enable, 263a29a5bd4SVlad Yasevich .maxlen = sizeof(int), 264a29a5bd4SVlad Yasevich .mode = 0644, 2656d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec, 266a29a5bd4SVlad Yasevich }, 26773d9c4fdSVlad Yasevich { 26873d9c4fdSVlad Yasevich .procname = "addip_noauth_enable", 269e1fc3b14SEric W. Biederman .data = &init_net.sctp.addip_noauth, 270e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 271e1fc3b14SEric W. Biederman .mode = 0644, 272e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 273e1fc3b14SEric W. Biederman }, 274e1fc3b14SEric W. Biederman { 275e1fc3b14SEric W. Biederman .procname = "prsctp_enable", 276e1fc3b14SEric W. Biederman .data = &init_net.sctp.prsctp_enable, 277e1fc3b14SEric W. Biederman .maxlen = sizeof(int), 278e1fc3b14SEric W. Biederman .mode = 0644, 279e1fc3b14SEric W. Biederman .proc_handler = proc_dointvec, 280e1fc3b14SEric W. Biederman }, 281e1fc3b14SEric W. Biederman { 282e1fc3b14SEric W. Biederman .procname = "auth_enable", 283e1fc3b14SEric W. Biederman .data = &init_net.sctp.auth_enable, 28473d9c4fdSVlad Yasevich .maxlen = sizeof(int), 28573d9c4fdSVlad Yasevich .mode = 0644, 286b14878ccSVlad Yasevich .proc_handler = proc_sctp_do_auth, 28773d9c4fdSVlad Yasevich }, 28872388433SBhaskar Dutta { 28972388433SBhaskar Dutta .procname = "addr_scope_policy", 290e1fc3b14SEric W. Biederman .data = &init_net.sctp.scope_policy, 29172388433SBhaskar Dutta .maxlen = sizeof(int), 29272388433SBhaskar Dutta .mode = 0644, 2936d456111SEric W. Biederman .proc_handler = proc_dointvec_minmax, 29472388433SBhaskar Dutta .extra1 = &zero, 29572388433SBhaskar Dutta .extra2 = &addr_scope_max, 29672388433SBhaskar Dutta }, 29790f2f531SVlad Yasevich { 29890f2f531SVlad Yasevich .procname = "rwnd_update_shift", 299e1fc3b14SEric W. Biederman .data = &init_net.sctp.rwnd_upd_shift, 30090f2f531SVlad Yasevich .maxlen = sizeof(int), 30190f2f531SVlad Yasevich .mode = 0644, 30290f2f531SVlad Yasevich .proc_handler = &proc_dointvec_minmax, 30390f2f531SVlad Yasevich .extra1 = &one, 30490f2f531SVlad Yasevich .extra2 = &rwnd_scale_max, 30590f2f531SVlad Yasevich }, 3062692ba61SXi Wang { 3072692ba61SXi Wang .procname = "max_autoclose", 308e1fc3b14SEric W. Biederman .data = &init_net.sctp.max_autoclose, 3092692ba61SXi Wang .maxlen = sizeof(unsigned long), 3102692ba61SXi Wang .mode = 0644, 3112692ba61SXi Wang .proc_handler = &proc_doulongvec_minmax, 3122692ba61SXi Wang .extra1 = &max_autoclose_min, 3132692ba61SXi Wang .extra2 = &max_autoclose_max, 3142692ba61SXi Wang }, 31571acc0ddSDavid S. Miller 316d7fc02c7SLinus Torvalds { /* sentinel */ } 3171da177e4SLinus Torvalds }; 3181da177e4SLinus Torvalds 319b486b228Swangweidong static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, 3203c68198eSNeil Horman void __user *buffer, size_t *lenp, 3213c68198eSNeil Horman loff_t *ppos) 3223c68198eSNeil Horman { 3233c68198eSNeil Horman struct net *net = current->nsproxy->net_ns; 324fe2c6338SJoe Perches struct ctl_table tbl; 325ff5e92c1SDaniel Borkmann bool changed = false; 3263c68198eSNeil Horman char *none = "none"; 327ff5e92c1SDaniel Borkmann char tmp[8]; 328ff5e92c1SDaniel Borkmann int ret; 3293c68198eSNeil Horman 3303c68198eSNeil Horman memset(&tbl, 0, sizeof(struct ctl_table)); 3313c68198eSNeil Horman 3323c68198eSNeil Horman if (write) { 3333c68198eSNeil Horman tbl.data = tmp; 334ff5e92c1SDaniel Borkmann tbl.maxlen = sizeof(tmp); 3353c68198eSNeil Horman } else { 3363c68198eSNeil Horman tbl.data = net->sctp.sctp_hmac_alg ? : none; 3373c68198eSNeil Horman tbl.maxlen = strlen(tbl.data); 3383c68198eSNeil Horman } 3393c68198eSNeil Horman 340ff5e92c1SDaniel Borkmann ret = proc_dostring(&tbl, write, buffer, lenp, ppos); 341ff5e92c1SDaniel Borkmann if (write && ret == 0) { 3423c68198eSNeil Horman #ifdef CONFIG_CRYPTO_MD5 3433c68198eSNeil Horman if (!strncmp(tmp, "md5", 3)) { 3443c68198eSNeil Horman net->sctp.sctp_hmac_alg = "md5"; 345ff5e92c1SDaniel Borkmann changed = true; 3463c68198eSNeil Horman } 3473c68198eSNeil Horman #endif 3483c68198eSNeil Horman #ifdef CONFIG_CRYPTO_SHA1 3493c68198eSNeil Horman if (!strncmp(tmp, "sha1", 4)) { 3503c68198eSNeil Horman net->sctp.sctp_hmac_alg = "sha1"; 351ff5e92c1SDaniel Borkmann changed = true; 3523c68198eSNeil Horman } 3533c68198eSNeil Horman #endif 3543c68198eSNeil Horman if (!strncmp(tmp, "none", 4)) { 3553c68198eSNeil Horman net->sctp.sctp_hmac_alg = NULL; 356ff5e92c1SDaniel Borkmann changed = true; 3573c68198eSNeil Horman } 3583c68198eSNeil Horman if (!changed) 3593c68198eSNeil Horman ret = -EINVAL; 3603c68198eSNeil Horman } 3613c68198eSNeil Horman 3623c68198eSNeil Horman return ret; 3633c68198eSNeil Horman } 3643c68198eSNeil Horman 3654f3fdf3bSwangweidong static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, 3664f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 3674f3fdf3bSwangweidong loff_t *ppos) 3684f3fdf3bSwangweidong { 3694f3fdf3bSwangweidong struct net *net = current->nsproxy->net_ns; 3704f3fdf3bSwangweidong unsigned int min = *(unsigned int *) ctl->extra1; 3714f3fdf3bSwangweidong unsigned int max = *(unsigned int *) ctl->extra2; 372ff5e92c1SDaniel Borkmann struct ctl_table tbl; 373ff5e92c1SDaniel Borkmann int ret, new_value; 3744f3fdf3bSwangweidong 3754f3fdf3bSwangweidong memset(&tbl, 0, sizeof(struct ctl_table)); 3764f3fdf3bSwangweidong tbl.maxlen = sizeof(unsigned int); 3774f3fdf3bSwangweidong 3784f3fdf3bSwangweidong if (write) 3794f3fdf3bSwangweidong tbl.data = &new_value; 3804f3fdf3bSwangweidong else 3814f3fdf3bSwangweidong tbl.data = &net->sctp.rto_min; 382ff5e92c1SDaniel Borkmann 3834f3fdf3bSwangweidong ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); 384ff5e92c1SDaniel Borkmann if (write && ret == 0) { 385ff5e92c1SDaniel Borkmann if (new_value > max || new_value < min) 3864f3fdf3bSwangweidong return -EINVAL; 387ff5e92c1SDaniel Borkmann 3884f3fdf3bSwangweidong net->sctp.rto_min = new_value; 3894f3fdf3bSwangweidong } 390ff5e92c1SDaniel Borkmann 3914f3fdf3bSwangweidong return ret; 3924f3fdf3bSwangweidong } 3934f3fdf3bSwangweidong 3944f3fdf3bSwangweidong static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, 3954f3fdf3bSwangweidong void __user *buffer, size_t *lenp, 3964f3fdf3bSwangweidong loff_t *ppos) 3974f3fdf3bSwangweidong { 3984f3fdf3bSwangweidong struct net *net = current->nsproxy->net_ns; 3994f3fdf3bSwangweidong unsigned int min = *(unsigned int *) ctl->extra1; 4004f3fdf3bSwangweidong unsigned int max = *(unsigned int *) ctl->extra2; 401ff5e92c1SDaniel Borkmann struct ctl_table tbl; 402ff5e92c1SDaniel Borkmann int ret, new_value; 4034f3fdf3bSwangweidong 4044f3fdf3bSwangweidong memset(&tbl, 0, sizeof(struct ctl_table)); 4054f3fdf3bSwangweidong tbl.maxlen = sizeof(unsigned int); 4064f3fdf3bSwangweidong 4074f3fdf3bSwangweidong if (write) 4084f3fdf3bSwangweidong tbl.data = &new_value; 4094f3fdf3bSwangweidong else 4104f3fdf3bSwangweidong tbl.data = &net->sctp.rto_max; 411ff5e92c1SDaniel Borkmann 4124f3fdf3bSwangweidong ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); 413ff5e92c1SDaniel Borkmann if (write && ret == 0) { 414ff5e92c1SDaniel Borkmann if (new_value > max || new_value < min) 4154f3fdf3bSwangweidong return -EINVAL; 416ff5e92c1SDaniel Borkmann 4174f3fdf3bSwangweidong net->sctp.rto_max = new_value; 4184f3fdf3bSwangweidong } 419ff5e92c1SDaniel Borkmann 4204f3fdf3bSwangweidong return ret; 4214f3fdf3bSwangweidong } 4224f3fdf3bSwangweidong 423b58537a1SDaniel Borkmann static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write, 424b58537a1SDaniel Borkmann void __user *buffer, size_t *lenp, 425b58537a1SDaniel Borkmann loff_t *ppos) 426b58537a1SDaniel Borkmann { 427b58537a1SDaniel Borkmann pr_warn_once("Changing rto_alpha or rto_beta may lead to " 428b58537a1SDaniel Borkmann "suboptimal rtt/srtt estimations!\n"); 429b58537a1SDaniel Borkmann 430b58537a1SDaniel Borkmann return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 431b58537a1SDaniel Borkmann } 432b58537a1SDaniel Borkmann 433b14878ccSVlad Yasevich static int proc_sctp_do_auth(struct ctl_table *ctl, int write, 434b14878ccSVlad Yasevich void __user *buffer, size_t *lenp, 435b14878ccSVlad Yasevich loff_t *ppos) 436b14878ccSVlad Yasevich { 437b14878ccSVlad Yasevich struct net *net = current->nsproxy->net_ns; 438b14878ccSVlad Yasevich struct ctl_table tbl; 439b14878ccSVlad Yasevich int new_value, ret; 440b14878ccSVlad Yasevich 441b14878ccSVlad Yasevich memset(&tbl, 0, sizeof(struct ctl_table)); 442b14878ccSVlad Yasevich tbl.maxlen = sizeof(unsigned int); 443b14878ccSVlad Yasevich 444b14878ccSVlad Yasevich if (write) 445b14878ccSVlad Yasevich tbl.data = &new_value; 446b14878ccSVlad Yasevich else 447b14878ccSVlad Yasevich tbl.data = &net->sctp.auth_enable; 448b14878ccSVlad Yasevich 449b14878ccSVlad Yasevich ret = proc_dointvec(&tbl, write, buffer, lenp, ppos); 450b14878ccSVlad Yasevich 451b14878ccSVlad Yasevich if (write) { 452b14878ccSVlad Yasevich struct sock *sk = net->sctp.ctl_sock; 453b14878ccSVlad Yasevich 454b14878ccSVlad Yasevich net->sctp.auth_enable = new_value; 455b14878ccSVlad Yasevich /* Update the value in the control socket */ 456b14878ccSVlad Yasevich lock_sock(sk); 457b14878ccSVlad Yasevich sctp_sk(sk)->ep->auth_enable = new_value; 458b14878ccSVlad Yasevich release_sock(sk); 459b14878ccSVlad Yasevich } 460b14878ccSVlad Yasevich 461b14878ccSVlad Yasevich return ret; 462b14878ccSVlad Yasevich } 463b14878ccSVlad Yasevich 464ebb7e95dSEric W. Biederman int sctp_sysctl_net_register(struct net *net) 465ebb7e95dSEric W. Biederman { 466eb9f3705Swangweidong struct ctl_table *table; 467e1fc3b14SEric W. Biederman int i; 468ebb7e95dSEric W. Biederman 469ebb7e95dSEric W. Biederman table = kmemdup(sctp_net_table, sizeof(sctp_net_table), GFP_KERNEL); 470ebb7e95dSEric W. Biederman if (!table) 471ebb7e95dSEric W. Biederman return -ENOMEM; 472ebb7e95dSEric W. Biederman 473e1fc3b14SEric W. Biederman for (i = 0; table[i].data; i++) 474e1fc3b14SEric W. Biederman table[i].data += (char *)(&net->sctp) - (char *)&init_net.sctp; 475e1fc3b14SEric W. Biederman 476ebb7e95dSEric W. Biederman net->sctp.sysctl_header = register_net_sysctl(net, "net/sctp", table); 477f66138c8Swangweidong if (net->sctp.sysctl_header == NULL) { 478f66138c8Swangweidong kfree(table); 479f66138c8Swangweidong return -ENOMEM; 480f66138c8Swangweidong } 481ebb7e95dSEric W. Biederman return 0; 482ebb7e95dSEric W. Biederman } 483ebb7e95dSEric W. Biederman 484ebb7e95dSEric W. Biederman void sctp_sysctl_net_unregister(struct net *net) 485ebb7e95dSEric W. Biederman { 4865f19d121SVlad Yasevich struct ctl_table *table; 4875f19d121SVlad Yasevich 4885f19d121SVlad Yasevich table = net->sctp.sysctl_header->ctl_table_arg; 489ebb7e95dSEric W. Biederman unregister_net_sysctl_table(net->sctp.sysctl_header); 4905f19d121SVlad Yasevich kfree(table); 491ebb7e95dSEric W. Biederman } 492ebb7e95dSEric W. Biederman 4931da177e4SLinus Torvalds static struct ctl_table_header *sctp_sysctl_header; 4941da177e4SLinus Torvalds 4951da177e4SLinus Torvalds /* Sysctl registration. */ 4961da177e4SLinus Torvalds void sctp_sysctl_register(void) 4971da177e4SLinus Torvalds { 498ec8f23ceSEric W. Biederman sctp_sysctl_header = register_net_sysctl(&init_net, "net/sctp", sctp_table); 4991da177e4SLinus Torvalds } 5001da177e4SLinus Torvalds 5011da177e4SLinus Torvalds /* Sysctl deregistration. */ 5021da177e4SLinus Torvalds void sctp_sysctl_unregister(void) 5031da177e4SLinus Torvalds { 5045dd3df10SEric W. Biederman unregister_net_sysctl_table(sctp_sysctl_header); 5051da177e4SLinus Torvalds } 506