[libiwinfo] apply FD_CLOEXEC on internal ioctl and netlink sockets
[project/luci.git] / contrib / package / iwinfo / src / iwinfo_wext_scan.h
1 /*
2 * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
3 *
4 * Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
5 *
6 * The iwinfo library is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
9 *
10 * The iwinfo library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with the iwinfo library. If not, see http://www.gnu.org/licenses/.
17 */
18
19 #ifndef __IWINFO_WEXT_SCAN_H_
20 #define __IWINFO_WEXT_SCAN_H_
21
22 #include <fcntl.h>
23
24 #include "iwinfo.h"
25 #include "include/wext.h"
26
27
28 typedef struct stream_descr
29 {
30 char * end; /* End of the stream */
31 char * current; /* Current event in stream of events */
32 char * value; /* Current value in event */
33 } stream_descr;
34
35 /*
36 * Describe how a standard IOCTL looks like.
37 */
38 struct iw_ioctl_description
39 {
40 uint8_t header_type; /* NULL, iw_point or other */
41 uint8_t token_type; /* Future */
42 uint16_t token_size; /* Granularity of payload */
43 uint16_t min_tokens; /* Min acceptable token number */
44 uint16_t max_tokens; /* Max acceptable token number */
45 uint32_t flags; /* Special handling of the request */
46 };
47
48 /* Type of headers we know about (basically union iwreq_data) */
49 #define IW_HEADER_TYPE_NULL 0 /* Not available */
50 #define IW_HEADER_TYPE_CHAR 2 /* char [IFNAMSIZ] */
51 #define IW_HEADER_TYPE_UINT 4 /* __u32 */
52 #define IW_HEADER_TYPE_FREQ 5 /* struct iw_freq */
53 #define IW_HEADER_TYPE_ADDR 6 /* struct sockaddr */
54 #define IW_HEADER_TYPE_POINT 8 /* struct iw_point */
55 #define IW_HEADER_TYPE_PARAM 9 /* struct iw_param */
56 #define IW_HEADER_TYPE_QUAL 10 /* struct iw_quality */
57
58 /* Handling flags */
59 /* Most are not implemented. I just use them as a reminder of some
60 * cool features we might need one day ;-) */
61 #define IW_DESCR_FLAG_NONE 0x0000 /* Obvious */
62 /* Wrapper level flags */
63 #define IW_DESCR_FLAG_DUMP 0x0001 /* Not part of the dump command */
64 #define IW_DESCR_FLAG_EVENT 0x0002 /* Generate an event on SET */
65 #define IW_DESCR_FLAG_RESTRICT 0x0004 /* GET : request is ROOT only */
66 /* SET : Omit payload from generated iwevent */
67 #define IW_DESCR_FLAG_NOMAX 0x0008 /* GET : no limit on request size */
68 /* Driver level flags */
69 #define IW_DESCR_FLAG_WAIT 0x0100 /* Wait for driver event */
70
71
72 /*
73 * Meta-data about all the standard Wireless Extension request we
74 * know about.
75 */
76 static const struct iw_ioctl_description standard_ioctl_descr[] = {
77 [SIOCSIWCOMMIT - SIOCIWFIRST] = {
78 .header_type = IW_HEADER_TYPE_NULL,
79 },
80 [SIOCGIWNAME - SIOCIWFIRST] = {
81 .header_type = IW_HEADER_TYPE_CHAR,
82 .flags = IW_DESCR_FLAG_DUMP,
83 },
84 [SIOCSIWNWID - SIOCIWFIRST] = {
85 .header_type = IW_HEADER_TYPE_PARAM,
86 .flags = IW_DESCR_FLAG_EVENT,
87 },
88 [SIOCGIWNWID - SIOCIWFIRST] = {
89 .header_type = IW_HEADER_TYPE_PARAM,
90 .flags = IW_DESCR_FLAG_DUMP,
91 },
92 [SIOCSIWFREQ - SIOCIWFIRST] = {
93 .header_type = IW_HEADER_TYPE_FREQ,
94 .flags = IW_DESCR_FLAG_EVENT,
95 },
96 [SIOCGIWFREQ - SIOCIWFIRST] = {
97 .header_type = IW_HEADER_TYPE_FREQ,
98 .flags = IW_DESCR_FLAG_DUMP,
99 },
100 [SIOCSIWMODE - SIOCIWFIRST] = {
101 .header_type = IW_HEADER_TYPE_UINT,
102 .flags = IW_DESCR_FLAG_EVENT,
103 },
104 [SIOCGIWMODE - SIOCIWFIRST] = {
105 .header_type = IW_HEADER_TYPE_UINT,
106 .flags = IW_DESCR_FLAG_DUMP,
107 },
108 [SIOCSIWSENS - SIOCIWFIRST] = {
109 .header_type = IW_HEADER_TYPE_PARAM,
110 },
111 [SIOCGIWSENS - SIOCIWFIRST] = {
112 .header_type = IW_HEADER_TYPE_PARAM,
113 },
114 [SIOCSIWRANGE - SIOCIWFIRST] = {
115 .header_type = IW_HEADER_TYPE_NULL,
116 },
117 [SIOCGIWRANGE - SIOCIWFIRST] = {
118 .header_type = IW_HEADER_TYPE_POINT,
119 .token_size = 1,
120 .max_tokens = sizeof(struct iw_range),
121 .flags = IW_DESCR_FLAG_DUMP,
122 },
123 [SIOCSIWPRIV - SIOCIWFIRST] = {
124 .header_type = IW_HEADER_TYPE_NULL,
125 },
126 [SIOCGIWPRIV - SIOCIWFIRST] = { /* (handled directly by us) */
127 .header_type = IW_HEADER_TYPE_NULL,
128 },
129 [SIOCSIWSTATS - SIOCIWFIRST] = {
130 .header_type = IW_HEADER_TYPE_NULL,
131 },
132 [SIOCGIWSTATS - SIOCIWFIRST] = { /* (handled directly by us) */
133 .header_type = IW_HEADER_TYPE_NULL,
134 .flags = IW_DESCR_FLAG_DUMP,
135 },
136 [SIOCSIWSPY - SIOCIWFIRST] = {
137 .header_type = IW_HEADER_TYPE_POINT,
138 .token_size = sizeof(struct sockaddr),
139 .max_tokens = IW_MAX_SPY,
140 },
141 [SIOCGIWSPY - SIOCIWFIRST] = {
142 .header_type = IW_HEADER_TYPE_POINT,
143 .token_size = sizeof(struct sockaddr) +
144 sizeof(struct iw_quality),
145 .max_tokens = IW_MAX_SPY,
146 },
147 [SIOCSIWTHRSPY - SIOCIWFIRST] = {
148 .header_type = IW_HEADER_TYPE_POINT,
149 .token_size = sizeof(struct iw_thrspy),
150 .min_tokens = 1,
151 .max_tokens = 1,
152 },
153 [SIOCGIWTHRSPY - SIOCIWFIRST] = {
154 .header_type = IW_HEADER_TYPE_POINT,
155 .token_size = sizeof(struct iw_thrspy),
156 .min_tokens = 1,
157 .max_tokens = 1,
158 },
159 [SIOCSIWAP - SIOCIWFIRST] = {
160 .header_type = IW_HEADER_TYPE_ADDR,
161 },
162 [SIOCGIWAP - SIOCIWFIRST] = {
163 .header_type = IW_HEADER_TYPE_ADDR,
164 .flags = IW_DESCR_FLAG_DUMP,
165 },
166 [SIOCSIWMLME - SIOCIWFIRST] = {
167 .header_type = IW_HEADER_TYPE_POINT,
168 .token_size = 1,
169 .min_tokens = sizeof(struct iw_mlme),
170 .max_tokens = sizeof(struct iw_mlme),
171 },
172 [SIOCGIWAPLIST - SIOCIWFIRST] = {
173 .header_type = IW_HEADER_TYPE_POINT,
174 .token_size = sizeof(struct sockaddr) +
175 sizeof(struct iw_quality),
176 .max_tokens = IW_MAX_AP,
177 .flags = IW_DESCR_FLAG_NOMAX,
178 },
179 [SIOCSIWSCAN - SIOCIWFIRST] = {
180 .header_type = IW_HEADER_TYPE_POINT,
181 .token_size = 1,
182 .min_tokens = 0,
183 .max_tokens = sizeof(struct iw_scan_req),
184 },
185 [SIOCGIWSCAN - SIOCIWFIRST] = {
186 .header_type = IW_HEADER_TYPE_POINT,
187 .token_size = 1,
188 .max_tokens = IW_SCAN_MAX_DATA,
189 .flags = IW_DESCR_FLAG_NOMAX,
190 },
191 [SIOCSIWESSID - SIOCIWFIRST] = {
192 .header_type = IW_HEADER_TYPE_POINT,
193 .token_size = 1,
194 .max_tokens = IW_ESSID_MAX_SIZE + 1,
195 .flags = IW_DESCR_FLAG_EVENT,
196 },
197 [SIOCGIWESSID - SIOCIWFIRST] = {
198 .header_type = IW_HEADER_TYPE_POINT,
199 .token_size = 1,
200 .max_tokens = IW_ESSID_MAX_SIZE + 1,
201 .flags = IW_DESCR_FLAG_DUMP,
202 },
203 [SIOCSIWNICKN - SIOCIWFIRST] = {
204 .header_type = IW_HEADER_TYPE_POINT,
205 .token_size = 1,
206 .max_tokens = IW_ESSID_MAX_SIZE + 1,
207 },
208 [SIOCGIWNICKN - SIOCIWFIRST] = {
209 .header_type = IW_HEADER_TYPE_POINT,
210 .token_size = 1,
211 .max_tokens = IW_ESSID_MAX_SIZE + 1,
212 },
213 [SIOCSIWRATE - SIOCIWFIRST] = {
214 .header_type = IW_HEADER_TYPE_PARAM,
215 },
216 [SIOCGIWRATE - SIOCIWFIRST] = {
217 .header_type = IW_HEADER_TYPE_PARAM,
218 },
219 [SIOCSIWRTS - SIOCIWFIRST] = {
220 .header_type = IW_HEADER_TYPE_PARAM,
221 },
222 [SIOCGIWRTS - SIOCIWFIRST] = {
223 .header_type = IW_HEADER_TYPE_PARAM,
224 },
225 [SIOCSIWFRAG - SIOCIWFIRST] = {
226 .header_type = IW_HEADER_TYPE_PARAM,
227 },
228 [SIOCGIWFRAG - SIOCIWFIRST] = {
229 .header_type = IW_HEADER_TYPE_PARAM,
230 },
231 [SIOCSIWTXPOW - SIOCIWFIRST] = {
232 .header_type = IW_HEADER_TYPE_PARAM,
233 },
234 [SIOCGIWTXPOW - SIOCIWFIRST] = {
235 .header_type = IW_HEADER_TYPE_PARAM,
236 },
237 [SIOCSIWRETRY - SIOCIWFIRST] = {
238 .header_type = IW_HEADER_TYPE_PARAM,
239 },
240 [SIOCGIWRETRY - SIOCIWFIRST] = {
241 .header_type = IW_HEADER_TYPE_PARAM,
242 },
243 [SIOCSIWENCODE - SIOCIWFIRST] = {
244 .header_type = IW_HEADER_TYPE_POINT,
245 .token_size = 1,
246 .max_tokens = IW_ENCODING_TOKEN_MAX,
247 .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT,
248 },
249 [SIOCGIWENCODE - SIOCIWFIRST] = {
250 .header_type = IW_HEADER_TYPE_POINT,
251 .token_size = 1,
252 .max_tokens = IW_ENCODING_TOKEN_MAX,
253 .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT,
254 },
255 [SIOCSIWPOWER - SIOCIWFIRST] = {
256 .header_type = IW_HEADER_TYPE_PARAM,
257 },
258 [SIOCGIWPOWER - SIOCIWFIRST] = {
259 .header_type = IW_HEADER_TYPE_PARAM,
260 },
261 [SIOCSIWMODUL - SIOCIWFIRST] = {
262 .header_type = IW_HEADER_TYPE_PARAM,
263 },
264 [SIOCGIWMODUL - SIOCIWFIRST] = {
265 .header_type = IW_HEADER_TYPE_PARAM,
266 },
267 [SIOCSIWGENIE - SIOCIWFIRST] = {
268 .header_type = IW_HEADER_TYPE_POINT,
269 .token_size = 1,
270 .max_tokens = IW_GENERIC_IE_MAX,
271 },
272 [SIOCGIWGENIE - SIOCIWFIRST] = {
273 .header_type = IW_HEADER_TYPE_POINT,
274 .token_size = 1,
275 .max_tokens = IW_GENERIC_IE_MAX,
276 },
277 [SIOCSIWAUTH - SIOCIWFIRST] = {
278 .header_type = IW_HEADER_TYPE_PARAM,
279 },
280 [SIOCGIWAUTH - SIOCIWFIRST] = {
281 .header_type = IW_HEADER_TYPE_PARAM,
282 },
283 [SIOCSIWENCODEEXT - SIOCIWFIRST] = {
284 .header_type = IW_HEADER_TYPE_POINT,
285 .token_size = 1,
286 .min_tokens = sizeof(struct iw_encode_ext),
287 .max_tokens = sizeof(struct iw_encode_ext) +
288 IW_ENCODING_TOKEN_MAX,
289 },
290 [SIOCGIWENCODEEXT - SIOCIWFIRST] = {
291 .header_type = IW_HEADER_TYPE_POINT,
292 .token_size = 1,
293 .min_tokens = sizeof(struct iw_encode_ext),
294 .max_tokens = sizeof(struct iw_encode_ext) +
295 IW_ENCODING_TOKEN_MAX,
296 },
297 [SIOCSIWPMKSA - SIOCIWFIRST] = {
298 .header_type = IW_HEADER_TYPE_POINT,
299 .token_size = 1,
300 .min_tokens = sizeof(struct iw_pmksa),
301 .max_tokens = sizeof(struct iw_pmksa),
302 },
303 };
304
305 /*
306 * Meta-data about all the additional standard Wireless Extension events
307 * we know about.
308 */
309 static const struct iw_ioctl_description standard_event_descr[] = {
310 [IWEVTXDROP - IWEVFIRST] = {
311 .header_type = IW_HEADER_TYPE_ADDR,
312 },
313 [IWEVQUAL - IWEVFIRST] = {
314 .header_type = IW_HEADER_TYPE_QUAL,
315 },
316 [IWEVCUSTOM - IWEVFIRST] = {
317 .header_type = IW_HEADER_TYPE_POINT,
318 .token_size = 1,
319 .max_tokens = IW_CUSTOM_MAX,
320 },
321 [IWEVREGISTERED - IWEVFIRST] = {
322 .header_type = IW_HEADER_TYPE_ADDR,
323 },
324 [IWEVEXPIRED - IWEVFIRST] = {
325 .header_type = IW_HEADER_TYPE_ADDR,
326 },
327 [IWEVGENIE - IWEVFIRST] = {
328 .header_type = IW_HEADER_TYPE_POINT,
329 .token_size = 1,
330 .max_tokens = IW_GENERIC_IE_MAX,
331 },
332 [IWEVMICHAELMICFAILURE - IWEVFIRST] = {
333 .header_type = IW_HEADER_TYPE_POINT,
334 .token_size = 1,
335 .max_tokens = sizeof(struct iw_michaelmicfailure),
336 },
337 [IWEVASSOCREQIE - IWEVFIRST] = {
338 .header_type = IW_HEADER_TYPE_POINT,
339 .token_size = 1,
340 .max_tokens = IW_GENERIC_IE_MAX,
341 },
342 [IWEVASSOCRESPIE - IWEVFIRST] = {
343 .header_type = IW_HEADER_TYPE_POINT,
344 .token_size = 1,
345 .max_tokens = IW_GENERIC_IE_MAX,
346 },
347 [IWEVPMKIDCAND - IWEVFIRST] = {
348 .header_type = IW_HEADER_TYPE_POINT,
349 .token_size = 1,
350 .max_tokens = sizeof(struct iw_pmkid_cand),
351 },
352 };
353
354 /* Size (in bytes) of various events */
355 static const int event_type_size[] = {
356 IW_EV_LCP_PK_LEN, /* IW_HEADER_TYPE_NULL */
357 0,
358 IW_EV_CHAR_PK_LEN, /* IW_HEADER_TYPE_CHAR */
359 0,
360 IW_EV_UINT_PK_LEN, /* IW_HEADER_TYPE_UINT */
361 IW_EV_FREQ_PK_LEN, /* IW_HEADER_TYPE_FREQ */
362 IW_EV_ADDR_PK_LEN, /* IW_HEADER_TYPE_ADDR */
363 0,
364 IW_EV_POINT_PK_LEN, /* Without variable payload */
365 IW_EV_PARAM_PK_LEN, /* IW_HEADER_TYPE_PARAM */
366 IW_EV_QUAL_PK_LEN, /* IW_HEADER_TYPE_QUAL */
367 };
368
369
370 static const unsigned int standard_ioctl_num =
371 (sizeof(standard_ioctl_descr) / sizeof(struct iw_ioctl_description));
372
373 static const unsigned int standard_event_num =
374 (sizeof(standard_event_descr) / sizeof(struct iw_ioctl_description));
375
376 #define IW_IE_CYPHER_NUM 8
377 #define IW_IE_KEY_MGMT_NUM 3
378
379 #endif