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