Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
0002 /*
0003  * This file define a set of standard wireless extensions
0004  *
0005  * Version :    22  16.3.07
0006  *
0007  * Authors :    Jean Tourrilhes - HPL - <jt@hpl.hp.com>
0008  * Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved.
0009  */
0010 
0011 #ifndef _UAPI_LINUX_WIRELESS_H
0012 #define _UAPI_LINUX_WIRELESS_H
0013 
0014 /************************** DOCUMENTATION **************************/
0015 /*
0016  * Initial APIs (1996 -> onward) :
0017  * -----------------------------
0018  * Basically, the wireless extensions are for now a set of standard ioctl
0019  * call + /proc/net/wireless
0020  *
0021  * The entry /proc/net/wireless give statistics and information on the
0022  * driver.
0023  * This is better than having each driver having its entry because
0024  * its centralised and we may remove the driver module safely.
0025  *
0026  * Ioctl are used to configure the driver and issue commands.  This is
0027  * better than command line options of insmod because we may want to
0028  * change dynamically (while the driver is running) some parameters.
0029  *
0030  * The ioctl mechanimsm are copied from standard devices ioctl.
0031  * We have the list of command plus a structure descibing the
0032  * data exchanged...
0033  * Note that to add these ioctl, I was obliged to modify :
0034  *  # net/core/dev.c (two place + add include)
0035  *  # net/ipv4/af_inet.c (one place + add include)
0036  *
0037  * /proc/net/wireless is a copy of /proc/net/dev.
0038  * We have a structure for data passed from the driver to /proc/net/wireless
0039  * Too add this, I've modified :
0040  *  # net/core/dev.c (two other places)
0041  *  # include/linux/netdevice.h (one place)
0042  *  # include/linux/proc_fs.h (one place)
0043  *
0044  * New driver API (2002 -> onward) :
0045  * -------------------------------
0046  * This file is only concerned with the user space API and common definitions.
0047  * The new driver API is defined and documented in :
0048  *  # include/net/iw_handler.h
0049  *
0050  * Note as well that /proc/net/wireless implementation has now moved in :
0051  *  # net/core/wireless.c
0052  *
0053  * Wireless Events (2002 -> onward) :
0054  * --------------------------------
0055  * Events are defined at the end of this file, and implemented in :
0056  *  # net/core/wireless.c
0057  *
0058  * Other comments :
0059  * --------------
0060  * Do not add here things that are redundant with other mechanisms
0061  * (drivers init, ifconfig, /proc/net/dev, ...) and with are not
0062  * wireless specific.
0063  *
0064  * These wireless extensions are not magic : each driver has to provide
0065  * support for them...
0066  *
0067  * IMPORTANT NOTE : As everything in the kernel, this is very much a
0068  * work in progress. Contact me if you have ideas of improvements...
0069  */
0070 
0071 /***************************** INCLUDES *****************************/
0072 
0073 #include <linux/types.h>        /* for __u* and __s* typedefs */
0074 #include <linux/socket.h>       /* for "struct sockaddr" et al  */
0075 #include <linux/if.h>           /* for IFNAMSIZ and co... */
0076 
0077 #ifdef __KERNEL__
0078 #   include <linux/stddef.h>    /* for offsetof */
0079 #else
0080 #   include <stddef.h>      /* for offsetof */
0081 #endif
0082 
0083 /***************************** VERSION *****************************/
0084 /*
0085  * This constant is used to know the availability of the wireless
0086  * extensions and to know which version of wireless extensions it is
0087  * (there is some stuff that will be added in the future...)
0088  * I just plan to increment with each new version.
0089  */
0090 #define WIRELESS_EXT    22
0091 
0092 /*
0093  * Changes :
0094  *
0095  * V2 to V3
0096  * --------
0097  *  Alan Cox start some incompatibles changes. I've integrated a bit more.
0098  *  - Encryption renamed to Encode to avoid US regulation problems
0099  *  - Frequency changed from float to struct to avoid problems on old 386
0100  *
0101  * V3 to V4
0102  * --------
0103  *  - Add sensitivity
0104  *
0105  * V4 to V5
0106  * --------
0107  *  - Missing encoding definitions in range
0108  *  - Access points stuff
0109  *
0110  * V5 to V6
0111  * --------
0112  *  - 802.11 support (ESSID ioctls)
0113  *
0114  * V6 to V7
0115  * --------
0116  *  - define IW_ESSID_MAX_SIZE and IW_MAX_AP
0117  *
0118  * V7 to V8
0119  * --------
0120  *  - Changed my e-mail address
0121  *  - More 802.11 support (nickname, rate, rts, frag)
0122  *  - List index in frequencies
0123  *
0124  * V8 to V9
0125  * --------
0126  *  - Support for 'mode of operation' (ad-hoc, managed...)
0127  *  - Support for unicast and multicast power saving
0128  *  - Change encoding to support larger tokens (>64 bits)
0129  *  - Updated iw_params (disable, flags) and use it for NWID
0130  *  - Extracted iw_point from iwreq for clarity
0131  *
0132  * V9 to V10
0133  * ---------
0134  *  - Add PM capability to range structure
0135  *  - Add PM modifier : MAX/MIN/RELATIVE
0136  *  - Add encoding option : IW_ENCODE_NOKEY
0137  *  - Add TxPower ioctls (work like TxRate)
0138  *
0139  * V10 to V11
0140  * ----------
0141  *  - Add WE version in range (help backward/forward compatibility)
0142  *  - Add retry ioctls (work like PM)
0143  *
0144  * V11 to V12
0145  * ----------
0146  *  - Add SIOCSIWSTATS to get /proc/net/wireless programatically
0147  *  - Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space
0148  *  - Add new statistics (frag, retry, beacon)
0149  *  - Add average quality (for user space calibration)
0150  *
0151  * V12 to V13
0152  * ----------
0153  *  - Document creation of new driver API.
0154  *  - Extract union iwreq_data from struct iwreq (for new driver API).
0155  *  - Rename SIOCSIWNAME as SIOCSIWCOMMIT
0156  *
0157  * V13 to V14
0158  * ----------
0159  *  - Wireless Events support : define struct iw_event
0160  *  - Define additional specific event numbers
0161  *  - Add "addr" and "param" fields in union iwreq_data
0162  *  - AP scanning stuff (SIOCSIWSCAN and friends)
0163  *
0164  * V14 to V15
0165  * ----------
0166  *  - Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg
0167  *  - Make struct iw_freq signed (both m & e), add explicit padding
0168  *  - Add IWEVCUSTOM for driver specific event/scanning token
0169  *  - Add IW_MAX_GET_SPY for driver returning a lot of addresses
0170  *  - Add IW_TXPOW_RANGE for range of Tx Powers
0171  *  - Add IWEVREGISTERED & IWEVEXPIRED events for Access Points
0172  *  - Add IW_MODE_MONITOR for passive monitor
0173  *
0174  * V15 to V16
0175  * ----------
0176  *  - Increase the number of bitrates in iw_range to 32 (for 802.11g)
0177  *  - Increase the number of frequencies in iw_range to 32 (for 802.11b+a)
0178  *  - Reshuffle struct iw_range for increases, add filler
0179  *  - Increase IW_MAX_AP to 64 for driver returning a lot of addresses
0180  *  - Remove IW_MAX_GET_SPY because conflict with enhanced spy support
0181  *  - Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy"
0182  *  - Add IW_ENCODE_TEMP and iw_range->encoding_login_index
0183  *
0184  * V16 to V17
0185  * ----------
0186  *  - Add flags to frequency -> auto/fixed
0187  *  - Document (struct iw_quality *)->updated, add new flags (INVALID)
0188  *  - Wireless Event capability in struct iw_range
0189  *  - Add support for relative TxPower (yick !)
0190  *
0191  * V17 to V18 (From Jouni Malinen <j@w1.fi>)
0192  * ----------
0193  *  - Add support for WPA/WPA2
0194  *  - Add extended encoding configuration (SIOCSIWENCODEEXT and
0195  *    SIOCGIWENCODEEXT)
0196  *  - Add SIOCSIWGENIE/SIOCGIWGENIE
0197  *  - Add SIOCSIWMLME
0198  *  - Add SIOCSIWPMKSA
0199  *  - Add struct iw_range bit field for supported encoding capabilities
0200  *  - Add optional scan request parameters for SIOCSIWSCAN
0201  *  - Add SIOCSIWAUTH/SIOCGIWAUTH for setting authentication and WPA
0202  *    related parameters (extensible up to 4096 parameter values)
0203  *  - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE,
0204  *    IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND
0205  *
0206  * V18 to V19
0207  * ----------
0208  *  - Remove (struct iw_point *)->pointer from events and streams
0209  *  - Remove header includes to help user space
0210  *  - Increase IW_ENCODING_TOKEN_MAX from 32 to 64
0211  *  - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros
0212  *  - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM
0213  *  - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros
0214  *
0215  * V19 to V20
0216  * ----------
0217  *  - RtNetlink requests support (SET/GET)
0218  *
0219  * V20 to V21
0220  * ----------
0221  *  - Remove (struct net_device *)->get_wireless_stats()
0222  *  - Change length in ESSID and NICK to strlen() instead of strlen()+1
0223  *  - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers
0224  *  - Power/Retry relative values no longer * 100000
0225  *  - Add explicit flag to tell stats are in 802.11k RCPI : IW_QUAL_RCPI
0226  *
0227  * V21 to V22
0228  * ----------
0229  *  - Prevent leaking of kernel space in stream on 64 bits.
0230  */
0231 
0232 /**************************** CONSTANTS ****************************/
0233 
0234 /* -------------------------- IOCTL LIST -------------------------- */
0235 
0236 /* Wireless Identification */
0237 #define SIOCSIWCOMMIT   0x8B00      /* Commit pending changes to driver */
0238 #define SIOCGIWNAME 0x8B01      /* get name == wireless protocol */
0239 /* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
0240  * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...
0241  * Don't put the name of your driver there, it's useless. */
0242 
0243 /* Basic operations */
0244 #define SIOCSIWNWID 0x8B02      /* set network id (pre-802.11) */
0245 #define SIOCGIWNWID 0x8B03      /* get network id (the cell) */
0246 #define SIOCSIWFREQ 0x8B04      /* set channel/frequency (Hz) */
0247 #define SIOCGIWFREQ 0x8B05      /* get channel/frequency (Hz) */
0248 #define SIOCSIWMODE 0x8B06      /* set operation mode */
0249 #define SIOCGIWMODE 0x8B07      /* get operation mode */
0250 #define SIOCSIWSENS 0x8B08      /* set sensitivity (dBm) */
0251 #define SIOCGIWSENS 0x8B09      /* get sensitivity (dBm) */
0252 
0253 /* Informative stuff */
0254 #define SIOCSIWRANGE    0x8B0A      /* Unused */
0255 #define SIOCGIWRANGE    0x8B0B      /* Get range of parameters */
0256 #define SIOCSIWPRIV 0x8B0C      /* Unused */
0257 #define SIOCGIWPRIV 0x8B0D      /* get private ioctl interface info */
0258 #define SIOCSIWSTATS    0x8B0E      /* Unused */
0259 #define SIOCGIWSTATS    0x8B0F      /* Get /proc/net/wireless stats */
0260 /* SIOCGIWSTATS is strictly used between user space and the kernel, and
0261  * is never passed to the driver (i.e. the driver will never see it). */
0262 
0263 /* Spy support (statistics per MAC address - used for Mobile IP support) */
0264 #define SIOCSIWSPY  0x8B10      /* set spy addresses */
0265 #define SIOCGIWSPY  0x8B11      /* get spy info (quality of link) */
0266 #define SIOCSIWTHRSPY   0x8B12      /* set spy threshold (spy event) */
0267 #define SIOCGIWTHRSPY   0x8B13      /* get spy threshold */
0268 
0269 /* Access Point manipulation */
0270 #define SIOCSIWAP   0x8B14      /* set access point MAC addresses */
0271 #define SIOCGIWAP   0x8B15      /* get access point MAC addresses */
0272 #define SIOCGIWAPLIST   0x8B17      /* Deprecated in favor of scanning */
0273 #define SIOCSIWSCAN 0x8B18      /* trigger scanning (list cells) */
0274 #define SIOCGIWSCAN 0x8B19      /* get scanning results */
0275 
0276 /* 802.11 specific support */
0277 #define SIOCSIWESSID    0x8B1A      /* set ESSID (network name) */
0278 #define SIOCGIWESSID    0x8B1B      /* get ESSID */
0279 #define SIOCSIWNICKN    0x8B1C      /* set node name/nickname */
0280 #define SIOCGIWNICKN    0x8B1D      /* get node name/nickname */
0281 /* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit
0282  * within the 'iwreq' structure, so we need to use the 'data' member to
0283  * point to a string in user space, like it is done for RANGE... */
0284 
0285 /* Other parameters useful in 802.11 and some other devices */
0286 #define SIOCSIWRATE 0x8B20      /* set default bit rate (bps) */
0287 #define SIOCGIWRATE 0x8B21      /* get default bit rate (bps) */
0288 #define SIOCSIWRTS  0x8B22      /* set RTS/CTS threshold (bytes) */
0289 #define SIOCGIWRTS  0x8B23      /* get RTS/CTS threshold (bytes) */
0290 #define SIOCSIWFRAG 0x8B24      /* set fragmentation thr (bytes) */
0291 #define SIOCGIWFRAG 0x8B25      /* get fragmentation thr (bytes) */
0292 #define SIOCSIWTXPOW    0x8B26      /* set transmit power (dBm) */
0293 #define SIOCGIWTXPOW    0x8B27      /* get transmit power (dBm) */
0294 #define SIOCSIWRETRY    0x8B28      /* set retry limits and lifetime */
0295 #define SIOCGIWRETRY    0x8B29      /* get retry limits and lifetime */
0296 
0297 /* Encoding stuff (scrambling, hardware security, WEP...) */
0298 #define SIOCSIWENCODE   0x8B2A      /* set encoding token & mode */
0299 #define SIOCGIWENCODE   0x8B2B      /* get encoding token & mode */
0300 /* Power saving stuff (power management, unicast and multicast) */
0301 #define SIOCSIWPOWER    0x8B2C      /* set Power Management settings */
0302 #define SIOCGIWPOWER    0x8B2D      /* get Power Management settings */
0303 
0304 /* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM).
0305  * This ioctl uses struct iw_point and data buffer that includes IE id and len
0306  * fields. More than one IE may be included in the request. Setting the generic
0307  * IE to empty buffer (len=0) removes the generic IE from the driver. Drivers
0308  * are allowed to generate their own WPA/RSN IEs, but in these cases, drivers
0309  * are required to report the used IE as a wireless event, e.g., when
0310  * associating with an AP. */
0311 #define SIOCSIWGENIE    0x8B30      /* set generic IE */
0312 #define SIOCGIWGENIE    0x8B31      /* get generic IE */
0313 
0314 /* WPA : IEEE 802.11 MLME requests */
0315 #define SIOCSIWMLME 0x8B16      /* request MLME operation; uses
0316                      * struct iw_mlme */
0317 /* WPA : Authentication mode parameters */
0318 #define SIOCSIWAUTH 0x8B32      /* set authentication mode params */
0319 #define SIOCGIWAUTH 0x8B33      /* get authentication mode params */
0320 
0321 /* WPA : Extended version of encoding configuration */
0322 #define SIOCSIWENCODEEXT 0x8B34     /* set encoding token & mode */
0323 #define SIOCGIWENCODEEXT 0x8B35     /* get encoding token & mode */
0324 
0325 /* WPA2 : PMKSA cache management */
0326 #define SIOCSIWPMKSA    0x8B36      /* PMKSA cache operation */
0327 
0328 /* -------------------- DEV PRIVATE IOCTL LIST -------------------- */
0329 
0330 /* These 32 ioctl are wireless device private, for 16 commands.
0331  * Each driver is free to use them for whatever purpose it chooses,
0332  * however the driver *must* export the description of those ioctls
0333  * with SIOCGIWPRIV and *must* use arguments as defined below.
0334  * If you don't follow those rules, DaveM is going to hate you (reason :
0335  * it make mixed 32/64bit operation impossible).
0336  */
0337 #define SIOCIWFIRSTPRIV 0x8BE0
0338 #define SIOCIWLASTPRIV  0x8BFF
0339 /* Previously, we were using SIOCDEVPRIVATE, but we now have our
0340  * separate range because of collisions with other tools such as
0341  * 'mii-tool'.
0342  * We now have 32 commands, so a bit more space ;-).
0343  * Also, all 'even' commands are only usable by root and don't return the
0344  * content of ifr/iwr to user (but you are not obliged to use the set/get
0345  * convention, just use every other two command). More details in iwpriv.c.
0346  * And I repeat : you are not forced to use them with iwpriv, but you
0347  * must be compliant with it.
0348  */
0349 
0350 /* ------------------------- IOCTL STUFF ------------------------- */
0351 
0352 /* The first and the last (range) */
0353 #define SIOCIWFIRST 0x8B00
0354 #define SIOCIWLAST  SIOCIWLASTPRIV      /* 0x8BFF */
0355 #define IW_IOCTL_IDX(cmd)   ((cmd) - SIOCIWFIRST)
0356 #define IW_HANDLER(id, func)            \
0357     [IW_IOCTL_IDX(id)] = func
0358 
0359 /* Odd : get (world access), even : set (root access) */
0360 #define IW_IS_SET(cmd)  (!((cmd) & 0x1))
0361 #define IW_IS_GET(cmd)  ((cmd) & 0x1)
0362 
0363 /* ----------------------- WIRELESS EVENTS ----------------------- */
0364 /* Those are *NOT* ioctls, do not issue request on them !!! */
0365 /* Most events use the same identifier as ioctl requests */
0366 
0367 #define IWEVTXDROP  0x8C00      /* Packet dropped to excessive retry */
0368 #define IWEVQUAL    0x8C01      /* Quality part of statistics (scan) */
0369 #define IWEVCUSTOM  0x8C02      /* Driver specific ascii string */
0370 #define IWEVREGISTERED  0x8C03      /* Discovered a new node (AP mode) */
0371 #define IWEVEXPIRED 0x8C04      /* Expired a node (AP mode) */
0372 #define IWEVGENIE   0x8C05      /* Generic IE (WPA, RSN, WMM, ..)
0373                      * (scan results); This includes id and
0374                      * length fields. One IWEVGENIE may
0375                      * contain more than one IE. Scan
0376                      * results may contain one or more
0377                      * IWEVGENIE events. */
0378 #define IWEVMICHAELMICFAILURE 0x8C06    /* Michael MIC failure
0379                      * (struct iw_michaelmicfailure)
0380                      */
0381 #define IWEVASSOCREQIE  0x8C07      /* IEs used in (Re)Association Request.
0382                      * The data includes id and length
0383                      * fields and may contain more than one
0384                      * IE. This event is required in
0385                      * Managed mode if the driver
0386                      * generates its own WPA/RSN IE. This
0387                      * should be sent just before
0388                      * IWEVREGISTERED event for the
0389                      * association. */
0390 #define IWEVASSOCRESPIE 0x8C08      /* IEs used in (Re)Association
0391                      * Response. The data includes id and
0392                      * length fields and may contain more
0393                      * than one IE. This may be sent
0394                      * between IWEVASSOCREQIE and
0395                      * IWEVREGISTERED events for the
0396                      * association. */
0397 #define IWEVPMKIDCAND   0x8C09      /* PMKID candidate for RSN
0398                      * pre-authentication
0399                      * (struct iw_pmkid_cand) */
0400 
0401 #define IWEVFIRST   0x8C00
0402 #define IW_EVENT_IDX(cmd)   ((cmd) - IWEVFIRST)
0403 
0404 /* ------------------------- PRIVATE INFO ------------------------- */
0405 /*
0406  * The following is used with SIOCGIWPRIV. It allow a driver to define
0407  * the interface (name, type of data) for its private ioctl.
0408  * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV
0409  */
0410 
0411 #define IW_PRIV_TYPE_MASK   0x7000  /* Type of arguments */
0412 #define IW_PRIV_TYPE_NONE   0x0000
0413 #define IW_PRIV_TYPE_BYTE   0x1000  /* Char as number */
0414 #define IW_PRIV_TYPE_CHAR   0x2000  /* Char as character */
0415 #define IW_PRIV_TYPE_INT    0x4000  /* 32 bits int */
0416 #define IW_PRIV_TYPE_FLOAT  0x5000  /* struct iw_freq */
0417 #define IW_PRIV_TYPE_ADDR   0x6000  /* struct sockaddr */
0418 
0419 #define IW_PRIV_SIZE_FIXED  0x0800  /* Variable or fixed number of args */
0420 
0421 #define IW_PRIV_SIZE_MASK   0x07FF  /* Max number of those args */
0422 
0423 /*
0424  * Note : if the number of args is fixed and the size < 16 octets,
0425  * instead of passing a pointer we will put args in the iwreq struct...
0426  */
0427 
0428 /* ----------------------- OTHER CONSTANTS ----------------------- */
0429 
0430 /* Maximum frequencies in the range struct */
0431 #define IW_MAX_FREQUENCIES  32
0432 /* Note : if you have something like 80 frequencies,
0433  * don't increase this constant and don't fill the frequency list.
0434  * The user will be able to set by channel anyway... */
0435 
0436 /* Maximum bit rates in the range struct */
0437 #define IW_MAX_BITRATES     32
0438 
0439 /* Maximum tx powers in the range struct */
0440 #define IW_MAX_TXPOWER      8
0441 /* Note : if you more than 8 TXPowers, just set the max and min or
0442  * a few of them in the struct iw_range. */
0443 
0444 /* Maximum of address that you may set with SPY */
0445 #define IW_MAX_SPY      8
0446 
0447 /* Maximum of address that you may get in the
0448    list of access points in range */
0449 #define IW_MAX_AP       64
0450 
0451 /* Maximum size of the ESSID and NICKN strings */
0452 #define IW_ESSID_MAX_SIZE   32
0453 
0454 /* Modes of operation */
0455 #define IW_MODE_AUTO    0   /* Let the driver decides */
0456 #define IW_MODE_ADHOC   1   /* Single cell network */
0457 #define IW_MODE_INFRA   2   /* Multi cell network, roaming, ... */
0458 #define IW_MODE_MASTER  3   /* Synchronisation master or Access Point */
0459 #define IW_MODE_REPEAT  4   /* Wireless Repeater (forwarder) */
0460 #define IW_MODE_SECOND  5   /* Secondary master/repeater (backup) */
0461 #define IW_MODE_MONITOR 6   /* Passive monitor (listen only) */
0462 #define IW_MODE_MESH    7   /* Mesh (IEEE 802.11s) network */
0463 
0464 /* Statistics flags (bitmask in updated) */
0465 #define IW_QUAL_QUAL_UPDATED    0x01    /* Value was updated since last read */
0466 #define IW_QUAL_LEVEL_UPDATED   0x02
0467 #define IW_QUAL_NOISE_UPDATED   0x04
0468 #define IW_QUAL_ALL_UPDATED 0x07
0469 #define IW_QUAL_DBM     0x08    /* Level + Noise are dBm */
0470 #define IW_QUAL_QUAL_INVALID    0x10    /* Driver doesn't provide value */
0471 #define IW_QUAL_LEVEL_INVALID   0x20
0472 #define IW_QUAL_NOISE_INVALID   0x40
0473 #define IW_QUAL_RCPI        0x80    /* Level + Noise are 802.11k RCPI */
0474 #define IW_QUAL_ALL_INVALID 0x70
0475 
0476 /* Frequency flags */
0477 #define IW_FREQ_AUTO        0x00    /* Let the driver decides */
0478 #define IW_FREQ_FIXED       0x01    /* Force a specific value */
0479 
0480 /* Maximum number of size of encoding token available
0481  * they are listed in the range structure */
0482 #define IW_MAX_ENCODING_SIZES   8
0483 
0484 /* Maximum size of the encoding token in bytes */
0485 #define IW_ENCODING_TOKEN_MAX   64  /* 512 bits (for now) */
0486 
0487 /* Flags for encoding (along with the token) */
0488 #define IW_ENCODE_INDEX     0x00FF  /* Token index (if needed) */
0489 #define IW_ENCODE_FLAGS     0xFF00  /* Flags defined below */
0490 #define IW_ENCODE_MODE      0xF000  /* Modes defined below */
0491 #define IW_ENCODE_DISABLED  0x8000  /* Encoding disabled */
0492 #define IW_ENCODE_ENABLED   0x0000  /* Encoding enabled */
0493 #define IW_ENCODE_RESTRICTED    0x4000  /* Refuse non-encoded packets */
0494 #define IW_ENCODE_OPEN      0x2000  /* Accept non-encoded packets */
0495 #define IW_ENCODE_NOKEY     0x0800  /* Key is write only, so not present */
0496 #define IW_ENCODE_TEMP      0x0400  /* Temporary key */
0497 
0498 /* Power management flags available (along with the value, if any) */
0499 #define IW_POWER_ON     0x0000  /* No details... */
0500 #define IW_POWER_TYPE       0xF000  /* Type of parameter */
0501 #define IW_POWER_PERIOD     0x1000  /* Value is a period/duration of  */
0502 #define IW_POWER_TIMEOUT    0x2000  /* Value is a timeout (to go asleep) */
0503 #define IW_POWER_MODE       0x0F00  /* Power Management mode */
0504 #define IW_POWER_UNICAST_R  0x0100  /* Receive only unicast messages */
0505 #define IW_POWER_MULTICAST_R    0x0200  /* Receive only multicast messages */
0506 #define IW_POWER_ALL_R      0x0300  /* Receive all messages though PM */
0507 #define IW_POWER_FORCE_S    0x0400  /* Force PM procedure for sending unicast */
0508 #define IW_POWER_REPEATER   0x0800  /* Repeat broadcast messages in PM period */
0509 #define IW_POWER_MODIFIER   0x000F  /* Modify a parameter */
0510 #define IW_POWER_MIN        0x0001  /* Value is a minimum  */
0511 #define IW_POWER_MAX        0x0002  /* Value is a maximum */
0512 #define IW_POWER_RELATIVE   0x0004  /* Value is not in seconds/ms/us */
0513 
0514 /* Transmit Power flags available */
0515 #define IW_TXPOW_TYPE       0x00FF  /* Type of value */
0516 #define IW_TXPOW_DBM        0x0000  /* Value is in dBm */
0517 #define IW_TXPOW_MWATT      0x0001  /* Value is in mW */
0518 #define IW_TXPOW_RELATIVE   0x0002  /* Value is in arbitrary units */
0519 #define IW_TXPOW_RANGE      0x1000  /* Range of value between min/max */
0520 
0521 /* Retry limits and lifetime flags available */
0522 #define IW_RETRY_ON     0x0000  /* No details... */
0523 #define IW_RETRY_TYPE       0xF000  /* Type of parameter */
0524 #define IW_RETRY_LIMIT      0x1000  /* Maximum number of retries*/
0525 #define IW_RETRY_LIFETIME   0x2000  /* Maximum duration of retries in us */
0526 #define IW_RETRY_MODIFIER   0x00FF  /* Modify a parameter */
0527 #define IW_RETRY_MIN        0x0001  /* Value is a minimum  */
0528 #define IW_RETRY_MAX        0x0002  /* Value is a maximum */
0529 #define IW_RETRY_RELATIVE   0x0004  /* Value is not in seconds/ms/us */
0530 #define IW_RETRY_SHORT      0x0010  /* Value is for short packets  */
0531 #define IW_RETRY_LONG       0x0020  /* Value is for long packets */
0532 
0533 /* Scanning request flags */
0534 #define IW_SCAN_DEFAULT     0x0000  /* Default scan of the driver */
0535 #define IW_SCAN_ALL_ESSID   0x0001  /* Scan all ESSIDs */
0536 #define IW_SCAN_THIS_ESSID  0x0002  /* Scan only this ESSID */
0537 #define IW_SCAN_ALL_FREQ    0x0004  /* Scan all Frequencies */
0538 #define IW_SCAN_THIS_FREQ   0x0008  /* Scan only this Frequency */
0539 #define IW_SCAN_ALL_MODE    0x0010  /* Scan all Modes */
0540 #define IW_SCAN_THIS_MODE   0x0020  /* Scan only this Mode */
0541 #define IW_SCAN_ALL_RATE    0x0040  /* Scan all Bit-Rates */
0542 #define IW_SCAN_THIS_RATE   0x0080  /* Scan only this Bit-Rate */
0543 /* struct iw_scan_req scan_type */
0544 #define IW_SCAN_TYPE_ACTIVE 0
0545 #define IW_SCAN_TYPE_PASSIVE 1
0546 /* Maximum size of returned data */
0547 #define IW_SCAN_MAX_DATA    4096    /* In bytes */
0548 
0549 /* Scan capability flags - in (struct iw_range *)->scan_capa */
0550 #define IW_SCAN_CAPA_NONE       0x00
0551 #define IW_SCAN_CAPA_ESSID      0x01
0552 #define IW_SCAN_CAPA_BSSID      0x02
0553 #define IW_SCAN_CAPA_CHANNEL    0x04
0554 #define IW_SCAN_CAPA_MODE       0x08
0555 #define IW_SCAN_CAPA_RATE       0x10
0556 #define IW_SCAN_CAPA_TYPE       0x20
0557 #define IW_SCAN_CAPA_TIME       0x40
0558 
0559 /* Max number of char in custom event - use multiple of them if needed */
0560 #define IW_CUSTOM_MAX       256 /* In bytes */
0561 
0562 /* Generic information element */
0563 #define IW_GENERIC_IE_MAX   1024
0564 
0565 /* MLME requests (SIOCSIWMLME / struct iw_mlme) */
0566 #define IW_MLME_DEAUTH      0
0567 #define IW_MLME_DISASSOC    1
0568 #define IW_MLME_AUTH        2
0569 #define IW_MLME_ASSOC       3
0570 
0571 /* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */
0572 #define IW_AUTH_INDEX       0x0FFF
0573 #define IW_AUTH_FLAGS       0xF000
0574 /* SIOCSIWAUTH/SIOCGIWAUTH parameters (0 .. 4095)
0575  * (IW_AUTH_INDEX mask in struct iw_param flags; this is the index of the
0576  * parameter that is being set/get to; value will be read/written to
0577  * struct iw_param value field) */
0578 #define IW_AUTH_WPA_VERSION     0
0579 #define IW_AUTH_CIPHER_PAIRWISE     1
0580 #define IW_AUTH_CIPHER_GROUP        2
0581 #define IW_AUTH_KEY_MGMT        3
0582 #define IW_AUTH_TKIP_COUNTERMEASURES    4
0583 #define IW_AUTH_DROP_UNENCRYPTED    5
0584 #define IW_AUTH_80211_AUTH_ALG      6
0585 #define IW_AUTH_WPA_ENABLED     7
0586 #define IW_AUTH_RX_UNENCRYPTED_EAPOL    8
0587 #define IW_AUTH_ROAMING_CONTROL     9
0588 #define IW_AUTH_PRIVACY_INVOKED     10
0589 #define IW_AUTH_CIPHER_GROUP_MGMT   11
0590 #define IW_AUTH_MFP         12
0591 
0592 /* IW_AUTH_WPA_VERSION values (bit field) */
0593 #define IW_AUTH_WPA_VERSION_DISABLED    0x00000001
0594 #define IW_AUTH_WPA_VERSION_WPA     0x00000002
0595 #define IW_AUTH_WPA_VERSION_WPA2    0x00000004
0596 
0597 /* IW_AUTH_PAIRWISE_CIPHER, IW_AUTH_GROUP_CIPHER, and IW_AUTH_CIPHER_GROUP_MGMT
0598  * values (bit field) */
0599 #define IW_AUTH_CIPHER_NONE 0x00000001
0600 #define IW_AUTH_CIPHER_WEP40    0x00000002
0601 #define IW_AUTH_CIPHER_TKIP 0x00000004
0602 #define IW_AUTH_CIPHER_CCMP 0x00000008
0603 #define IW_AUTH_CIPHER_WEP104   0x00000010
0604 #define IW_AUTH_CIPHER_AES_CMAC 0x00000020
0605 
0606 /* IW_AUTH_KEY_MGMT values (bit field) */
0607 #define IW_AUTH_KEY_MGMT_802_1X 1
0608 #define IW_AUTH_KEY_MGMT_PSK    2
0609 
0610 /* IW_AUTH_80211_AUTH_ALG values (bit field) */
0611 #define IW_AUTH_ALG_OPEN_SYSTEM 0x00000001
0612 #define IW_AUTH_ALG_SHARED_KEY  0x00000002
0613 #define IW_AUTH_ALG_LEAP    0x00000004
0614 
0615 /* IW_AUTH_ROAMING_CONTROL values */
0616 #define IW_AUTH_ROAMING_ENABLE  0   /* driver/firmware based roaming */
0617 #define IW_AUTH_ROAMING_DISABLE 1   /* user space program used for roaming
0618                      * control */
0619 
0620 /* IW_AUTH_MFP (management frame protection) values */
0621 #define IW_AUTH_MFP_DISABLED    0   /* MFP disabled */
0622 #define IW_AUTH_MFP_OPTIONAL    1   /* MFP optional */
0623 #define IW_AUTH_MFP_REQUIRED    2   /* MFP required */
0624 
0625 /* SIOCSIWENCODEEXT definitions */
0626 #define IW_ENCODE_SEQ_MAX_SIZE  8
0627 /* struct iw_encode_ext ->alg */
0628 #define IW_ENCODE_ALG_NONE  0
0629 #define IW_ENCODE_ALG_WEP   1
0630 #define IW_ENCODE_ALG_TKIP  2
0631 #define IW_ENCODE_ALG_CCMP  3
0632 #define IW_ENCODE_ALG_PMK   4
0633 #define IW_ENCODE_ALG_AES_CMAC  5
0634 /* struct iw_encode_ext ->ext_flags */
0635 #define IW_ENCODE_EXT_TX_SEQ_VALID  0x00000001
0636 #define IW_ENCODE_EXT_RX_SEQ_VALID  0x00000002
0637 #define IW_ENCODE_EXT_GROUP_KEY     0x00000004
0638 #define IW_ENCODE_EXT_SET_TX_KEY    0x00000008
0639 
0640 /* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */
0641 #define IW_MICFAILURE_KEY_ID    0x00000003 /* Key ID 0..3 */
0642 #define IW_MICFAILURE_GROUP 0x00000004
0643 #define IW_MICFAILURE_PAIRWISE  0x00000008
0644 #define IW_MICFAILURE_STAKEY    0x00000010
0645 #define IW_MICFAILURE_COUNT 0x00000060 /* 1 or 2 (0 = count not supported)
0646                         */
0647 
0648 /* Bit field values for enc_capa in struct iw_range */
0649 #define IW_ENC_CAPA_WPA     0x00000001
0650 #define IW_ENC_CAPA_WPA2    0x00000002
0651 #define IW_ENC_CAPA_CIPHER_TKIP 0x00000004
0652 #define IW_ENC_CAPA_CIPHER_CCMP 0x00000008
0653 #define IW_ENC_CAPA_4WAY_HANDSHAKE  0x00000010
0654 
0655 /* Event capability macros - in (struct iw_range *)->event_capa
0656  * Because we have more than 32 possible events, we use an array of
0657  * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */
0658 #define IW_EVENT_CAPA_BASE(cmd)     ((cmd >= SIOCIWFIRSTPRIV) ? \
0659                      (cmd - SIOCIWFIRSTPRIV + 0x60) : \
0660                      (cmd - SIOCIWFIRST))
0661 #define IW_EVENT_CAPA_INDEX(cmd)    (IW_EVENT_CAPA_BASE(cmd) >> 5)
0662 #define IW_EVENT_CAPA_MASK(cmd)     (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F))
0663 /* Event capability constants - event autogenerated by the kernel
0664  * This list is valid for most 802.11 devices, customise as needed... */
0665 #define IW_EVENT_CAPA_K_0   (IW_EVENT_CAPA_MASK(0x8B04) | \
0666                  IW_EVENT_CAPA_MASK(0x8B06) | \
0667                  IW_EVENT_CAPA_MASK(0x8B1A))
0668 #define IW_EVENT_CAPA_K_1   (IW_EVENT_CAPA_MASK(0x8B2A))
0669 /* "Easy" macro to set events in iw_range (less efficient) */
0670 #define IW_EVENT_CAPA_SET(event_capa, cmd) (event_capa[IW_EVENT_CAPA_INDEX(cmd)] |= IW_EVENT_CAPA_MASK(cmd))
0671 #define IW_EVENT_CAPA_SET_KERNEL(event_capa) {event_capa[0] |= IW_EVENT_CAPA_K_0; event_capa[1] |= IW_EVENT_CAPA_K_1; }
0672 
0673 
0674 /****************************** TYPES ******************************/
0675 
0676 /* --------------------------- SUBTYPES --------------------------- */
0677 /*
0678  *  Generic format for most parameters that fit in an int
0679  */
0680 struct iw_param {
0681   __s32     value;      /* The value of the parameter itself */
0682   __u8      fixed;      /* Hardware should not use auto select */
0683   __u8      disabled;   /* Disable the feature */
0684   __u16     flags;      /* Various specifc flags (if any) */
0685 };
0686 
0687 /*
0688  *  For all data larger than 16 octets, we need to use a
0689  *  pointer to memory allocated in user space.
0690  */
0691 struct iw_point {
0692   void __user   *pointer;   /* Pointer to the data  (in user space) */
0693   __u16     length;     /* number of fields or size in bytes */
0694   __u16     flags;      /* Optional params */
0695 };
0696 
0697 
0698 /*
0699  *  A frequency
0700  *  For numbers lower than 10^9, we encode the number in 'm' and
0701  *  set 'e' to 0
0702  *  For number greater than 10^9, we divide it by the lowest power
0703  *  of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')...
0704  *  The power of 10 is in 'e', the result of the division is in 'm'.
0705  */
0706 struct iw_freq {
0707     __s32       m;      /* Mantissa */
0708     __s16       e;      /* Exponent */
0709     __u8        i;      /* List index (when in range struct) */
0710     __u8        flags;      /* Flags (fixed/auto) */
0711 };
0712 
0713 /*
0714  *  Quality of the link
0715  */
0716 struct iw_quality {
0717     __u8        qual;       /* link quality (%retries, SNR,
0718                        %missed beacons or better...) */
0719     __u8        level;      /* signal level (dBm) */
0720     __u8        noise;      /* noise level (dBm) */
0721     __u8        updated;    /* Flags to know if updated */
0722 };
0723 
0724 /*
0725  *  Packet discarded in the wireless adapter due to
0726  *  "wireless" specific problems...
0727  *  Note : the list of counter and statistics in net_device_stats
0728  *  is already pretty exhaustive, and you should use that first.
0729  *  This is only additional stats...
0730  */
0731 struct iw_discarded {
0732     __u32       nwid;       /* Rx : Wrong nwid/essid */
0733     __u32       code;       /* Rx : Unable to code/decode (WEP) */
0734     __u32       fragment;   /* Rx : Can't perform MAC reassembly */
0735     __u32       retries;    /* Tx : Max MAC retries num reached */
0736     __u32       misc;       /* Others cases */
0737 };
0738 
0739 /*
0740  *  Packet/Time period missed in the wireless adapter due to
0741  *  "wireless" specific problems...
0742  */
0743 struct iw_missed {
0744     __u32       beacon;     /* Missed beacons/superframe */
0745 };
0746 
0747 /*
0748  *  Quality range (for spy threshold)
0749  */
0750 struct iw_thrspy {
0751     struct sockaddr     addr;       /* Source address (hw/mac) */
0752     struct iw_quality   qual;       /* Quality of the link */
0753     struct iw_quality   low;        /* Low threshold */
0754     struct iw_quality   high;       /* High threshold */
0755 };
0756 
0757 /*
0758  *  Optional data for scan request
0759  *
0760  *  Note: these optional parameters are controlling parameters for the
0761  *  scanning behavior, these do not apply to getting scan results
0762  *  (SIOCGIWSCAN). Drivers are expected to keep a local BSS table and
0763  *  provide a merged results with all BSSes even if the previous scan
0764  *  request limited scanning to a subset, e.g., by specifying an SSID.
0765  *  Especially, scan results are required to include an entry for the
0766  *  current BSS if the driver is in Managed mode and associated with an AP.
0767  */
0768 struct iw_scan_req {
0769     __u8        scan_type; /* IW_SCAN_TYPE_{ACTIVE,PASSIVE} */
0770     __u8        essid_len;
0771     __u8        num_channels; /* num entries in channel_list;
0772                        * 0 = scan all allowed channels */
0773     __u8        flags; /* reserved as padding; use zero, this may
0774                 * be used in the future for adding flags
0775                 * to request different scan behavior */
0776     struct sockaddr bssid; /* ff:ff:ff:ff:ff:ff for broadcast BSSID or
0777                 * individual address of a specific BSS */
0778 
0779     /*
0780      * Use this ESSID if IW_SCAN_THIS_ESSID flag is used instead of using
0781      * the current ESSID. This allows scan requests for specific ESSID
0782      * without having to change the current ESSID and potentially breaking
0783      * the current association.
0784      */
0785     __u8        essid[IW_ESSID_MAX_SIZE];
0786 
0787     /*
0788      * Optional parameters for changing the default scanning behavior.
0789      * These are based on the MLME-SCAN.request from IEEE Std 802.11.
0790      * TU is 1.024 ms. If these are set to 0, driver is expected to use
0791      * reasonable default values. min_channel_time defines the time that
0792      * will be used to wait for the first reply on each channel. If no
0793      * replies are received, next channel will be scanned after this. If
0794      * replies are received, total time waited on the channel is defined by
0795      * max_channel_time.
0796      */
0797     __u32       min_channel_time; /* in TU */
0798     __u32       max_channel_time; /* in TU */
0799 
0800     struct iw_freq  channel_list[IW_MAX_FREQUENCIES];
0801 };
0802 
0803 /* ------------------------- WPA SUPPORT ------------------------- */
0804 
0805 /*
0806  *  Extended data structure for get/set encoding (this is used with
0807  *  SIOCSIWENCODEEXT/SIOCGIWENCODEEXT. struct iw_point and IW_ENCODE_*
0808  *  flags are used in the same way as with SIOCSIWENCODE/SIOCGIWENCODE and
0809  *  only the data contents changes (key data -> this structure, including
0810  *  key data).
0811  *
0812  *  If the new key is the first group key, it will be set as the default
0813  *  TX key. Otherwise, default TX key index is only changed if
0814  *  IW_ENCODE_EXT_SET_TX_KEY flag is set.
0815  *
0816  *  Key will be changed with SIOCSIWENCODEEXT in all cases except for
0817  *  special "change TX key index" operation which is indicated by setting
0818  *  key_len = 0 and ext_flags |= IW_ENCODE_EXT_SET_TX_KEY.
0819  *
0820  *  tx_seq/rx_seq are only used when respective
0821  *  IW_ENCODE_EXT_{TX,RX}_SEQ_VALID flag is set in ext_flags. Normal
0822  *  TKIP/CCMP operation is to set RX seq with SIOCSIWENCODEEXT and start
0823  *  TX seq from zero whenever key is changed. SIOCGIWENCODEEXT is normally
0824  *  used only by an Authenticator (AP or an IBSS station) to get the
0825  *  current TX sequence number. Using TX_SEQ_VALID for SIOCSIWENCODEEXT and
0826  *  RX_SEQ_VALID for SIOCGIWENCODEEXT are optional, but can be useful for
0827  *  debugging/testing.
0828  */
0829 struct iw_encode_ext {
0830     __u32       ext_flags; /* IW_ENCODE_EXT_* */
0831     __u8        tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
0832     __u8        rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
0833     struct sockaddr addr; /* ff:ff:ff:ff:ff:ff for broadcast/multicast
0834                    * (group) keys or unicast address for
0835                    * individual keys */
0836     __u16       alg; /* IW_ENCODE_ALG_* */
0837     __u16       key_len;
0838     __u8        key[0];
0839 };
0840 
0841 /* SIOCSIWMLME data */
0842 struct iw_mlme {
0843     __u16       cmd; /* IW_MLME_* */
0844     __u16       reason_code;
0845     struct sockaddr addr;
0846 };
0847 
0848 /* SIOCSIWPMKSA data */
0849 #define IW_PMKSA_ADD        1
0850 #define IW_PMKSA_REMOVE     2
0851 #define IW_PMKSA_FLUSH      3
0852 
0853 #define IW_PMKID_LEN    16
0854 
0855 struct iw_pmksa {
0856     __u32       cmd; /* IW_PMKSA_* */
0857     struct sockaddr bssid;
0858     __u8        pmkid[IW_PMKID_LEN];
0859 };
0860 
0861 /* IWEVMICHAELMICFAILURE data */
0862 struct iw_michaelmicfailure {
0863     __u32       flags;
0864     struct sockaddr src_addr;
0865     __u8        tsc[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
0866 };
0867 
0868 /* IWEVPMKIDCAND data */
0869 #define IW_PMKID_CAND_PREAUTH   0x00000001 /* RNS pre-authentication enabled */
0870 struct iw_pmkid_cand {
0871     __u32       flags; /* IW_PMKID_CAND_* */
0872     __u32       index; /* the smaller the index, the higher the
0873                 * priority */
0874     struct sockaddr bssid;
0875 };
0876 
0877 /* ------------------------ WIRELESS STATS ------------------------ */
0878 /*
0879  * Wireless statistics (used for /proc/net/wireless)
0880  */
0881 struct iw_statistics {
0882     __u16       status;     /* Status
0883                      * - device dependent for now */
0884 
0885     struct iw_quality   qual;       /* Quality of the link
0886                          * (instant/mean/max) */
0887     struct iw_discarded discard;    /* Packet discarded counts */
0888     struct iw_missed    miss;       /* Packet missed counts */
0889 };
0890 
0891 /* ------------------------ IOCTL REQUEST ------------------------ */
0892 /*
0893  * This structure defines the payload of an ioctl, and is used
0894  * below.
0895  *
0896  * Note that this structure should fit on the memory footprint
0897  * of iwreq (which is the same as ifreq), which mean a max size of
0898  * 16 octets = 128 bits. Warning, pointers might be 64 bits wide...
0899  * You should check this when increasing the structures defined
0900  * above in this file...
0901  */
0902 union iwreq_data {
0903     /* Config - generic */
0904     char        name[IFNAMSIZ];
0905     /* Name : used to verify the presence of  wireless extensions.
0906      * Name of the protocol/provider... */
0907 
0908     struct iw_point essid;      /* Extended network name */
0909     struct iw_param nwid;       /* network id (or domain - the cell) */
0910     struct iw_freq  freq;       /* frequency or channel :
0911                      * 0-1000 = channel
0912                      * > 1000 = frequency in Hz */
0913 
0914     struct iw_param sens;       /* signal level threshold */
0915     struct iw_param bitrate;    /* default bit rate */
0916     struct iw_param txpower;    /* default transmit power */
0917     struct iw_param rts;        /* RTS threshold */
0918     struct iw_param frag;       /* Fragmentation threshold */
0919     __u32       mode;       /* Operation mode */
0920     struct iw_param retry;      /* Retry limits & lifetime */
0921 
0922     struct iw_point encoding;   /* Encoding stuff : tokens */
0923     struct iw_param power;      /* PM duration/timeout */
0924     struct iw_quality qual;     /* Quality part of statistics */
0925 
0926     struct sockaddr ap_addr;    /* Access point address */
0927     struct sockaddr addr;       /* Destination address (hw/mac) */
0928 
0929     struct iw_param param;      /* Other small parameters */
0930     struct iw_point data;       /* Other large parameters */
0931 };
0932 
0933 /*
0934  * The structure to exchange data for ioctl.
0935  * This structure is the same as 'struct ifreq', but (re)defined for
0936  * convenience...
0937  * Do I need to remind you about structure size (32 octets) ?
0938  */
0939 struct iwreq {
0940     union
0941     {
0942         char    ifrn_name[IFNAMSIZ];    /* if name, e.g. "eth0" */
0943     } ifr_ifrn;
0944 
0945     /* Data part (defined just above) */
0946     union iwreq_data    u;
0947 };
0948 
0949 /* -------------------------- IOCTL DATA -------------------------- */
0950 /*
0951  *  For those ioctl which want to exchange mode data that what could
0952  *  fit in the above structure...
0953  */
0954 
0955 /*
0956  *  Range of parameters
0957  */
0958 
0959 struct iw_range {
0960     /* Informative stuff (to choose between different interface) */
0961     __u32       throughput; /* To give an idea... */
0962     /* In theory this value should be the maximum benchmarked
0963      * TCP/IP throughput, because with most of these devices the
0964      * bit rate is meaningless (overhead an co) to estimate how
0965      * fast the connection will go and pick the fastest one.
0966      * I suggest people to play with Netperf or any benchmark...
0967      */
0968 
0969     /* NWID (or domain id) */
0970     __u32       min_nwid;   /* Minimal NWID we are able to set */
0971     __u32       max_nwid;   /* Maximal NWID we are able to set */
0972 
0973     /* Old Frequency (backward compat - moved lower ) */
0974     __u16       old_num_channels;
0975     __u8        old_num_frequency;
0976 
0977     /* Scan capabilities */
0978     __u8        scan_capa;  /* IW_SCAN_CAPA_* bit field */
0979 
0980     /* Wireless event capability bitmasks */
0981     __u32       event_capa[6];
0982 
0983     /* signal level threshold range */
0984     __s32       sensitivity;
0985 
0986     /* Quality of link & SNR stuff */
0987     /* Quality range (link, level, noise)
0988      * If the quality is absolute, it will be in the range [0 ; max_qual],
0989      * if the quality is dBm, it will be in the range [max_qual ; 0].
0990      * Don't forget that we use 8 bit arithmetics... */
0991     struct iw_quality   max_qual;   /* Quality of the link */
0992     /* This should contain the average/typical values of the quality
0993      * indicator. This should be the threshold between a "good" and
0994      * a "bad" link (example : monitor going from green to orange).
0995      * Currently, user space apps like quality monitors don't have any
0996      * way to calibrate the measurement. With this, they can split
0997      * the range between 0 and max_qual in different quality level
0998      * (using a geometric subdivision centered on the average).
0999      * I expect that people doing the user space apps will feedback
1000      * us on which value we need to put in each driver... */
1001     struct iw_quality   avg_qual;   /* Quality of the link */
1002 
1003     /* Rates */
1004     __u8        num_bitrates;   /* Number of entries in the list */
1005     __s32       bitrate[IW_MAX_BITRATES];   /* list, in bps */
1006 
1007     /* RTS threshold */
1008     __s32       min_rts;    /* Minimal RTS threshold */
1009     __s32       max_rts;    /* Maximal RTS threshold */
1010 
1011     /* Frag threshold */
1012     __s32       min_frag;   /* Minimal frag threshold */
1013     __s32       max_frag;   /* Maximal frag threshold */
1014 
1015     /* Power Management duration & timeout */
1016     __s32       min_pmp;    /* Minimal PM period */
1017     __s32       max_pmp;    /* Maximal PM period */
1018     __s32       min_pmt;    /* Minimal PM timeout */
1019     __s32       max_pmt;    /* Maximal PM timeout */
1020     __u16       pmp_flags;  /* How to decode max/min PM period */
1021     __u16       pmt_flags;  /* How to decode max/min PM timeout */
1022     __u16       pm_capa;    /* What PM options are supported */
1023 
1024     /* Encoder stuff */
1025     __u16   encoding_size[IW_MAX_ENCODING_SIZES];   /* Different token sizes */
1026     __u8    num_encoding_sizes; /* Number of entry in the list */
1027     __u8    max_encoding_tokens;    /* Max number of tokens */
1028     /* For drivers that need a "login/passwd" form */
1029     __u8    encoding_login_index;   /* token index for login token */
1030 
1031     /* Transmit power */
1032     __u16       txpower_capa;   /* What options are supported */
1033     __u8        num_txpower;    /* Number of entries in the list */
1034     __s32       txpower[IW_MAX_TXPOWER];    /* list, in bps */
1035 
1036     /* Wireless Extension version info */
1037     __u8        we_version_compiled;    /* Must be WIRELESS_EXT */
1038     __u8        we_version_source;  /* Last update of source */
1039 
1040     /* Retry limits and lifetime */
1041     __u16       retry_capa; /* What retry options are supported */
1042     __u16       retry_flags;    /* How to decode max/min retry limit */
1043     __u16       r_time_flags;   /* How to decode max/min retry life */
1044     __s32       min_retry;  /* Minimal number of retries */
1045     __s32       max_retry;  /* Maximal number of retries */
1046     __s32       min_r_time; /* Minimal retry lifetime */
1047     __s32       max_r_time; /* Maximal retry lifetime */
1048 
1049     /* Frequency */
1050     __u16       num_channels;   /* Number of channels [0; num - 1] */
1051     __u8        num_frequency;  /* Number of entry in the list */
1052     struct iw_freq  freq[IW_MAX_FREQUENCIES];   /* list */
1053     /* Note : this frequency list doesn't need to fit channel numbers,
1054      * because each entry contain its channel index */
1055 
1056     __u32       enc_capa;   /* IW_ENC_CAPA_* bit field */
1057 };
1058 
1059 /*
1060  * Private ioctl interface information
1061  */
1062 
1063 struct iw_priv_args {
1064     __u32       cmd;        /* Number of the ioctl to issue */
1065     __u16       set_args;   /* Type and number of args */
1066     __u16       get_args;   /* Type and number of args */
1067     char        name[IFNAMSIZ]; /* Name of the extension */
1068 };
1069 
1070 /* ----------------------- WIRELESS EVENTS ----------------------- */
1071 /*
1072  * Wireless events are carried through the rtnetlink socket to user
1073  * space. They are encapsulated in the IFLA_WIRELESS field of
1074  * a RTM_NEWLINK message.
1075  */
1076 
1077 /*
1078  * A Wireless Event. Contains basically the same data as the ioctl...
1079  */
1080 struct iw_event {
1081     __u16       len;            /* Real length of this stuff */
1082     __u16       cmd;            /* Wireless IOCTL */
1083     union iwreq_data    u;      /* IOCTL fixed payload */
1084 };
1085 
1086 /* Size of the Event prefix (including padding and alignement junk) */
1087 #define IW_EV_LCP_LEN   (sizeof(struct iw_event) - sizeof(union iwreq_data))
1088 /* Size of the various events */
1089 #define IW_EV_CHAR_LEN  (IW_EV_LCP_LEN + IFNAMSIZ)
1090 #define IW_EV_UINT_LEN  (IW_EV_LCP_LEN + sizeof(__u32))
1091 #define IW_EV_FREQ_LEN  (IW_EV_LCP_LEN + sizeof(struct iw_freq))
1092 #define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param))
1093 #define IW_EV_ADDR_LEN  (IW_EV_LCP_LEN + sizeof(struct sockaddr))
1094 #define IW_EV_QUAL_LEN  (IW_EV_LCP_LEN + sizeof(struct iw_quality))
1095 
1096 /* iw_point events are special. First, the payload (extra data) come at
1097  * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second,
1098  * we omit the pointer, so start at an offset. */
1099 #define IW_EV_POINT_OFF offsetof(struct iw_point, length)
1100 #define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \
1101              IW_EV_POINT_OFF)
1102 
1103 
1104 /* Size of the Event prefix when packed in stream */
1105 #define IW_EV_LCP_PK_LEN    (4)
1106 /* Size of the various events when packed in stream */
1107 #define IW_EV_CHAR_PK_LEN   (IW_EV_LCP_PK_LEN + IFNAMSIZ)
1108 #define IW_EV_UINT_PK_LEN   (IW_EV_LCP_PK_LEN + sizeof(__u32))
1109 #define IW_EV_FREQ_PK_LEN   (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq))
1110 #define IW_EV_PARAM_PK_LEN  (IW_EV_LCP_PK_LEN + sizeof(struct iw_param))
1111 #define IW_EV_ADDR_PK_LEN   (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr))
1112 #define IW_EV_QUAL_PK_LEN   (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality))
1113 #define IW_EV_POINT_PK_LEN  (IW_EV_LCP_PK_LEN + 4)
1114 
1115 #endif /* _UAPI_LINUX_WIRELESS_H */