176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _GPXE_IEEE80211_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _GPXE_IEEE80211_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/if_ether.h>	/* for ETH_ALEN */
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <endian.h>
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Constants and data structures defined in IEEE 802.11, subsetted
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * according to what gPXE knows how to use.
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE(GPL2_OR_LATER);
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---------- Maximum lengths of things ---------- */
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_maxlen Maximum lengths in the 802.11 protocol
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum length of frame payload
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This does not include cryptographic overhead, which can be up to 20
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * bytes, but it DOES include the 802.2 LLC/SNAP headers that are used
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * on data frames (but not management frames).
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_DATA_LEN          2304
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Length of LLC/SNAP headers on data frames */
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_LLC_HEADER_LEN	8
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum cryptographic overhead before encrypted data */
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_CRYPTO_HEADER	8
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum cryptographic overhead after encrypted data
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This does not count the MIC in TKIP frames, since that is
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * considered to be part of the MSDU and thus contributes to the size
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of the data field.
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * It @e does count the MIC in CCMP frames, which is considered part
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of the MPDU (outside the data field).
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_CRYPTO_TRAILER    8
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Total maximum cryptographic overhead */
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_CRYPTO_OVERHEAD	16
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Bytes of network-layer data that can go into a regular data frame */
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_FRAME_DATA	2296
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Frame header length for frames we might work with
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * QoS adds a two-byte field on top of this, and APs communicating
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * with each other in Wireless Distribution System (WDS) mode add an
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * extra 6-byte MAC address field, but we do not work with such
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * frames.
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_TYP_FRAME_HEADER_LEN	24
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Theoretical maximum frame header length
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This includes the QoS and WDS Addr4 fields that we should never
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * see.
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_FRAME_HEADER_LEN	32
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum combined frame length
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The biggest frame will include 32 frame header bytes, 16 bytes of
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * crypto overhead, and 2304 data bytes.
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_FRAME_LEN         2352
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum length of an ESSID */
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAX_SSID_LEN          32
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---------- Frame Control defines ---------- */
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_fc 802.11 Frame Control field bits
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field, Version bitmask */
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_VERSION	0x0003
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Expected value of Version bits in Frame Control */
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_THIS_VERSION  0x0000
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field, Frame Type bitmask */
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_TYPE	0x000C
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type value for management (layer-2) frames */
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_TYPE_MGMT     0x0000
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type value for control (layer-1, hardware-managed) frames */
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_TYPE_CTRL     0x0004
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type value for data frames */
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_TYPE_DATA     0x0008
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field, Frame Subtype bitmask */
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_SUBTYPE	0x00F0
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for association-request management frames
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Association request frames are sent after authentication from the
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * client to the Access Point to establish the client as part of the
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Access Point's network.
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_ASSOC_REQ    0x0000
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for association-response management frames
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Association response frames are sent by the Access Point to confirm
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * or deny the association requested in an association request frame.
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_ASSOC_RESP   0x0010
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for reassociation-request management frames
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Reassociation request frames are sent by clients wishing to change
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * from one Access Point to another while roaming within the same
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * extended network (same ESSID).
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_REASSOC_REQ  0x0020
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for reassociation-response management frames
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Reassociation response frames are sent by the Access Point to
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * confirm or deny the swap requested in a reassociation request
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * frame.
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_REASSOC_RESP 0x0030
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for probe-request management frames
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Probe request frames are sent by clients to request that all Access
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Points on the sending channel, or all belonging to a particular
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ESSID, identify themselves by BSSID, supported transfer rates, RF
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * configuration, and other capabilities.
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_PROBE_REQ    0x0040
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for probe-response management frames
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Probe response frames are sent by Access Points in response to
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * probe request frames, providing the requested information.
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_PROBE_RESP   0x0050
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for beacon management frames
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Beacon frames are sent by Access Points at regular intervals,
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * usually ten per second, on the channel on which they communicate.
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * They can be used to probe passively for access points on a channel
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * where local regulatory restrictions prohibit active scanning, or
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * due to their regularity as a mechanism to determine the fraction of
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * packets that are being dropped.
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_BEACON       0x0080
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for disassociation management frames
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Disassociation frames are sent by either a client or an Access
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Point to unequivocally terminate the association between the two.
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * They may be sent by clients upon leaving the network, or by an
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Access Point upon reconfiguration, among other reasons; they are
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * usually more "polite" than deauthentication frames.
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_DISASSOC     0x00A0
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for authentication management frames
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Authentication frames are exchanged between a client and an Access
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Point before association may be performed. Confusingly, in the most
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * common authentication method (Open System) no security tokens are
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * exchanged at all. Modern 802.11 security handshaking takes place
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * after association.
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_AUTH         0x00B0
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for deauthentication management frames
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Deauthentication frames are sent by either a client or an Access
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Point to terminate the authentication (and therefore also the
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * association) between the two. They are generally more forceful than
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * disassociation frames, sent for such reasons as a failure to
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * set up security properly after associating.
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_DEAUTH       0x00C0
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for action management frames
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Action frames are used to implement spectrum management and QoS
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * features that gPXE currently does not support.
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_ACTION	      0x00D0
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for RTS (request to send) control frames */
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_RTS          0x00B0
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for CTS (clear to send) control frames */
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_CTS          0x00C0
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for ACK (acknowledgement) control frames */
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_ACK          0x00D0
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for ordinary data frames, with no QoS or CF add-ons */
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_DATA         0x0000
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subtype value for data frames containing no data */
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_STYPE_NODATA       0x0040
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: To Data System flag
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is set on data frames sent to an Access Point.
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_TODS       0x0100
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: From Data System flag
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is set on data frames sent from an Access Point. If both TODS
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and FROMDS are set, the frame header is a 4-address format used for
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * inter-Access Point communication.
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_FROMDS     0x0200
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: More Fragments flag */
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_MORE_FRAG  0x0400
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: Retransmission flag */
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_RETRY      0x0800
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: Power Managed flag
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is set on any frame sent by a low-power station that will go
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * into a power-saving mode immediately after this frame. Access
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Points are not allowed to act as low-power stations.
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_PWR_MGMT   0x1000
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: More Data flag
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is set on any frame sent by a station that has more data
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * queued to be sent than is in the frame.
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_MORE_DATA  0x2000
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: Protected flag
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is set on frames in which data is encrypted (by any method).
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_PROTECTED  0x4000
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Frame Control field: Ordered flag [?] */
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FC_ORDER      0x8000
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---------- Sequence Control defines ---------- */
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_seq 802.11 Sequence Control field handling
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Extract sequence number from 802.11 Sequence Control field */
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_SEQNR( seq )		( ( seq ) >> 4 )
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Extract fragment number from 802.11 Sequence Control field */
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_FRAG( seq )		( ( seq ) & 0x000F )
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Make 802.11 Sequence Control field from sequence and fragment numbers */
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_MAKESEQ( seqnr, frag )	\
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	( ( ( ( seqnr ) & 0xFFF ) << 4 ) | ( ( frag ) & 0xF ) )
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---------- Frame header formats ---------- */
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_hdr 802.11 frame header formats
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An 802.11 data or management frame without QoS or WDS header fields */
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_frame
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 fc;			/**< 802.11 Frame Control field */
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 duration;		/**< Microseconds to reserve link */
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 addr1[ETH_ALEN];	/**< Address 1 (immediate receiver) */
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 addr2[ETH_ALEN];	/**< Address 2 (immediate sender) */
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 addr3[ETH_ALEN];	/**< Address 3 (often "forward to") */
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 seq;		/**< 802.11 Sequence Control field */
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 data[0];		/**< Beginning of frame data */
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The 802.2 LLC/SNAP header sent before actual data in a data frame
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This header is not acknowledged in the 802.11 standard at all; it
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * is treated just like data for MAC-layer purposes, including
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * fragmentation and encryption. It is actually two headers
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * concatenated: a three-byte 802.2 LLC header indicating Subnetwork
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Accesss Protocol (SNAP) in both source and destination Service
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Access Point (SAP) fields, and a five-byte SNAP header indicating a
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * zero OUI and two-byte Ethernet protocol type field.
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Thus, an eight-byte header in which six of the bytes are redundant.
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Lovely, isn't it?
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_llc_snap_header
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* LLC part: */
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 dsap;		/**< Destination SAP ID */
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 ssap;		/**< Source SAP ID */
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 ctrl;		/**< Control information */
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* SNAP part: */
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 oui[3];		/**< Organization code, usually 0 */
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 ethertype;		/**< Ethernet Type field */
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Value for DSAP field in 802.2 LLC header for 802.11 frames: SNAP */
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_LLC_DSAP	0xAA
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Value for SSAP field in 802.2 LLC header for 802.11 frames: SNAP */
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_LLC_SSAP	0xAA
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Value for control field in 802.2 LLC header for 802.11 frames
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * "Unnumbered Information".
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_LLC_CTRL	0x03
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 16-byte RTS frame format, with abbreviated header */
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_rts
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 fc;			/**< 802.11 Frame Control field */
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 duration;		/**< Microseconds to reserve link */
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 addr1[ETH_ALEN];	/**< Address 1 (immediate receiver) */
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 addr2[ETH_ALEN];	/**< Address 2 (immediate sender) */
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Length of 802.11 RTS control frame */
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_RTS_LEN	16
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 10-byte CTS or ACK frame format, with abbreviated header */
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_cts_or_ack
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 fc;			/**< 802.11 Frame Control field */
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 duration;		/**< Microseconds to reserve link */
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 addr1[ETH_ALEN];	/**< Address 1 (immediate receiver) */
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_cts ieee80211_cts_or_ack
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_ack ieee80211_cts_or_ack
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Length of 802.11 CTS control frame */
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CTS_LEN	10
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Length of 802.11 ACK control frame */
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_ACK_LEN	10
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---------- Capability bits, status and reason codes ---------- */
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_capab 802.11 management frame capability field bits
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if using an Access Point (managed mode) */
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_MANAGED       0x0001
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if operating in IBSS (no-AP, "Ad-Hoc") mode */
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_ADHOC         0x0002
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if we support Contention-Free Period operation */
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_CFPOLL        0x0004
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if we wish to be polled for Contention-Free operation */
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_CFPR          0x0008
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if the network is encrypted (by any method) */
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_PRIVACY       0x0010
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if PHY supports short preambles on 802.11b */
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_SHORT_PMBL    0x0020
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if PHY supports PBCC modulation */
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_PBCC          0x0040
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if we support Channel Agility */
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_CHAN_AGILITY  0x0080
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if we support spectrum management (DFS and TPC) on the 5GHz band */
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_SPECTRUM_MGMT 0x0100
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if we support Quality of Service enhancements */
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_QOS           0x0200
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if PHY supports short slot time on 802.11g */
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_SHORT_SLOT    0x0400
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if PHY supports APSD option */
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_APSD          0x0800
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if PHY supports DSSS/OFDM modulation (one way of 802.11 b/g mixing) */
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_DSSS_OFDM     0x2000
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if we support delayed block ACK */
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_DELAYED_BACK  0x4000
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Set if we support immediate block ACK */
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_CAPAB_IMMED_BACK    0x8000
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_status 802.11 status codes
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * These are returned to indicate an immediate denial of
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * authentication or association. In gPXE, the lower 5 bits of the
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * status code are encoded into the file-unique portion of an error
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * code, the ERRFILE portion is always @c ERRFILE_net80211, and the
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * POSIX error code is @c ECONNREFUSED for status 0-31 or @c
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * EHOSTUNREACH for status 32-63.
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For a complete table with non-abbreviated error messages, see IEEE
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Std 802.11-2007, Table 7-23, p.94.
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_SUCCESS		0
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_FAILURE		1
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_CAPAB_UNSUPP		10
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_REASSOC_INVALID	11
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_DENIED		12
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_AUTH_ALGO_UNSUPP	13
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_AUTH_SEQ_INVALID	14
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_AUTH_CHALL_INVALID	15
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_AUTH_TIMEOUT		16
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NO_ROOM		17
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_RATE	18
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_SHORT_PMBL	19
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_PBCC	20
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_CHAN_AGILITY 21
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_SPECTRUM_MGMT 22
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_BAD_POWER	23
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_BAD_CHANNELS	24
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_SHORT_SLOT	25
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_DSSS_OFDM	26
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_QOS_FAILURE		32
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_QOS_NO_ROOM		33
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_LINK_IS_HORRIBLE	34
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_NEED_QOS		35
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_REQUEST_DECLINED	37
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_REQUEST_INVALID	38
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_TS_NOT_CREATED_AGAIN	39
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_INVALID_IE		40
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_GROUP_CIPHER_INVALID	41
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_PAIR_CIPHER_INVALID	42
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_AKMP_INVALID		43
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_RSN_VERSION_UNSUPP	44
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_RSN_CAPAB_INVALID	45
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_CIPHER_REJECTED	46
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_TS_NOT_CREATED_WAIT	47
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_DIRECT_LINK_FORBIDDEN	48
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_DEST_NOT_PRESENT	49
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_DEST_NOT_QOS		50
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_STATUS_ASSOC_LISTEN_TOO_HIGH	51
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_reason 802.11 reason codes
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * These are returned to indicate the reason for a deauthentication or
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * disassociation sent (usually) after authentication or association
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * had succeeded.  In gPXE, the lower 5 bits of the reason code are
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * encoded into the file-unique portion of an error code, the ERRFILE
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * portion is always @c ERRFILE_net80211, and the POSIX error code is
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @c ECONNRESET for reason 0-31 or @c ENETRESET for reason 32-63.
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For a complete table with non-abbreviated error messages, see IEEE
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Std 802.11-2007, Table 7-22, p.92.
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_NONE			0
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_UNSPECIFIED		1
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_AUTH_NO_LONGER_VALID	2
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_LEAVING		3
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_INACTIVITY		4
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_OUT_OF_RESOURCES	5
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_NEED_AUTH		6
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_NEED_ASSOC		7
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_LEAVING_TO_ROAM	8
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_REASSOC_INVALID	9
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_BAD_POWER		10
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_BAD_CHANNELS		11
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_INVALID_IE		13
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_MIC_FAILURE		14
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_4WAY_TIMEOUT		15
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_GROUPKEY_TIMEOUT	16
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_4WAY_INVALID		17
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_GROUP_CIPHER_INVALID	18
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_PAIR_CIPHER_INVALID	19
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_AKMP_INVALID		20
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_RSN_VERSION_INVALID	21
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_RSN_CAPAB_INVALID	22
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_8021X_FAILURE		23
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_CIPHER_REJECTED	24
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_QOS_UNSPECIFIED	32
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_QOS_OUT_OF_RESOURCES	33
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_LINK_IS_HORRIBLE	34
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_INVALID_TXOP		35
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_REQUESTED_LEAVING	36
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_REQUESTED_NO_USE	37
54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_REQUESTED_NEED_SETUP	38
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_REQUESTED_TIMEOUT	39
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_REASON_CIPHER_UNSUPPORTED	45
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---------- Information element declarations ---------- */
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_ie 802.11 information elements
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Many management frames include a section that amounts to a
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * concatenation of these information elements, so that the sender can
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * choose which information to send and the receiver can ignore the
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * parts it doesn't understand. Each IE contains a two-byte header,
55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * one byte ID and one byte length, followed by IE-specific data. The
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * length does not include the two-byte header. Information elements
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * are required to be sorted by ID, but gPXE does not require that in
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * those it receives.
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This group also includes a few inline functions to simplify common
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * tasks in IE processing.
56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Generic 802.11 information element header */
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_header {
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Information element ID */
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Information element length */
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 SSID information element */
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_ssid {
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< SSID ID: 0 */
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< SSID length */
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char ssid[0];		/**< SSID data, not NUL-terminated */
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for SSID information element */
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_SSID	0
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 rates information element
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The first 8 rates go in an IE of type RATES (1), and any more rates
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * go in one of type EXT_RATES (50). Each rate is a byte with the low
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 7 bits equal to the rate in units of 500 kbps, and the high bit set
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * if and only if the rate is "basic" (must be supported by all
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * connected stations).
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_rates {
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Rates ID: 1 or 50 */
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Number of rates */
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 rates[0];		/**< Rates data, one rate per byte */
59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for rates information element */
59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_RATES	1
60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for extended rates information element */
60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_EXT_RATES	50
60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Direct Spectrum parameter information element
60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This just contains the channel number. It has the fancy name
60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * because IEEE 802.11 also defines a frequency-hopping PHY that
60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * changes channels at regular intervals following a predetermined
61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * pattern; in practice nobody uses the FH PHY.
61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_ds_param {
61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< DS parameter ID: 3 */
61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< DS parameter length: 1 */
61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 current_channel;	/**< Current channel number, 1-14 */
61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Direct Spectrum parameter information element */
61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_DS_PARAM	3
62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Country information element regulatory extension triplet */
62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_country_ext_triplet {
62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 reg_ext_id;		/**< Regulatory extension ID */
62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 reg_class_id;	/**< Regulatory class ID */
62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 coverage_class;	/**< Coverage class */
62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Country information element regulatory band triplet */
63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_country_band_triplet {
63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 first_channel;	/**< Channel number for first channel in band */
63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 nr_channels;		/**< Number of contiguous channels in band */
63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 max_txpower;		/**< Maximum TX power in dBm */
63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Country information element regulatory triplet
63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * It is a band triplet if the first byte is 200 or less, and a
63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * regulatory extension triplet otherwise.
64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanunion ieee80211_ie_country_triplet {
64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Differentiator between band and ext triplets */
64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 first;
64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information about a band of channels */
64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_country_band_triplet band;
64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Regulatory extension information */
64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_country_ext_triplet ext;
65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Country information element
65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This contains some data about RF regulations.
65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_country {
65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Country information ID: 7 */
65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Country information length: varies */
65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char name[2];		/**< ISO Alpha2 country code */
66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char in_out;		/**< 'I' for indoor, 'O' for outdoor */
66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of regulatory triplets */
66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie_country_triplet triplet[0];
66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Country information element */
66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_COUNTRY	7
66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Request information element
67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This contains a list of information element types we would like to
67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * be included in probe response frames.
67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_request {
67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Request ID: 10 */
67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Number of IEs requested */
67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 request[0];		/**< List of IEs requested */
67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Request information element */
68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_REQUEST	10
68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Challenge Text information element
68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is used in authentication frames under Shared Key
68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * authentication.
68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_challenge_text {
69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Challenge Text ID: 16 */
69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Challenge Text length: usually 128 */
69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 challenge_text[0];	/**< Challenge Text data */
69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Challenge Text information element */
69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_CHALLENGE_TEXT	16
69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Power Constraint information element
70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is used to specify an additional power limitation on top of
70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Country requirements.
70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_power_constraint {
70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Power Constraint ID: 52 */
70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Power Constraint length: 1 */
70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 power_constraint;	/**< Decrease in allowed TX power, dBm */
70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Power Constraint information element */
71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_POWER_CONSTRAINT	52
71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
71576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Power Capability information element
71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is used in association request frames to indicate the extremes
71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of our TX power abilities. It is required only if we indicate
71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * support for spectrum management.
72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_power_capab {
72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Power Capability ID: 33 */
72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Power Capability length: 2 */
72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 min_txpower;		/**< Minimum possible TX power, dBm */
72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 max_txpower;		/**< Maximum possible TX power, dBm */
72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Power Capability information element */
72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_POWER_CAPAB	33
73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Channels information element channel band tuple */
73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_channels_channel_band {
73476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 first_channel;	/**< Channel number of first channel in band */
73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 nr_channels;		/**< Number of channels in band */
73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Channels information element
73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is used in association frames to indicate the channels we can
74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * use. It is required only if we indicate support for spectrum
74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * management.
74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_channels {
74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Channels ID: 36 */
74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Channels length: 2 */
74776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of (start, length) channel bands we can use */
74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_channels_channel_band channels[0];
75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Channels information element */
75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_CHANNELS	36
75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 ERP Information information element
75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
75876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is used to communicate some PHY-level flags.
75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_erp_info {
76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< ERP Information ID: 42 */
76276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< ERP Information length: 1 */
76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 erp_info;		/**< ERP flags */
76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for ERP Information information element */
76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_ERP_INFO	42
76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** ERP information element: Flag set if 802.11b stations are present */
77076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_ERP_NONERP_PRESENT	0x01
77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** ERP information element: Flag set if CTS protection must be used */
77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_ERP_USE_PROTECTION	0x02
77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** ERP information element: Flag set if long preambles must be used */
77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_ERP_BARKER_LONG	0x04
77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Robust Security Network ("WPA") information element
78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Showing once again a striking clarity of design, the IEEE folks put
78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * dynamically-sized data in the middle of this structure. As such,
78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the below structure definition only works for IEs we create
78476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ourselves, which always have one pairwise cipher and one AKM;
78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * received IEs should be parsed piecemeal.
78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Also inspired was IEEE's choice of 16-bit fields to count the
78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * number of 4-byte elements in a structure with a maximum length of
78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 255 bytes.
79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Many fields reference a cipher or authentication-type ID; this is a
79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * three-byte OUI followed by one byte identifying the cipher with
79376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * respect to that OUI. For all standard ciphers the OUI is 00:0F:AC,
79476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * except in old-style WPA IEs encapsulated in vendor-specific IEs,
79576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * where it's 00:50:F2.
79676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
79776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_rsn {
79876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information element ID */
79976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;
80076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
80176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Information element length */
80276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;
80376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
80476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** RSN information element version */
80576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 version;
80676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
80776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Cipher ID for the cipher used in multicast/broadcast frames */
80876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u32 group_cipher;
80976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Number of unicast ciphers supported */
81176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 pairwise_count;
81276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of cipher IDs for supported unicast frame ciphers */
81476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u32 pairwise_cipher[1];
81576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Number of authentication types supported */
81776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 akm_count;
81876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
81976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of authentication type IDs for supported types */
82076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u32 akm_list[1];
82176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
82276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Security capabilities field (RSN only) */
82376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 rsn_capab;
82476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
82576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Number of PMKIDs included (present only in association frames) */
82676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 pmkid_count;
82776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
82876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of PMKIDs included, each a 16-byte SHA1 hash */
82976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 pmkid_list[0];
83076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
83176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
83276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Robust Security Network information element */
83376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_RSN	48
83476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
83576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Calculate necessary size of RSN information element
83676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
83776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v npair	Number of pairwise ciphers supported
83876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v nauth	Number of authentication types supported
83976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v npmkid	Number of PMKIDs to include
84076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v is_rsn	If TRUE, calculate RSN IE size; if FALSE, calculate WPA IE size
84176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret size	Necessary size of IE, including header bytes
84276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
84376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline size_t ieee80211_rsn_size ( int npair, int nauth, int npmkid,
84476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman					  int rsn_ie ) {
84576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return 16 + 4 * ( npair + nauth ) + 16 * npmkid - 4 * ! rsn_ie;
84676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
84776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
84876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Make OUI plus type byte into 32-bit integer for easy comparison */
84976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if __BYTE_ORDER == __BIG_ENDIAN
85076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _MKOUI( a, b, c, t )	\
85176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		( ( ( a ) << 24 ) | ( ( b ) << 16 ) | ( ( c ) << 8 ) | ( d ) )
85276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  OUI_ORG_MASK		0xFFFFFF00
85376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  OUI_TYPE_MASK		0x000000FF
85476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
85576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _MKOUI( a, b, c, t )	\
85676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		( ( ( t ) << 24 ) | ( ( c ) << 16 ) | ( ( b ) << 8 ) | ( a ) )
85776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  OUI_ORG_MASK		0x00FFFFFF
85876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  OUI_TYPE_MASK		0xFF000000
85976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
86076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
86176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Organization part for OUIs in standard RSN IE */
86276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_OUI	_MKOUI ( 0x00, 0x0F, 0xAC, 0 )
86376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
86476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Organization part for OUIs in old WPA IE */
86576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_WPA_OUI	_MKOUI ( 0x00, 0x50, 0xF2, 0 )
86676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
86776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Old vendor-type WPA IE OUI type + subtype */
86876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_WPA_OUI_VEN	_MKOUI ( 0x00, 0x50, 0xF2, 0x01 )
86976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
87076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
87176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: expected version number */
87276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_VERSION		1
87376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
87476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: cipher type for 40-bit WEP */
87576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CTYPE_WEP40	_MKOUI ( 0, 0, 0, 0x01 )
87676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
87776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: cipher type for 104-bit WEP */
87876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CTYPE_WEP104	_MKOUI ( 0, 0, 0, 0x05 )
87976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
88076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: cipher type for TKIP ("WPA") */
88176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CTYPE_TKIP	_MKOUI ( 0, 0, 0, 0x02 )
88276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
88376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: cipher type for CCMP ("WPA2") */
88476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CTYPE_CCMP	_MKOUI ( 0, 0, 0, 0x04 )
88576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
88676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: cipher type for "use group"
88776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
88876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This can only appear as a pairwise cipher, and means unicast frames
88976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * should be encrypted in the same way as broadcast/multicast frames.
89076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
89176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CTYPE_USEGROUP	_MKOUI ( 0, 0, 0, 0x00 )
89276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: auth method type for using an 802.1X server */
89476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_ATYPE_8021X	_MKOUI ( 0, 0, 0, 0x01 )
89576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE: auth method type for using a pre-shared key */
89776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_ATYPE_PSK	_MKOUI ( 0, 0, 0, 0x02 )
89876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
89976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: AP supports pre-authentication */
90076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CAPAB_PREAUTH	0x001
90176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
90276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: Node has conflict between TKIP and WEP
90376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
90476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is a legacy issue; APs always set it to 0, and gPXE sets it to
90576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 0.
90676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
90776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CAPAB_NO_PAIRWISE 0x002
90876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
90976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: Number of PTKSA replay counters
91076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
91176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A value of 0 means one replay counter, 1 means two, 2 means four,
91276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and 3 means sixteen.
91376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
91476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CAPAB_PTKSA_REPLAY 0x00C
91576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
91676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: Number of GTKSA replay counters
91776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
91876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * A value of 0 means one replay counter, 1 means two, 2 means four,
91976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and 3 means sixteen.
92076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
92176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CAPAB_GTKSA_REPLAY 0x030
92276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
92376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: PeerKey Handshaking is suported */
92476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define  IEEE80211_RSN_CAPAB_PEERKEY	0x200
92576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
92676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
92776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: One replay counter
92876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
92976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This should be AND'ed with @c IEEE80211_RSN_CAPAB_PTKSA_REPLAY or
93076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @c IEEE80211_RSN_CAPAB_GTKSA_REPLAY (or both) to produce a value
93176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * which can be OR'ed into the capabilities field.
93276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
93376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_RSN_1_CTR		0x000
93476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
93576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: Two replay counters */
93676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_RSN_2_CTR		0x014
93776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
93876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: Four replay counters */
93976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_RSN_4_CTR		0x028
94076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
94176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 RSN IE capabilities: 16 replay counters */
94276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_RSN_16_CTR		0x03C
94376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
94476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
94576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 802.11 Vendor Specific information element
94676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
94776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * One often sees the RSN IE masquerading as vendor-specific on
94876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * devices that were produced prior to 802.11i (the WPA amendment)
94976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * being finalized.
95076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
95176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_ie_vendor {
95276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 id;			/**< Vendor-specific ID: 221 */
95376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 len;			/**< Vendor-specific length: variable */
95476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u32 oui;		/**< OUI and vendor-specific type byte */
95576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 data[0];		/**< Vendor-specific data */
95676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ ((packed));
95776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
95876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Information element ID for Vendor Specific information element */
95976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_IE_VENDOR	221
96076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
96176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
96276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
96376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
96476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Any 802.11 information element
96576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
96676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is formatted for ease of use, so IEs with complex structures
96776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * get referenced in full, while those with only one byte of data or a
96876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * simple array are pulled in to avoid a layer of indirection like
96976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ie->channels.channels[0].
97076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
97176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanunion ieee80211_ie
97276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
97376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Generic and simple information element info */
97476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct {
97576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		u8 id;		/**< Information element ID */
97676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		u8 len;		/**< Information element data length */
97776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		union {
97876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			char ssid[0];	/**< SSID text */
97976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			u8 rates[0];	/**< Rates data */
98076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			u8 request[0];	/**< Request list */
98176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			u8 challenge_text[0]; /**< Challenge text data */
98276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			u8 power_constraint; /**< Power constraint, dBm */
98376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			u8 erp_info;	/**< ERP information flags */
98476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			/** List of channels */
98576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			struct ieee80211_ie_channels_channel_band channels[0];
98676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		};
98776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	};
98876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
98976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** DS parameter set */
99076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_ds_param ds_param;
99176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
99276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Country information */
99376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_country country;
99476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
99576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Power capability */
99676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_power_capab power_capab;
99776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
99876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Security information */
99976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_rsn rsn;
100076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
100176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Vendor-specific */
100276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct ieee80211_ie_vendor vendor;
100376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
100476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
100576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Check that 802.11 information element is bounded by buffer
100676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
100776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ie	Information element
100876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v end	End of buffer in which information element is stored
100976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret ok	TRUE if the IE is completely contained within the buffer
101076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
101176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline int ieee80211_ie_bound ( union ieee80211_ie *ie, void *end )
101276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
101376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	void *iep = ie;
101476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return ( iep + 2 <= end && iep + 2 + ie->len <= end );
101576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
101676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
101776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Advance to next 802.11 information element
101876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
101976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ie	Current information element pointer
102076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v end	Pointer to first byte not in information element space
102176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret next	Pointer to next information element, or NULL if no more
102276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
102376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * When processing received IEs, @a end should be set to the I/O
102476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * buffer tail pointer; when marshalling IEs for sending, @a end
102576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * should be NULL.
102676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
102776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline union ieee80211_ie * ieee80211_next_ie ( union ieee80211_ie *ie,
102876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman						       void *end )
102976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
103076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	void *next_ie_byte = ( void * ) ie + ie->len + 2;
103176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie *next_ie = next_ie_byte;
103276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
103376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if ( ! end )
103476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return next_ie;
103576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
103676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if ( ieee80211_ie_bound ( next_ie, end ) )
103776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return next_ie;
103876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
103976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return NULL;
104076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
104176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
104376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---------- Management frame data formats ---------- */
104676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
104776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
104876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @defgroup ieee80211_mgmt_data Management frame data payloads
104976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @{
105076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
105176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
105276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Beacon or probe response frame data */
105376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_beacon_or_probe_resp
105476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
105576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** 802.11 TSFT value at frame send */
105676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u64 timestamp;
105776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
105876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Interval at which beacons are sent, in units of 1024 us */
105976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 beacon_interval;
106076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
106176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Capability flags */
106276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 capability;
106376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
106476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of information elements */
106576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie info_element[0];
106676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
106776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
106876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_beacon	ieee80211_beacon_or_probe_resp
106976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_probe_resp	ieee80211_beacon_or_probe_resp
107076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
107176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Disassociation or deauthentication frame data */
107276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_disassoc_or_deauth
107376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
107476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Reason code */
107576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 reason;
107676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
107776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
107876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_disassoc	ieee80211_disassoc_or_deauth
107976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_deauth	ieee80211_disassoc_or_deauth
108076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
108176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Association request frame data */
108276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_assoc_req
108376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
108476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Capability flags */
108576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 capability;
108676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
108776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Interval at which we wake up, in units of the beacon interval */
108876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 listen_interval;
108976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of information elements */
109176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie info_element[0];
109276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
109376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
109476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Association or reassociation response frame data */
109576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_assoc_or_reassoc_resp
109676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
109776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Capability flags */
109876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 capability;
109976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
110076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Status code */
110176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 status;
110276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
110376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Association ID */
110476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 aid;
110576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
110676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of information elements */
110776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie info_element[0];
110876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
110976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
111076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_assoc_resp	ieee80211_assoc_or_reassoc_resp
111176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ieee80211_reassoc_resp	ieee80211_assoc_or_reassoc_resp
111276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
111376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Reassociation request frame data */
111476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_reassoc_req
111576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
111676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Capability flags */
111776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 capability;
111876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
111976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Interval at which we wake up, in units of the beacon interval */
112076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 listen_interval;
112176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
112276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** MAC address of current Access Point */
112376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u8 current_addr[ETH_ALEN];
112476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
112576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of information elements */
112676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie info_element[0];
112776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
112876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
112976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Probe request frame data */
113076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_probe_req
113176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
113276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of information elements */
113376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie info_element[0];
113476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
113576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
113676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Authentication frame data */
113776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ieee80211_auth
113876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
113976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Authentication algorithm (Open System or Shared Key) */
114076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 algorithm;
114176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
114276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Sequence number of this frame; first from client to AP is 1 */
114376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 tx_seq;
114476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
114576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** Status code */
114676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	u16 status;
114776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
114876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/** List of information elements */
114976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union ieee80211_ie info_element[0];
115076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__((packed));
115176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
115276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Open System authentication algorithm */
115376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_AUTH_OPEN_SYSTEM  0
115476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
115576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Shared Key authentication algorithm */
115676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IEEE80211_AUTH_SHARED_KEY   1
115776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
115876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @} */
115976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
116076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
1161