6456c28ffdc1860a762e0312c6ea96abafc18014
[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