Root/package/iwinfo/src/include/iwinfo/wext_scan.h

1/*
2 * iwinfo - Wireless Information Library - Linux Wireless Extension Headers
3 *
4 * Copyright (C) 2009-2010 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 "iwinfo/utils.h"
26#include "iwinfo/api/wext.h"
27
28
29typedef struct stream_descr
30{
31  char * end; /* End of the stream */
32  char * current; /* Current event in stream of events */
33  char * value; /* Current value in event */
34} stream_descr;
35
36/*
37 * Describe how a standard IOCTL looks like.
38 */
39struct iw_ioctl_description
40{
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 */
47};
48
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 */
58
59/* Handling flags */
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 */
71
72
73/*
74 * Meta-data about all the standard Wireless Extension request we
75 * know about.
76 */
77static const struct iw_ioctl_description standard_ioctl_descr[] = {
78    [SIOCSIWCOMMIT - SIOCIWFIRST] = {
79        .header_type = IW_HEADER_TYPE_NULL,
80    },
81    [SIOCGIWNAME - SIOCIWFIRST] = {
82        .header_type = IW_HEADER_TYPE_CHAR,
83        .flags = IW_DESCR_FLAG_DUMP,
84    },
85    [SIOCSIWNWID - SIOCIWFIRST] = {
86        .header_type = IW_HEADER_TYPE_PARAM,
87        .flags = IW_DESCR_FLAG_EVENT,
88    },
89    [SIOCGIWNWID - SIOCIWFIRST] = {
90        .header_type = IW_HEADER_TYPE_PARAM,
91        .flags = IW_DESCR_FLAG_DUMP,
92    },
93    [SIOCSIWFREQ - SIOCIWFIRST] = {
94        .header_type = IW_HEADER_TYPE_FREQ,
95        .flags = IW_DESCR_FLAG_EVENT,
96    },
97    [SIOCGIWFREQ - SIOCIWFIRST] = {
98        .header_type = IW_HEADER_TYPE_FREQ,
99        .flags = IW_DESCR_FLAG_DUMP,
100    },
101    [SIOCSIWMODE - SIOCIWFIRST] = {
102        .header_type = IW_HEADER_TYPE_UINT,
103        .flags = IW_DESCR_FLAG_EVENT,
104    },
105    [SIOCGIWMODE - SIOCIWFIRST] = {
106        .header_type = IW_HEADER_TYPE_UINT,
107        .flags = IW_DESCR_FLAG_DUMP,
108    },
109    [SIOCSIWSENS - SIOCIWFIRST] = {
110        .header_type = IW_HEADER_TYPE_PARAM,
111    },
112    [SIOCGIWSENS - SIOCIWFIRST] = {
113        .header_type = IW_HEADER_TYPE_PARAM,
114    },
115    [SIOCSIWRANGE - SIOCIWFIRST] = {
116        .header_type = IW_HEADER_TYPE_NULL,
117    },
118    [SIOCGIWRANGE - SIOCIWFIRST] = {
119        .header_type = IW_HEADER_TYPE_POINT,
120        .token_size = 1,
121        .max_tokens = sizeof(struct iw_range),
122        .flags = IW_DESCR_FLAG_DUMP,
123    },
124    [SIOCSIWPRIV - SIOCIWFIRST] = {
125        .header_type = IW_HEADER_TYPE_NULL,
126    },
127    [SIOCGIWPRIV - SIOCIWFIRST] = { /* (handled directly by us) */
128        .header_type = IW_HEADER_TYPE_NULL,
129    },
130    [SIOCSIWSTATS - SIOCIWFIRST] = {
131        .header_type = IW_HEADER_TYPE_NULL,
132    },
133    [SIOCGIWSTATS - SIOCIWFIRST] = { /* (handled directly by us) */
134        .header_type = IW_HEADER_TYPE_NULL,
135        .flags = IW_DESCR_FLAG_DUMP,
136    },
137    [SIOCSIWSPY - SIOCIWFIRST] = {
138        .header_type = IW_HEADER_TYPE_POINT,
139        .token_size = sizeof(struct sockaddr),
140        .max_tokens = IW_MAX_SPY,
141    },
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,
147    },
148    [SIOCSIWTHRSPY - SIOCIWFIRST] = {
149        .header_type = IW_HEADER_TYPE_POINT,
150        .token_size = sizeof(struct iw_thrspy),
151        .min_tokens = 1,
152        .max_tokens = 1,
153    },
154    [SIOCGIWTHRSPY - SIOCIWFIRST] = {
155        .header_type = IW_HEADER_TYPE_POINT,
156        .token_size = sizeof(struct iw_thrspy),
157        .min_tokens = 1,
158        .max_tokens = 1,
159    },
160    [SIOCSIWAP - SIOCIWFIRST] = {
161        .header_type = IW_HEADER_TYPE_ADDR,
162    },
163    [SIOCGIWAP - SIOCIWFIRST] = {
164        .header_type = IW_HEADER_TYPE_ADDR,
165        .flags = IW_DESCR_FLAG_DUMP,
166    },
167    [SIOCSIWMLME - SIOCIWFIRST] = {
168        .header_type = IW_HEADER_TYPE_POINT,
169        .token_size = 1,
170        .min_tokens = sizeof(struct iw_mlme),
171        .max_tokens = sizeof(struct iw_mlme),
172    },
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,
179    },
180    [SIOCSIWSCAN - SIOCIWFIRST] = {
181        .header_type = IW_HEADER_TYPE_POINT,
182        .token_size = 1,
183        .min_tokens = 0,
184        .max_tokens = sizeof(struct iw_scan_req),
185    },
186    [SIOCGIWSCAN - SIOCIWFIRST] = {
187        .header_type = IW_HEADER_TYPE_POINT,
188        .token_size = 1,
189        .max_tokens = IW_SCAN_MAX_DATA,
190        .flags = IW_DESCR_FLAG_NOMAX,
191    },
192    [SIOCSIWESSID - SIOCIWFIRST] = {
193        .header_type = IW_HEADER_TYPE_POINT,
194        .token_size = 1,
195        .max_tokens = IW_ESSID_MAX_SIZE + 1,
196        .flags = IW_DESCR_FLAG_EVENT,
197    },
198    [SIOCGIWESSID - SIOCIWFIRST] = {
199        .header_type = IW_HEADER_TYPE_POINT,
200        .token_size = 1,
201        .max_tokens = IW_ESSID_MAX_SIZE + 1,
202        .flags = IW_DESCR_FLAG_DUMP,
203    },
204    [SIOCSIWNICKN - SIOCIWFIRST] = {
205        .header_type = IW_HEADER_TYPE_POINT,
206        .token_size = 1,
207        .max_tokens = IW_ESSID_MAX_SIZE + 1,
208    },
209    [SIOCGIWNICKN - SIOCIWFIRST] = {
210        .header_type = IW_HEADER_TYPE_POINT,
211        .token_size = 1,
212        .max_tokens = IW_ESSID_MAX_SIZE + 1,
213    },
214    [SIOCSIWRATE - SIOCIWFIRST] = {
215        .header_type = IW_HEADER_TYPE_PARAM,
216    },
217    [SIOCGIWRATE - SIOCIWFIRST] = {
218        .header_type = IW_HEADER_TYPE_PARAM,
219    },
220    [SIOCSIWRTS - SIOCIWFIRST] = {
221        .header_type = IW_HEADER_TYPE_PARAM,
222    },
223    [SIOCGIWRTS - SIOCIWFIRST] = {
224        .header_type = IW_HEADER_TYPE_PARAM,
225    },
226    [SIOCSIWFRAG - SIOCIWFIRST] = {
227        .header_type = IW_HEADER_TYPE_PARAM,
228    },
229    [SIOCGIWFRAG - SIOCIWFIRST] = {
230        .header_type = IW_HEADER_TYPE_PARAM,
231    },
232    [SIOCSIWTXPOW - SIOCIWFIRST] = {
233        .header_type = IW_HEADER_TYPE_PARAM,
234    },
235    [SIOCGIWTXPOW - SIOCIWFIRST] = {
236        .header_type = IW_HEADER_TYPE_PARAM,
237    },
238    [SIOCSIWRETRY - SIOCIWFIRST] = {
239        .header_type = IW_HEADER_TYPE_PARAM,
240    },
241    [SIOCGIWRETRY - SIOCIWFIRST] = {
242        .header_type = IW_HEADER_TYPE_PARAM,
243    },
244    [SIOCSIWENCODE - SIOCIWFIRST] = {
245        .header_type = IW_HEADER_TYPE_POINT,
246        .token_size = 1,
247        .max_tokens = IW_ENCODING_TOKEN_MAX,
248        .flags = IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT,
249    },
250    [SIOCGIWENCODE - SIOCIWFIRST] = {
251        .header_type = IW_HEADER_TYPE_POINT,
252        .token_size = 1,
253        .max_tokens = IW_ENCODING_TOKEN_MAX,
254        .flags = IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT,
255    },
256    [SIOCSIWPOWER - SIOCIWFIRST] = {
257        .header_type = IW_HEADER_TYPE_PARAM,
258    },
259    [SIOCGIWPOWER - SIOCIWFIRST] = {
260        .header_type = IW_HEADER_TYPE_PARAM,
261    },
262    [SIOCSIWMODUL - SIOCIWFIRST] = {
263        .header_type = IW_HEADER_TYPE_PARAM,
264    },
265    [SIOCGIWMODUL - SIOCIWFIRST] = {
266        .header_type = IW_HEADER_TYPE_PARAM,
267    },
268    [SIOCSIWGENIE - SIOCIWFIRST] = {
269        .header_type = IW_HEADER_TYPE_POINT,
270        .token_size = 1,
271        .max_tokens = IW_GENERIC_IE_MAX,
272    },
273    [SIOCGIWGENIE - SIOCIWFIRST] = {
274        .header_type = IW_HEADER_TYPE_POINT,
275        .token_size = 1,
276        .max_tokens = IW_GENERIC_IE_MAX,
277    },
278    [SIOCSIWAUTH - SIOCIWFIRST] = {
279        .header_type = IW_HEADER_TYPE_PARAM,
280    },
281    [SIOCGIWAUTH - SIOCIWFIRST] = {
282        .header_type = IW_HEADER_TYPE_PARAM,
283    },
284    [SIOCSIWENCODEEXT - SIOCIWFIRST] = {
285        .header_type = IW_HEADER_TYPE_POINT,
286        .token_size = 1,
287        .min_tokens = sizeof(struct iw_encode_ext),
288        .max_tokens = sizeof(struct iw_encode_ext) +
289                  IW_ENCODING_TOKEN_MAX,
290    },
291    [SIOCGIWENCODEEXT - SIOCIWFIRST] = {
292        .header_type = IW_HEADER_TYPE_POINT,
293        .token_size = 1,
294        .min_tokens = sizeof(struct iw_encode_ext),
295        .max_tokens = sizeof(struct iw_encode_ext) +
296                  IW_ENCODING_TOKEN_MAX,
297    },
298    [SIOCSIWPMKSA - SIOCIWFIRST] = {
299        .header_type = IW_HEADER_TYPE_POINT,
300        .token_size = 1,
301        .min_tokens = sizeof(struct iw_pmksa),
302        .max_tokens = sizeof(struct iw_pmksa),
303    },
304};
305
306/*
307 * Meta-data about all the additional standard Wireless Extension events
308 * we know about.
309 */
310static const struct iw_ioctl_description standard_event_descr[] = {
311    [IWEVTXDROP - IWEVFIRST] = {
312        .header_type = IW_HEADER_TYPE_ADDR,
313    },
314    [IWEVQUAL - IWEVFIRST] = {
315        .header_type = IW_HEADER_TYPE_QUAL,
316    },
317    [IWEVCUSTOM - IWEVFIRST] = {
318        .header_type = IW_HEADER_TYPE_POINT,
319        .token_size = 1,
320        .max_tokens = IW_CUSTOM_MAX,
321    },
322    [IWEVREGISTERED - IWEVFIRST] = {
323        .header_type = IW_HEADER_TYPE_ADDR,
324    },
325    [IWEVEXPIRED - IWEVFIRST] = {
326        .header_type = IW_HEADER_TYPE_ADDR,
327    },
328    [IWEVGENIE - IWEVFIRST] = {
329        .header_type = IW_HEADER_TYPE_POINT,
330        .token_size = 1,
331        .max_tokens = IW_GENERIC_IE_MAX,
332    },
333    [IWEVMICHAELMICFAILURE - IWEVFIRST] = {
334        .header_type = IW_HEADER_TYPE_POINT,
335        .token_size = 1,
336        .max_tokens = sizeof(struct iw_michaelmicfailure),
337    },
338    [IWEVASSOCREQIE - IWEVFIRST] = {
339        .header_type = IW_HEADER_TYPE_POINT,
340        .token_size = 1,
341        .max_tokens = IW_GENERIC_IE_MAX,
342    },
343    [IWEVASSOCRESPIE - IWEVFIRST] = {
344        .header_type = IW_HEADER_TYPE_POINT,
345        .token_size = 1,
346        .max_tokens = IW_GENERIC_IE_MAX,
347    },
348    [IWEVPMKIDCAND - IWEVFIRST] = {
349        .header_type = IW_HEADER_TYPE_POINT,
350        .token_size = 1,
351        .max_tokens = sizeof(struct iw_pmkid_cand),
352    },
353};
354
355/* Size (in bytes) of various events */
356static const int event_type_size[] = {
357    IW_EV_LCP_PK_LEN, /* IW_HEADER_TYPE_NULL */
358    0,
359    IW_EV_CHAR_PK_LEN, /* IW_HEADER_TYPE_CHAR */
360    0,
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 */
364    0,
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 */
368};
369
370
371static const unsigned int standard_ioctl_num =
372    (sizeof(standard_ioctl_descr) / sizeof(struct iw_ioctl_description));
373
374static const unsigned int standard_event_num =
375    (sizeof(standard_event_descr) / sizeof(struct iw_ioctl_description));
376
377#define IW_IE_CYPHER_NUM 8
378#define IW_IE_KEY_MGMT_NUM 3
379
380#endif
381

Archive Download this file



interactive