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/mm.h> 10 #include <linux/slab.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[] = {30000}; 22 static int min_t2[] = {1}, max_t2[] = {20000}; 23 static int min_t3[1], max_t3[] = {3600000}; 24 static int min_idle[1], max_idle[] = {65535000}; 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[] = { AX25_PROTO_MAX }; 28 #ifdef CONFIG_AX25_DAMA_SLAVE 29 static int min_ds_timeout[1], max_ds_timeout[] = {65535000}; 30 #endif 31 32 static struct ctl_table_header *ax25_table_header; 33 34 static ctl_table *ax25_table; 35 static int ax25_table_size; 36 37 static struct ctl_path ax25_path[] = { 38 { .procname = "net", }, 39 { .procname = "ax25", }, 40 { } 41 }; 42 43 static const ctl_table ax25_param_table[] = { 44 { 45 .procname = "ip_default_mode", 46 .maxlen = sizeof(int), 47 .mode = 0644, 48 .proc_handler = proc_dointvec_minmax, 49 .extra1 = &min_ipdefmode, 50 .extra2 = &max_ipdefmode 51 }, 52 { 53 .procname = "ax25_default_mode", 54 .maxlen = sizeof(int), 55 .mode = 0644, 56 .proc_handler = proc_dointvec_minmax, 57 .extra1 = &min_axdefmode, 58 .extra2 = &max_axdefmode 59 }, 60 { 61 .procname = "backoff_type", 62 .maxlen = sizeof(int), 63 .mode = 0644, 64 .proc_handler = proc_dointvec_minmax, 65 .extra1 = &min_backoff, 66 .extra2 = &max_backoff 67 }, 68 { 69 .procname = "connect_mode", 70 .maxlen = sizeof(int), 71 .mode = 0644, 72 .proc_handler = proc_dointvec_minmax, 73 .extra1 = &min_conmode, 74 .extra2 = &max_conmode 75 }, 76 { 77 .procname = "standard_window_size", 78 .maxlen = sizeof(int), 79 .mode = 0644, 80 .proc_handler = proc_dointvec_minmax, 81 .extra1 = &min_window, 82 .extra2 = &max_window 83 }, 84 { 85 .procname = "extended_window_size", 86 .maxlen = sizeof(int), 87 .mode = 0644, 88 .proc_handler = proc_dointvec_minmax, 89 .extra1 = &min_ewindow, 90 .extra2 = &max_ewindow 91 }, 92 { 93 .procname = "t1_timeout", 94 .maxlen = sizeof(int), 95 .mode = 0644, 96 .proc_handler = proc_dointvec_minmax, 97 .extra1 = &min_t1, 98 .extra2 = &max_t1 99 }, 100 { 101 .procname = "t2_timeout", 102 .maxlen = sizeof(int), 103 .mode = 0644, 104 .proc_handler = proc_dointvec_minmax, 105 .extra1 = &min_t2, 106 .extra2 = &max_t2 107 }, 108 { 109 .procname = "t3_timeout", 110 .maxlen = sizeof(int), 111 .mode = 0644, 112 .proc_handler = proc_dointvec_minmax, 113 .extra1 = &min_t3, 114 .extra2 = &max_t3 115 }, 116 { 117 .procname = "idle_timeout", 118 .maxlen = sizeof(int), 119 .mode = 0644, 120 .proc_handler = proc_dointvec_minmax, 121 .extra1 = &min_idle, 122 .extra2 = &max_idle 123 }, 124 { 125 .procname = "maximum_retry_count", 126 .maxlen = sizeof(int), 127 .mode = 0644, 128 .proc_handler = proc_dointvec_minmax, 129 .extra1 = &min_n2, 130 .extra2 = &max_n2 131 }, 132 { 133 .procname = "maximum_packet_length", 134 .maxlen = sizeof(int), 135 .mode = 0644, 136 .proc_handler = proc_dointvec_minmax, 137 .extra1 = &min_paclen, 138 .extra2 = &max_paclen 139 }, 140 { 141 .procname = "protocol", 142 .maxlen = sizeof(int), 143 .mode = 0644, 144 .proc_handler = proc_dointvec_minmax, 145 .extra1 = &min_proto, 146 .extra2 = &max_proto 147 }, 148 #ifdef CONFIG_AX25_DAMA_SLAVE 149 { 150 .procname = "dama_slave_timeout", 151 .maxlen = sizeof(int), 152 .mode = 0644, 153 .proc_handler = proc_dointvec_minmax, 154 .extra1 = &min_ds_timeout, 155 .extra2 = &max_ds_timeout 156 }, 157 #endif 158 159 { } /* that's all, folks! */ 160 }; 161 162 void ax25_register_sysctl(void) 163 { 164 ax25_dev *ax25_dev; 165 int n, k; 166 167 spin_lock_bh(&ax25_dev_lock); 168 for (ax25_table_size = sizeof(ctl_table), ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) 169 ax25_table_size += sizeof(ctl_table); 170 171 if ((ax25_table = kzalloc(ax25_table_size, GFP_ATOMIC)) == NULL) { 172 spin_unlock_bh(&ax25_dev_lock); 173 return; 174 } 175 176 for (n = 0, ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) { 177 struct ctl_table *child = kmemdup(ax25_param_table, 178 sizeof(ax25_param_table), 179 GFP_ATOMIC); 180 if (!child) { 181 while (n--) 182 kfree(ax25_table[n].child); 183 kfree(ax25_table); 184 spin_unlock_bh(&ax25_dev_lock); 185 return; 186 } 187 ax25_table[n].child = ax25_dev->systable = child; 188 ax25_table[n].procname = ax25_dev->dev->name; 189 ax25_table[n].mode = 0555; 190 191 192 for (k = 0; k < AX25_MAX_VALUES; k++) 193 child[k].data = &ax25_dev->values[k]; 194 195 n++; 196 } 197 spin_unlock_bh(&ax25_dev_lock); 198 199 ax25_table_header = register_sysctl_paths(ax25_path, ax25_table); 200 } 201 202 void ax25_unregister_sysctl(void) 203 { 204 ctl_table *p; 205 unregister_sysctl_table(ax25_table_header); 206 207 for (p = ax25_table; p->procname; p++) 208 kfree(p->child); 209 kfree(ax25_table); 210 } 211