[802.11] Add ieee80211.h defining standard constants and frame formats
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 29 May 2009 23:58:19 +0000 (16:58 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Fri, 29 May 2009 23:58:19 +0000 (16:58 -0700)
src/include/gpxe/ieee80211.h [new file with mode: 0644]

diff --git a/src/include/gpxe/ieee80211.h b/src/include/gpxe/ieee80211.h
new file mode 100644 (file)
index 0000000..7a3ca6d
--- /dev/null
@@ -0,0 +1,316 @@
+#ifndef _GPXE_IEEE80211_H
+#define _GPXE_IEEE80211_H
+
+#include <gpxe/if_ether.h>     /* for ETH_ALEN */
+
+/** @file
+ * Constants and data structures defined in IEEE 802.11, subsetted
+ * according to what gPXE knows how to use.
+ */
+
+FILE_LICENCE(GPL2_OR_LATER);
+
+/* Flags for Frame Control field, ieee80211_frame.fc: */
+#define IEEE80211_FC_VERSION   0x0003
+#define IEEE80211_FC_TYPE      0x000C
+#define  IEEE80211_TYPE_MGMT     0x0000
+#define  IEEE80211_TYPE_CTRL     0x0004
+#define  IEEE80211_TYPE_DATA     0x0008
+
+#define IEEE80211_FC_SUBTYPE   0x00F0
+/* for management frames: */
+#define  IEEE80211_STYPE_ASSOC_REQ    0x0000
+#define  IEEE80211_STYPE_ASSOC_RESP   0x0010
+#define  IEEE80211_STYPE_REASSOC_REQ  0x0020
+#define  IEEE80211_STYPE_REASSOC_RESP 0x0030
+#define  IEEE80211_STYPE_PROBE_REQ    0x0040
+#define  IEEE80211_STYPE_PROBE_RESP   0x0050
+#define  IEEE80211_STYPE_BEACON       0x0080
+#define  IEEE80211_STYPE_DISASSOC     0x00A0
+#define  IEEE80211_STYPE_AUTH         0x00B0
+#define  IEEE80211_STYPE_DEAUTH       0x00C0
+/* for control frames: */
+#define  IEEE80211_STYPE_RTS          0x00B0
+#define  IEEE80211_STYPE_CTS          0x00C0
+#define  IEEE80211_STYPE_ACK          0x00D0
+/* for data frames: */
+#define  IEEE80211_STYPE_DATA         0x0000
+#define  IEEE80211_STYPE_NODATA       0x0040
+
+#define IEEE80211_FC_TODS       0x0100 /* to an access point */
+#define IEEE80211_FC_FROMDS     0x0200 /* from an access point */
+#define IEEE80211_FC_MORE_FRAG  0x0400 /* more fragments for this packet */
+#define IEEE80211_FC_RETRY      0x0800 /* this is a retransmission */
+#define IEEE80211_FC_PWR_MGMT   0x1000 /* set for powersave after this exchange */
+#define IEEE80211_FC_MORE_DATA  0x2000 /* more packets are queued */
+#define IEEE80211_FC_PROTECTED  0x4000 /* this frame is encrypted */
+#define IEEE80211_FC_ORDER      0x8000 /* "StrictlyOrdered service class" */
+
+/* Parts of Sequence Control field, ieee80211_frame.seq: */
+#define IEEE80211_SEQNR(seq)    ((seq) & 0x0FFF)
+#define IEEE80211_FRAG(seq)     (((seq) >> 12) & 0xF)
+
+/* Generic data or management frame. */
+struct ieee80211_frame
+{
+       u16 fc;                 /**< Frame Control field */
+       u16 duration;           /**< Microseconds to reserve link */
+       u8 addr1[ETH_ALEN];     /**< Address 1 (immediate receiver) */
+       u8 addr2[ETH_ALEN];     /**< Address 2 (immediate sender) */
+       u8 addr3[ETH_ALEN];     /**< Address 3 (often "forward to") */
+       u16 seq;                /**< Sequence control/fragmentation */
+       u8 data[0];
+} __attribute__((packed));
+
+
+/* Control frame formats, with abbreviated frame header. */
+struct ieee80211_rts
+{
+       u16 fc;
+       u16 duration;
+       u8 addr1[ETH_ALEN];
+       u8 addr2[ETH_ALEN];
+} __attribute__((packed));
+
+struct ieee80211_cts
+{
+       u16 fc;
+       u16 duration;
+       u8 addr1[ETH_ALEN];
+} __attribute__((packed));
+
+#define ieee80211_ack ieee80211_cts
+
+
+/* Defines for the `capability' and `status' fields of management
+   frames; [c] set according to configuration, [h] set according to
+   hardware, [0,1] currently fixed at such in gPXE. */
+#define IEEE80211_CAPAB_MANAGED       0x0001 /* [1] Managed mode (with an Access Point) */
+#define IEEE80211_CAPAB_ADHOC         0x0002 /* [0] Ad-hoc mode (no Access Point) */
+#define IEEE80211_CAPAB_CFPOLL        0x0004 /* [0] CF-Pollable */
+#define IEEE80211_CAPAB_CFPR          0x0008 /* [0] CF-Poll Request */
+#define IEEE80211_CAPAB_PRIVACY       0x0010 /* [c] Encrypted network */
+#define IEEE80211_CAPAB_SHORT_PMBL    0x0020 /* [h] Short RF preambles supported */
+#define IEEE80211_CAPAB_PBCC          0x0040 /* [h] PBCC modulation supported */
+#define IEEE80211_CAPAB_CHAN_AGILITY  0x0080 /* [0] Channel Agility supported */
+#define IEEE80211_CAPAB_SPECTRUM_MGMT 0x0100 /* [0] Spectrum Management required */
+#define IEEE80211_CAPAB_QOS           0x0200 /* [0] QoS supported */
+#define IEEE80211_CAPAB_SHORT_SLOT    0x0400 /* [h] Short Slot Time option supported */
+#define IEEE80211_CAPAB_APSD          0x0800 /* [0] APSD option supported */
+#define IEEE80211_CAPAB_DSSS_OFDM     0x2000 /* [h] DSSS/OFDM modulation supported */
+#define IEEE80211_CAPAB_DELAYED_BACK  0x4000 /* [0] Delayed block ACK supported */
+#define IEEE80211_CAPAB_IMMED_BACK    0x8000 /* [0] Immediate block ACK supported */
+
+#define IEEE80211_STATUS_SUCCESS                  0
+#define IEEE80211_STATUS_FAILURE                  1
+#define IEEE80211_STATUS_CAPAB_UNSUPP             10
+#define IEEE80211_STATUS_REASSOC_NO_ASSOC         11
+#define IEEE80211_STATUS_ASSOC_DENIED             12
+#define IEEE80211_STATUS_AUTH_ALGO_UNSUPP         13
+#define IEEE80211_STATUS_AUTH_SEQ_INVALID         14
+#define IEEE80211_STATUS_AUTH_CHALL_INVALID       15
+#define IEEE80211_STATUS_AUTH_TIMEOUT             16
+#define IEEE80211_STATUS_ASSOC_NO_ROOM            17
+#define IEEE80211_STATUS_ASSOC_NEED_RATE          18
+#define IEEE80211_STATUS_ASSOC_NEED_SHORT_PMBL    19
+#define IEEE80211_STATUS_ASSOC_NEED_PBCC          20
+#define IEEE80211_STATUS_ASSOC_NEED_CHAN_AGILITY  21
+#define IEEE80211_STATUS_ASSOC_NEED_SPECTRUM_MGMT 22
+#define IEEE80211_STATUS_ASSOC_BAD_POWER          23
+#define IEEE80211_STATUS_ASSOC_BAD_CHANNELS       24
+#define IEEE80211_STATUS_ASSOC_NEED_SHORT_SLOT    25
+#define IEEE80211_STATUS_ASSOC_NEED_DSSS_OFDM     26
+#define IEEE80211_STATUS_ASSOC_NEED_QOS           35
+#define IEEE80211_STATUS_REQUEST_DECLINED         37
+#define IEEE80211_STATUS_REQUEST_INVALID          38
+#define IEEE80211_STATUS_IE_INVALID               40
+#define IEEE80211_STATUS_GROUP_CIPHER_INVALID     41
+#define IEEE80211_STATUS_PAIR_CIPHER_INVALID      42
+#define IEEE80211_STATUS_AKMP_INVALID             43
+#define IEEE80211_STATUS_RSN_IE_VERSION_UNSUPP    44
+#define IEEE80211_STATUS_RSN_IE_INVALID           45
+#define IEEE80211_STATUS_CIPHER_REJECTED          46
+#define IEEE80211_STATUS_ASSOC_LISTEN_TOO_HIGH    51
+
+
+/* Information elements for management frames: */
+
+/* Security information element */
+struct ieee80211_ie_rsn {
+       /* The RSN structure has dynamically-sized data at its middle.
+          The below assumes the most common case of pairwise_count ==
+          akm_count == 1; in other cases some munging is necessary. */
+#define  IEEE80211_RSN_VERSION  1
+       u16 version;
+       
+       /* cipher id is 00 0F AC ss, where ss = CTYPE or ATYPE #define: */
+       u8 group_cipher[4];
+#define  IEEE80211_RSN_CTYPE_WEP40  1
+#define  IEEE80211_RSN_CTYPE_TKIP   2
+#define  IEEE80211_RSN_CTYPE_CCMP   4
+#define  IEEE80211_RSN_CTYPE_WEP104 5
+       
+       u16 pairwise_count;
+       u8 pairwise_cipher[4];
+#define  IEEE80211_RSN_CTYPE_USEGROUP 0
+       
+       u16 akm_count;
+       u8 akm_list[4];
+#define  IEEE80211_RSN_ATYPE_8021X  1
+#define  IEEE80211_RSN_ATYPE_PSK    2
+       
+       u16 rsn_capab;
+#define  IEEE80211_RSN_CAPAB_PREAUTH      0x001
+#define  IEEE80211_RSN_CAPAB_NO_PAIRWISE  0x002
+#define  IEEE80211_RSN_CAPAB_PTKSA_REPLAY 0x00C
+#define  IEEE80211_RSN_CAPAB_GTKSA_REPLAY 0x030
+#define  IEEE80211_RSN_CAPAB_PEERKEY      0x200
+
+       u16 pmkid_count;
+       u8 pmkid_list[0];       /* 16 bytes per PMKID, pmkid_count PMKIDs */
+} __attribute__((packed));
+
+/* Generic information element */
+struct ieee80211_ie 
+{
+       u8 id;
+       u8 len;
+       union {
+#define IEEE80211_IE_SSID  0
+               char ssid[0];
+
+               /* For both `rates' IEs, each basic
+                  (must-be-supported) rate is a byte with the high
+                  bit set and the low 7 bits equal to the rate
+                  divided by 500 kbps. The high bit is clear for
+                  non-basic rates. */
+#define IEEE80211_IE_RATES  1
+               u8 rates[0];
+#define IEEE80211_IE_EXT_RATES  50
+               u8 ext_rates[0];
+
+#define IEEE80211_IE_DS_PARAM  3
+               struct {
+                       u8 current_channel;
+               } __attribute__((packed)) ds_param;     /* for DSSS modulation */
+
+#define IEEE80211_IE_COUNTRY  7
+               struct {
+                       char name[3];
+                       /* A regulatory triplet can simply specify a
+                          channel range + maximum transmission power
+                          (in dBm). If first_channel >= 201, it is
+                          interpreted as a regulatory extension, with
+                          everything an index into some tables not
+                          included here. */
+                       struct {
+                               union {
+                                       struct {
+                                               u8 first_channel;
+                                               u8 nr_channels;
+                                               s8 max_txpower;
+                                       } __attribute__((packed)) band;
+                                       struct {
+                                               u8 reg_ext_id;
+                                               u8 reg_class_id;
+                                               u8 coverage_class;
+                                       } __attribute__((packed)) ext;
+                               };
+                       } __attribute__((packed)) triplet[0];
+               } __attribute__((packed)) country;
+               
+#define IEEE80211_IE_REQUEST  10
+               u8 request[0];
+
+#define IEEE80211_IE_CHALLENGE_TEXT  16
+               char challenge_text[0];
+
+               /* Power constraint in this channel, taking
+                  mitigation requirements into account, in dBm. Real
+                  max power = country max power - power constraint. */
+#define IEEE80211_IE_POWER_CONSTRAINT  32
+               u8 power_constraint;
+
+               /* Describes the min/max power we're capable of using,
+                  irrespective of regulatory restrictions. */
+#define IEEE80211_IE_POWER_CAPAB  33
+               struct {
+                       s8 min_txpower;
+                       s8 max_txpower;
+               } __attribute__((packed)) power_capab;
+
+#define IEEE80211_IE_CHANNELS  36
+               struct {
+                       u8 first_channel;
+                       u8 nr_channels;
+               } __attribute__((packed)) channels[0];
+
+#define IEEE80211_IE_ERP_INFO  42
+#define  IEEE80211_ERP_NONERP_PRESENT  0x01
+#define  IEEE80211_ERP_USE_PROTECTION  0x02
+#define  IEEE80211_ERP_BARKER_LONG     0x04
+               u8 erp_info;
+
+#define IEEE80211_IE_RSN  48
+               struct ieee80211_ie_rsn rsn;
+       };
+} __attribute__((packed));
+
+
+/* Internal structure for management frames. */
+struct ieee80211_beacon
+{
+       u64 timestamp;
+       u16 beacon_interval;
+       u16 capability;
+       struct ieee80211_ie info_element[0];
+} __attribute__((packed));
+
+struct ieee80211_disassoc
+{
+       u16 reason;
+} __attribute__((packed));
+
+struct ieee80211_assoc_req
+{
+       u16 capability;
+       u16 listen_interval;
+       struct ieee80211_ie info_element[0];
+} __attribute__((packed));
+
+struct ieee80211_assoc_resp
+{
+       u16 capability;
+       u16 status;
+       u16 aid;
+       struct ieee80211_ie info_element[0];
+} __attribute__((packed));
+
+struct ieee80211_reassoc_req
+{
+       u16 capability;
+       u16 listen_interval;
+       u8 current_addr[ETH_ALEN];
+       struct ieee80211_ie info_element[0];
+} __attribute__((packed));
+
+#define ieee80211_reassoc_resp ieee80211_assoc_resp
+
+struct ieee80211_probe_req
+{
+       struct ieee80211_ie info_element[0];
+} __attribute__((packed));
+
+#define ieee80211_probe_resp ieee80211_beacon
+
+struct ieee80211_auth
+{
+       u16 algorithm;
+       u16 tx_seq;
+       u16 status;
+       struct ieee80211_ie info_element[0];
+} __attribute__((packed));
+
+#define ieee80211_deauth ieee80211_disassoc
+
+#endif