1 /* SCTP kernel implementation 2 * (C) Copyright IBM Corp. 2002, 2004 3 * Copyright (c) 2002 Intel Corp. 4 * 5 * This file is part of the SCTP kernel implementation 6 * 7 * Sysctl related interfaces for SCTP. 8 * 9 * This SCTP implementation is free software; 10 * you can redistribute it and/or modify it under the terms of 11 * the GNU General Public License as published by 12 * the Free Software Foundation; either version 2, or (at your option) 13 * any later version. 14 * 15 * This SCTP implementation is distributed in the hope that it 16 * will be useful, but WITHOUT ANY WARRANTY; without even the implied 17 * ************************ 18 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 19 * See the GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with GNU CC; see the file COPYING. If not, write to 23 * the Free Software Foundation, 59 Temple Place - Suite 330, 24 * Boston, MA 02111-1307, USA. 25 * 26 * Please send any bug reports or fixes you make to the 27 * email address(es): 28 * lksctp developers <lksctp-developers@lists.sourceforge.net> 29 * 30 * Or submit a bug report through the following website: 31 * http://www.sf.net/projects/lksctp 32 * 33 * Written or modified by: 34 * Mingqin Liu <liuming@us.ibm.com> 35 * Jon Grimm <jgrimm@us.ibm.com> 36 * Ardelle Fan <ardelle.fan@intel.com> 37 * Ryan Layer <rmlayer@us.ibm.com> 38 * Sridhar Samudrala <sri@us.ibm.com> 39 * 40 * Any bugs reported given to us we will try to fix... any fixes shared will 41 * be incorporated into the next SCTP release. 42 */ 43 44 #include <net/sctp/structs.h> 45 #include <net/sctp/sctp.h> 46 #include <linux/sysctl.h> 47 48 static int zero = 0; 49 static int one = 1; 50 static int timer_max = 86400000; /* ms in one day */ 51 static int int_max = INT_MAX; 52 static long sack_timer_min = 1; 53 static long sack_timer_max = 500; 54 55 extern int sysctl_sctp_mem[3]; 56 extern int sysctl_sctp_rmem[3]; 57 extern int sysctl_sctp_wmem[3]; 58 59 static ctl_table sctp_table[] = { 60 { 61 .ctl_name = NET_SCTP_RTO_INITIAL, 62 .procname = "rto_initial", 63 .data = &sctp_rto_initial, 64 .maxlen = sizeof(unsigned int), 65 .mode = 0644, 66 .proc_handler = &proc_dointvec_minmax, 67 .strategy = &sysctl_intvec, 68 .extra1 = &one, 69 .extra2 = &timer_max 70 }, 71 { 72 .ctl_name = NET_SCTP_RTO_MIN, 73 .procname = "rto_min", 74 .data = &sctp_rto_min, 75 .maxlen = sizeof(unsigned int), 76 .mode = 0644, 77 .proc_handler = &proc_dointvec_minmax, 78 .strategy = &sysctl_intvec, 79 .extra1 = &one, 80 .extra2 = &timer_max 81 }, 82 { 83 .ctl_name = NET_SCTP_RTO_MAX, 84 .procname = "rto_max", 85 .data = &sctp_rto_max, 86 .maxlen = sizeof(unsigned int), 87 .mode = 0644, 88 .proc_handler = &proc_dointvec_minmax, 89 .strategy = &sysctl_intvec, 90 .extra1 = &one, 91 .extra2 = &timer_max 92 }, 93 { 94 .ctl_name = NET_SCTP_VALID_COOKIE_LIFE, 95 .procname = "valid_cookie_life", 96 .data = &sctp_valid_cookie_life, 97 .maxlen = sizeof(unsigned int), 98 .mode = 0644, 99 .proc_handler = &proc_dointvec_minmax, 100 .strategy = &sysctl_intvec, 101 .extra1 = &one, 102 .extra2 = &timer_max 103 }, 104 { 105 .ctl_name = NET_SCTP_MAX_BURST, 106 .procname = "max_burst", 107 .data = &sctp_max_burst, 108 .maxlen = sizeof(int), 109 .mode = 0644, 110 .proc_handler = &proc_dointvec_minmax, 111 .strategy = &sysctl_intvec, 112 .extra1 = &zero, 113 .extra2 = &int_max 114 }, 115 { 116 .ctl_name = NET_SCTP_ASSOCIATION_MAX_RETRANS, 117 .procname = "association_max_retrans", 118 .data = &sctp_max_retrans_association, 119 .maxlen = sizeof(int), 120 .mode = 0644, 121 .proc_handler = &proc_dointvec_minmax, 122 .strategy = &sysctl_intvec, 123 .extra1 = &one, 124 .extra2 = &int_max 125 }, 126 { 127 .ctl_name = NET_SCTP_SNDBUF_POLICY, 128 .procname = "sndbuf_policy", 129 .data = &sctp_sndbuf_policy, 130 .maxlen = sizeof(int), 131 .mode = 0644, 132 .proc_handler = &proc_dointvec, 133 .strategy = &sysctl_intvec 134 }, 135 { 136 .ctl_name = NET_SCTP_RCVBUF_POLICY, 137 .procname = "rcvbuf_policy", 138 .data = &sctp_rcvbuf_policy, 139 .maxlen = sizeof(int), 140 .mode = 0644, 141 .proc_handler = &proc_dointvec, 142 .strategy = &sysctl_intvec 143 }, 144 { 145 .ctl_name = NET_SCTP_PATH_MAX_RETRANS, 146 .procname = "path_max_retrans", 147 .data = &sctp_max_retrans_path, 148 .maxlen = sizeof(int), 149 .mode = 0644, 150 .proc_handler = &proc_dointvec_minmax, 151 .strategy = &sysctl_intvec, 152 .extra1 = &one, 153 .extra2 = &int_max 154 }, 155 { 156 .ctl_name = NET_SCTP_MAX_INIT_RETRANSMITS, 157 .procname = "max_init_retransmits", 158 .data = &sctp_max_retrans_init, 159 .maxlen = sizeof(int), 160 .mode = 0644, 161 .proc_handler = &proc_dointvec_minmax, 162 .strategy = &sysctl_intvec, 163 .extra1 = &one, 164 .extra2 = &int_max 165 }, 166 { 167 .ctl_name = NET_SCTP_HB_INTERVAL, 168 .procname = "hb_interval", 169 .data = &sctp_hb_interval, 170 .maxlen = sizeof(unsigned int), 171 .mode = 0644, 172 .proc_handler = &proc_dointvec_minmax, 173 .strategy = &sysctl_intvec, 174 .extra1 = &one, 175 .extra2 = &timer_max 176 }, 177 { 178 .ctl_name = NET_SCTP_PRESERVE_ENABLE, 179 .procname = "cookie_preserve_enable", 180 .data = &sctp_cookie_preserve_enable, 181 .maxlen = sizeof(int), 182 .mode = 0644, 183 .proc_handler = &proc_dointvec, 184 .strategy = &sysctl_intvec 185 }, 186 { 187 .ctl_name = NET_SCTP_RTO_ALPHA, 188 .procname = "rto_alpha_exp_divisor", 189 .data = &sctp_rto_alpha, 190 .maxlen = sizeof(int), 191 .mode = 0444, 192 .proc_handler = &proc_dointvec, 193 .strategy = &sysctl_intvec 194 }, 195 { 196 .ctl_name = NET_SCTP_RTO_BETA, 197 .procname = "rto_beta_exp_divisor", 198 .data = &sctp_rto_beta, 199 .maxlen = sizeof(int), 200 .mode = 0444, 201 .proc_handler = &proc_dointvec, 202 .strategy = &sysctl_intvec 203 }, 204 { 205 .ctl_name = NET_SCTP_ADDIP_ENABLE, 206 .procname = "addip_enable", 207 .data = &sctp_addip_enable, 208 .maxlen = sizeof(int), 209 .mode = 0644, 210 .proc_handler = &proc_dointvec, 211 .strategy = &sysctl_intvec 212 }, 213 { 214 .ctl_name = NET_SCTP_PRSCTP_ENABLE, 215 .procname = "prsctp_enable", 216 .data = &sctp_prsctp_enable, 217 .maxlen = sizeof(int), 218 .mode = 0644, 219 .proc_handler = &proc_dointvec, 220 .strategy = &sysctl_intvec 221 }, 222 { 223 .ctl_name = NET_SCTP_SACK_TIMEOUT, 224 .procname = "sack_timeout", 225 .data = &sctp_sack_timeout, 226 .maxlen = sizeof(long), 227 .mode = 0644, 228 .proc_handler = &proc_dointvec_minmax, 229 .strategy = &sysctl_intvec, 230 .extra1 = &sack_timer_min, 231 .extra2 = &sack_timer_max, 232 }, 233 { 234 .ctl_name = CTL_UNNUMBERED, 235 .procname = "sctp_mem", 236 .data = &sysctl_sctp_mem, 237 .maxlen = sizeof(sysctl_sctp_mem), 238 .mode = 0644, 239 .proc_handler = &proc_dointvec, 240 }, 241 { 242 .ctl_name = CTL_UNNUMBERED, 243 .procname = "sctp_rmem", 244 .data = &sysctl_sctp_rmem, 245 .maxlen = sizeof(sysctl_sctp_rmem), 246 .mode = 0644, 247 .proc_handler = &proc_dointvec, 248 }, 249 { 250 .ctl_name = CTL_UNNUMBERED, 251 .procname = "sctp_wmem", 252 .data = &sysctl_sctp_wmem, 253 .maxlen = sizeof(sysctl_sctp_wmem), 254 .mode = 0644, 255 .proc_handler = &proc_dointvec, 256 }, 257 { 258 .ctl_name = CTL_UNNUMBERED, 259 .procname = "auth_enable", 260 .data = &sctp_auth_enable, 261 .maxlen = sizeof(int), 262 .mode = 0644, 263 .proc_handler = &proc_dointvec, 264 .strategy = &sysctl_intvec 265 }, 266 { 267 .ctl_name = CTL_UNNUMBERED, 268 .procname = "addip_noauth_enable", 269 .data = &sctp_addip_noauth, 270 .maxlen = sizeof(int), 271 .mode = 0644, 272 .proc_handler = &proc_dointvec, 273 .strategy = &sysctl_intvec 274 }, 275 { .ctl_name = 0 } 276 }; 277 278 static struct ctl_path sctp_path[] = { 279 { .procname = "net", .ctl_name = CTL_NET, }, 280 { .procname = "sctp", .ctl_name = NET_SCTP, }, 281 { } 282 }; 283 284 static struct ctl_table_header * sctp_sysctl_header; 285 286 /* Sysctl registration. */ 287 void sctp_sysctl_register(void) 288 { 289 sctp_sysctl_header = register_sysctl_paths(sctp_path, sctp_table); 290 } 291 292 /* Sysctl deregistration. */ 293 void sctp_sysctl_unregister(void) 294 { 295 unregister_sysctl_table(sctp_sysctl_header); 296 } 297