xref: /openbmc/linux/net/ax25/sysctl_net_ax25.c (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
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