2 * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
4 * Copyright (C) 2009-2010 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 "iwinfo_utils.h"
26 #include "include/wext.h"
29 typedef struct stream_descr
31 char * end
; /* End of the stream */
32 char * current
; /* Current event in stream of events */
33 char * value
; /* Current value in event */
37 * Describe how a standard IOCTL looks like.
39 struct iw_ioctl_description
41 uint8_t header_type
; /* NULL, iw_point or other */
42 uint8_t token_type
; /* Future */
43 uint16_t token_size
; /* Granularity of payload */
44 uint16_t min_tokens
; /* Min acceptable token number */
45 uint16_t max_tokens
; /* Max acceptable token number */
46 uint32_t flags
; /* Special handling of the request */
49 /* Type of headers we know about (basically union iwreq_data) */
50 #define IW_HEADER_TYPE_NULL 0 /* Not available */
51 #define IW_HEADER_TYPE_CHAR 2 /* char [IFNAMSIZ] */
52 #define IW_HEADER_TYPE_UINT 4 /* __u32 */
53 #define IW_HEADER_TYPE_FREQ 5 /* struct iw_freq */
54 #define IW_HEADER_TYPE_ADDR 6 /* struct sockaddr */
55 #define IW_HEADER_TYPE_POINT 8 /* struct iw_point */
56 #define IW_HEADER_TYPE_PARAM 9 /* struct iw_param */
57 #define IW_HEADER_TYPE_QUAL 10 /* struct iw_quality */
60 /* Most are not implemented. I just use them as a reminder of some
61 * cool features we might need one day ;-) */
62 #define IW_DESCR_FLAG_NONE 0x0000 /* Obvious */
63 /* Wrapper level flags */
64 #define IW_DESCR_FLAG_DUMP 0x0001 /* Not part of the dump command */
65 #define IW_DESCR_FLAG_EVENT 0x0002 /* Generate an event on SET */
66 #define IW_DESCR_FLAG_RESTRICT 0x0004 /* GET : request is ROOT only */
67 /* SET : Omit payload from generated iwevent */
68 #define IW_DESCR_FLAG_NOMAX 0x0008 /* GET : no limit on request size */
69 /* Driver level flags */
70 #define IW_DESCR_FLAG_WAIT 0x0100 /* Wait for driver event */
74 * Meta-data about all the standard Wireless Extension request we
77 static const struct iw_ioctl_description standard_ioctl_descr
[] = {
78 [SIOCSIWCOMMIT
- SIOCIWFIRST
] = {
79 .header_type
= IW_HEADER_TYPE_NULL
,
81 [SIOCGIWNAME
- SIOCIWFIRST
] = {
82 .header_type
= IW_HEADER_TYPE_CHAR
,
83 .flags
= IW_DESCR_FLAG_DUMP
,
85 [SIOCSIWNWID
- SIOCIWFIRST
] = {
86 .header_type
= IW_HEADER_TYPE_PARAM
,
87 .flags
= IW_DESCR_FLAG_EVENT
,
89 [SIOCGIWNWID
- SIOCIWFIRST
] = {
90 .header_type
= IW_HEADER_TYPE_PARAM
,
91 .flags
= IW_DESCR_FLAG_DUMP
,
93 [SIOCSIWFREQ
- SIOCIWFIRST
] = {
94 .header_type
= IW_HEADER_TYPE_FREQ
,
95 .flags
= IW_DESCR_FLAG_EVENT
,
97 [SIOCGIWFREQ
- SIOCIWFIRST
] = {
98 .header_type
= IW_HEADER_TYPE_FREQ
,
99 .flags
= IW_DESCR_FLAG_DUMP
,
101 [SIOCSIWMODE
- SIOCIWFIRST
] = {
102 .header_type
= IW_HEADER_TYPE_UINT
,
103 .flags
= IW_DESCR_FLAG_EVENT
,
105 [SIOCGIWMODE
- SIOCIWFIRST
] = {
106 .header_type
= IW_HEADER_TYPE_UINT
,
107 .flags
= IW_DESCR_FLAG_DUMP
,
109 [SIOCSIWSENS
- SIOCIWFIRST
] = {
110 .header_type
= IW_HEADER_TYPE_PARAM
,
112 [SIOCGIWSENS
- SIOCIWFIRST
] = {
113 .header_type
= IW_HEADER_TYPE_PARAM
,
115 [SIOCSIWRANGE
- SIOCIWFIRST
] = {
116 .header_type
= IW_HEADER_TYPE_NULL
,
118 [SIOCGIWRANGE
- SIOCIWFIRST
] = {
119 .header_type
= IW_HEADER_TYPE_POINT
,
121 .max_tokens
= sizeof(struct iw_range
),
122 .flags
= IW_DESCR_FLAG_DUMP
,
124 [SIOCSIWPRIV
- SIOCIWFIRST
] = {
125 .header_type
= IW_HEADER_TYPE_NULL
,
127 [SIOCGIWPRIV
- SIOCIWFIRST
] = { /* (handled directly by us) */
128 .header_type
= IW_HEADER_TYPE_NULL
,
130 [SIOCSIWSTATS
- SIOCIWFIRST
] = {
131 .header_type
= IW_HEADER_TYPE_NULL
,
133 [SIOCGIWSTATS
- SIOCIWFIRST
] = { /* (handled directly by us) */
134 .header_type
= IW_HEADER_TYPE_NULL
,
135 .flags
= IW_DESCR_FLAG_DUMP
,
137 [SIOCSIWSPY
- SIOCIWFIRST
] = {
138 .header_type
= IW_HEADER_TYPE_POINT
,
139 .token_size
= sizeof(struct sockaddr
),
140 .max_tokens
= IW_MAX_SPY
,
142 [SIOCGIWSPY
- SIOCIWFIRST
] = {
143 .header_type
= IW_HEADER_TYPE_POINT
,
144 .token_size
= sizeof(struct sockaddr
) +
145 sizeof(struct iw_quality
),
146 .max_tokens
= IW_MAX_SPY
,
148 [SIOCSIWTHRSPY
- SIOCIWFIRST
] = {
149 .header_type
= IW_HEADER_TYPE_POINT
,
150 .token_size
= sizeof(struct iw_thrspy
),
154 [SIOCGIWTHRSPY
- SIOCIWFIRST
] = {
155 .header_type
= IW_HEADER_TYPE_POINT
,
156 .token_size
= sizeof(struct iw_thrspy
),
160 [SIOCSIWAP
- SIOCIWFIRST
] = {
161 .header_type
= IW_HEADER_TYPE_ADDR
,
163 [SIOCGIWAP
- SIOCIWFIRST
] = {
164 .header_type
= IW_HEADER_TYPE_ADDR
,
165 .flags
= IW_DESCR_FLAG_DUMP
,
167 [SIOCSIWMLME
- SIOCIWFIRST
] = {
168 .header_type
= IW_HEADER_TYPE_POINT
,
170 .min_tokens
= sizeof(struct iw_mlme
),
171 .max_tokens
= sizeof(struct iw_mlme
),
173 [SIOCGIWAPLIST
- SIOCIWFIRST
] = {
174 .header_type
= IW_HEADER_TYPE_POINT
,
175 .token_size
= sizeof(struct sockaddr
) +
176 sizeof(struct iw_quality
),
177 .max_tokens
= IW_MAX_AP
,
178 .flags
= IW_DESCR_FLAG_NOMAX
,
180 [SIOCSIWSCAN
- SIOCIWFIRST
] = {
181 .header_type
= IW_HEADER_TYPE_POINT
,
184 .max_tokens
= sizeof(struct iw_scan_req
),
186 [SIOCGIWSCAN
- SIOCIWFIRST
] = {
187 .header_type
= IW_HEADER_TYPE_POINT
,
189 .max_tokens
= IW_SCAN_MAX_DATA
,
190 .flags
= IW_DESCR_FLAG_NOMAX
,
192 [SIOCSIWESSID
- SIOCIWFIRST
] = {
193 .header_type
= IW_HEADER_TYPE_POINT
,
195 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
196 .flags
= IW_DESCR_FLAG_EVENT
,
198 [SIOCGIWESSID
- SIOCIWFIRST
] = {
199 .header_type
= IW_HEADER_TYPE_POINT
,
201 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
202 .flags
= IW_DESCR_FLAG_DUMP
,
204 [SIOCSIWNICKN
- SIOCIWFIRST
] = {
205 .header_type
= IW_HEADER_TYPE_POINT
,
207 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
209 [SIOCGIWNICKN
- SIOCIWFIRST
] = {
210 .header_type
= IW_HEADER_TYPE_POINT
,
212 .max_tokens
= IW_ESSID_MAX_SIZE
+ 1,
214 [SIOCSIWRATE
- SIOCIWFIRST
] = {
215 .header_type
= IW_HEADER_TYPE_PARAM
,
217 [SIOCGIWRATE
- SIOCIWFIRST
] = {
218 .header_type
= IW_HEADER_TYPE_PARAM
,
220 [SIOCSIWRTS
- SIOCIWFIRST
] = {
221 .header_type
= IW_HEADER_TYPE_PARAM
,
223 [SIOCGIWRTS
- SIOCIWFIRST
] = {
224 .header_type
= IW_HEADER_TYPE_PARAM
,
226 [SIOCSIWFRAG
- SIOCIWFIRST
] = {
227 .header_type
= IW_HEADER_TYPE_PARAM
,
229 [SIOCGIWFRAG
- SIOCIWFIRST
] = {
230 .header_type
= IW_HEADER_TYPE_PARAM
,
232 [SIOCSIWTXPOW
- SIOCIWFIRST
] = {
233 .header_type
= IW_HEADER_TYPE_PARAM
,
235 [SIOCGIWTXPOW
- SIOCIWFIRST
] = {
236 .header_type
= IW_HEADER_TYPE_PARAM
,
238 [SIOCSIWRETRY
- SIOCIWFIRST
] = {
239 .header_type
= IW_HEADER_TYPE_PARAM
,
241 [SIOCGIWRETRY
- SIOCIWFIRST
] = {
242 .header_type
= IW_HEADER_TYPE_PARAM
,
244 [SIOCSIWENCODE
- SIOCIWFIRST
] = {
245 .header_type
= IW_HEADER_TYPE_POINT
,
247 .max_tokens
= IW_ENCODING_TOKEN_MAX
,
248 .flags
= IW_DESCR_FLAG_EVENT
| IW_DESCR_FLAG_RESTRICT
,
250 [SIOCGIWENCODE
- SIOCIWFIRST
] = {
251 .header_type
= IW_HEADER_TYPE_POINT
,
253 .max_tokens
= IW_ENCODING_TOKEN_MAX
,
254 .flags
= IW_DESCR_FLAG_DUMP
| IW_DESCR_FLAG_RESTRICT
,
256 [SIOCSIWPOWER
- SIOCIWFIRST
] = {
257 .header_type
= IW_HEADER_TYPE_PARAM
,
259 [SIOCGIWPOWER
- SIOCIWFIRST
] = {
260 .header_type
= IW_HEADER_TYPE_PARAM
,
262 [SIOCSIWMODUL
- SIOCIWFIRST
] = {
263 .header_type
= IW_HEADER_TYPE_PARAM
,
265 [SIOCGIWMODUL
- SIOCIWFIRST
] = {
266 .header_type
= IW_HEADER_TYPE_PARAM
,
268 [SIOCSIWGENIE
- SIOCIWFIRST
] = {
269 .header_type
= IW_HEADER_TYPE_POINT
,
271 .max_tokens
= IW_GENERIC_IE_MAX
,
273 [SIOCGIWGENIE
- SIOCIWFIRST
] = {
274 .header_type
= IW_HEADER_TYPE_POINT
,
276 .max_tokens
= IW_GENERIC_IE_MAX
,
278 [SIOCSIWAUTH
- SIOCIWFIRST
] = {
279 .header_type
= IW_HEADER_TYPE_PARAM
,
281 [SIOCGIWAUTH
- SIOCIWFIRST
] = {
282 .header_type
= IW_HEADER_TYPE_PARAM
,
284 [SIOCSIWENCODEEXT
- SIOCIWFIRST
] = {
285 .header_type
= IW_HEADER_TYPE_POINT
,
287 .min_tokens
= sizeof(struct iw_encode_ext
),
288 .max_tokens
= sizeof(struct iw_encode_ext
) +
289 IW_ENCODING_TOKEN_MAX
,
291 [SIOCGIWENCODEEXT
- SIOCIWFIRST
] = {
292 .header_type
= IW_HEADER_TYPE_POINT
,
294 .min_tokens
= sizeof(struct iw_encode_ext
),
295 .max_tokens
= sizeof(struct iw_encode_ext
) +
296 IW_ENCODING_TOKEN_MAX
,
298 [SIOCSIWPMKSA
- SIOCIWFIRST
] = {
299 .header_type
= IW_HEADER_TYPE_POINT
,
301 .min_tokens
= sizeof(struct iw_pmksa
),
302 .max_tokens
= sizeof(struct iw_pmksa
),
307 * Meta-data about all the additional standard Wireless Extension events
310 static const struct iw_ioctl_description standard_event_descr
[] = {
311 [IWEVTXDROP
- IWEVFIRST
] = {
312 .header_type
= IW_HEADER_TYPE_ADDR
,
314 [IWEVQUAL
- IWEVFIRST
] = {
315 .header_type
= IW_HEADER_TYPE_QUAL
,
317 [IWEVCUSTOM
- IWEVFIRST
] = {
318 .header_type
= IW_HEADER_TYPE_POINT
,
320 .max_tokens
= IW_CUSTOM_MAX
,
322 [IWEVREGISTERED
- IWEVFIRST
] = {
323 .header_type
= IW_HEADER_TYPE_ADDR
,
325 [IWEVEXPIRED
- IWEVFIRST
] = {
326 .header_type
= IW_HEADER_TYPE_ADDR
,
328 [IWEVGENIE
- IWEVFIRST
] = {
329 .header_type
= IW_HEADER_TYPE_POINT
,
331 .max_tokens
= IW_GENERIC_IE_MAX
,
333 [IWEVMICHAELMICFAILURE
- IWEVFIRST
] = {
334 .header_type
= IW_HEADER_TYPE_POINT
,
336 .max_tokens
= sizeof(struct iw_michaelmicfailure
),
338 [IWEVASSOCREQIE
- IWEVFIRST
] = {
339 .header_type
= IW_HEADER_TYPE_POINT
,
341 .max_tokens
= IW_GENERIC_IE_MAX
,
343 [IWEVASSOCRESPIE
- IWEVFIRST
] = {
344 .header_type
= IW_HEADER_TYPE_POINT
,
346 .max_tokens
= IW_GENERIC_IE_MAX
,
348 [IWEVPMKIDCAND
- IWEVFIRST
] = {
349 .header_type
= IW_HEADER_TYPE_POINT
,
351 .max_tokens
= sizeof(struct iw_pmkid_cand
),
355 /* Size (in bytes) of various events */
356 static const int event_type_size
[] = {
357 IW_EV_LCP_PK_LEN
, /* IW_HEADER_TYPE_NULL */
359 IW_EV_CHAR_PK_LEN
, /* IW_HEADER_TYPE_CHAR */
361 IW_EV_UINT_PK_LEN
, /* IW_HEADER_TYPE_UINT */
362 IW_EV_FREQ_PK_LEN
, /* IW_HEADER_TYPE_FREQ */
363 IW_EV_ADDR_PK_LEN
, /* IW_HEADER_TYPE_ADDR */
365 IW_EV_POINT_PK_LEN
, /* Without variable payload */
366 IW_EV_PARAM_PK_LEN
, /* IW_HEADER_TYPE_PARAM */
367 IW_EV_QUAL_PK_LEN
, /* IW_HEADER_TYPE_QUAL */
371 static const unsigned int standard_ioctl_num
=
372 (sizeof(standard_ioctl_descr
) / sizeof(struct iw_ioctl_description
));
374 static const unsigned int standard_event_num
=
375 (sizeof(standard_event_descr
) / sizeof(struct iw_ioctl_description
));
377 #define IW_IE_CYPHER_NUM 8
378 #define IW_IE_KEY_MGMT_NUM 3