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