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_
25 #include "include/wext.h"
28 typedef struct stream_descr
30 char * end
; /* End of the stream */
31 char * current
; /* Current event in stream of events */
32 char * value
; /* Current value in event */
36 * Describe how a standard IOCTL looks like.
38 struct iw_ioctl_description
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 */
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 */
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 */
73 * Meta-data about all the standard Wireless Extension request we
76 static const struct iw_ioctl_description standard_ioctl_descr
[] = {
77 [SIOCSIWCOMMIT
- SIOCIWFIRST
] = {
78 .header_type
= IW_HEADER_TYPE_NULL
,
80 [SIOCGIWNAME
- SIOCIWFIRST
] = {
81 .header_type
= IW_HEADER_TYPE_CHAR
,
82 .flags
= IW_DESCR_FLAG_DUMP
,
84 [SIOCSIWNWID
- SIOCIWFIRST
] = {
85 .header_type
= IW_HEADER_TYPE_PARAM
,
86 .flags
= IW_DESCR_FLAG_EVENT
,
88 [SIOCGIWNWID
- SIOCIWFIRST
] = {
89 .header_type
= IW_HEADER_TYPE_PARAM
,
90 .flags
= IW_DESCR_FLAG_DUMP
,
92 [SIOCSIWFREQ
- SIOCIWFIRST
] = {
93 .header_type
= IW_HEADER_TYPE_FREQ
,
94 .flags
= IW_DESCR_FLAG_EVENT
,
96 [SIOCGIWFREQ
- SIOCIWFIRST
] = {
97 .header_type
= IW_HEADER_TYPE_FREQ
,
98 .flags
= IW_DESCR_FLAG_DUMP
,
100 [SIOCSIWMODE
- SIOCIWFIRST
] = {
101 .header_type
= IW_HEADER_TYPE_UINT
,
102 .flags
= IW_DESCR_FLAG_EVENT
,
104 [SIOCGIWMODE
- SIOCIWFIRST
] = {
105 .header_type
= IW_HEADER_TYPE_UINT
,
106 .flags
= IW_DESCR_FLAG_DUMP
,
108 [SIOCSIWSENS
- SIOCIWFIRST
] = {
109 .header_type
= IW_HEADER_TYPE_PARAM
,
111 [SIOCGIWSENS
- SIOCIWFIRST
] = {
112 .header_type
= IW_HEADER_TYPE_PARAM
,
114 [SIOCSIWRANGE
- SIOCIWFIRST
] = {
115 .header_type
= IW_HEADER_TYPE_NULL
,
117 [SIOCGIWRANGE
- SIOCIWFIRST
] = {
118 .header_type
= IW_HEADER_TYPE_POINT
,
120 .max_tokens
= sizeof(struct iw_range
),
121 .flags
= IW_DESCR_FLAG_DUMP
,
123 [SIOCSIWPRIV
- SIOCIWFIRST
] = {
124 .header_type
= IW_HEADER_TYPE_NULL
,
126 [SIOCGIWPRIV
- SIOCIWFIRST
] = { /* (handled directly by us) */
127 .header_type
= IW_HEADER_TYPE_NULL
,
129 [SIOCSIWSTATS
- SIOCIWFIRST
] = {
130 .header_type
= IW_HEADER_TYPE_NULL
,
132 [SIOCGIWSTATS
- SIOCIWFIRST
] = { /* (handled directly by us) */
133 .header_type
= IW_HEADER_TYPE_NULL
,
134 .flags
= IW_DESCR_FLAG_DUMP
,
136 [SIOCSIWSPY
- SIOCIWFIRST
] = {
137 .header_type
= IW_HEADER_TYPE_POINT
,
138 .token_size
= sizeof(struct sockaddr
),
139 .max_tokens
= IW_MAX_SPY
,
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
,
147 [SIOCSIWTHRSPY
- SIOCIWFIRST
] = {
148 .header_type
= IW_HEADER_TYPE_POINT
,
149 .token_size
= sizeof(struct iw_thrspy
),
153 [SIOCGIWTHRSPY
- SIOCIWFIRST
] = {
154 .header_type
= IW_HEADER_TYPE_POINT
,
155 .token_size
= sizeof(struct iw_thrspy
),
159 [SIOCSIWAP
- SIOCIWFIRST
] = {
160 .header_type
= IW_HEADER_TYPE_ADDR
,
162 [SIOCGIWAP
- SIOCIWFIRST
] = {
163 .header_type
= IW_HEADER_TYPE_ADDR
,
164 .flags
= IW_DESCR_FLAG_DUMP
,
166 [SIOCSIWMLME
- SIOCIWFIRST
] = {
167 .header_type
= IW_HEADER_TYPE_POINT
,
169 .min_tokens
= sizeof(struct iw_mlme
),
170 .max_tokens
= sizeof(struct iw_mlme
),
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
,
179 [SIOCSIWSCAN
- SIOCIWFIRST
] = {
180 .header_type
= IW_HEADER_TYPE_POINT
,
183 .max_tokens
= sizeof(struct iw_scan_req
),
185 [SIOCGIWSCAN
- SIOCIWFIRST
] = {
186 .header_type
= IW_HEADER_TYPE_POINT
,
188 .max_tokens
= IW_SCAN_MAX_DATA
,
189 .flags
= IW_DESCR_FLAG_NOMAX
,
191 [SIOCSIWESSID
- SIOCIWFIRST
] = {
192 .header_type
= IW_HEADER_TYPE_POINT
,
194 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
195 .flags
= IW_DESCR_FLAG_EVENT
,
197 [SIOCGIWESSID
- SIOCIWFIRST
] = {
198 .header_type
= IW_HEADER_TYPE_POINT
,
200 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
201 .flags
= IW_DESCR_FLAG_DUMP
,
203 [SIOCSIWNICKN
- SIOCIWFIRST
] = {
204 .header_type
= IW_HEADER_TYPE_POINT
,
206 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
208 [SIOCGIWNICKN
- SIOCIWFIRST
] = {
209 .header_type
= IW_HEADER_TYPE_POINT
,
211 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
213 [SIOCSIWRATE
- SIOCIWFIRST
] = {
214 .header_type
= IW_HEADER_TYPE_PARAM
,
216 [SIOCGIWRATE
- SIOCIWFIRST
] = {
217 .header_type
= IW_HEADER_TYPE_PARAM
,
219 [SIOCSIWRTS
- SIOCIWFIRST
] = {
220 .header_type
= IW_HEADER_TYPE_PARAM
,
222 [SIOCGIWRTS
- SIOCIWFIRST
] = {
223 .header_type
= IW_HEADER_TYPE_PARAM
,
225 [SIOCSIWFRAG
- SIOCIWFIRST
] = {
226 .header_type
= IW_HEADER_TYPE_PARAM
,
228 [SIOCGIWFRAG
- SIOCIWFIRST
] = {
229 .header_type
= IW_HEADER_TYPE_PARAM
,
231 [SIOCSIWTXPOW
- SIOCIWFIRST
] = {
232 .header_type
= IW_HEADER_TYPE_PARAM
,
234 [SIOCGIWTXPOW
- SIOCIWFIRST
] = {
235 .header_type
= IW_HEADER_TYPE_PARAM
,
237 [SIOCSIWRETRY
- SIOCIWFIRST
] = {
238 .header_type
= IW_HEADER_TYPE_PARAM
,
240 [SIOCGIWRETRY
- SIOCIWFIRST
] = {
241 .header_type
= IW_HEADER_TYPE_PARAM
,
243 [SIOCSIWENCODE
- SIOCIWFIRST
] = {
244 .header_type
= IW_HEADER_TYPE_POINT
,
246 .max_tokens
= IW_ENCODING_TOKEN_MAX
,
247 .flags
= IW_DESCR_FLAG_EVENT
| IW_DESCR_FLAG_RESTRICT
,
249 [SIOCGIWENCODE
- SIOCIWFIRST
] = {
250 .header_type
= IW_HEADER_TYPE_POINT
,
252 .max_tokens
= IW_ENCODING_TOKEN_MAX
,
253 .flags
= IW_DESCR_FLAG_DUMP
| IW_DESCR_FLAG_RESTRICT
,
255 [SIOCSIWPOWER
- SIOCIWFIRST
] = {
256 .header_type
= IW_HEADER_TYPE_PARAM
,
258 [SIOCGIWPOWER
- SIOCIWFIRST
] = {
259 .header_type
= IW_HEADER_TYPE_PARAM
,
261 [SIOCSIWMODUL
- SIOCIWFIRST
] = {
262 .header_type
= IW_HEADER_TYPE_PARAM
,
264 [SIOCGIWMODUL
- SIOCIWFIRST
] = {
265 .header_type
= IW_HEADER_TYPE_PARAM
,
267 [SIOCSIWGENIE
- SIOCIWFIRST
] = {
268 .header_type
= IW_HEADER_TYPE_POINT
,
270 .max_tokens
= IW_GENERIC_IE_MAX
,
272 [SIOCGIWGENIE
- SIOCIWFIRST
] = {
273 .header_type
= IW_HEADER_TYPE_POINT
,
275 .max_tokens
= IW_GENERIC_IE_MAX
,
277 [SIOCSIWAUTH
- SIOCIWFIRST
] = {
278 .header_type
= IW_HEADER_TYPE_PARAM
,
280 [SIOCGIWAUTH
- SIOCIWFIRST
] = {
281 .header_type
= IW_HEADER_TYPE_PARAM
,
283 [SIOCSIWENCODEEXT
- SIOCIWFIRST
] = {
284 .header_type
= IW_HEADER_TYPE_POINT
,
286 .min_tokens
= sizeof(struct iw_encode_ext
),
287 .max_tokens
= sizeof(struct iw_encode_ext
) +
288 IW_ENCODING_TOKEN_MAX
,
290 [SIOCGIWENCODEEXT
- SIOCIWFIRST
] = {
291 .header_type
= IW_HEADER_TYPE_POINT
,
293 .min_tokens
= sizeof(struct iw_encode_ext
),
294 .max_tokens
= sizeof(struct iw_encode_ext
) +
295 IW_ENCODING_TOKEN_MAX
,
297 [SIOCSIWPMKSA
- SIOCIWFIRST
] = {
298 .header_type
= IW_HEADER_TYPE_POINT
,
300 .min_tokens
= sizeof(struct iw_pmksa
),
301 .max_tokens
= sizeof(struct iw_pmksa
),
306 * Meta-data about all the additional standard Wireless Extension events
309 static const struct iw_ioctl_description standard_event_descr
[] = {
310 [IWEVTXDROP
- IWEVFIRST
] = {
311 .header_type
= IW_HEADER_TYPE_ADDR
,
313 [IWEVQUAL
- IWEVFIRST
] = {
314 .header_type
= IW_HEADER_TYPE_QUAL
,
316 [IWEVCUSTOM
- IWEVFIRST
] = {
317 .header_type
= IW_HEADER_TYPE_POINT
,
319 .max_tokens
= IW_CUSTOM_MAX
,
321 [IWEVREGISTERED
- IWEVFIRST
] = {
322 .header_type
= IW_HEADER_TYPE_ADDR
,
324 [IWEVEXPIRED
- IWEVFIRST
] = {
325 .header_type
= IW_HEADER_TYPE_ADDR
,
327 [IWEVGENIE
- IWEVFIRST
] = {
328 .header_type
= IW_HEADER_TYPE_POINT
,
330 .max_tokens
= IW_GENERIC_IE_MAX
,
332 [IWEVMICHAELMICFAILURE
- IWEVFIRST
] = {
333 .header_type
= IW_HEADER_TYPE_POINT
,
335 .max_tokens
= sizeof(struct iw_michaelmicfailure
),
337 [IWEVASSOCREQIE
- IWEVFIRST
] = {
338 .header_type
= IW_HEADER_TYPE_POINT
,
340 .max_tokens
= IW_GENERIC_IE_MAX
,
342 [IWEVASSOCRESPIE
- IWEVFIRST
] = {
343 .header_type
= IW_HEADER_TYPE_POINT
,
345 .max_tokens
= IW_GENERIC_IE_MAX
,
347 [IWEVPMKIDCAND
- IWEVFIRST
] = {
348 .header_type
= IW_HEADER_TYPE_POINT
,
350 .max_tokens
= sizeof(struct iw_pmkid_cand
),
354 /* Size (in bytes) of various events */
355 static const int event_type_size
[] = {
356 IW_EV_LCP_PK_LEN
, /* IW_HEADER_TYPE_NULL */
358 IW_EV_CHAR_PK_LEN
, /* IW_HEADER_TYPE_CHAR */
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 */
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 */
370 static const unsigned int standard_ioctl_num
=
371 (sizeof(standard_ioctl_descr
) / sizeof(struct iw_ioctl_description
));
373 static const unsigned int standard_event_num
=
374 (sizeof(standard_event_descr
) / sizeof(struct iw_ioctl_description
));
376 #define IW_IE_CYPHER_NUM 8
377 #define IW_IE_KEY_MGMT_NUM 3