Home | History | Annotate | Download | only in gpxe
      1 #ifndef _GPXE_IEEE80211_H
      2 #define _GPXE_IEEE80211_H
      3 
      4 #include <gpxe/if_ether.h>	/* for ETH_ALEN */
      5 #include <endian.h>
      6 
      7 /** @file
      8  * Constants and data structures defined in IEEE 802.11, subsetted
      9  * according to what gPXE knows how to use.
     10  */
     11 
     12 FILE_LICENCE(GPL2_OR_LATER);
     13 
     14 /* ---------- Maximum lengths of things ---------- */
     15 
     16 /**
     17  * @defgroup ieee80211_maxlen Maximum lengths in the 802.11 protocol
     18  * @{
     19  */
     20 
     21 /** Maximum length of frame payload
     22  *
     23  * This does not include cryptographic overhead, which can be up to 20
     24  * bytes, but it DOES include the 802.2 LLC/SNAP headers that are used
     25  * on data frames (but not management frames).
     26  */
     27 #define IEEE80211_MAX_DATA_LEN          2304
     28 
     29 /** Length of LLC/SNAP headers on data frames */
     30 #define IEEE80211_LLC_HEADER_LEN	8
     31 
     32 /** Maximum cryptographic overhead before encrypted data */
     33 #define IEEE80211_MAX_CRYPTO_HEADER	8
     34 
     35 /** Maximum cryptographic overhead after encrypted data
     36  *
     37  * This does not count the MIC in TKIP frames, since that is
     38  * considered to be part of the MSDU and thus contributes to the size
     39  * of the data field.
     40  *
     41  * It @e does count the MIC in CCMP frames, which is considered part
     42  * of the MPDU (outside the data field).
     43  */
     44 #define IEEE80211_MAX_CRYPTO_TRAILER    8
     45 
     46 /** Total maximum cryptographic overhead */
     47 #define IEEE80211_MAX_CRYPTO_OVERHEAD	16
     48 
     49 /** Bytes of network-layer data that can go into a regular data frame */
     50 #define IEEE80211_MAX_FRAME_DATA	2296
     51 
     52 /** Frame header length for frames we might work with
     53  *
     54  * QoS adds a two-byte field on top of this, and APs communicating
     55  * with each other in Wireless Distribution System (WDS) mode add an
     56  * extra 6-byte MAC address field, but we do not work with such
     57  * frames.
     58  */
     59 #define IEEE80211_TYP_FRAME_HEADER_LEN	24
     60 
     61 /** Theoretical maximum frame header length
     62  *
     63  * This includes the QoS and WDS Addr4 fields that we should never
     64  * see.
     65  */
     66 #define IEEE80211_MAX_FRAME_HEADER_LEN	32
     67 
     68 /** Maximum combined frame length
     69  *
     70  * The biggest frame will include 32 frame header bytes, 16 bytes of
     71  * crypto overhead, and 2304 data bytes.
     72  */
     73 #define IEEE80211_MAX_FRAME_LEN         2352
     74 
     75 /** Maximum length of an ESSID */
     76 #define IEEE80211_MAX_SSID_LEN          32
     77 
     78 /** @} */
     79 
     80 
     81 /* ---------- Frame Control defines ---------- */
     82 
     83 /**
     84  * @defgroup ieee80211_fc 802.11 Frame Control field bits
     85  * @{
     86  */
     87 
     88 /** 802.11 Frame Control field, Version bitmask */
     89 #define IEEE80211_FC_VERSION	0x0003
     90 
     91 /** Expected value of Version bits in Frame Control */
     92 #define  IEEE80211_THIS_VERSION  0x0000
     93 
     94 
     95 /** 802.11 Frame Control field, Frame Type bitmask */
     96 #define IEEE80211_FC_TYPE	0x000C
     97 
     98 /** Type value for management (layer-2) frames */
     99 #define  IEEE80211_TYPE_MGMT     0x0000
    100 
    101 /** Type value for control (layer-1, hardware-managed) frames */
    102 #define  IEEE80211_TYPE_CTRL     0x0004
    103 
    104 /** Type value for data frames */
    105 #define  IEEE80211_TYPE_DATA     0x0008
    106 
    107 
    108 /** 802.11 Frame Control field, Frame Subtype bitmask */
    109 #define IEEE80211_FC_SUBTYPE	0x00F0
    110 
    111 /** Subtype value for association-request management frames
    112  *
    113  * Association request frames are sent after authentication from the
    114  * client to the Access Point to establish the client as part of the
    115  * Access Point's network.
    116  */
    117 #define  IEEE80211_STYPE_ASSOC_REQ    0x0000
    118 
    119 /** Subtype value for association-response management frames
    120  *
    121  * Association response frames are sent by the Access Point to confirm
    122  * or deny the association requested in an association request frame.
    123  */
    124 #define  IEEE80211_STYPE_ASSOC_RESP   0x0010
    125 
    126 /** Subtype value for reassociation-request management frames
    127  *
    128  * Reassociation request frames are sent by clients wishing to change
    129  * from one Access Point to another while roaming within the same
    130  * extended network (same ESSID).
    131  */
    132 #define  IEEE80211_STYPE_REASSOC_REQ  0x0020
    133 
    134 /** Subtype value for reassociation-response management frames
    135  *
    136  * Reassociation response frames are sent by the Access Point to
    137  * confirm or deny the swap requested in a reassociation request
    138  * frame.
    139  */
    140 #define  IEEE80211_STYPE_REASSOC_RESP 0x0030
    141 
    142 /** Subtype value for probe-request management frames
    143  *
    144  * Probe request frames are sent by clients to request that all Access
    145  * Points on the sending channel, or all belonging to a particular
    146  * ESSID, identify themselves by BSSID, supported transfer rates, RF
    147  * configuration, and other capabilities.
    148  */
    149 #define  IEEE80211_STYPE_PROBE_REQ    0x0040
    150 
    151 /** Subtype value for probe-response management frames
    152  *
    153  * Probe response frames are sent by Access Points in response to
    154  * probe request frames, providing the requested information.
    155  */
    156 #define  IEEE80211_STYPE_PROBE_RESP   0x0050
    157 
    158 /** Subtype value for beacon management frames
    159  *
    160  * Beacon frames are sent by Access Points at regular intervals,
    161  * usually ten per second, on the channel on which they communicate.
    162  * They can be used to probe passively for access points on a channel
    163  * where local regulatory restrictions prohibit active scanning, or
    164  * due to their regularity as a mechanism to determine the fraction of
    165  * packets that are being dropped.
    166  */
    167 #define  IEEE80211_STYPE_BEACON       0x0080
    168 
    169 /** Subtype value for disassociation management frames
    170  *
    171  * Disassociation frames are sent by either a client or an Access
    172  * Point to unequivocally terminate the association between the two.
    173  * They may be sent by clients upon leaving the network, or by an
    174  * Access Point upon reconfiguration, among other reasons; they are
    175  * usually more "polite" than deauthentication frames.
    176  */
    177 #define  IEEE80211_STYPE_DISASSOC     0x00A0
    178 
    179 /** Subtype value for authentication management frames
    180  *
    181  * Authentication frames are exchanged between a client and an Access
    182  * Point before association may be performed. Confusingly, in the most
    183  * common authentication method (Open System) no security tokens are
    184  * exchanged at all. Modern 802.11 security handshaking takes place
    185  * after association.
    186  */
    187 #define  IEEE80211_STYPE_AUTH         0x00B0
    188 
    189 /** Subtype value for deauthentication management frames
    190  *
    191  * Deauthentication frames are sent by either a client or an Access
    192  * Point to terminate the authentication (and therefore also the
    193  * association) between the two. They are generally more forceful than
    194  * disassociation frames, sent for such reasons as a failure to
    195  * set up security properly after associating.
    196  */
    197 #define  IEEE80211_STYPE_DEAUTH       0x00C0
    198 
    199 /** Subtype value for action management frames
    200  *
    201  * Action frames are used to implement spectrum management and QoS
    202  * features that gPXE currently does not support.
    203  */
    204 #define  IEEE80211_STYPE_ACTION	      0x00D0
    205 
    206 
    207 /** Subtype value for RTS (request to send) control frames */
    208 #define  IEEE80211_STYPE_RTS          0x00B0
    209 
    210 /** Subtype value for CTS (clear to send) control frames */
    211 #define  IEEE80211_STYPE_CTS          0x00C0
    212 
    213 /** Subtype value for ACK (acknowledgement) control frames */
    214 #define  IEEE80211_STYPE_ACK          0x00D0
    215 
    216 
    217 /** Subtype value for ordinary data frames, with no QoS or CF add-ons */
    218 #define  IEEE80211_STYPE_DATA         0x0000
    219 
    220 /** Subtype value for data frames containing no data */
    221 #define  IEEE80211_STYPE_NODATA       0x0040
    222 
    223 
    224 /** 802.11 Frame Control field: To Data System flag
    225  *
    226  * This is set on data frames sent to an Access Point.
    227  */
    228 #define IEEE80211_FC_TODS       0x0100
    229 
    230 /** 802.11 Frame Control field: From Data System flag
    231  *
    232  * This is set on data frames sent from an Access Point. If both TODS
    233  * and FROMDS are set, the frame header is a 4-address format used for
    234  * inter-Access Point communication.
    235  */
    236 #define IEEE80211_FC_FROMDS     0x0200
    237 
    238 /** 802.11 Frame Control field: More Fragments flag */
    239 #define IEEE80211_FC_MORE_FRAG  0x0400
    240 
    241 /** 802.11 Frame Control field: Retransmission flag */
    242 #define IEEE80211_FC_RETRY      0x0800
    243 
    244 /** 802.11 Frame Control field: Power Managed flag
    245  *
    246  * This is set on any frame sent by a low-power station that will go
    247  * into a power-saving mode immediately after this frame. Access
    248  * Points are not allowed to act as low-power stations.
    249  */
    250 #define IEEE80211_FC_PWR_MGMT   0x1000
    251 
    252 /** 802.11 Frame Control field: More Data flag
    253  *
    254  * This is set on any frame sent by a station that has more data
    255  * queued to be sent than is in the frame.
    256  */
    257 #define IEEE80211_FC_MORE_DATA  0x2000
    258 
    259 /** 802.11 Frame Control field: Protected flag
    260  *
    261  * This is set on frames in which data is encrypted (by any method).
    262  */
    263 #define IEEE80211_FC_PROTECTED  0x4000
    264 
    265 /** 802.11 Frame Control field: Ordered flag [?] */
    266 #define IEEE80211_FC_ORDER      0x8000
    267 
    268 /** @} */
    269 
    270 
    271 /* ---------- Sequence Control defines ---------- */
    272 
    273 /**
    274  * @defgroup ieee80211_seq 802.11 Sequence Control field handling
    275  * @{
    276  */
    277 
    278 /** Extract sequence number from 802.11 Sequence Control field */
    279 #define IEEE80211_SEQNR( seq )		( ( seq ) >> 4 )
    280 
    281 /** Extract fragment number from 802.11 Sequence Control field */
    282 #define IEEE80211_FRAG( seq )		( ( seq ) & 0x000F )
    283 
    284 /** Make 802.11 Sequence Control field from sequence and fragment numbers */
    285 #define IEEE80211_MAKESEQ( seqnr, frag )	\
    286 	( ( ( ( seqnr ) & 0xFFF ) << 4 ) | ( ( frag ) & 0xF ) )
    287 
    288 /** @} */
    289 
    290 
    291 /* ---------- Frame header formats ---------- */
    292 
    293 /**
    294  * @defgroup ieee80211_hdr 802.11 frame header formats
    295  * @{
    296  */
    297 
    298 /** An 802.11 data or management frame without QoS or WDS header fields */
    299 struct ieee80211_frame
    300 {
    301 	u16 fc;			/**< 802.11 Frame Control field */
    302 	u16 duration;		/**< Microseconds to reserve link */
    303 	u8 addr1[ETH_ALEN];	/**< Address 1 (immediate receiver) */
    304 	u8 addr2[ETH_ALEN];	/**< Address 2 (immediate sender) */
    305 	u8 addr3[ETH_ALEN];	/**< Address 3 (often "forward to") */
    306 	u16 seq;		/**< 802.11 Sequence Control field */
    307 	u8 data[0];		/**< Beginning of frame data */
    308 } __attribute__((packed));
    309 
    310 /** The 802.2 LLC/SNAP header sent before actual data in a data frame
    311  *
    312  * This header is not acknowledged in the 802.11 standard at all; it
    313  * is treated just like data for MAC-layer purposes, including
    314  * fragmentation and encryption. It is actually two headers
    315  * concatenated: a three-byte 802.2 LLC header indicating Subnetwork
    316  * Accesss Protocol (SNAP) in both source and destination Service
    317  * Access Point (SAP) fields, and a five-byte SNAP header indicating a
    318  * zero OUI and two-byte Ethernet protocol type field.
    319  *
    320  * Thus, an eight-byte header in which six of the bytes are redundant.
    321  * Lovely, isn't it?
    322  */
    323 struct ieee80211_llc_snap_header
    324 {
    325 	/* LLC part: */
    326 	u8 dsap;		/**< Destination SAP ID */
    327 	u8 ssap;		/**< Source SAP ID */
    328 	u8 ctrl;		/**< Control information */
    329 
    330 	/* SNAP part: */
    331 	u8 oui[3];		/**< Organization code, usually 0 */
    332 	u16 ethertype;		/**< Ethernet Type field */
    333 } __attribute__((packed));
    334 
    335 /** Value for DSAP field in 802.2 LLC header for 802.11 frames: SNAP */
    336 #define IEEE80211_LLC_DSAP	0xAA
    337 
    338 /** Value for SSAP field in 802.2 LLC header for 802.11 frames: SNAP */
    339 #define IEEE80211_LLC_SSAP	0xAA
    340 
    341 /** Value for control field in 802.2 LLC header for 802.11 frames
    342  *
    343  * "Unnumbered Information".
    344  */
    345 #define IEEE80211_LLC_CTRL	0x03
    346 
    347 
    348 /** 16-byte RTS frame format, with abbreviated header */
    349 struct ieee80211_rts
    350 {
    351 	u16 fc;			/**< 802.11 Frame Control field */
    352 	u16 duration;		/**< Microseconds to reserve link */
    353 	u8 addr1[ETH_ALEN];	/**< Address 1 (immediate receiver) */
    354 	u8 addr2[ETH_ALEN];	/**< Address 2 (immediate sender) */
    355 } __attribute__((packed));
    356 
    357 /** Length of 802.11 RTS control frame */
    358 #define IEEE80211_RTS_LEN	16
    359 
    360 /** 10-byte CTS or ACK frame format, with abbreviated header */
    361 struct ieee80211_cts_or_ack
    362 {
    363 	u16 fc;			/**< 802.11 Frame Control field */
    364 	u16 duration;		/**< Microseconds to reserve link */
    365 	u8 addr1[ETH_ALEN];	/**< Address 1 (immediate receiver) */
    366 } __attribute__((packed));
    367 
    368 #define ieee80211_cts ieee80211_cts_or_ack
    369 #define ieee80211_ack ieee80211_cts_or_ack
    370 
    371 /** Length of 802.11 CTS control frame */
    372 #define IEEE80211_CTS_LEN	10
    373 
    374 /** Length of 802.11 ACK control frame */
    375 #define IEEE80211_ACK_LEN	10
    376 
    377 /** @} */
    378 
    379 
    380 /* ---------- Capability bits, status and reason codes ---------- */
    381 
    382 /**
    383  * @defgroup ieee80211_capab 802.11 management frame capability field bits
    384  * @{
    385  */
    386 
    387 /** Set if using an Access Point (managed mode) */
    388 #define IEEE80211_CAPAB_MANAGED       0x0001
    389 
    390 /** Set if operating in IBSS (no-AP, "Ad-Hoc") mode */
    391 #define IEEE80211_CAPAB_ADHOC         0x0002
    392 
    393 /** Set if we support Contention-Free Period operation */
    394 #define IEEE80211_CAPAB_CFPOLL        0x0004
    395 
    396 /** Set if we wish to be polled for Contention-Free operation */
    397 #define IEEE80211_CAPAB_CFPR          0x0008
    398 
    399 /** Set if the network is encrypted (by any method) */
    400 #define IEEE80211_CAPAB_PRIVACY       0x0010
    401 
    402 /** Set if PHY supports short preambles on 802.11b */
    403 #define IEEE80211_CAPAB_SHORT_PMBL    0x0020
    404 
    405 /** Set if PHY supports PBCC modulation */
    406 #define IEEE80211_CAPAB_PBCC          0x0040
    407 
    408 /** Set if we support Channel Agility */
    409 #define IEEE80211_CAPAB_CHAN_AGILITY  0x0080
    410 
    411 /** Set if we support spectrum management (DFS and TPC) on the 5GHz band */
    412 #define IEEE80211_CAPAB_SPECTRUM_MGMT 0x0100
    413 
    414 /** Set if we support Quality of Service enhancements */
    415 #define IEEE80211_CAPAB_QOS           0x0200
    416 
    417 /** Set if PHY supports short slot time on 802.11g */
    418 #define IEEE80211_CAPAB_SHORT_SLOT    0x0400
    419 
    420 /** Set if PHY supports APSD option */
    421 #define IEEE80211_CAPAB_APSD          0x0800
    422 
    423 /** Set if PHY supports DSSS/OFDM modulation (one way of 802.11 b/g mixing) */
    424 #define IEEE80211_CAPAB_DSSS_OFDM     0x2000
    425 
    426 /** Set if we support delayed block ACK */
    427 #define IEEE80211_CAPAB_DELAYED_BACK  0x4000
    428 
    429 /** Set if we support immediate block ACK */
    430 #define IEEE80211_CAPAB_IMMED_BACK    0x8000
    431 
    432 /** @} */
    433 
    434 
    435 /**
    436  * @defgroup ieee80211_status 802.11 status codes
    437  *
    438  * These are returned to indicate an immediate denial of
    439  * authentication or association. In gPXE, the lower 5 bits of the
    440  * status code are encoded into the file-unique portion of an error
    441  * code, the ERRFILE portion is always @c ERRFILE_net80211, and the
    442  * POSIX error code is @c ECONNREFUSED for status 0-31 or @c
    443  * EHOSTUNREACH for status 32-63.
    444  *
    445  * For a complete table with non-abbreviated error messages, see IEEE
    446  * Std 802.11-2007, Table 7-23, p.94.
    447  *
    448  * @{
    449  */
    450 
    451 #define IEEE80211_STATUS_SUCCESS		0
    452 #define IEEE80211_STATUS_FAILURE		1
    453 #define IEEE80211_STATUS_CAPAB_UNSUPP		10
    454 #define IEEE80211_STATUS_REASSOC_INVALID	11
    455 #define IEEE80211_STATUS_ASSOC_DENIED		12
    456 #define IEEE80211_STATUS_AUTH_ALGO_UNSUPP	13
    457 #define IEEE80211_STATUS_AUTH_SEQ_INVALID	14
    458 #define IEEE80211_STATUS_AUTH_CHALL_INVALID	15
    459 #define IEEE80211_STATUS_AUTH_TIMEOUT		16
    460 #define IEEE80211_STATUS_ASSOC_NO_ROOM		17
    461 #define IEEE80211_STATUS_ASSOC_NEED_RATE	18
    462 #define IEEE80211_STATUS_ASSOC_NEED_SHORT_PMBL	19
    463 #define IEEE80211_STATUS_ASSOC_NEED_PBCC	20
    464 #define IEEE80211_STATUS_ASSOC_NEED_CHAN_AGILITY 21
    465 #define IEEE80211_STATUS_ASSOC_NEED_SPECTRUM_MGMT 22
    466 #define IEEE80211_STATUS_ASSOC_BAD_POWER	23
    467 #define IEEE80211_STATUS_ASSOC_BAD_CHANNELS	24
    468 #define IEEE80211_STATUS_ASSOC_NEED_SHORT_SLOT	25
    469 #define IEEE80211_STATUS_ASSOC_NEED_DSSS_OFDM	26
    470 #define IEEE80211_STATUS_QOS_FAILURE		32
    471 #define IEEE80211_STATUS_QOS_NO_ROOM		33
    472 #define IEEE80211_STATUS_LINK_IS_HORRIBLE	34
    473 #define IEEE80211_STATUS_ASSOC_NEED_QOS		35
    474 #define IEEE80211_STATUS_REQUEST_DECLINED	37
    475 #define IEEE80211_STATUS_REQUEST_INVALID	38
    476 #define IEEE80211_STATUS_TS_NOT_CREATED_AGAIN	39
    477 #define IEEE80211_STATUS_INVALID_IE		40
    478 #define IEEE80211_STATUS_GROUP_CIPHER_INVALID	41
    479 #define IEEE80211_STATUS_PAIR_CIPHER_INVALID	42
    480 #define IEEE80211_STATUS_AKMP_INVALID		43
    481 #define IEEE80211_STATUS_RSN_VERSION_UNSUPP	44
    482 #define IEEE80211_STATUS_RSN_CAPAB_INVALID	45
    483 #define IEEE80211_STATUS_CIPHER_REJECTED	46
    484 #define IEEE80211_STATUS_TS_NOT_CREATED_WAIT	47
    485 #define IEEE80211_STATUS_DIRECT_LINK_FORBIDDEN	48
    486 #define IEEE80211_STATUS_DEST_NOT_PRESENT	49
    487 #define IEEE80211_STATUS_DEST_NOT_QOS		50
    488 #define IEEE80211_STATUS_ASSOC_LISTEN_TOO_HIGH	51
    489 
    490 /** @} */
    491 
    492 
    493 
    494 /**
    495  * @defgroup ieee80211_reason 802.11 reason codes
    496  *
    497  * These are returned to indicate the reason for a deauthentication or
    498  * disassociation sent (usually) after authentication or association
    499  * had succeeded.  In gPXE, the lower 5 bits of the reason code are
    500  * encoded into the file-unique portion of an error code, the ERRFILE
    501  * portion is always @c ERRFILE_net80211, and the POSIX error code is
    502  * @c ECONNRESET for reason 0-31 or @c ENETRESET for reason 32-63.
    503  *
    504  * For a complete table with non-abbreviated error messages, see IEEE
    505  * Std 802.11-2007, Table 7-22, p.92.
    506  *
    507  * @{
    508  */
    509 
    510 #define IEEE80211_REASON_NONE			0
    511 #define IEEE80211_REASON_UNSPECIFIED		1
    512 #define IEEE80211_REASON_AUTH_NO_LONGER_VALID	2
    513 #define IEEE80211_REASON_LEAVING		3
    514 #define IEEE80211_REASON_INACTIVITY		4
    515 #define IEEE80211_REASON_OUT_OF_RESOURCES	5
    516 #define IEEE80211_REASON_NEED_AUTH		6
    517 #define IEEE80211_REASON_NEED_ASSOC		7
    518 #define IEEE80211_REASON_LEAVING_TO_ROAM	8
    519 #define IEEE80211_REASON_REASSOC_INVALID	9
    520 #define IEEE80211_REASON_BAD_POWER		10
    521 #define IEEE80211_REASON_BAD_CHANNELS		11
    522 #define IEEE80211_REASON_INVALID_IE		13
    523 #define IEEE80211_REASON_MIC_FAILURE		14
    524 #define IEEE80211_REASON_4WAY_TIMEOUT		15
    525 #define IEEE80211_REASON_GROUPKEY_TIMEOUT	16
    526 #define IEEE80211_REASON_4WAY_INVALID		17
    527 #define IEEE80211_REASON_GROUP_CIPHER_INVALID	18
    528 #define IEEE80211_REASON_PAIR_CIPHER_INVALID	19
    529 #define IEEE80211_REASON_AKMP_INVALID		20
    530 #define IEEE80211_REASON_RSN_VERSION_INVALID	21
    531 #define IEEE80211_REASON_RSN_CAPAB_INVALID	22
    532 #define IEEE80211_REASON_8021X_FAILURE		23
    533 #define IEEE80211_REASON_CIPHER_REJECTED	24
    534 #define IEEE80211_REASON_QOS_UNSPECIFIED	32
    535 #define IEEE80211_REASON_QOS_OUT_OF_RESOURCES	33
    536 #define IEEE80211_REASON_LINK_IS_HORRIBLE	34
    537 #define IEEE80211_REASON_INVALID_TXOP		35
    538 #define IEEE80211_REASON_REQUESTED_LEAVING	36
    539 #define IEEE80211_REASON_REQUESTED_NO_USE	37
    540 #define IEEE80211_REASON_REQUESTED_NEED_SETUP	38
    541 #define IEEE80211_REASON_REQUESTED_TIMEOUT	39
    542 #define IEEE80211_REASON_CIPHER_UNSUPPORTED	45
    543 
    544 /** @} */
    545 
    546 /* ---------- Information element declarations ---------- */
    547 
    548 /**
    549  * @defgroup ieee80211_ie 802.11 information elements
    550  *
    551  * Many management frames include a section that amounts to a
    552  * concatenation of these information elements, so that the sender can
    553  * choose which information to send and the receiver can ignore the
    554  * parts it doesn't understand. Each IE contains a two-byte header,
    555  * one byte ID and one byte length, followed by IE-specific data. The
    556  * length does not include the two-byte header. Information elements
    557  * are required to be sorted by ID, but gPXE does not require that in
    558  * those it receives.
    559  *
    560  * This group also includes a few inline functions to simplify common
    561  * tasks in IE processing.
    562  *
    563  * @{
    564  */
    565 
    566 /** Generic 802.11 information element header */
    567 struct ieee80211_ie_header {
    568 	u8 id;			/**< Information element ID */
    569 	u8 len;			/**< Information element length */
    570 } __attribute__ ((packed));
    571 
    572 
    573 /** 802.11 SSID information element */
    574 struct ieee80211_ie_ssid {
    575 	u8 id;			/**< SSID ID: 0 */
    576 	u8 len;			/**< SSID length */
    577 	char ssid[0];		/**< SSID data, not NUL-terminated */
    578 } __attribute__ ((packed));
    579 
    580 /** Information element ID for SSID information element */
    581 #define IEEE80211_IE_SSID	0
    582 
    583 
    584 /** 802.11 rates information element
    585  *
    586  * The first 8 rates go in an IE of type RATES (1), and any more rates
    587  * go in one of type EXT_RATES (50). Each rate is a byte with the low
    588  * 7 bits equal to the rate in units of 500 kbps, and the high bit set
    589  * if and only if the rate is "basic" (must be supported by all
    590  * connected stations).
    591  */
    592 struct ieee80211_ie_rates {
    593 	u8 id;			/**< Rates ID: 1 or 50 */
    594 	u8 len;			/**< Number of rates */
    595 	u8 rates[0];		/**< Rates data, one rate per byte */
    596 } __attribute__ ((packed));
    597 
    598 /** Information element ID for rates information element */
    599 #define IEEE80211_IE_RATES	1
    600 
    601 /** Information element ID for extended rates information element */
    602 #define IEEE80211_IE_EXT_RATES	50
    603 
    604 
    605 /** 802.11 Direct Spectrum parameter information element
    606  *
    607  * This just contains the channel number. It has the fancy name
    608  * because IEEE 802.11 also defines a frequency-hopping PHY that
    609  * changes channels at regular intervals following a predetermined
    610  * pattern; in practice nobody uses the FH PHY.
    611  */
    612 struct ieee80211_ie_ds_param {
    613 	u8 id;			/**< DS parameter ID: 3 */
    614 	u8 len;			/**< DS parameter length: 1 */
    615 	u8 current_channel;	/**< Current channel number, 1-14 */
    616 } __attribute__ ((packed));
    617 
    618 /** Information element ID for Direct Spectrum parameter information element */
    619 #define IEEE80211_IE_DS_PARAM	3
    620 
    621 
    622 /** 802.11 Country information element regulatory extension triplet */
    623 struct ieee80211_ie_country_ext_triplet {
    624 	u8 reg_ext_id;		/**< Regulatory extension ID */
    625 	u8 reg_class_id;	/**< Regulatory class ID */
    626 	u8 coverage_class;	/**< Coverage class */
    627 } __attribute__ ((packed));
    628 
    629 /** 802.11 Country information element regulatory band triplet */
    630 struct ieee80211_ie_country_band_triplet {
    631 	u8 first_channel;	/**< Channel number for first channel in band */
    632 	u8 nr_channels;		/**< Number of contiguous channels in band */
    633 	u8 max_txpower;		/**< Maximum TX power in dBm */
    634 } __attribute__ ((packed));
    635 
    636 /** 802.11 Country information element regulatory triplet
    637  *
    638  * It is a band triplet if the first byte is 200 or less, and a
    639  * regulatory extension triplet otherwise.
    640  */
    641 union ieee80211_ie_country_triplet {
    642 	/** Differentiator between band and ext triplets */
    643 	u8 first;
    644 
    645 	/** Information about a band of channels */
    646 	struct ieee80211_ie_country_band_triplet band;
    647 
    648 	/** Regulatory extension information */
    649 	struct ieee80211_ie_country_ext_triplet ext;
    650 };
    651 
    652 /** 802.11 Country information element
    653  *
    654  * This contains some data about RF regulations.
    655  */
    656 struct ieee80211_ie_country {
    657 	u8 id;			/**< Country information ID: 7 */
    658 	u8 len;			/**< Country information length: varies */
    659 	char name[2];		/**< ISO Alpha2 country code */
    660 	char in_out;		/**< 'I' for indoor, 'O' for outdoor */
    661 
    662 	/** List of regulatory triplets */
    663 	union ieee80211_ie_country_triplet triplet[0];
    664 } __attribute__ ((packed));
    665 
    666 /** Information element ID for Country information element */
    667 #define IEEE80211_IE_COUNTRY	7
    668 
    669 
    670 /** 802.11 Request information element
    671  *
    672  * This contains a list of information element types we would like to
    673  * be included in probe response frames.
    674  */
    675 struct ieee80211_ie_request {
    676 	u8 id;			/**< Request ID: 10 */
    677 	u8 len;			/**< Number of IEs requested */
    678 	u8 request[0];		/**< List of IEs requested */
    679 } __attribute__ ((packed));
    680 
    681 /** Information element ID for Request information element */
    682 #define IEEE80211_IE_REQUEST	10
    683 
    684 
    685 /** 802.11 Challenge Text information element
    686  *
    687  * This is used in authentication frames under Shared Key
    688  * authentication.
    689  */
    690 struct ieee80211_ie_challenge_text {
    691 	u8 id;			/**< Challenge Text ID: 16 */
    692 	u8 len;			/**< Challenge Text length: usually 128 */
    693 	u8 challenge_text[0];	/**< Challenge Text data */
    694 } __attribute__ ((packed));
    695 
    696 /** Information element ID for Challenge Text information element */
    697 #define IEEE80211_IE_CHALLENGE_TEXT	16
    698 
    699 
    700 /** 802.11 Power Constraint information element
    701  *
    702  * This is used to specify an additional power limitation on top of
    703  * the Country requirements.
    704  */
    705 struct ieee80211_ie_power_constraint {
    706 	u8 id;			/**< Power Constraint ID: 52 */
    707 	u8 len;			/**< Power Constraint length: 1 */
    708 	u8 power_constraint;	/**< Decrease in allowed TX power, dBm */
    709 } __attribute__ ((packed));
    710 
    711 /** Information element ID for Power Constraint information element */
    712 #define IEEE80211_IE_POWER_CONSTRAINT	52
    713 
    714 
    715 /** 802.11 Power Capability information element
    716  *
    717  * This is used in association request frames to indicate the extremes
    718  * of our TX power abilities. It is required only if we indicate
    719  * support for spectrum management.
    720  */
    721 struct ieee80211_ie_power_capab {
    722 	u8 id;			/**< Power Capability ID: 33 */
    723 	u8 len;			/**< Power Capability length: 2 */
    724 	u8 min_txpower;		/**< Minimum possible TX power, dBm */
    725 	u8 max_txpower;		/**< Maximum possible TX power, dBm */
    726 } __attribute__ ((packed));
    727 
    728 /** Information element ID for Power Capability information element */
    729 #define IEEE80211_IE_POWER_CAPAB	33
    730 
    731 
    732 /** 802.11 Channels information element channel band tuple */
    733 struct ieee80211_ie_channels_channel_band {
    734 	u8 first_channel;	/**< Channel number of first channel in band */
    735 	u8 nr_channels;		/**< Number of channels in band */
    736 } __attribute__ ((packed));
    737 
    738 /** 802.11 Channels information element
    739  *
    740  * This is used in association frames to indicate the channels we can
    741  * use. It is required only if we indicate support for spectrum
    742  * management.
    743  */
    744 struct ieee80211_ie_channels {
    745 	u8 id;			/**< Channels ID: 36 */
    746 	u8 len;			/**< Channels length: 2 */
    747 
    748 	/** List of (start, length) channel bands we can use */
    749 	struct ieee80211_ie_channels_channel_band channels[0];
    750 } __attribute__ ((packed));
    751 
    752 /** Information element ID for Channels information element */
    753 #define IEEE80211_IE_CHANNELS	36
    754 
    755 
    756 /** 802.11 ERP Information information element
    757  *
    758  * This is used to communicate some PHY-level flags.
    759  */
    760 struct ieee80211_ie_erp_info {
    761 	u8 id;			/**< ERP Information ID: 42 */
    762 	u8 len;			/**< ERP Information length: 1 */
    763 	u8 erp_info;		/**< ERP flags */
    764 } __attribute__ ((packed));
    765 
    766 /** Information element ID for ERP Information information element */
    767 #define IEEE80211_IE_ERP_INFO	42
    768 
    769 /** ERP information element: Flag set if 802.11b stations are present */
    770 #define  IEEE80211_ERP_NONERP_PRESENT	0x01
    771 
    772 /** ERP information element: Flag set if CTS protection must be used */
    773 #define  IEEE80211_ERP_USE_PROTECTION	0x02
    774 
    775 /** ERP information element: Flag set if long preambles must be used */
    776 #define  IEEE80211_ERP_BARKER_LONG	0x04
    777 
    778 
    779 /** 802.11 Robust Security Network ("WPA") information element
    780  *
    781  * Showing once again a striking clarity of design, the IEEE folks put
    782  * dynamically-sized data in the middle of this structure. As such,
    783  * the below structure definition only works for IEs we create
    784  * ourselves, which always have one pairwise cipher and one AKM;
    785  * received IEs should be parsed piecemeal.
    786  *
    787  * Also inspired was IEEE's choice of 16-bit fields to count the
    788  * number of 4-byte elements in a structure with a maximum length of
    789  * 255 bytes.
    790  *
    791  * Many fields reference a cipher or authentication-type ID; this is a
    792  * three-byte OUI followed by one byte identifying the cipher with
    793  * respect to that OUI. For all standard ciphers the OUI is 00:0F:AC,
    794  * except in old-style WPA IEs encapsulated in vendor-specific IEs,
    795  * where it's 00:50:F2.
    796  */
    797 struct ieee80211_ie_rsn {
    798 	/** Information element ID */
    799 	u8 id;
    800 
    801 	/** Information element length */
    802 	u8 len;
    803 
    804 	/** RSN information element version */
    805 	u16 version;
    806 
    807 	/** Cipher ID for the cipher used in multicast/broadcast frames */
    808 	u32 group_cipher;
    809 
    810 	/** Number of unicast ciphers supported */
    811 	u16 pairwise_count;
    812 
    813 	/** List of cipher IDs for supported unicast frame ciphers */
    814 	u32 pairwise_cipher[1];
    815 
    816 	/** Number of authentication types supported */
    817 	u16 akm_count;
    818 
    819 	/** List of authentication type IDs for supported types */
    820 	u32 akm_list[1];
    821 
    822 	/** Security capabilities field (RSN only) */
    823 	u16 rsn_capab;
    824 
    825 	/** Number of PMKIDs included (present only in association frames) */
    826 	u16 pmkid_count;
    827 
    828 	/** List of PMKIDs included, each a 16-byte SHA1 hash */
    829 	u8 pmkid_list[0];
    830 } __attribute__((packed));
    831 
    832 /** Information element ID for Robust Security Network information element */
    833 #define IEEE80211_IE_RSN	48
    834 
    835 /** Calculate necessary size of RSN information element
    836  *
    837  * @v npair	Number of pairwise ciphers supported
    838  * @v nauth	Number of authentication types supported
    839  * @v npmkid	Number of PMKIDs to include
    840  * @v is_rsn	If TRUE, calculate RSN IE size; if FALSE, calculate WPA IE size
    841  * @ret size	Necessary size of IE, including header bytes
    842  */
    843 static inline size_t ieee80211_rsn_size ( int npair, int nauth, int npmkid,
    844 					  int rsn_ie ) {
    845 	return 16 + 4 * ( npair + nauth ) + 16 * npmkid - 4 * ! rsn_ie;
    846 }
    847 
    848 /** Make OUI plus type byte into 32-bit integer for easy comparison */
    849 #if __BYTE_ORDER == __BIG_ENDIAN
    850 #define _MKOUI( a, b, c, t )	\
    851 		( ( ( a ) << 24 ) | ( ( b ) << 16 ) | ( ( c ) << 8 ) | ( d ) )
    852 #define  OUI_ORG_MASK		0xFFFFFF00
    853 #define  OUI_TYPE_MASK		0x000000FF
    854 #else
    855 #define _MKOUI( a, b, c, t )	\
    856 		( ( ( t ) << 24 ) | ( ( c ) << 16 ) | ( ( b ) << 8 ) | ( a ) )
    857 #define  OUI_ORG_MASK		0x00FFFFFF
    858 #define  OUI_TYPE_MASK		0xFF000000
    859 #endif
    860 
    861 /** Organization part for OUIs in standard RSN IE */
    862 #define  IEEE80211_RSN_OUI	_MKOUI ( 0x00, 0x0F, 0xAC, 0 )
    863 
    864 /** Organization part for OUIs in old WPA IE */
    865 #define  IEEE80211_WPA_OUI	_MKOUI ( 0x00, 0x50, 0xF2, 0 )
    866 
    867 /** Old vendor-type WPA IE OUI type + subtype */
    868 #define  IEEE80211_WPA_OUI_VEN	_MKOUI ( 0x00, 0x50, 0xF2, 0x01 )
    869 
    870 
    871 /** 802.11 RSN IE: expected version number */
    872 #define  IEEE80211_RSN_VERSION		1
    873 
    874 /** 802.11 RSN IE: cipher type for 40-bit WEP */
    875 #define  IEEE80211_RSN_CTYPE_WEP40	_MKOUI ( 0, 0, 0, 0x01 )
    876 
    877 /** 802.11 RSN IE: cipher type for 104-bit WEP */
    878 #define  IEEE80211_RSN_CTYPE_WEP104	_MKOUI ( 0, 0, 0, 0x05 )
    879 
    880 /** 802.11 RSN IE: cipher type for TKIP ("WPA") */
    881 #define  IEEE80211_RSN_CTYPE_TKIP	_MKOUI ( 0, 0, 0, 0x02 )
    882 
    883 /** 802.11 RSN IE: cipher type for CCMP ("WPA2") */
    884 #define  IEEE80211_RSN_CTYPE_CCMP	_MKOUI ( 0, 0, 0, 0x04 )
    885 
    886 /** 802.11 RSN IE: cipher type for "use group"
    887  *
    888  * This can only appear as a pairwise cipher, and means unicast frames
    889  * should be encrypted in the same way as broadcast/multicast frames.
    890  */
    891 #define  IEEE80211_RSN_CTYPE_USEGROUP	_MKOUI ( 0, 0, 0, 0x00 )
    892 
    893 /** 802.11 RSN IE: auth method type for using an 802.1X server */
    894 #define  IEEE80211_RSN_ATYPE_8021X	_MKOUI ( 0, 0, 0, 0x01 )
    895 
    896 /** 802.11 RSN IE: auth method type for using a pre-shared key */
    897 #define  IEEE80211_RSN_ATYPE_PSK	_MKOUI ( 0, 0, 0, 0x02 )
    898 
    899 /** 802.11 RSN IE capabilities: AP supports pre-authentication */
    900 #define  IEEE80211_RSN_CAPAB_PREAUTH	0x001
    901 
    902 /** 802.11 RSN IE capabilities: Node has conflict between TKIP and WEP
    903  *
    904  * This is a legacy issue; APs always set it to 0, and gPXE sets it to
    905  * 0.
    906  */
    907 #define  IEEE80211_RSN_CAPAB_NO_PAIRWISE 0x002
    908 
    909 /** 802.11 RSN IE capabilities: Number of PTKSA replay counters
    910  *
    911  * A value of 0 means one replay counter, 1 means two, 2 means four,
    912  * and 3 means sixteen.
    913  */
    914 #define  IEEE80211_RSN_CAPAB_PTKSA_REPLAY 0x00C
    915 
    916 /** 802.11 RSN IE capabilities: Number of GTKSA replay counters
    917  *
    918  * A value of 0 means one replay counter, 1 means two, 2 means four,
    919  * and 3 means sixteen.
    920  */
    921 #define  IEEE80211_RSN_CAPAB_GTKSA_REPLAY 0x030
    922 
    923 /** 802.11 RSN IE capabilities: PeerKey Handshaking is suported */
    924 #define  IEEE80211_RSN_CAPAB_PEERKEY	0x200
    925 
    926 
    927 /** 802.11 RSN IE capabilities: One replay counter
    928  *
    929  * This should be AND'ed with @c IEEE80211_RSN_CAPAB_PTKSA_REPLAY or
    930  * @c IEEE80211_RSN_CAPAB_GTKSA_REPLAY (or both) to produce a value
    931  * which can be OR'ed into the capabilities field.
    932  */
    933 #define IEEE80211_RSN_1_CTR		0x000
    934 
    935 /** 802.11 RSN IE capabilities: Two replay counters */
    936 #define IEEE80211_RSN_2_CTR		0x014
    937 
    938 /** 802.11 RSN IE capabilities: Four replay counters */
    939 #define IEEE80211_RSN_4_CTR		0x028
    940 
    941 /** 802.11 RSN IE capabilities: 16 replay counters */
    942 #define IEEE80211_RSN_16_CTR		0x03C
    943 
    944 
    945 /** 802.11 Vendor Specific information element
    946  *
    947  * One often sees the RSN IE masquerading as vendor-specific on
    948  * devices that were produced prior to 802.11i (the WPA amendment)
    949  * being finalized.
    950  */
    951 struct ieee80211_ie_vendor {
    952 	u8 id;			/**< Vendor-specific ID: 221 */
    953 	u8 len;			/**< Vendor-specific length: variable */
    954 	u32 oui;		/**< OUI and vendor-specific type byte */
    955 	u8 data[0];		/**< Vendor-specific data */
    956 } __attribute__ ((packed));
    957 
    958 /** Information element ID for Vendor Specific information element */
    959 #define IEEE80211_IE_VENDOR	221
    960 
    961 
    962 
    963 
    964 /** Any 802.11 information element
    965  *
    966  * This is formatted for ease of use, so IEs with complex structures
    967  * get referenced in full, while those with only one byte of data or a
    968  * simple array are pulled in to avoid a layer of indirection like
    969  * ie->channels.channels[0].
    970  */
    971 union ieee80211_ie
    972 {
    973 	/** Generic and simple information element info */
    974 	struct {
    975 		u8 id;		/**< Information element ID */
    976 		u8 len;		/**< Information element data length */
    977 		union {
    978 			char ssid[0];	/**< SSID text */
    979 			u8 rates[0];	/**< Rates data */
    980 			u8 request[0];	/**< Request list */
    981 			u8 challenge_text[0]; /**< Challenge text data */
    982 			u8 power_constraint; /**< Power constraint, dBm */
    983 			u8 erp_info;	/**< ERP information flags */
    984 			/** List of channels */
    985 			struct ieee80211_ie_channels_channel_band channels[0];
    986 		};
    987 	};
    988 
    989 	/** DS parameter set */
    990 	struct ieee80211_ie_ds_param ds_param;
    991 
    992 	/** Country information */
    993 	struct ieee80211_ie_country country;
    994 
    995 	/** Power capability */
    996 	struct ieee80211_ie_power_capab power_capab;
    997 
    998 	/** Security information */
    999 	struct ieee80211_ie_rsn rsn;
   1000 
   1001 	/** Vendor-specific */
   1002 	struct ieee80211_ie_vendor vendor;
   1003 };
   1004 
   1005 /** Check that 802.11 information element is bounded by buffer
   1006  *
   1007  * @v ie	Information element
   1008  * @v end	End of buffer in which information element is stored
   1009  * @ret ok	TRUE if the IE is completely contained within the buffer
   1010  */
   1011 static inline int ieee80211_ie_bound ( union ieee80211_ie *ie, void *end )
   1012 {
   1013 	void *iep = ie;
   1014 	return ( iep + 2 <= end && iep + 2 + ie->len <= end );
   1015 }
   1016 
   1017 /** Advance to next 802.11 information element
   1018  *
   1019  * @v ie	Current information element pointer
   1020  * @v end	Pointer to first byte not in information element space
   1021  * @ret next	Pointer to next information element, or NULL if no more
   1022  *
   1023  * When processing received IEs, @a end should be set to the I/O
   1024  * buffer tail pointer; when marshalling IEs for sending, @a end
   1025  * should be NULL.
   1026  */
   1027 static inline union ieee80211_ie * ieee80211_next_ie ( union ieee80211_ie *ie,
   1028 						       void *end )
   1029 {
   1030 	void *next_ie_byte = ( void * ) ie + ie->len + 2;
   1031 	union ieee80211_ie *next_ie = next_ie_byte;
   1032 
   1033 	if ( ! end )
   1034 		return next_ie;
   1035 
   1036 	if ( ieee80211_ie_bound ( next_ie, end ) )
   1037 		return next_ie;
   1038 
   1039 	return NULL;
   1040 }
   1041 
   1042 /** @} */
   1043 
   1044 
   1045 /* ---------- Management frame data formats ---------- */
   1046 
   1047 /**
   1048  * @defgroup ieee80211_mgmt_data Management frame data payloads
   1049  * @{
   1050  */
   1051 
   1052 /** Beacon or probe response frame data */
   1053 struct ieee80211_beacon_or_probe_resp
   1054 {
   1055 	/** 802.11 TSFT value at frame send */
   1056 	u64 timestamp;
   1057 
   1058 	/** Interval at which beacons are sent, in units of 1024 us */
   1059 	u16 beacon_interval;
   1060 
   1061 	/** Capability flags */
   1062 	u16 capability;
   1063 
   1064 	/** List of information elements */
   1065 	union ieee80211_ie info_element[0];
   1066 } __attribute__((packed));
   1067 
   1068 #define ieee80211_beacon	ieee80211_beacon_or_probe_resp
   1069 #define ieee80211_probe_resp	ieee80211_beacon_or_probe_resp
   1070 
   1071 /** Disassociation or deauthentication frame data */
   1072 struct ieee80211_disassoc_or_deauth
   1073 {
   1074 	/** Reason code */
   1075 	u16 reason;
   1076 } __attribute__((packed));
   1077 
   1078 #define ieee80211_disassoc	ieee80211_disassoc_or_deauth
   1079 #define ieee80211_deauth	ieee80211_disassoc_or_deauth
   1080 
   1081 /** Association request frame data */
   1082 struct ieee80211_assoc_req
   1083 {
   1084 	/** Capability flags */
   1085 	u16 capability;
   1086 
   1087 	/** Interval at which we wake up, in units of the beacon interval */
   1088 	u16 listen_interval;
   1089 
   1090 	/** List of information elements */
   1091 	union ieee80211_ie info_element[0];
   1092 } __attribute__((packed));
   1093 
   1094 /** Association or reassociation response frame data */
   1095 struct ieee80211_assoc_or_reassoc_resp
   1096 {
   1097 	/** Capability flags */
   1098 	u16 capability;
   1099 
   1100 	/** Status code */
   1101 	u16 status;
   1102 
   1103 	/** Association ID */
   1104 	u16 aid;
   1105 
   1106 	/** List of information elements */
   1107 	union ieee80211_ie info_element[0];
   1108 } __attribute__((packed));
   1109 
   1110 #define ieee80211_assoc_resp	ieee80211_assoc_or_reassoc_resp
   1111 #define ieee80211_reassoc_resp	ieee80211_assoc_or_reassoc_resp
   1112 
   1113 /** Reassociation request frame data */
   1114 struct ieee80211_reassoc_req
   1115 {
   1116 	/** Capability flags */
   1117 	u16 capability;
   1118 
   1119 	/** Interval at which we wake up, in units of the beacon interval */
   1120 	u16 listen_interval;
   1121 
   1122 	/** MAC address of current Access Point */
   1123 	u8 current_addr[ETH_ALEN];
   1124 
   1125 	/** List of information elements */
   1126 	union ieee80211_ie info_element[0];
   1127 } __attribute__((packed));
   1128 
   1129 /** Probe request frame data */
   1130 struct ieee80211_probe_req
   1131 {
   1132 	/** List of information elements */
   1133 	union ieee80211_ie info_element[0];
   1134 } __attribute__((packed));
   1135 
   1136 /** Authentication frame data */
   1137 struct ieee80211_auth
   1138 {
   1139 	/** Authentication algorithm (Open System or Shared Key) */
   1140 	u16 algorithm;
   1141 
   1142 	/** Sequence number of this frame; first from client to AP is 1 */
   1143 	u16 tx_seq;
   1144 
   1145 	/** Status code */
   1146 	u16 status;
   1147 
   1148 	/** List of information elements */
   1149 	union ieee80211_ie info_element[0];
   1150 } __attribute__((packed));
   1151 
   1152 /** Open System authentication algorithm */
   1153 #define IEEE80211_AUTH_OPEN_SYSTEM  0
   1154 
   1155 /** Shared Key authentication algorithm */
   1156 #define IEEE80211_AUTH_SHARED_KEY   1
   1157 
   1158 /** @} */
   1159 
   1160 #endif
   1161