2 * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
4 * Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
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.
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.
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/.
19 #ifndef __IWINFO_WEXT_SCAN_H_
20 #define __IWINFO_WEXT_SCAN_H_
23 #include "include/wext.h"
26 typedef struct stream_descr
28 char * end; /* End of the stream */
29 char * current; /* Current event in stream of events */
30 char * value; /* Current value in event */
34 * Describe how a standard IOCTL looks like.
36 struct iw_ioctl_description
38 uint8_t header_type; /* NULL, iw_point or other */
39 uint8_t token_type; /* Future */
40 uint16_t token_size; /* Granularity of payload */
41 uint16_t min_tokens; /* Min acceptable token number */
42 uint16_t max_tokens; /* Max acceptable token number */
43 uint32_t flags; /* Special handling of the request */
46 /* Type of headers we know about (basically union iwreq_data) */
47 #define IW_HEADER_TYPE_NULL 0 /* Not available */
48 #define IW_HEADER_TYPE_CHAR 2 /* char [IFNAMSIZ] */
49 #define IW_HEADER_TYPE_UINT 4 /* __u32 */
50 #define IW_HEADER_TYPE_FREQ 5 /* struct iw_freq */
51 #define IW_HEADER_TYPE_ADDR 6 /* struct sockaddr */
52 #define IW_HEADER_TYPE_POINT 8 /* struct iw_point */
53 #define IW_HEADER_TYPE_PARAM 9 /* struct iw_param */
54 #define IW_HEADER_TYPE_QUAL 10 /* struct iw_quality */
57 /* Most are not implemented. I just use them as a reminder of some
58 * cool features we might need one day ;-) */
59 #define IW_DESCR_FLAG_NONE 0x0000 /* Obvious */
60 /* Wrapper level flags */
61 #define IW_DESCR_FLAG_DUMP 0x0001 /* Not part of the dump command */
62 #define IW_DESCR_FLAG_EVENT 0x0002 /* Generate an event on SET */
63 #define IW_DESCR_FLAG_RESTRICT 0x0004 /* GET : request is ROOT only */
64 /* SET : Omit payload from generated iwevent */
65 #define IW_DESCR_FLAG_NOMAX 0x0008 /* GET : no limit on request size */
66 /* Driver level flags */
67 #define IW_DESCR_FLAG_WAIT 0x0100 /* Wait for driver event */
71 * Meta-data about all the standard Wireless Extension request we
74 static const struct iw_ioctl_description standard_ioctl_descr[] = {
75 [SIOCSIWCOMMIT - SIOCIWFIRST] = {
76 .header_type = IW_HEADER_TYPE_NULL,
78 [SIOCGIWNAME - SIOCIWFIRST] = {
79 .header_type = IW_HEADER_TYPE_CHAR,
80 .flags = IW_DESCR_FLAG_DUMP,
82 [SIOCSIWNWID - SIOCIWFIRST] = {
83 .header_type = IW_HEADER_TYPE_PARAM,
84 .flags = IW_DESCR_FLAG_EVENT,
86 [SIOCGIWNWID - SIOCIWFIRST] = {
87 .header_type = IW_HEADER_TYPE_PARAM,
88 .flags = IW_DESCR_FLAG_DUMP,
90 [SIOCSIWFREQ - SIOCIWFIRST] = {
91 .header_type = IW_HEADER_TYPE_FREQ,
92 .flags = IW_DESCR_FLAG_EVENT,
94 [SIOCGIWFREQ - SIOCIWFIRST] = {
95 .header_type = IW_HEADER_TYPE_FREQ,
96 .flags = IW_DESCR_FLAG_DUMP,
98 [SIOCSIWMODE - SIOCIWFIRST] = {
99 .header_type = IW_HEADER_TYPE_UINT,
100 .flags = IW_DESCR_FLAG_EVENT,
102 [SIOCGIWMODE - SIOCIWFIRST] = {
103 .header_type = IW_HEADER_TYPE_UINT,
104 .flags = IW_DESCR_FLAG_DUMP,
106 [SIOCSIWSENS - SIOCIWFIRST] = {
107 .header_type = IW_HEADER_TYPE_PARAM,
109 [SIOCGIWSENS - SIOCIWFIRST] = {
110 .header_type = IW_HEADER_TYPE_PARAM,
112 [SIOCSIWRANGE - SIOCIWFIRST] = {
113 .header_type = IW_HEADER_TYPE_NULL,
115 [SIOCGIWRANGE - SIOCIWFIRST] = {
116 .header_type = IW_HEADER_TYPE_POINT,
118 .max_tokens = sizeof(struct iw_range),
119 .flags = IW_DESCR_FLAG_DUMP,
121 [SIOCSIWPRIV - SIOCIWFIRST] = {
122 .header_type = IW_HEADER_TYPE_NULL,
124 [SIOCGIWPRIV - SIOCIWFIRST] = { /* (handled directly by us) */
125 .header_type = IW_HEADER_TYPE_NULL,
127 [SIOCSIWSTATS - SIOCIWFIRST] = {
128 .header_type = IW_HEADER_TYPE_NULL,
130 [SIOCGIWSTATS - SIOCIWFIRST] = { /* (handled directly by us) */
131 .header_type = IW_HEADER_TYPE_NULL,
132 .flags = IW_DESCR_FLAG_DUMP,
134 [SIOCSIWSPY - SIOCIWFIRST] = {
135 .header_type = IW_HEADER_TYPE_POINT,
136 .token_size = sizeof(struct sockaddr),
137 .max_tokens = IW_MAX_SPY,
139 [SIOCGIWSPY - SIOCIWFIRST] = {
140 .header_type = IW_HEADER_TYPE_POINT,
141 .token_size = sizeof(struct sockaddr) +
142 sizeof(struct iw_quality),
143 .max_tokens = IW_MAX_SPY,
145 [SIOCSIWTHRSPY - SIOCIWFIRST] = {
146 .header_type = IW_HEADER_TYPE_POINT,
147 .token_size = sizeof(struct iw_thrspy),
151 [SIOCGIWTHRSPY - SIOCIWFIRST] = {
152 .header_type = IW_HEADER_TYPE_POINT,
153 .token_size = sizeof(struct iw_thrspy),
157 [SIOCSIWAP - SIOCIWFIRST] = {
158 .header_type = IW_HEADER_TYPE_ADDR,
160 [SIOCGIWAP - SIOCIWFIRST] = {
161 .header_type = IW_HEADER_TYPE_ADDR,
162 .flags = IW_DESCR_FLAG_DUMP,
164 [SIOCSIWMLME - SIOCIWFIRST] = {
165 .header_type = IW_HEADER_TYPE_POINT,
167 .min_tokens = sizeof(struct iw_mlme),
168 .max_tokens = sizeof(struct iw_mlme),
170 [SIOCGIWAPLIST - SIOCIWFIRST] = {
171 .header_type = IW_HEADER_TYPE_POINT,
172 .token_size = sizeof(struct sockaddr) +
173 sizeof(struct iw_quality),
174 .max_tokens = IW_MAX_AP,
175 .flags = IW_DESCR_FLAG_NOMAX,
177 [SIOCSIWSCAN - SIOCIWFIRST] = {
178 .header_type = IW_HEADER_TYPE_POINT,
181 .max_tokens = sizeof(struct iw_scan_req),
183 [SIOCGIWSCAN - SIOCIWFIRST] = {
184 .header_type = IW_HEADER_TYPE_POINT,
186 .max_tokens = IW_SCAN_MAX_DATA,
187 .flags = IW_DESCR_FLAG_NOMAX,
189 [SIOCSIWESSID - SIOCIWFIRST] = {
190 .header_type = IW_HEADER_TYPE_POINT,
192 .max_tokens = IW_ESSID_MAX_SIZE + 1,
193 .flags = IW_DESCR_FLAG_EVENT,
195 [SIOCGIWESSID - SIOCIWFIRST] = {
196 .header_type = IW_HEADER_TYPE_POINT,
198 .max_tokens = IW_ESSID_MAX_SIZE + 1,
199 .flags = IW_DESCR_FLAG_DUMP,
201 [SIOCSIWNICKN - SIOCIWFIRST] = {
202 .header_type = IW_HEADER_TYPE_POINT,
204 .max_tokens = IW_ESSID_MAX_SIZE + 1,
206 [SIOCGIWNICKN - SIOCIWFIRST] = {
207 .header_type = IW_HEADER_TYPE_POINT,
209 .max_tokens = IW_ESSID_MAX_SIZE + 1,
211 [SIOCSIWRATE - SIOCIWFIRST] = {
212 .header_type = IW_HEADER_TYPE_PARAM,
214 [SIOCGIWRATE - SIOCIWFIRST] = {
215 .header_type = IW_HEADER_TYPE_PARAM,
217 [SIOCSIWRTS - SIOCIWFIRST] = {
218 .header_type = IW_HEADER_TYPE_PARAM,
220 [SIOCGIWRTS - SIOCIWFIRST] = {
221 .header_type = IW_HEADER_TYPE_PARAM,
223 [SIOCSIWFRAG - SIOCIWFIRST] = {
224 .header_type = IW_HEADER_TYPE_PARAM,
226 [SIOCGIWFRAG - SIOCIWFIRST] = {
227 .header_type = IW_HEADER_TYPE_PARAM,
229 [SIOCSIWTXPOW - SIOCIWFIRST] = {
230 .header_type = IW_HEADER_TYPE_PARAM,
232 [SIOCGIWTXPOW - SIOCIWFIRST] = {
233 .header_type = IW_HEADER_TYPE_PARAM,
235 [SIOCSIWRETRY - SIOCIWFIRST] = {
236 .header_type = IW_HEADER_TYPE_PARAM,
238 [SIOCGIWRETRY - SIOCIWFIRST] = {
239 .header_type = IW_HEADER_TYPE_PARAM,
241 [SIOCSIWENCODE - SIOCIWFIRST] = {
242 .header_type = IW_HEADER_TYPE_POINT,
244 .max_tokens = IW_ENCODING_TOKEN_MAX,
245 .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT,
247 [SIOCGIWENCODE - SIOCIWFIRST] = {
248 .header_type = IW_HEADER_TYPE_POINT,
250 .max_tokens = IW_ENCODING_TOKEN_MAX,
251 .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT,
253 [SIOCSIWPOWER - SIOCIWFIRST] = {
254 .header_type = IW_HEADER_TYPE_PARAM,
256 [SIOCGIWPOWER - SIOCIWFIRST] = {
257 .header_type = IW_HEADER_TYPE_PARAM,
259 [SIOCSIWMODUL - SIOCIWFIRST] = {
260 .header_type = IW_HEADER_TYPE_PARAM,
262 [SIOCGIWMODUL - SIOCIWFIRST] = {
263 .header_type = IW_HEADER_TYPE_PARAM,
265 [SIOCSIWGENIE - SIOCIWFIRST] = {
266 .header_type = IW_HEADER_TYPE_POINT,
268 .max_tokens = IW_GENERIC_IE_MAX,
270 [SIOCGIWGENIE - SIOCIWFIRST] = {
271 .header_type = IW_HEADER_TYPE_POINT,
273 .max_tokens = IW_GENERIC_IE_MAX,
275 [SIOCSIWAUTH - SIOCIWFIRST] = {
276 .header_type = IW_HEADER_TYPE_PARAM,
278 [SIOCGIWAUTH - SIOCIWFIRST] = {
279 .header_type = IW_HEADER_TYPE_PARAM,
281 [SIOCSIWENCODEEXT - SIOCIWFIRST] = {
282 .header_type = IW_HEADER_TYPE_POINT,
284 .min_tokens = sizeof(struct iw_encode_ext),
285 .max_tokens = sizeof(struct iw_encode_ext) +
286 IW_ENCODING_TOKEN_MAX,
288 [SIOCGIWENCODEEXT - SIOCIWFIRST] = {
289 .header_type = IW_HEADER_TYPE_POINT,
291 .min_tokens = sizeof(struct iw_encode_ext),
292 .max_tokens = sizeof(struct iw_encode_ext) +
293 IW_ENCODING_TOKEN_MAX,
295 [SIOCSIWPMKSA - SIOCIWFIRST] = {
296 .header_type = IW_HEADER_TYPE_POINT,
298 .min_tokens = sizeof(struct iw_pmksa),
299 .max_tokens = sizeof(struct iw_pmksa),
304 * Meta-data about all the additional standard Wireless Extension events
307 static const struct iw_ioctl_description standard_event_descr[] = {
308 [IWEVTXDROP - IWEVFIRST] = {
309 .header_type = IW_HEADER_TYPE_ADDR,
311 [IWEVQUAL - IWEVFIRST] = {
312 .header_type = IW_HEADER_TYPE_QUAL,
314 [IWEVCUSTOM - IWEVFIRST] = {
315 .header_type = IW_HEADER_TYPE_POINT,
317 .max_tokens = IW_CUSTOM_MAX,
319 [IWEVREGISTERED - IWEVFIRST] = {
320 .header_type = IW_HEADER_TYPE_ADDR,
322 [IWEVEXPIRED - IWEVFIRST] = {
323 .header_type = IW_HEADER_TYPE_ADDR,
325 [IWEVGENIE - IWEVFIRST] = {
326 .header_type = IW_HEADER_TYPE_POINT,
328 .max_tokens = IW_GENERIC_IE_MAX,
330 [IWEVMICHAELMICFAILURE - IWEVFIRST] = {
331 .header_type = IW_HEADER_TYPE_POINT,
333 .max_tokens = sizeof(struct iw_michaelmicfailure),
335 [IWEVASSOCREQIE - IWEVFIRST] = {
336 .header_type = IW_HEADER_TYPE_POINT,
338 .max_tokens = IW_GENERIC_IE_MAX,
340 [IWEVASSOCRESPIE - IWEVFIRST] = {
341 .header_type = IW_HEADER_TYPE_POINT,
343 .max_tokens = IW_GENERIC_IE_MAX,
345 [IWEVPMKIDCAND - IWEVFIRST] = {
346 .header_type = IW_HEADER_TYPE_POINT,
348 .max_tokens = sizeof(struct iw_pmkid_cand),
352 /* Size (in bytes) of various events */
353 static const int event_type_size[] = {
354 IW_EV_LCP_PK_LEN, /* IW_HEADER_TYPE_NULL */
356 IW_EV_CHAR_PK_LEN, /* IW_HEADER_TYPE_CHAR */
358 IW_EV_UINT_PK_LEN, /* IW_HEADER_TYPE_UINT */
359 IW_EV_FREQ_PK_LEN, /* IW_HEADER_TYPE_FREQ */
360 IW_EV_ADDR_PK_LEN, /* IW_HEADER_TYPE_ADDR */
362 IW_EV_POINT_PK_LEN, /* Without variable payload */
363 IW_EV_PARAM_PK_LEN, /* IW_HEADER_TYPE_PARAM */
364 IW_EV_QUAL_PK_LEN, /* IW_HEADER_TYPE_QUAL */
368 static const unsigned int standard_ioctl_num =
369 (sizeof(standard_ioctl_descr) / sizeof(struct iw_ioctl_description));
371 static const unsigned int standard_event_num =
372 (sizeof(standard_event_descr) / sizeof(struct iw_ioctl_description));
374 static const char *iw_ie_cypher_name[] = {
383 #define IW_ARRAY_LEN(x) (sizeof(x)/sizeof((x)[0]))
384 #define IW_IE_CYPHER_NUM IW_ARRAY_LEN(iw_ie_cypher_name)
386 static const char *iw_ie_key_mgmt_name[] = {
391 #define IW_IE_KEY_MGMT_NUM IW_ARRAY_LEN(iw_ie_key_mgmt_name)