Merge tag 'mtd/for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
[linux-block.git] / net / ax25 / sysctl_net_ax25.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
1da177e4 2/*
1da177e4
LT
3 *
4 * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com)
5 */
1da177e4 6#include <linux/mm.h>
5a0e3ad6 7#include <linux/slab.h>
1da177e4
LT
8#include <linux/sysctl.h>
9#include <linux/spinlock.h>
10#include <net/ax25.h>
11
12static int min_ipdefmode[1], max_ipdefmode[] = {1};
13static int min_axdefmode[1], max_axdefmode[] = {1};
14static int min_backoff[1], max_backoff[] = {2};
15static int min_conmode[1], max_conmode[] = {2};
16static int min_window[] = {1}, max_window[] = {7};
17static int min_ewindow[] = {1}, max_ewindow[] = {63};
e1fdb5b3
RB
18static int min_t1[] = {1}, max_t1[] = {30000};
19static int min_t2[] = {1}, max_t2[] = {20000};
20static int min_t3[1], max_t3[] = {3600000};
21static int min_idle[1], max_idle[] = {65535000};
1da177e4
LT
22static int min_n2[] = {1}, max_n2[] = {31};
23static int min_paclen[] = {1}, max_paclen[] = {512};
c7c694d1 24static int min_proto[1], max_proto[] = { AX25_PROTO_MAX };
e14bec2e 25#ifdef CONFIG_AX25_DAMA_SLAVE
e1fdb5b3 26static int min_ds_timeout[1], max_ds_timeout[] = {65535000};
e14bec2e 27#endif
1da177e4 28
fe2c6338 29static const struct ctl_table ax25_param_table[] = {
1da177e4 30 {
1da177e4
LT
31 .procname = "ip_default_mode",
32 .maxlen = sizeof(int),
33 .mode = 0644,
6d9f239a 34 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
35 .extra1 = &min_ipdefmode,
36 .extra2 = &max_ipdefmode
37 },
38 {
1da177e4
LT
39 .procname = "ax25_default_mode",
40 .maxlen = sizeof(int),
41 .mode = 0644,
6d9f239a 42 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
43 .extra1 = &min_axdefmode,
44 .extra2 = &max_axdefmode
45 },
46 {
1da177e4
LT
47 .procname = "backoff_type",
48 .maxlen = sizeof(int),
49 .mode = 0644,
6d9f239a 50 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
51 .extra1 = &min_backoff,
52 .extra2 = &max_backoff
53 },
54 {
1da177e4
LT
55 .procname = "connect_mode",
56 .maxlen = sizeof(int),
57 .mode = 0644,
6d9f239a 58 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
59 .extra1 = &min_conmode,
60 .extra2 = &max_conmode
61 },
62 {
1da177e4
LT
63 .procname = "standard_window_size",
64 .maxlen = sizeof(int),
65 .mode = 0644,
6d9f239a 66 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
67 .extra1 = &min_window,
68 .extra2 = &max_window
69 },
70 {
1da177e4
LT
71 .procname = "extended_window_size",
72 .maxlen = sizeof(int),
73 .mode = 0644,
6d9f239a 74 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
75 .extra1 = &min_ewindow,
76 .extra2 = &max_ewindow
77 },
78 {
1da177e4
LT
79 .procname = "t1_timeout",
80 .maxlen = sizeof(int),
81 .mode = 0644,
6d9f239a 82 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
83 .extra1 = &min_t1,
84 .extra2 = &max_t1
85 },
86 {
1da177e4
LT
87 .procname = "t2_timeout",
88 .maxlen = sizeof(int),
89 .mode = 0644,
6d9f239a 90 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
91 .extra1 = &min_t2,
92 .extra2 = &max_t2
93 },
94 {
1da177e4
LT
95 .procname = "t3_timeout",
96 .maxlen = sizeof(int),
97 .mode = 0644,
6d9f239a 98 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
99 .extra1 = &min_t3,
100 .extra2 = &max_t3
101 },
102 {
1da177e4
LT
103 .procname = "idle_timeout",
104 .maxlen = sizeof(int),
105 .mode = 0644,
6d9f239a 106 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
107 .extra1 = &min_idle,
108 .extra2 = &max_idle
109 },
110 {
1da177e4
LT
111 .procname = "maximum_retry_count",
112 .maxlen = sizeof(int),
113 .mode = 0644,
6d9f239a 114 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
115 .extra1 = &min_n2,
116 .extra2 = &max_n2
117 },
118 {
1da177e4
LT
119 .procname = "maximum_packet_length",
120 .maxlen = sizeof(int),
121 .mode = 0644,
6d9f239a 122 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
123 .extra1 = &min_paclen,
124 .extra2 = &max_paclen
125 },
126 {
1da177e4
LT
127 .procname = "protocol",
128 .maxlen = sizeof(int),
129 .mode = 0644,
6d9f239a 130 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
131 .extra1 = &min_proto,
132 .extra2 = &max_proto
133 },
ffb20847 134#ifdef CONFIG_AX25_DAMA_SLAVE
1da177e4 135 {
1da177e4
LT
136 .procname = "dama_slave_timeout",
137 .maxlen = sizeof(int),
138 .mode = 0644,
6d9f239a 139 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
140 .extra1 = &min_ds_timeout,
141 .extra2 = &max_ds_timeout
142 },
ffb20847
RB
143#endif
144
f8572d8f 145 { } /* that's all, folks! */
1da177e4
LT
146};
147
0ca7a4c8 148int ax25_register_dev_sysctl(ax25_dev *ax25_dev)
1da177e4 149{
0ca7a4c8
EB
150 char path[sizeof("net/ax25/") + IFNAMSIZ];
151 int k;
152 struct ctl_table *table;
153
154 table = kmemdup(ax25_param_table, sizeof(ax25_param_table), GFP_KERNEL);
155 if (!table)
156 return -ENOMEM;
157
158 for (k = 0; k < AX25_MAX_VALUES; k++)
159 table[k].data = &ax25_dev->values[k];
160
161 snprintf(path, sizeof(path), "net/ax25/%s", ax25_dev->dev->name);
162 ax25_dev->sysheader = register_net_sysctl(&init_net, path, table);
163 if (!ax25_dev->sysheader) {
164 kfree(table);
165 return -ENOMEM;
1da177e4 166 }
0ca7a4c8 167 return 0;
1da177e4
LT
168}
169
0ca7a4c8 170void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev)
1da177e4 171{
0ca7a4c8
EB
172 struct ctl_table_header *header = ax25_dev->sysheader;
173 struct ctl_table *table;
174
175 if (header) {
176 ax25_dev->sysheader = NULL;
177 table = header->ctl_table_arg;
178 unregister_net_sysctl_table(header);
179 kfree(table);
180 }
1da177e4 181}