[802.11] The 802.11 MAC layer, second big commit
[people/oremanj/gpxe.git] / src / include / gpxe / ieee80211.h
1 #ifndef _GPXE_IEEE80211_H
2 #define _GPXE_IEEE80211_H
3
4 #include <gpxe/if_ether.h>      /* for ETH_ALEN */
5
6 /** @file
7  * Constants and data structures defined in IEEE 802.11, subsetted
8  * according to what gPXE knows how to use.
9  */
10
11 FILE_LICENCE(GPL2_OR_LATER);
12
13 /* Maximum lengths of things: */
14
15 /* Maximum length of `data' field in frame: doesn't include any crypto
16    overhead, but DOES include the 802.3 LLC + SNAP headers in data frames! */
17 #define IEEE80211_MAX_DATA_LEN          2304
18 /* Length of said 802.3 LLC + SNAP headers. */
19 #define IEEE80211_LLC_HEADER_LEN        8
20 /* Amount of crypto overhead there might be. */
21 #define IEEE80211_MAX_CRYPTO_HEADER     8    /* TKIP and CCMP */
22 #define IEEE80211_MAX_CRYPTO_TRAILER    12   /* TKIP: 8-byte MIC, 4-byte ICV */
23 #define IEEE80211_MAX_CRYPTO_OVERHEAD   20   /* HEADER + TRAILER */
24 /* Number of bytes of real data we can put in one non-fragmented frame. */
25 #define IEEE80211_MAX_FRAME_DATA        2296 /* DATA_LEN - LLC_HEADER_LEN */
26
27 /* Frame header lengths - the LLC header is separate. We should never see
28    a frame with the maximum header length; it's included for completeness. */
29 #define IEEE80211_TYP_FRAME_HEADER_LEN  24   /* for non-QoS, not-between-APs */
30 #define IEEE80211_MAX_FRAME_HEADER_LEN  32   /* 4-address QoS format */
31
32 #define IEEE80211_MAX_FRAME_LEN         2356 /* data + crypto + header */
33
34 #define IEEE80211_MAX_SSID_LEN          32
35
36 /* Flags for Frame Control field, ieee80211_frame.fc: */
37 #define IEEE80211_FC_VERSION    0x0003
38 #define  IEEE80211_THIS_VERSION  0x0000
39 #define IEEE80211_FC_TYPE       0x000C
40 #define  IEEE80211_TYPE_MGMT     0x0000
41 #define  IEEE80211_TYPE_CTRL     0x0004
42 #define  IEEE80211_TYPE_DATA     0x0008
43
44 #define IEEE80211_FC_SUBTYPE    0x00F0
45 /* for management frames: */
46 #define  IEEE80211_STYPE_ASSOC_REQ    0x0000
47 #define  IEEE80211_STYPE_ASSOC_RESP   0x0010
48 #define  IEEE80211_STYPE_REASSOC_REQ  0x0020
49 #define  IEEE80211_STYPE_REASSOC_RESP 0x0030
50 #define  IEEE80211_STYPE_PROBE_REQ    0x0040
51 #define  IEEE80211_STYPE_PROBE_RESP   0x0050
52 #define  IEEE80211_STYPE_BEACON       0x0080
53 #define  IEEE80211_STYPE_DISASSOC     0x00A0
54 #define  IEEE80211_STYPE_AUTH         0x00B0
55 #define  IEEE80211_STYPE_DEAUTH       0x00C0
56 #define  IEEE80211_STYPE_ACTION       0x00D0
57 /* for control frames: */
58 #define  IEEE80211_STYPE_RTS          0x00B0
59 #define  IEEE80211_STYPE_CTS          0x00C0
60 #define  IEEE80211_STYPE_ACK          0x00D0
61 /* for data frames: */
62 #define  IEEE80211_STYPE_DATA         0x0000
63 #define  IEEE80211_STYPE_NODATA       0x0040
64
65 #define IEEE80211_FC_TODS       0x0100 /* to an access point */
66 #define IEEE80211_FC_FROMDS     0x0200 /* from an access point */
67 #define IEEE80211_FC_MORE_FRAG  0x0400 /* more fragments for this packet */
68 #define IEEE80211_FC_RETRY      0x0800 /* this is a retransmission */
69 #define IEEE80211_FC_PWR_MGMT   0x1000 /* set for powersave after this exchange */
70 #define IEEE80211_FC_MORE_DATA  0x2000 /* more packets are queued */
71 #define IEEE80211_FC_PROTECTED  0x4000 /* this frame is encrypted */
72 #define IEEE80211_FC_ORDER      0x8000 /* "StrictlyOrdered service class" */
73
74 /* Parts of Sequence Control field, ieee80211_frame.seq: */
75 #define IEEE80211_SEQNR(seq)    ((seq) & 0x0FFF)
76 #define IEEE80211_FRAG(seq)     (((seq) >> 12) & 0xF)
77
78 /* Generic data or management frame - non-QoS, not between APs. */
79 struct ieee80211_frame
80 {
81         u16 fc;                 /**< Frame Control field */
82         u16 duration;           /**< Microseconds to reserve link */
83         u8 addr1[ETH_ALEN];     /**< Address 1 (immediate receiver) */
84         u8 addr2[ETH_ALEN];     /**< Address 2 (immediate sender) */
85         u8 addr3[ETH_ALEN];     /**< Address 3 (often "forward to") */
86         u16 seq;                /**< Sequence control/fragmentation */
87         u8 data[0];
88 } __attribute__((packed));
89
90 /* The 802.3 link-layer header that begins the data, plus SNAP fields
91    for encapsulating Ethernet protocol type */
92 struct ieee80211_llc_snap_header
93 {
94         /* LLC part: */
95         u8 dsap;                /**< destination SAP id */
96         u8 ssap;                /**< source SAP id */
97         u8 ctrl;                /**< control info */
98 #define IEEE80211_LLC_DSAP 0xAA /* for SNAP */
99 #define IEEE80211_LLC_SSAP 0xAA /* for SNAP */
100 #define IEEE80211_LLC_CTRL 0x03 /* Unnumbered Information */
101
102         /* SNAP part: */
103         u8 oui[3];              /**< Organization code, usually 0 */
104         u16 ethertype;          /**< Ethernet Type field */
105 } __attribute__((packed));
106
107
108 /* Control frame formats, with abbreviated frame header. */
109 struct ieee80211_rts
110 {
111         u16 fc;
112         u16 duration;
113         u8 addr1[ETH_ALEN];
114         u8 addr2[ETH_ALEN];
115 } __attribute__((packed));
116
117 struct ieee80211_cts
118 {
119         u16 fc;
120         u16 duration;
121         u8 addr1[ETH_ALEN];
122 } __attribute__((packed));
123
124 #define ieee80211_ack ieee80211_cts
125
126
127 /* Defines for the `capability' and `status' fields of management
128    frames; [c] set according to configuration, [h] set according to
129    hardware, [0,1] currently fixed at such in gPXE. */
130 #define IEEE80211_CAPAB_MANAGED       0x0001 /* [1] Managed mode (with an Access Point) */
131 #define IEEE80211_CAPAB_ADHOC         0x0002 /* [0] Ad-hoc mode (no Access Point) */
132 #define IEEE80211_CAPAB_CFPOLL        0x0004 /* [0] CF-Pollable */
133 #define IEEE80211_CAPAB_CFPR          0x0008 /* [0] CF-Poll Request */
134 #define IEEE80211_CAPAB_PRIVACY       0x0010 /* [c] Encrypted network */
135 #define IEEE80211_CAPAB_SHORT_PMBL    0x0020 /* [h] Short RF preambles supported */
136 #define IEEE80211_CAPAB_PBCC          0x0040 /* [0] PBCC modulation supported */
137 #define IEEE80211_CAPAB_CHAN_AGILITY  0x0080 /* [0] Channel Agility supported */
138 #define IEEE80211_CAPAB_SPECTRUM_MGMT 0x0100 /* [0] Spectrum Management required */
139 #define IEEE80211_CAPAB_QOS           0x0200 /* [0] QoS supported */
140 #define IEEE80211_CAPAB_SHORT_SLOT    0x0400 /* [h] Short Slot Time option supported */
141 #define IEEE80211_CAPAB_APSD          0x0800 /* [0] APSD option supported */
142 #define IEEE80211_CAPAB_DSSS_OFDM     0x2000 /* [0] DSSS/OFDM modulation supported
143                                                     (802.11g/b interoperability) */
144 #define IEEE80211_CAPAB_DELAYED_BACK  0x4000 /* [0] Delayed block ACK supported */
145 #define IEEE80211_CAPAB_IMMED_BACK    0x8000 /* [0] Immediate block ACK supported */
146
147 #define IEEE80211_STATUS_SUCCESS                  0
148 #define IEEE80211_STATUS_FAILURE                  1
149 #define IEEE80211_STATUS_CAPAB_UNSUPP             10
150 #define IEEE80211_STATUS_REASSOC_NO_ASSOC         11
151 #define IEEE80211_STATUS_ASSOC_DENIED             12
152 #define IEEE80211_STATUS_AUTH_ALGO_UNSUPP         13
153 #define IEEE80211_STATUS_AUTH_SEQ_INVALID         14
154 #define IEEE80211_STATUS_AUTH_CHALL_INVALID       15
155 #define IEEE80211_STATUS_AUTH_TIMEOUT             16
156 #define IEEE80211_STATUS_ASSOC_NO_ROOM            17
157 #define IEEE80211_STATUS_ASSOC_NEED_RATE          18
158 #define IEEE80211_STATUS_ASSOC_NEED_SHORT_PMBL    19
159 #define IEEE80211_STATUS_ASSOC_NEED_PBCC          20
160 #define IEEE80211_STATUS_ASSOC_NEED_CHAN_AGILITY  21
161 #define IEEE80211_STATUS_ASSOC_NEED_SPECTRUM_MGMT 22
162 #define IEEE80211_STATUS_ASSOC_BAD_POWER          23
163 #define IEEE80211_STATUS_ASSOC_BAD_CHANNELS       24
164 #define IEEE80211_STATUS_ASSOC_NEED_SHORT_SLOT    25
165 #define IEEE80211_STATUS_ASSOC_NEED_DSSS_OFDM     26
166 #define IEEE80211_STATUS_ASSOC_NEED_QOS           35
167 #define IEEE80211_STATUS_REQUEST_DECLINED         37
168 #define IEEE80211_STATUS_REQUEST_INVALID          38
169 #define IEEE80211_STATUS_IE_INVALID               40
170 #define IEEE80211_STATUS_GROUP_CIPHER_INVALID     41
171 #define IEEE80211_STATUS_PAIR_CIPHER_INVALID      42
172 #define IEEE80211_STATUS_AKMP_INVALID             43
173 #define IEEE80211_STATUS_RSN_IE_VERSION_UNSUPP    44
174 #define IEEE80211_STATUS_RSN_IE_INVALID           45
175 #define IEEE80211_STATUS_CIPHER_REJECTED          46
176 #define IEEE80211_STATUS_ASSOC_LISTEN_TOO_HIGH    51
177
178
179 /* Information elements for management frames: */
180
181 /* Security information element */
182 struct ieee80211_ie_rsn {
183         /* The RSN structure has dynamically-sized data at its middle.
184            The below assumes the most common case of pairwise_count ==
185            akm_count == 1; in other cases some munging is necessary. */
186 #define  IEEE80211_RSN_VERSION  1
187         u16 version;
188         
189         /* cipher id is 00 0F AC ss, where ss = CTYPE or ATYPE #define: */
190         u8 group_cipher[4];
191 #define  IEEE80211_RSN_CTYPE_WEP40  1
192 #define  IEEE80211_RSN_CTYPE_TKIP   2
193 #define  IEEE80211_RSN_CTYPE_CCMP   4
194 #define  IEEE80211_RSN_CTYPE_WEP104 5
195         
196         u16 pairwise_count;
197         u8 pairwise_cipher[4];
198 #define  IEEE80211_RSN_CTYPE_USEGROUP 0
199         
200         u16 akm_count;
201         u8 akm_list[4];
202 #define  IEEE80211_RSN_ATYPE_8021X  1
203 #define  IEEE80211_RSN_ATYPE_PSK    2
204         
205         u16 rsn_capab;
206 #define  IEEE80211_RSN_CAPAB_PREAUTH      0x001
207 #define  IEEE80211_RSN_CAPAB_NO_PAIRWISE  0x002
208 #define  IEEE80211_RSN_CAPAB_PTKSA_REPLAY 0x00C
209 #define  IEEE80211_RSN_CAPAB_GTKSA_REPLAY 0x030
210 #define  IEEE80211_RSN_CAPAB_PEERKEY      0x200
211
212         u16 pmkid_count;
213         u8 pmkid_list[0];       /* 16 bytes per PMKID, pmkid_count PMKIDs */
214 } __attribute__((packed));
215
216 /* Generic information element */
217 struct ieee80211_ie 
218 {
219         u8 id;
220         u8 len;
221         union {
222 #define IEEE80211_IE_SSID  0
223                 char ssid[0];
224
225                 /* For both `rates' IEs, each basic
226                    (must-be-supported) rate is a byte with the high
227                    bit set and the low 7 bits equal to the rate
228                    divided by 500 kbps. The high bit is clear for
229                    non-basic rates. */
230 #define IEEE80211_IE_RATES  1
231                 u8 rates[0];
232 #define IEEE80211_IE_EXT_RATES  50
233                 u8 ext_rates[0];
234
235 #define IEEE80211_IE_DS_PARAM  3
236                 struct {
237                         u8 current_channel;
238                 } __attribute__((packed)) ds_param;     /* for DSSS modulation */
239
240 #define IEEE80211_IE_COUNTRY  7
241                 struct {
242                         char name[3];
243                         /* A regulatory triplet can simply specify a
244                            channel range + maximum transmission power
245                            (in dBm). If first_channel >= 201, it is
246                            interpreted as a regulatory extension, with
247                            everything an index into some tables not
248                            included here. */
249                         struct {
250                                 union {
251                                         struct {
252                                                 u8 first_channel;
253                                                 u8 nr_channels;
254                                                 s8 max_txpower;
255                                         } __attribute__((packed)) band;
256                                         struct {
257                                                 u8 reg_ext_id;
258                                                 u8 reg_class_id;
259                                                 u8 coverage_class;
260                                         } __attribute__((packed)) ext;
261                                 };
262                         } __attribute__((packed)) triplet[0];
263                 } __attribute__((packed)) country;
264                 
265 #define IEEE80211_IE_REQUEST  10
266                 u8 request[0];
267
268 #define IEEE80211_IE_CHALLENGE_TEXT  16
269                 char challenge_text[0];
270
271                 /* Power constraint in this channel, taking
272                    mitigation requirements into account, in dBm. Real
273                    max power = country max power - power constraint. */
274 #define IEEE80211_IE_POWER_CONSTRAINT  32
275                 u8 power_constraint;
276
277                 /* Describes the min/max power we're capable of using,
278                    irrespective of regulatory restrictions. */
279 #define IEEE80211_IE_POWER_CAPAB  33
280                 struct {
281                         s8 min_txpower;
282                         s8 max_txpower;
283                 } __attribute__((packed)) power_capab;
284
285 #define IEEE80211_IE_CHANNELS  36
286                 struct {
287                         u8 first_channel;
288                         u8 nr_channels;
289                 } __attribute__((packed)) channels[0];
290
291 #define IEEE80211_IE_ERP_INFO  42
292 #define  IEEE80211_ERP_NONERP_PRESENT  0x01
293 #define  IEEE80211_ERP_USE_PROTECTION  0x02
294 #define  IEEE80211_ERP_BARKER_LONG     0x04
295                 u8 erp_info;
296
297 #define IEEE80211_IE_RSN  48
298                 struct ieee80211_ie_rsn rsn;
299         };
300 } __attribute__((packed));
301
302
303 /* Internal structure for management frames. */
304 struct ieee80211_beacon
305 {
306         u64 timestamp;
307         u16 beacon_interval;
308         u16 capability;
309         struct ieee80211_ie info_element[0];
310 } __attribute__((packed));
311
312 struct ieee80211_disassoc
313 {
314         u16 reason;
315 } __attribute__((packed));
316
317 struct ieee80211_assoc_req
318 {
319         u16 capability;
320         u16 listen_interval;
321         struct ieee80211_ie info_element[0];
322 } __attribute__((packed));
323
324 struct ieee80211_assoc_resp
325 {
326         u16 capability;
327         u16 status;
328         u16 aid;
329         struct ieee80211_ie info_element[0];
330 } __attribute__((packed));
331
332 struct ieee80211_reassoc_req
333 {
334         u16 capability;
335         u16 listen_interval;
336         u8 current_addr[ETH_ALEN];
337         struct ieee80211_ie info_element[0];
338 } __attribute__((packed));
339
340 #define ieee80211_reassoc_resp ieee80211_assoc_resp
341
342 struct ieee80211_probe_req
343 {
344         struct ieee80211_ie info_element[0];
345 } __attribute__((packed));
346
347 #define ieee80211_probe_resp ieee80211_beacon
348
349 struct ieee80211_auth
350 {
351         u16 algorithm;
352 #define IEEE80211_AUTH_OPEN_SYSTEM  0
353 #define IEEE80211_AUTH_SHARED_KEY   1
354
355         u16 tx_seq;
356         u16 status;
357         struct ieee80211_ie info_element[0];
358 } __attribute__((packed));
359
360 #define ieee80211_deauth ieee80211_disassoc
361
362 #endif