OSDN Git Service

v24
[android-x86/external-wireless-tools.git] / wireless_tools / wireless.14.h
1 /*
2  * This file define a set of standard wireless extensions
3  *
4  * Version :    14      25.1.02
5  *
6  * Authors :    Jean Tourrilhes - HPL - <jt@hpl.hp.com>
7  * Copyright (c) 1997-2002 Jean Tourrilhes, All Rights Reserved.
8  */
9
10 #ifndef _LINUX_WIRELESS_H
11 #define _LINUX_WIRELESS_H
12
13 /************************** DOCUMENTATION **************************/
14 /*
15  * Initial APIs (1996 -> onward) :
16  * -----------------------------
17  * Basically, the wireless extensions are for now a set of standard ioctl
18  * call + /proc/net/wireless
19  *
20  * The entry /proc/net/wireless give statistics and information on the
21  * driver.
22  * This is better than having each driver having its entry because
23  * its centralised and we may remove the driver module safely.
24  *
25  * Ioctl are used to configure the driver and issue commands.  This is
26  * better than command line options of insmod because we may want to
27  * change dynamically (while the driver is running) some parameters.
28  *
29  * The ioctl mechanimsm are copied from standard devices ioctl.
30  * We have the list of command plus a structure descibing the
31  * data exchanged...
32  * Note that to add these ioctl, I was obliged to modify :
33  *      # net/core/dev.c (two place + add include)
34  *      # net/ipv4/af_inet.c (one place + add include)
35  *
36  * /proc/net/wireless is a copy of /proc/net/dev.
37  * We have a structure for data passed from the driver to /proc/net/wireless
38  * Too add this, I've modified :
39  *      # net/core/dev.c (two other places)
40  *      # include/linux/netdevice.h (one place)
41  *      # include/linux/proc_fs.h (one place)
42  *
43  * New driver API (2002 -> onward) :
44  * -------------------------------
45  * This file is only concerned with the user space API and common definitions.
46  * The new driver API is defined and documented in :
47  *      # include/net/iw_handler.h
48  *
49  * Note as well that /proc/net/wireless implementation has now moved in :
50  *      # include/linux/wireless.c
51  *
52  * Wireless Events (2002 -> onward) :
53  * --------------------------------
54  * Events are defined at the end of this file, and implemented in :
55  *      # include/linux/wireless.c
56  *
57  * Other comments :
58  * --------------
59  * Do not add here things that are redundant with other mechanisms
60  * (drivers init, ifconfig, /proc/net/dev, ...) and with are not
61  * wireless specific.
62  *
63  * These wireless extensions are not magic : each driver has to provide
64  * support for them...
65  *
66  * IMPORTANT NOTE : As everything in the kernel, this is very much a
67  * work in progress. Contact me if you have ideas of improvements...
68  */
69
70 /***************************** INCLUDES *****************************/
71
72 #include <linux/types.h>                /* for "caddr_t" et al          */
73 #include <linux/socket.h>               /* for "struct sockaddr" et al  */
74 #include <linux/if.h>                   /* for IFNAMSIZ and co... */
75
76 /***************************** VERSION *****************************/
77 /*
78  * This constant is used to know the availability of the wireless
79  * extensions and to know which version of wireless extensions it is
80  * (there is some stuff that will be added in the future...)
81  * I just plan to increment with each new version.
82  */
83 #define WIRELESS_EXT    14
84
85 /*
86  * Changes :
87  *
88  * V2 to V3
89  * --------
90  *      Alan Cox start some incompatibles changes. I've integrated a bit more.
91  *      - Encryption renamed to Encode to avoid US regulation problems
92  *      - Frequency changed from float to struct to avoid problems on old 386
93  *
94  * V3 to V4
95  * --------
96  *      - Add sensitivity
97  *
98  * V4 to V5
99  * --------
100  *      - Missing encoding definitions in range
101  *      - Access points stuff
102  *
103  * V5 to V6
104  * --------
105  *      - 802.11 support (ESSID ioctls)
106  *
107  * V6 to V7
108  * --------
109  *      - define IW_ESSID_MAX_SIZE and IW_MAX_AP
110  *
111  * V7 to V8
112  * --------
113  *      - Changed my e-mail address
114  *      - More 802.11 support (nickname, rate, rts, frag)
115  *      - List index in frequencies
116  *
117  * V8 to V9
118  * --------
119  *      - Support for 'mode of operation' (ad-hoc, managed...)
120  *      - Support for unicast and multicast power saving
121  *      - Change encoding to support larger tokens (>64 bits)
122  *      - Updated iw_params (disable, flags) and use it for NWID
123  *      - Extracted iw_point from iwreq for clarity
124  *
125  * V9 to V10
126  * ---------
127  *      - Add PM capability to range structure
128  *      - Add PM modifier : MAX/MIN/RELATIVE
129  *      - Add encoding option : IW_ENCODE_NOKEY
130  *      - Add TxPower ioctls (work like TxRate)
131  *
132  * V10 to V11
133  * ----------
134  *      - Add WE version in range (help backward/forward compatibility)
135  *      - Add retry ioctls (work like PM)
136  *
137  * V11 to V12
138  * ----------
139  *      - Add SIOCSIWSTATS to get /proc/net/wireless programatically
140  *      - Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space
141  *      - Add new statistics (frag, retry, beacon)
142  *      - Add average quality (for user space calibration)
143  *
144  * V12 to V13
145  * ----------
146  *      - Document creation of new driver API.
147  *      - Extract union iwreq_data from struct iwreq (for new driver API).
148  *      - Rename SIOCSIWNAME as SIOCSIWCOMMIT
149  *
150  * V13 to V14
151  * ----------
152  *      - Wireless Events support : define struct iw_event
153  *      - Define additional specific event numbers
154  *      - Add "addr" and "param" fields in union iwreq_data
155  *      - AP scanning stuff (SIOCSIWSCAN and friends)
156  */
157
158 /**************************** CONSTANTS ****************************/
159
160 /* -------------------------- IOCTL LIST -------------------------- */
161
162 /* Basic operations */
163 #define SIOCSIWCOMMIT   0x8B00          /* Commit pending changes to driver */
164 #define SIOCGIWNAME     0x8B01          /* get name == wireless protocol */
165 #define SIOCSIWNWID     0x8B02          /* set network id (the cell) */
166 #define SIOCGIWNWID     0x8B03          /* get network id */
167 #define SIOCSIWFREQ     0x8B04          /* set channel/frequency (Hz) */
168 #define SIOCGIWFREQ     0x8B05          /* get channel/frequency (Hz) */
169 #define SIOCSIWMODE     0x8B06          /* set operation mode */
170 #define SIOCGIWMODE     0x8B07          /* get operation mode */
171 #define SIOCSIWSENS     0x8B08          /* set sensitivity (dBm) */
172 #define SIOCGIWSENS     0x8B09          /* get sensitivity (dBm) */
173
174 /* Informative stuff */
175 #define SIOCSIWRANGE    0x8B0A          /* Unused */
176 #define SIOCGIWRANGE    0x8B0B          /* Get range of parameters */
177 #define SIOCSIWPRIV     0x8B0C          /* Unused */
178 #define SIOCGIWPRIV     0x8B0D          /* get private ioctl interface info */
179 #define SIOCSIWSTATS    0x8B0E          /* Unused */
180 #define SIOCGIWSTATS    0x8B0F          /* Get /proc/net/wireless stats */
181
182 /* Mobile IP support */
183 #define SIOCSIWSPY      0x8B10          /* set spy addresses */
184 #define SIOCGIWSPY      0x8B11          /* get spy info (quality of link) */
185
186 /* Access Point manipulation */
187 #define SIOCSIWAP       0x8B14          /* set access point MAC addresses */
188 #define SIOCGIWAP       0x8B15          /* get access point MAC addresses */
189 #define SIOCGIWAPLIST   0x8B17          /* get list of access point in range */
190 #define SIOCSIWSCAN     0x8B18          /* trigger scanning */
191 #define SIOCGIWSCAN     0x8B19          /* get scanning results */
192
193 /* 802.11 specific support */
194 #define SIOCSIWESSID    0x8B1A          /* set ESSID (network name) */
195 #define SIOCGIWESSID    0x8B1B          /* get ESSID */
196 #define SIOCSIWNICKN    0x8B1C          /* set node name/nickname */
197 #define SIOCGIWNICKN    0x8B1D          /* get node name/nickname */
198 /* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit
199  * within the 'iwreq' structure, so we need to use the 'data' member to
200  * point to a string in user space, like it is done for RANGE...
201  * The "flags" member indicate if the ESSID is active or not (promiscuous).
202  */
203
204 /* Other parameters useful in 802.11 and some other devices */
205 #define SIOCSIWRATE     0x8B20          /* set default bit rate (bps) */
206 #define SIOCGIWRATE     0x8B21          /* get default bit rate (bps) */
207 #define SIOCSIWRTS      0x8B22          /* set RTS/CTS threshold (bytes) */
208 #define SIOCGIWRTS      0x8B23          /* get RTS/CTS threshold (bytes) */
209 #define SIOCSIWFRAG     0x8B24          /* set fragmentation thr (bytes) */
210 #define SIOCGIWFRAG     0x8B25          /* get fragmentation thr (bytes) */
211 #define SIOCSIWTXPOW    0x8B26          /* set transmit power (dBm) */
212 #define SIOCGIWTXPOW    0x8B27          /* get transmit power (dBm) */
213 #define SIOCSIWRETRY    0x8B28          /* set retry limits and lifetime */
214 #define SIOCGIWRETRY    0x8B29          /* get retry limits and lifetime */
215
216 /* Encoding stuff (scrambling, hardware security, WEP...) */
217 #define SIOCSIWENCODE   0x8B2A          /* set encoding token & mode */
218 #define SIOCGIWENCODE   0x8B2B          /* get encoding token & mode */
219 /* Power saving stuff (power management, unicast and multicast) */
220 #define SIOCSIWPOWER    0x8B2C          /* set Power Management settings */
221 #define SIOCGIWPOWER    0x8B2D          /* get Power Management settings */
222
223 /* -------------------- DEV PRIVATE IOCTL LIST -------------------- */
224
225 /* These 16 ioctl are wireless device private.
226  * Each driver is free to use them for whatever purpose it chooses,
227  * however the driver *must* export the description of those ioctls
228  * with SIOCGIWPRIV and *must* use arguments as defined below.
229  * If you don't follow those rules, DaveM is going to hate you (reason :
230  * it make mixed 32/64bit operation impossible).
231  */
232 #define SIOCIWFIRSTPRIV 0x8BE0
233 #define SIOCIWLASTPRIV  0x8BFF
234 /* Previously, we were using SIOCDEVPRIVATE, but we now have our
235  * separate range because of collisions with other tools such as
236  * 'mii-tool'.
237  * We now have 32 commands, so a bit more space ;-).
238  * Also, all 'odd' commands are only usable by root and don't return the
239  * content of ifr/iwr to user (but you are not obliged to use the set/get
240  * convention, just use every other two command).
241  * And I repeat : you are not obliged to use them with iwspy, but you
242  * must be compliant with it.
243  */
244
245 /* ------------------------- IOCTL STUFF ------------------------- */
246
247 /* The first and the last (range) */
248 #define SIOCIWFIRST     0x8B00
249 #define SIOCIWLAST      SIOCIWLASTPRIV          /* 0x8BFF */
250
251 /* Even : get (world access), odd : set (root access) */
252 #define IW_IS_SET(cmd)  (!((cmd) & 0x1))
253 #define IW_IS_GET(cmd)  ((cmd) & 0x1)
254
255 /* ----------------------- WIRELESS EVENTS ----------------------- */
256 /* Those are *NOT* ioctls, do not issue request on them !!! */
257 /* Most events use the same identifier as ioctl requests */
258
259 #define IWEVTXDROP      0x8C00          /* Packet dropped to excessive retry */
260 #define IWEVQUAL        0x8C01          /* Quality part of statistics */
261
262 #define IWEVFIRST       0x8C00
263
264 /* ------------------------- PRIVATE INFO ------------------------- */
265 /*
266  * The following is used with SIOCGIWPRIV. It allow a driver to define
267  * the interface (name, type of data) for its private ioctl.
268  * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV
269  */
270
271 #define IW_PRIV_TYPE_MASK       0x7000  /* Type of arguments */
272 #define IW_PRIV_TYPE_NONE       0x0000
273 #define IW_PRIV_TYPE_BYTE       0x1000  /* Char as number */
274 #define IW_PRIV_TYPE_CHAR       0x2000  /* Char as character */
275 #define IW_PRIV_TYPE_INT        0x4000  /* 32 bits int */
276 #define IW_PRIV_TYPE_FLOAT      0x5000
277
278 #define IW_PRIV_SIZE_FIXED      0x0800  /* Variable or fixed nuber of args */
279
280 #define IW_PRIV_SIZE_MASK       0x07FF  /* Max number of those args */
281
282 /*
283  * Note : if the number of args is fixed and the size < 16 octets,
284  * instead of passing a pointer we will put args in the iwreq struct...
285  */
286
287 /* ----------------------- OTHER CONSTANTS ----------------------- */
288
289 /* Maximum frequencies in the range struct */
290 #define IW_MAX_FREQUENCIES      16
291 /* Note : if you have something like 80 frequencies,
292  * don't increase this constant and don't fill the frequency list.
293  * The user will be able to set by channel anyway... */
294
295 /* Maximum bit rates in the range struct */
296 #define IW_MAX_BITRATES         8
297
298 /* Maximum tx powers in the range struct */
299 #define IW_MAX_TXPOWER          8
300
301 /* Maximum of address that you may set with SPY */
302 #define IW_MAX_SPY              8
303
304 /* Maximum of address that you may get in the
305    list of access points in range */
306 #define IW_MAX_AP               8
307
308 /* Maximum size of the ESSID and NICKN strings */
309 #define IW_ESSID_MAX_SIZE       32
310
311 /* Modes of operation */
312 #define IW_MODE_AUTO    0       /* Let the driver decides */
313 #define IW_MODE_ADHOC   1       /* Single cell network */
314 #define IW_MODE_INFRA   2       /* Multi cell network, roaming, ... */
315 #define IW_MODE_MASTER  3       /* Synchronisation master or Access Point */
316 #define IW_MODE_REPEAT  4       /* Wireless Repeater (forwarder) */
317 #define IW_MODE_SECOND  5       /* Secondary master/repeater (backup) */
318
319 /* Maximum number of size of encoding token available
320  * they are listed in the range structure */
321 #define IW_MAX_ENCODING_SIZES   8
322
323 /* Maximum size of the encoding token in bytes */
324 #define IW_ENCODING_TOKEN_MAX   32      /* 256 bits (for now) */
325
326 /* Flags for encoding (along with the token) */
327 #define IW_ENCODE_INDEX         0x00FF  /* Token index (if needed) */
328 #define IW_ENCODE_FLAGS         0xFF00  /* Flags defined below */
329 #define IW_ENCODE_MODE          0xF000  /* Modes defined below */
330 #define IW_ENCODE_DISABLED      0x8000  /* Encoding disabled */
331 #define IW_ENCODE_ENABLED       0x0000  /* Encoding enabled */
332 #define IW_ENCODE_RESTRICTED    0x4000  /* Refuse non-encoded packets */
333 #define IW_ENCODE_OPEN          0x2000  /* Accept non-encoded packets */
334 #define IW_ENCODE_NOKEY         0x0800  /* Key is write only, so not present */
335
336 /* Power management flags available (along with the value, if any) */
337 #define IW_POWER_ON             0x0000  /* No details... */
338 #define IW_POWER_TYPE           0xF000  /* Type of parameter */
339 #define IW_POWER_PERIOD         0x1000  /* Value is a period/duration of  */
340 #define IW_POWER_TIMEOUT        0x2000  /* Value is a timeout (to go asleep) */
341 #define IW_POWER_MODE           0x0F00  /* Power Management mode */
342 #define IW_POWER_UNICAST_R      0x0100  /* Receive only unicast messages */
343 #define IW_POWER_MULTICAST_R    0x0200  /* Receive only multicast messages */
344 #define IW_POWER_ALL_R          0x0300  /* Receive all messages though PM */
345 #define IW_POWER_FORCE_S        0x0400  /* Force PM procedure for sending unicast */
346 #define IW_POWER_REPEATER       0x0800  /* Repeat broadcast messages in PM period */
347 #define IW_POWER_MODIFIER       0x000F  /* Modify a parameter */
348 #define IW_POWER_MIN            0x0001  /* Value is a minimum  */
349 #define IW_POWER_MAX            0x0002  /* Value is a maximum */
350 #define IW_POWER_RELATIVE       0x0004  /* Value is not in seconds/ms/us */
351
352 /* Transmit Power flags available */
353 #define IW_TXPOW_DBM            0x0000  /* Value is in dBm */
354 #define IW_TXPOW_MWATT          0x0001  /* Value is in mW */
355
356 /* Retry limits and lifetime flags available */
357 #define IW_RETRY_ON             0x0000  /* No details... */
358 #define IW_RETRY_TYPE           0xF000  /* Type of parameter */
359 #define IW_RETRY_LIMIT          0x1000  /* Maximum number of retries*/
360 #define IW_RETRY_LIFETIME       0x2000  /* Maximum duration of retries in us */
361 #define IW_RETRY_MODIFIER       0x000F  /* Modify a parameter */
362 #define IW_RETRY_MIN            0x0001  /* Value is a minimum  */
363 #define IW_RETRY_MAX            0x0002  /* Value is a maximum */
364 #define IW_RETRY_RELATIVE       0x0004  /* Value is not in seconds/ms/us */
365
366 /* Scanning request flags */
367 #define IW_SCAN_DEFAULT         0x0000  /* Default scan of the driver */
368 #define IW_SCAN_ALL_ESSID       0x0001  /* Scan all ESSIDs */
369 #define IW_SCAN_THIS_ESSID      0x0002  /* Scan only this ESSID */
370 #define IW_SCAN_ALL_FREQ        0x0004  /* Scan all Frequencies */
371 #define IW_SCAN_THIS_FREQ       0x0008  /* Scan only this Frequency */
372 #define IW_SCAN_ALL_MODE        0x0010  /* Scan all Modes */
373 #define IW_SCAN_THIS_MODE       0x0020  /* Scan only this Mode */
374 #define IW_SCAN_ALL_RATE        0x0040  /* Scan all Bit-Rates */
375 #define IW_SCAN_THIS_RATE       0x0080  /* Scan only this Bit-Rate */
376 /* Maximum size of returned data */
377 #define IW_SCAN_MAX_DATA        4096    /* In bytes */
378
379 /****************************** TYPES ******************************/
380
381 /* --------------------------- SUBTYPES --------------------------- */
382 /*
383  *      Generic format for most parameters that fit in an int
384  */
385 struct  iw_param
386 {
387   __s32         value;          /* The value of the parameter itself */
388   __u8          fixed;          /* Hardware should not use auto select */
389   __u8          disabled;       /* Disable the feature */
390   __u16         flags;          /* Various specifc flags (if any) */
391 };
392
393 /*
394  *      For all data larger than 16 octets, we need to use a
395  *      pointer to memory allocated in user space.
396  */
397 struct  iw_point
398 {
399   caddr_t       pointer;        /* Pointer to the data  (in user space) */
400   __u16         length;         /* number of fields or size in bytes */
401   __u16         flags;          /* Optional params */
402 };
403
404 /*
405  *      A frequency
406  *      For numbers lower than 10^9, we encode the number in 'm' and
407  *      set 'e' to 0
408  *      For number greater than 10^9, we divide it by the lowest power
409  *      of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')...
410  *      The power of 10 is in 'e', the result of the division is in 'm'.
411  */
412 struct  iw_freq
413 {
414         __u32           m;              /* Mantissa */
415         __u16           e;              /* Exponent */
416         __u8            i;              /* List index (when in range struct) */
417 };
418
419 /*
420  *      Quality of the link
421  */
422 struct  iw_quality
423 {
424         __u8            qual;           /* link quality (%retries, SNR,
425                                            %missed beacons or better...) */
426         __u8            level;          /* signal level (dBm) */
427         __u8            noise;          /* noise level (dBm) */
428         __u8            updated;        /* Flags to know if updated */
429 };
430
431 /*
432  *      Packet discarded in the wireless adapter due to
433  *      "wireless" specific problems...
434  *      Note : the list of counter and statistics in net_device_stats
435  *      is already pretty exhaustive, and you should use that first.
436  *      This is only additional stats...
437  */
438 struct  iw_discarded
439 {
440         __u32           nwid;           /* Rx : Wrong nwid/essid */
441         __u32           code;           /* Rx : Unable to code/decode (WEP) */
442         __u32           fragment;       /* Rx : Can't perform MAC reassembly */
443         __u32           retries;        /* Tx : Max MAC retries num reached */
444         __u32           misc;           /* Others cases */
445 };
446
447 /*
448  *      Packet/Time period missed in the wireless adapter due to
449  *      "wireless" specific problems...
450  */
451 struct  iw_missed
452 {
453         __u32           beacon;         /* Missed beacons/superframe */
454 };
455
456 /* ------------------------ WIRELESS STATS ------------------------ */
457 /*
458  * Wireless statistics (used for /proc/net/wireless)
459  */
460 struct  iw_statistics
461 {
462         __u16           status;         /* Status
463                                          * - device dependent for now */
464
465         struct iw_quality       qual;           /* Quality of the link
466                                                  * (instant/mean/max) */
467         struct iw_discarded     discard;        /* Packet discarded counts */
468         struct iw_missed        miss;           /* Packet missed counts */
469 };
470
471 /* ------------------------ IOCTL REQUEST ------------------------ */
472 /*
473  * This structure defines the payload of an ioctl, and is used 
474  * below.
475  *
476  * Note that this structure should fit on the memory footprint
477  * of iwreq (which is the same as ifreq), which mean a max size of
478  * 16 octets = 128 bits. Warning, pointers might be 64 bits wide...
479  * You should check this when increasing the structures defined
480  * above in this file...
481  */
482 union   iwreq_data
483 {
484         /* Config - generic */
485         char            name[IFNAMSIZ];
486         /* Name : used to verify the presence of  wireless extensions.
487          * Name of the protocol/provider... */
488
489         struct iw_point essid;          /* Extended network name */
490         struct iw_param nwid;           /* network id (or domain - the cell) */
491         struct iw_freq  freq;           /* frequency or channel :
492                                          * 0-1000 = channel
493                                          * > 1000 = frequency in Hz */
494
495         struct iw_param sens;           /* signal level threshold */
496         struct iw_param bitrate;        /* default bit rate */
497         struct iw_param txpower;        /* default transmit power */
498         struct iw_param rts;            /* RTS threshold threshold */
499         struct iw_param frag;           /* Fragmentation threshold */
500         __u32           mode;           /* Operation mode */
501         struct iw_param retry;          /* Retry limits & lifetime */
502
503         struct iw_point encoding;       /* Encoding stuff : tokens */
504         struct iw_param power;          /* PM duration/timeout */
505         struct iw_quality qual;         /* Quality part of statistics */
506
507         struct sockaddr ap_addr;        /* Access point address */
508         struct sockaddr addr;           /* Destination address (hw) */
509
510         struct iw_param param;          /* Other small parameters */
511         struct iw_point data;           /* Other large parameters */
512 };
513
514 /*
515  * The structure to exchange data for ioctl.
516  * This structure is the same as 'struct ifreq', but (re)defined for
517  * convenience...
518  * Do I need to remind you about structure size (32 octets) ?
519  */
520 struct  iwreq 
521 {
522         union
523         {
524                 char    ifrn_name[IFNAMSIZ];    /* if name, e.g. "eth0" */
525         } ifr_ifrn;
526
527         /* Data part (defined just above) */
528         union   iwreq_data      u;
529 };
530
531 /* -------------------------- IOCTL DATA -------------------------- */
532 /*
533  *      For those ioctl which want to exchange mode data that what could
534  *      fit in the above structure...
535  */
536
537 /*
538  *      Range of parameters
539  */
540
541 struct  iw_range
542 {
543         /* Informative stuff (to choose between different interface) */
544         __u32           throughput;     /* To give an idea... */
545         /* In theory this value should be the maximum benchmarked
546          * TCP/IP throughput, because with most of these devices the
547          * bit rate is meaningless (overhead an co) to estimate how
548          * fast the connection will go and pick the fastest one.
549          * I suggest people to play with Netperf or any benchmark...
550          */
551
552         /* NWID (or domain id) */
553         __u32           min_nwid;       /* Minimal NWID we are able to set */
554         __u32           max_nwid;       /* Maximal NWID we are able to set */
555
556         /* Frequency */
557         __u16           num_channels;   /* Number of channels [0; num - 1] */
558         __u8            num_frequency;  /* Number of entry in the list */
559         struct iw_freq  freq[IW_MAX_FREQUENCIES];       /* list */
560         /* Note : this frequency list doesn't need to fit channel numbers */
561
562         /* signal level threshold range */
563         __s32   sensitivity;
564
565         /* Quality of link & SNR stuff */
566         struct iw_quality       max_qual;       /* Quality of the link */
567
568         /* Rates */
569         __u8            num_bitrates;   /* Number of entries in the list */
570         __s32           bitrate[IW_MAX_BITRATES];       /* list, in bps */
571
572         /* RTS threshold */
573         __s32           min_rts;        /* Minimal RTS threshold */
574         __s32           max_rts;        /* Maximal RTS threshold */
575
576         /* Frag threshold */
577         __s32           min_frag;       /* Minimal frag threshold */
578         __s32           max_frag;       /* Maximal frag threshold */
579
580         /* Power Management duration & timeout */
581         __s32           min_pmp;        /* Minimal PM period */
582         __s32           max_pmp;        /* Maximal PM period */
583         __s32           min_pmt;        /* Minimal PM timeout */
584         __s32           max_pmt;        /* Maximal PM timeout */
585         __u16           pmp_flags;      /* How to decode max/min PM period */
586         __u16           pmt_flags;      /* How to decode max/min PM timeout */
587         __u16           pm_capa;        /* What PM options are supported */
588
589         /* Encoder stuff */
590         __u16   encoding_size[IW_MAX_ENCODING_SIZES];   /* Different token sizes */
591         __u8    num_encoding_sizes;     /* Number of entry in the list */
592         __u8    max_encoding_tokens;    /* Max number of tokens */
593
594         /* Transmit power */
595         __u16           txpower_capa;   /* What options are supported */
596         __u8            num_txpower;    /* Number of entries in the list */
597         __s32           txpower[IW_MAX_TXPOWER];        /* list, in bps */
598
599         /* Wireless Extension version info */
600         __u8            we_version_compiled;    /* Must be WIRELESS_EXT */
601         __u8            we_version_source;      /* Last update of source */
602
603         /* Retry limits and lifetime */
604         __u16           retry_capa;     /* What retry options are supported */
605         __u16           retry_flags;    /* How to decode max/min retry limit */
606         __u16           r_time_flags;   /* How to decode max/min retry life */
607         __s32           min_retry;      /* Minimal number of retries */
608         __s32           max_retry;      /* Maximal number of retries */
609         __s32           min_r_time;     /* Minimal retry lifetime */
610         __s32           max_r_time;     /* Maximal retry lifetime */
611
612         /* Average quality of link & SNR */
613         struct iw_quality       avg_qual;       /* Quality of the link */
614         /* This should contain the average/typical values of the quality
615          * indicator. This should be the threshold between a "good" and
616          * a "bad" link (example : monitor going from green to orange).
617          * Currently, user space apps like quality monitors don't have any
618          * way to calibrate the measurement. With this, they can split
619          * the range between 0 and max_qual in different quality level
620          * (using a geometric subdivision centered on the average).
621          * I expect that people doing the user space apps will feedback
622          * us on which value we need to put in each driver...
623          */
624 };
625
626 /*
627  * Private ioctl interface information
628  */
629  
630 struct  iw_priv_args
631 {
632         __u32           cmd;            /* Number of the ioctl to issue */
633         __u16           set_args;       /* Type and number of args */
634         __u16           get_args;       /* Type and number of args */
635         char            name[IFNAMSIZ]; /* Name of the extension */
636 };
637
638 /* ----------------------- WIRELESS EVENTS ----------------------- */
639 /*
640  * Wireless events are carried through the rtnetlink socket to user
641  * space. They are encapsulated in the IFLA_WIRELESS field of
642  * a RTM_NEWLINK message.
643  */
644
645 /*
646  * A Wireless Event. Contains basically the same data as the ioctl...
647  */
648 struct iw_event
649 {
650         __u16           len;                    /* Real lenght of this stuff */
651         __u16           cmd;                    /* Wireless IOCTL */
652         union iwreq_data        u;              /* IOCTL fixed payload */
653 };
654
655 /* Size of the Event prefix (including padding and alignement junk) */
656 #define IW_EV_LCP_LEN   (sizeof(struct iw_event) - sizeof(union iwreq_data))
657 /* Size of the various events */
658 #define IW_EV_CHAR_LEN  (IW_EV_LCP_LEN + IFNAMSIZ)
659 #define IW_EV_UINT_LEN  (IW_EV_LCP_LEN + sizeof(__u32))
660 #define IW_EV_FREQ_LEN  (IW_EV_LCP_LEN + sizeof(struct iw_freq))
661 #define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point))
662 #define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param))
663 #define IW_EV_ADDR_LEN  (IW_EV_LCP_LEN + sizeof(struct sockaddr))
664 #define IW_EV_QUAL_LEN  (IW_EV_LCP_LEN + sizeof(struct iw_quality))
665
666 /* Note : in the case of iw_point, the extra data will come at the
667  * end of the event */
668
669 #endif  /* _LINUX_WIRELESS_H */