1 /* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License as published by 4 * the Free Software Foundation; either version 2 of the License, or 5 * (at your option) any later version. 6 * 7 * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com) 8 */ 9 #include <linux/config.h> 10 #include <linux/mm.h> 11 #include <linux/sysctl.h> 12 #include <linux/spinlock.h> 13 #include <net/ax25.h> 14 15 static int min_ipdefmode[1], max_ipdefmode[] = {1}; 16 static int min_axdefmode[1], max_axdefmode[] = {1}; 17 static int min_backoff[1], max_backoff[] = {2}; 18 static int min_conmode[1], max_conmode[] = {2}; 19 static int min_window[] = {1}, max_window[] = {7}; 20 static int min_ewindow[] = {1}, max_ewindow[] = {63}; 21 static int min_t1[] = {1}, max_t1[] = {30 * HZ}; 22 static int min_t2[] = {1}, max_t2[] = {20 * HZ}; 23 static int min_t3[1], max_t3[] = {3600 * HZ}; 24 static int min_idle[1], max_idle[] = {65535 * HZ}; 25 static int min_n2[] = {1}, max_n2[] = {31}; 26 static int min_paclen[] = {1}, max_paclen[] = {512}; 27 static int min_proto[1], max_proto[] = {3}; 28 static int min_ds_timeout[1], max_ds_timeout[] = {65535 * HZ}; 29 30 static struct ctl_table_header *ax25_table_header; 31 32 static ctl_table *ax25_table; 33 static int ax25_table_size; 34 35 static ctl_table ax25_dir_table[] = { 36 { 37 .ctl_name = NET_AX25, 38 .procname = "ax25", 39 .mode = 0555, 40 }, 41 { .ctl_name = 0 } 42 }; 43 44 static ctl_table ax25_root_table[] = { 45 { 46 .ctl_name = CTL_NET, 47 .procname = "net", 48 .mode = 0555, 49 .child = ax25_dir_table 50 }, 51 { .ctl_name = 0 } 52 }; 53 54 static const ctl_table ax25_param_table[] = { 55 { 56 .ctl_name = NET_AX25_IP_DEFAULT_MODE, 57 .procname = "ip_default_mode", 58 .maxlen = sizeof(int), 59 .mode = 0644, 60 .proc_handler = &proc_dointvec_minmax, 61 .strategy = &sysctl_intvec, 62 .extra1 = &min_ipdefmode, 63 .extra2 = &max_ipdefmode 64 }, 65 { 66 .ctl_name = NET_AX25_DEFAULT_MODE, 67 .procname = "ax25_default_mode", 68 .maxlen = sizeof(int), 69 .mode = 0644, 70 .proc_handler = &proc_dointvec_minmax, 71 .strategy = &sysctl_intvec, 72 .extra1 = &min_axdefmode, 73 .extra2 = &max_axdefmode 74 }, 75 { 76 .ctl_name = NET_AX25_BACKOFF_TYPE, 77 .procname = "backoff_type", 78 .maxlen = sizeof(int), 79 .mode = 0644, 80 .proc_handler = &proc_dointvec_minmax, 81 .strategy = &sysctl_intvec, 82 .extra1 = &min_backoff, 83 .extra2 = &max_backoff 84 }, 85 { 86 .ctl_name = NET_AX25_CONNECT_MODE, 87 .procname = "connect_mode", 88 .maxlen = sizeof(int), 89 .mode = 0644, 90 .proc_handler = &proc_dointvec_minmax, 91 .strategy = &sysctl_intvec, 92 .extra1 = &min_conmode, 93 .extra2 = &max_conmode 94 }, 95 { 96 .ctl_name = NET_AX25_STANDARD_WINDOW, 97 .procname = "standard_window_size", 98 .maxlen = sizeof(int), 99 .mode = 0644, 100 .proc_handler = &proc_dointvec_minmax, 101 .strategy = &sysctl_intvec, 102 .extra1 = &min_window, 103 .extra2 = &max_window 104 }, 105 { 106 .ctl_name = NET_AX25_EXTENDED_WINDOW, 107 .procname = "extended_window_size", 108 .maxlen = sizeof(int), 109 .mode = 0644, 110 .proc_handler = &proc_dointvec_minmax, 111 .strategy = &sysctl_intvec, 112 .extra1 = &min_ewindow, 113 .extra2 = &max_ewindow 114 }, 115 { 116 .ctl_name = NET_AX25_T1_TIMEOUT, 117 .procname = "t1_timeout", 118 .maxlen = sizeof(int), 119 .mode = 0644, 120 .proc_handler = &proc_dointvec_minmax, 121 .strategy = &sysctl_intvec, 122 .extra1 = &min_t1, 123 .extra2 = &max_t1 124 }, 125 { 126 .ctl_name = NET_AX25_T2_TIMEOUT, 127 .procname = "t2_timeout", 128 .maxlen = sizeof(int), 129 .mode = 0644, 130 .proc_handler = &proc_dointvec_minmax, 131 .strategy = &sysctl_intvec, 132 .extra1 = &min_t2, 133 .extra2 = &max_t2 134 }, 135 { 136 .ctl_name = NET_AX25_T3_TIMEOUT, 137 .procname = "t3_timeout", 138 .maxlen = sizeof(int), 139 .mode = 0644, 140 .proc_handler = &proc_dointvec_minmax, 141 .strategy = &sysctl_intvec, 142 .extra1 = &min_t3, 143 .extra2 = &max_t3 144 }, 145 { 146 .ctl_name = NET_AX25_IDLE_TIMEOUT, 147 .procname = "idle_timeout", 148 .maxlen = sizeof(int), 149 .mode = 0644, 150 .proc_handler = &proc_dointvec_minmax, 151 .strategy = &sysctl_intvec, 152 .extra1 = &min_idle, 153 .extra2 = &max_idle 154 }, 155 { 156 .ctl_name = NET_AX25_N2, 157 .procname = "maximum_retry_count", 158 .maxlen = sizeof(int), 159 .mode = 0644, 160 .proc_handler = &proc_dointvec_minmax, 161 .strategy = &sysctl_intvec, 162 .extra1 = &min_n2, 163 .extra2 = &max_n2 164 }, 165 { 166 .ctl_name = NET_AX25_PACLEN, 167 .procname = "maximum_packet_length", 168 .maxlen = sizeof(int), 169 .mode = 0644, 170 .proc_handler = &proc_dointvec_minmax, 171 .strategy = &sysctl_intvec, 172 .extra1 = &min_paclen, 173 .extra2 = &max_paclen 174 }, 175 { 176 .ctl_name = NET_AX25_PROTOCOL, 177 .procname = "protocol", 178 .maxlen = sizeof(int), 179 .mode = 0644, 180 .proc_handler = &proc_dointvec_minmax, 181 .strategy = &sysctl_intvec, 182 .extra1 = &min_proto, 183 .extra2 = &max_proto 184 }, 185 { 186 .ctl_name = NET_AX25_DAMA_SLAVE_TIMEOUT, 187 .procname = "dama_slave_timeout", 188 .maxlen = sizeof(int), 189 .mode = 0644, 190 .proc_handler = &proc_dointvec_minmax, 191 .strategy = &sysctl_intvec, 192 .extra1 = &min_ds_timeout, 193 .extra2 = &max_ds_timeout 194 }, 195 { .ctl_name = 0 } /* that's all, folks! */ 196 }; 197 198 void ax25_register_sysctl(void) 199 { 200 ax25_dev *ax25_dev; 201 int n, k; 202 203 spin_lock_bh(&ax25_dev_lock); 204 for (ax25_table_size = sizeof(ctl_table), ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) 205 ax25_table_size += sizeof(ctl_table); 206 207 if ((ax25_table = kmalloc(ax25_table_size, GFP_ATOMIC)) == NULL) { 208 spin_unlock_bh(&ax25_dev_lock); 209 return; 210 } 211 212 memset(ax25_table, 0x00, ax25_table_size); 213 214 for (n = 0, ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) { 215 ctl_table *child = kmalloc(sizeof(ax25_param_table), GFP_ATOMIC); 216 if (!child) { 217 while (n--) 218 kfree(ax25_table[n].child); 219 kfree(ax25_table); 220 spin_unlock_bh(&ax25_dev_lock); 221 return; 222 } 223 memcpy(child, ax25_param_table, sizeof(ax25_param_table)); 224 ax25_table[n].child = ax25_dev->systable = child; 225 ax25_table[n].ctl_name = n + 1; 226 ax25_table[n].procname = ax25_dev->dev->name; 227 ax25_table[n].mode = 0555; 228 229 #ifndef CONFIG_AX25_DAMA_SLAVE 230 /* 231 * We do not wish to have a representation of this parameter 232 * in /proc/sys/ when configured *not* to include the 233 * AX.25 DAMA slave code, do we? 234 */ 235 236 child[AX25_VALUES_DS_TIMEOUT].procname = NULL; 237 #endif 238 239 child[AX25_MAX_VALUES].ctl_name = 0; /* just in case... */ 240 241 for (k = 0; k < AX25_MAX_VALUES; k++) 242 child[k].data = &ax25_dev->values[k]; 243 244 n++; 245 } 246 spin_unlock_bh(&ax25_dev_lock); 247 248 ax25_dir_table[0].child = ax25_table; 249 250 ax25_table_header = register_sysctl_table(ax25_root_table, 1); 251 } 252 253 void ax25_unregister_sysctl(void) 254 { 255 ctl_table *p; 256 unregister_sysctl_table(ax25_table_header); 257 258 ax25_dir_table[0].child = NULL; 259 for (p = ax25_table; p->ctl_name; p++) 260 kfree(p->child); 261 kfree(ax25_table); 262 } 263