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