root / lab4 / .minix-src / include / net80211 / ieee80211.h @ 14
History | View | Annotate | Download (21.8 KB)
1 | 13 | up20180614 | /* $NetBSD: ieee80211.h,v 1.26 2013/03/30 14:14:31 christos Exp $ */
|
---|---|---|---|
2 | /*-
|
||
3 | * Copyright (c) 2001 Atsushi Onoe
|
||
4 | * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
|
||
5 | * All rights reserved.
|
||
6 | *
|
||
7 | * Redistribution and use in source and binary forms, with or without
|
||
8 | * modification, are permitted provided that the following conditions
|
||
9 | * are met:
|
||
10 | * 1. Redistributions of source code must retain the above copyright
|
||
11 | * notice, this list of conditions and the following disclaimer.
|
||
12 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
13 | * notice, this list of conditions and the following disclaimer in the
|
||
14 | * documentation and/or other materials provided with the distribution.
|
||
15 | * 3. The name of the author may not be used to endorse or promote products
|
||
16 | * derived from this software without specific prior written permission.
|
||
17 | *
|
||
18 | * Alternatively, this software may be distributed under the terms of the
|
||
19 | * GNU General Public License ("GPL") version 2 as published by the Free
|
||
20 | * Software Foundation.
|
||
21 | *
|
||
22 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||
24 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||
25 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
26 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
27 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
28 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
29 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||
31 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
32 | *
|
||
33 | * $FreeBSD: src/sys/net80211/ieee80211.h,v 1.10 2005/07/22 16:55:27 sam Exp $
|
||
34 | */
|
||
35 | #ifndef _NET80211_IEEE80211_H_
|
||
36 | #define _NET80211_IEEE80211_H_
|
||
37 | |||
38 | /*
|
||
39 | * 802.11 protocol definitions.
|
||
40 | */
|
||
41 | |||
42 | #define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */ |
||
43 | /* is 802.11 address multicast/broadcast? */
|
||
44 | #define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01) |
||
45 | |||
46 | /* IEEE 802.11 PLCP header */
|
||
47 | struct ieee80211_plcp_hdr {
|
||
48 | u_int16_t i_sfd; |
||
49 | u_int8_t i_signal; |
||
50 | u_int8_t i_service; |
||
51 | u_int16_t i_length; |
||
52 | u_int16_t i_crc; |
||
53 | } __packed; |
||
54 | |||
55 | #define IEEE80211_PLCP_SFD 0xF3A0 |
||
56 | #define IEEE80211_PLCP_SERVICE 0x00 |
||
57 | |||
58 | /*
|
||
59 | * generic definitions for IEEE 802.11 frames
|
||
60 | */
|
||
61 | struct ieee80211_frame {
|
||
62 | u_int8_t i_fc[2];
|
||
63 | u_int8_t i_dur[2];
|
||
64 | u_int8_t i_addr1[IEEE80211_ADDR_LEN]; |
||
65 | u_int8_t i_addr2[IEEE80211_ADDR_LEN]; |
||
66 | u_int8_t i_addr3[IEEE80211_ADDR_LEN]; |
||
67 | u_int8_t i_seq[2];
|
||
68 | /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
|
||
69 | /* see below */
|
||
70 | } __packed; |
||
71 | |||
72 | struct ieee80211_qosframe {
|
||
73 | u_int8_t i_fc[2];
|
||
74 | u_int8_t i_dur[2];
|
||
75 | u_int8_t i_addr1[IEEE80211_ADDR_LEN]; |
||
76 | u_int8_t i_addr2[IEEE80211_ADDR_LEN]; |
||
77 | u_int8_t i_addr3[IEEE80211_ADDR_LEN]; |
||
78 | u_int8_t i_seq[2];
|
||
79 | u_int8_t i_qos[2];
|
||
80 | /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
|
||
81 | /* see below */
|
||
82 | } __packed; |
||
83 | |||
84 | struct ieee80211_qoscntl {
|
||
85 | u_int8_t i_qos[2];
|
||
86 | }; |
||
87 | |||
88 | struct ieee80211_frame_addr4 {
|
||
89 | u_int8_t i_fc[2];
|
||
90 | u_int8_t i_dur[2];
|
||
91 | u_int8_t i_addr1[IEEE80211_ADDR_LEN]; |
||
92 | u_int8_t i_addr2[IEEE80211_ADDR_LEN]; |
||
93 | u_int8_t i_addr3[IEEE80211_ADDR_LEN]; |
||
94 | u_int8_t i_seq[2];
|
||
95 | u_int8_t i_addr4[IEEE80211_ADDR_LEN]; |
||
96 | } __packed; |
||
97 | |||
98 | |||
99 | struct ieee80211_qosframe_addr4 {
|
||
100 | u_int8_t i_fc[2];
|
||
101 | u_int8_t i_dur[2];
|
||
102 | u_int8_t i_addr1[IEEE80211_ADDR_LEN]; |
||
103 | u_int8_t i_addr2[IEEE80211_ADDR_LEN]; |
||
104 | u_int8_t i_addr3[IEEE80211_ADDR_LEN]; |
||
105 | u_int8_t i_seq[2];
|
||
106 | u_int8_t i_addr4[IEEE80211_ADDR_LEN]; |
||
107 | u_int8_t i_qos[2];
|
||
108 | } __packed; |
||
109 | |||
110 | #define IEEE80211_FC0_VERSION_MASK 0x03 |
||
111 | #define IEEE80211_FC0_VERSION_SHIFT 0 |
||
112 | #define IEEE80211_FC0_VERSION_0 0x00 |
||
113 | #define IEEE80211_FC0_TYPE_MASK 0x0c |
||
114 | #define IEEE80211_FC0_TYPE_SHIFT 2 |
||
115 | #define IEEE80211_FC0_TYPE_MGT 0x00 |
||
116 | #define IEEE80211_FC0_TYPE_CTL 0x04 |
||
117 | #define IEEE80211_FC0_TYPE_DATA 0x08 |
||
118 | |||
119 | #define IEEE80211_FC0_SUBTYPE_MASK 0xf0 |
||
120 | #define IEEE80211_FC0_SUBTYPE_SHIFT 4 |
||
121 | /* for TYPE_MGT */
|
||
122 | #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00 |
||
123 | #define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10 |
||
124 | #define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20 |
||
125 | #define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30 |
||
126 | #define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40 |
||
127 | #define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50 |
||
128 | #define IEEE80211_FC0_SUBTYPE_BEACON 0x80 |
||
129 | #define IEEE80211_FC0_SUBTYPE_ATIM 0x90 |
||
130 | #define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0 |
||
131 | #define IEEE80211_FC0_SUBTYPE_AUTH 0xb0 |
||
132 | #define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0 |
||
133 | /* for TYPE_CTL */
|
||
134 | #define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0 |
||
135 | #define IEEE80211_FC0_SUBTYPE_RTS 0xb0 |
||
136 | #define IEEE80211_FC0_SUBTYPE_CTS 0xc0 |
||
137 | #define IEEE80211_FC0_SUBTYPE_ACK 0xd0 |
||
138 | #define IEEE80211_FC0_SUBTYPE_CF_END 0xe0 |
||
139 | #define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0 |
||
140 | /* for TYPE_DATA (bit combination) */
|
||
141 | #define IEEE80211_FC0_SUBTYPE_DATA 0x00 |
||
142 | #define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10 |
||
143 | #define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20 |
||
144 | #define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30 |
||
145 | #define IEEE80211_FC0_SUBTYPE_NODATA 0x40 |
||
146 | #define IEEE80211_FC0_SUBTYPE_CFACK 0x50 |
||
147 | #define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60 |
||
148 | #define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70 |
||
149 | #define IEEE80211_FC0_SUBTYPE_QOS 0x80 |
||
150 | #define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0 |
||
151 | |||
152 | /*
|
||
153 | * DS bit usage
|
||
154 | *
|
||
155 | * TA = transmitter address
|
||
156 | * RA = receiver address
|
||
157 | * DA = destination address
|
||
158 | * SA = source address
|
||
159 | *
|
||
160 | * ToDS FromDS A1(RA) A2(TA) A3 A4 Use
|
||
161 | * -----------------------------------------------------------------
|
||
162 | * 0 0 DA SA BSSID - IBSS/DLS
|
||
163 | * 0 1 DA BSSID SA - AP -> STA
|
||
164 | * 1 0 BSSID SA DA - AP <- STA
|
||
165 | * 1 1 RA TA DA SA unspecified (WDS)
|
||
166 | */
|
||
167 | #define IEEE80211_FC1_DIR_MASK 0x03 |
||
168 | #define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ |
||
169 | #define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */ |
||
170 | #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ |
||
171 | #define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */ |
||
172 | |||
173 | #define IEEE80211_FC1_MORE_FRAG 0x04 |
||
174 | #define IEEE80211_FC1_RETRY 0x08 |
||
175 | #define IEEE80211_FC1_PWR_MGT 0x10 |
||
176 | #define IEEE80211_FC1_MORE_DATA 0x20 |
||
177 | #define IEEE80211_FC1_PROTECTED 0x40 |
||
178 | #define IEEE80211_FC1_WEP 0x40 /* pre-RSNA compat */ |
||
179 | #define IEEE80211_FC1_ORDER 0x80 |
||
180 | |||
181 | #define IEEE80211_SEQ_FRAG_MASK 0x000f |
||
182 | #define IEEE80211_SEQ_FRAG_SHIFT 0 |
||
183 | #define IEEE80211_SEQ_SEQ_MASK 0xfff0 |
||
184 | #define IEEE80211_SEQ_SEQ_SHIFT 4 |
||
185 | |||
186 | #define IEEE80211_NWID_LEN 32 |
||
187 | |||
188 | /*
|
||
189 | * QoS Control field (see 7.1.3.5).
|
||
190 | */
|
||
191 | /* bit 8 is reserved */
|
||
192 | #define IEEE80211_QOS_TXOP 0xff00 |
||
193 | #define IEEE80211_QOS_AMSDU 0x0080 /* 11n */ |
||
194 | #define IEEE80211_QOS_ACKPOLICY_NORMAL 0x0000 |
||
195 | #define IEEE80211_QOS_ACKPOLICY_NOACK 0x0020 |
||
196 | #define IEEE80211_QOS_ACKPOLICY_NOEXPLACK 0x0040 |
||
197 | #define IEEE80211_QOS_ACKPOLICY 0x0060 |
||
198 | #define IEEE80211_QOS_ACKPOLICY_S 5 |
||
199 | #define IEEE80211_QOS_ACKPOLICY_MASK 0x0060 |
||
200 | #define IEEE80211_QOS_ACKPOLICY_BA 0x0060 |
||
201 | #define IEEE80211_QOS_ESOP 0x0010 |
||
202 | #define IEEE80211_QOS_ESOP_S 4 |
||
203 | #define IEEE80211_QOS_TID 0x000f |
||
204 | |||
205 | /*
|
||
206 | * WME/802.11e information element.
|
||
207 | */
|
||
208 | struct ieee80211_wme_info {
|
||
209 | u_int8_t wme_id; /* IEEE80211_ELEMID_VENDOR */
|
||
210 | u_int8_t wme_len; /* length in bytes */
|
||
211 | u_int8_t wme_oui[3]; /* 0x00, 0x50, 0xf2 */ |
||
212 | u_int8_t wme_type; /* OUI type */
|
||
213 | u_int8_t wme_subtype; /* OUI subtype */
|
||
214 | u_int8_t wme_version; /* spec revision */
|
||
215 | u_int8_t wme_info; /* QoS info */
|
||
216 | } __packed; |
||
217 | |||
218 | /*
|
||
219 | * WME/802.11e Tspec Element
|
||
220 | */
|
||
221 | struct ieee80211_wme_tspec {
|
||
222 | u_int8_t ts_id; |
||
223 | u_int8_t ts_len; |
||
224 | u_int8_t ts_oui[3];
|
||
225 | u_int8_t ts_oui_type; |
||
226 | u_int8_t ts_oui_subtype; |
||
227 | u_int8_t ts_version; |
||
228 | u_int8_t ts_tsinfo[3];
|
||
229 | u_int8_t ts_nom_msdu[2];
|
||
230 | u_int8_t ts_max_msdu[2];
|
||
231 | u_int8_t ts_min_svc[4];
|
||
232 | u_int8_t ts_max_svc[4];
|
||
233 | u_int8_t ts_inactv_intv[4];
|
||
234 | u_int8_t ts_susp_intv[4];
|
||
235 | u_int8_t ts_start_svc[4];
|
||
236 | u_int8_t ts_min_rate[4];
|
||
237 | u_int8_t ts_mean_rate[4];
|
||
238 | u_int8_t ts_max_burst[4];
|
||
239 | u_int8_t ts_min_phy[4];
|
||
240 | u_int8_t ts_peak_rate[4];
|
||
241 | u_int8_t ts_delay[4];
|
||
242 | u_int8_t ts_surplus[2];
|
||
243 | u_int8_t ts_medium_time[2];
|
||
244 | } __packed; |
||
245 | |||
246 | /*
|
||
247 | * WME AC parameter field
|
||
248 | */
|
||
249 | struct ieee80211_wme_acparams {
|
||
250 | u_int8_t acp_aci_aifsn; |
||
251 | u_int8_t acp_logcwminmax; |
||
252 | u_int16_t acp_txop; |
||
253 | } __packed; |
||
254 | |||
255 | /* WME stream classes */
|
||
256 | enum ieee80211_wme_ac {
|
||
257 | WME_AC_BE = 0, /* best effort */ |
||
258 | WME_AC_BK = 1, /* background */ |
||
259 | WME_AC_VI = 2, /* video */ |
||
260 | WME_AC_VO = 3, /* voice */ |
||
261 | }; |
||
262 | #define WME_NUM_AC 4 /* 4 AC categories */ |
||
263 | |||
264 | #define WME_PARAM_ACI 0x60 /* Mask for ACI field */ |
||
265 | #define WME_PARAM_ACI_S 5 /* Shift for ACI field */ |
||
266 | #define WME_PARAM_ACM 0x10 /* Mask for ACM bit */ |
||
267 | #define WME_PARAM_ACM_S 4 /* Shift for ACM bit */ |
||
268 | #define WME_PARAM_AIFSN 0x0f /* Mask for aifsn field */ |
||
269 | #define WME_PARAM_AIFSN_S 0 /* Shift for aifsn field */ |
||
270 | #define WME_PARAM_LOGCWMIN 0x0f /* Mask for CwMin field (in log) */ |
||
271 | #define WME_PARAM_LOGCWMIN_S 0 /* Shift for CwMin field */ |
||
272 | #define WME_PARAM_LOGCWMAX 0xf0 /* Mask for CwMax field (in log) */ |
||
273 | #define WME_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */ |
||
274 | |||
275 | #define WME_AC_TO_TID(_ac) ( \
|
||
276 | ((_ac) == WME_AC_VO) ? 6 : \
|
||
277 | ((_ac) == WME_AC_VI) ? 5 : \
|
||
278 | ((_ac) == WME_AC_BK) ? 1 : \
|
||
279 | 0)
|
||
280 | |||
281 | #define TID_TO_WME_AC(_tid) ( \
|
||
282 | ((_tid) < 1) ? WME_AC_BE : \
|
||
283 | ((_tid) < 3) ? WME_AC_BK : \
|
||
284 | ((_tid) < 6) ? WME_AC_VI : \
|
||
285 | WME_AC_VO) |
||
286 | |||
287 | /*
|
||
288 | * WME Parameter Element
|
||
289 | */
|
||
290 | struct ieee80211_wme_param {
|
||
291 | u_int8_t param_id; |
||
292 | u_int8_t param_len; |
||
293 | u_int8_t param_oui[3];
|
||
294 | u_int8_t param_oui_type; |
||
295 | u_int8_t param_oui_sybtype; |
||
296 | u_int8_t param_version; |
||
297 | u_int8_t param_qosInfo; |
||
298 | #define WME_QOSINFO_COUNT 0x0f /* Mask for param count field */ |
||
299 | u_int8_t param_reserved; |
||
300 | struct ieee80211_wme_acparams params_acParams[WME_NUM_AC];
|
||
301 | } __packed; |
||
302 | |||
303 | /*
|
||
304 | * Management Notification Frame
|
||
305 | */
|
||
306 | struct ieee80211_mnf {
|
||
307 | u_int8_t mnf_category; |
||
308 | u_int8_t mnf_action; |
||
309 | u_int8_t mnf_dialog; |
||
310 | u_int8_t mnf_status; |
||
311 | } __packed; |
||
312 | #define MNF_SETUP_REQ 0 |
||
313 | #define MNF_SETUP_RESP 1 |
||
314 | #define MNF_TEARDOWN 2 |
||
315 | |||
316 | /*
|
||
317 | * Control frames.
|
||
318 | */
|
||
319 | struct ieee80211_frame_min {
|
||
320 | u_int8_t i_fc[2];
|
||
321 | u_int8_t i_dur[2];
|
||
322 | u_int8_t i_addr1[IEEE80211_ADDR_LEN]; |
||
323 | u_int8_t i_addr2[IEEE80211_ADDR_LEN]; |
||
324 | /* FCS */
|
||
325 | } __packed; |
||
326 | |||
327 | struct ieee80211_frame_rts {
|
||
328 | u_int8_t i_fc[2];
|
||
329 | u_int8_t i_dur[2];
|
||
330 | u_int8_t i_ra[IEEE80211_ADDR_LEN]; |
||
331 | u_int8_t i_ta[IEEE80211_ADDR_LEN]; |
||
332 | /* FCS */
|
||
333 | } __packed; |
||
334 | |||
335 | struct ieee80211_frame_cts {
|
||
336 | u_int8_t i_fc[2];
|
||
337 | u_int8_t i_dur[2];
|
||
338 | u_int8_t i_ra[IEEE80211_ADDR_LEN]; |
||
339 | /* FCS */
|
||
340 | } __packed; |
||
341 | |||
342 | struct ieee80211_frame_ack {
|
||
343 | u_int8_t i_fc[2];
|
||
344 | u_int8_t i_dur[2];
|
||
345 | u_int8_t i_ra[IEEE80211_ADDR_LEN]; |
||
346 | /* FCS */
|
||
347 | } __packed; |
||
348 | |||
349 | struct ieee80211_frame_pspoll {
|
||
350 | u_int8_t i_fc[2];
|
||
351 | u_int8_t i_aid[2];
|
||
352 | u_int8_t i_bssid[IEEE80211_ADDR_LEN]; |
||
353 | u_int8_t i_ta[IEEE80211_ADDR_LEN]; |
||
354 | /* FCS */
|
||
355 | } __packed; |
||
356 | |||
357 | struct ieee80211_frame_cfend { /* NB: also CF-End+CF-Ack */ |
||
358 | u_int8_t i_fc[2];
|
||
359 | u_int8_t i_dur[2]; /* should be zero */ |
||
360 | u_int8_t i_ra[IEEE80211_ADDR_LEN]; |
||
361 | u_int8_t i_bssid[IEEE80211_ADDR_LEN]; |
||
362 | /* FCS */
|
||
363 | } __packed; |
||
364 | |||
365 | static __inline int |
||
366 | ieee80211_has_seq(const struct ieee80211_frame *wh) |
||
367 | { |
||
368 | return (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != |
||
369 | IEEE80211_FC0_TYPE_CTL; |
||
370 | } |
||
371 | |||
372 | static __inline int |
||
373 | ieee80211_has_addr4(const struct ieee80211_frame *wh) |
||
374 | { |
||
375 | return (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == |
||
376 | IEEE80211_FC1_DIR_DSTODS; |
||
377 | } |
||
378 | |||
379 | static __inline int |
||
380 | ieee80211_has_qos(const struct ieee80211_frame *wh) |
||
381 | { |
||
382 | return (wh->i_fc[0] & |
||
383 | (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == |
||
384 | (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS); |
||
385 | } |
||
386 | |||
387 | static __inline int |
||
388 | ieee80211_has_htc(const struct ieee80211_frame *wh) |
||
389 | { |
||
390 | return (wh->i_fc[1] & IEEE80211_FC1_ORDER) && |
||
391 | (ieee80211_has_qos(wh) || |
||
392 | (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
|
||
393 | IEEE80211_FC0_TYPE_MGT); |
||
394 | } |
||
395 | |||
396 | static __inline u_int16_t
|
||
397 | ieee80211_get_qos(const struct ieee80211_frame *wh) |
||
398 | { |
||
399 | const u_int8_t *frm;
|
||
400 | |||
401 | if (ieee80211_has_addr4(wh))
|
||
402 | frm = ((const struct ieee80211_qosframe_addr4 *)wh)->i_qos; |
||
403 | else
|
||
404 | frm = ((const struct ieee80211_qosframe *)wh)->i_qos; |
||
405 | |||
406 | return le16toh(*(const u_int16_t *)frm); |
||
407 | } |
||
408 | |||
409 | /*
|
||
410 | * BEACON management packets
|
||
411 | *
|
||
412 | * octet timestamp[8]
|
||
413 | * octet beacon interval[2]
|
||
414 | * octet capability information[2]
|
||
415 | * information element
|
||
416 | * octet elemid
|
||
417 | * octet length
|
||
418 | * octet information[length]
|
||
419 | */
|
||
420 | |||
421 | typedef u_int8_t *ieee80211_mgt_beacon_t;
|
||
422 | |||
423 | #define IEEE80211_BEACON_INTERVAL(beacon) \
|
||
424 | ((beacon)[8] | ((beacon)[9] << 8)) |
||
425 | #define IEEE80211_BEACON_CAPABILITY(beacon) \
|
||
426 | ((beacon)[10] | ((beacon)[11] << 8)) |
||
427 | |||
428 | #define IEEE80211_CAPINFO_ESS 0x0001 |
||
429 | #define IEEE80211_CAPINFO_IBSS 0x0002 |
||
430 | #define IEEE80211_CAPINFO_CF_POLLABLE 0x0004 |
||
431 | #define IEEE80211_CAPINFO_CF_POLLREQ 0x0008 |
||
432 | #define IEEE80211_CAPINFO_PRIVACY 0x0010 |
||
433 | #define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020 |
||
434 | #define IEEE80211_CAPINFO_PBCC 0x0040 |
||
435 | #define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080 |
||
436 | /* bits 8-9 are reserved */
|
||
437 | #define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400 |
||
438 | #define IEEE80211_CAPINFO_RSN 0x0800 |
||
439 | /* bit 12 is reserved */
|
||
440 | #define IEEE80211_CAPINFO_DSSSOFDM 0x2000 |
||
441 | /* bits 14-15 are reserved */
|
||
442 | |||
443 | /*
|
||
444 | * 802.11i/WPA information element (maximally sized).
|
||
445 | */
|
||
446 | struct ieee80211_ie_wpa {
|
||
447 | u_int8_t wpa_id; /* IEEE80211_ELEMID_VENDOR */
|
||
448 | u_int8_t wpa_len; /* length in bytes */
|
||
449 | u_int8_t wpa_oui[3]; /* 0x00, 0x50, 0xf2 */ |
||
450 | u_int8_t wpa_type; /* OUI type */
|
||
451 | u_int16_t wpa_version; /* spec revision */
|
||
452 | u_int32_t wpa_mcipher[1]; /* multicast/group key cipher */ |
||
453 | u_int16_t wpa_uciphercnt; /* # pairwise key ciphers */
|
||
454 | u_int32_t wpa_uciphers[8];/* ciphers */ |
||
455 | u_int16_t wpa_authselcnt; /* authentication selector cnt*/
|
||
456 | u_int32_t wpa_authsels[8];/* selectors */ |
||
457 | u_int16_t wpa_caps; /* 802.11i capabilities */
|
||
458 | u_int16_t wpa_pmkidcnt; /* 802.11i pmkid count */
|
||
459 | u_int16_t wpa_pmkids[8]; /* 802.11i pmkids */ |
||
460 | } __packed; |
||
461 | |||
462 | /*
|
||
463 | * Management information element payloads.
|
||
464 | */
|
||
465 | |||
466 | enum {
|
||
467 | IEEE80211_ELEMID_SSID = 0,
|
||
468 | IEEE80211_ELEMID_RATES = 1,
|
||
469 | IEEE80211_ELEMID_FHPARMS = 2,
|
||
470 | IEEE80211_ELEMID_DSPARMS = 3,
|
||
471 | IEEE80211_ELEMID_CFPARMS = 4,
|
||
472 | IEEE80211_ELEMID_TIM = 5,
|
||
473 | IEEE80211_ELEMID_IBSSPARMS = 6,
|
||
474 | IEEE80211_ELEMID_COUNTRY = 7,
|
||
475 | IEEE80211_ELEMID_EDCAPARMS = 12,
|
||
476 | IEEE80211_ELEMID_CHALLENGE = 16,
|
||
477 | /* 17-31 reserved for challenge text extension */
|
||
478 | IEEE80211_ELEMID_PWRCNSTR = 32,
|
||
479 | IEEE80211_ELEMID_PWRCAP = 33,
|
||
480 | IEEE80211_ELEMID_TPCREQ = 34,
|
||
481 | IEEE80211_ELEMID_TPCREP = 35,
|
||
482 | IEEE80211_ELEMID_SUPPCHAN = 36,
|
||
483 | IEEE80211_ELEMID_CHANSWITCHANN = 37,
|
||
484 | IEEE80211_ELEMID_MEASREQ = 38,
|
||
485 | IEEE80211_ELEMID_MEASREP = 39,
|
||
486 | IEEE80211_ELEMID_QUIET = 40,
|
||
487 | IEEE80211_ELEMID_IBSSDFS = 41,
|
||
488 | IEEE80211_ELEMID_ERP = 42,
|
||
489 | IEEE80211_ELEMID_HTCAP = 45, /* 11n */ |
||
490 | IEEE80211_ELEMID_QOS_CAP = 46,
|
||
491 | IEEE80211_ELEMID_RSN = 48,
|
||
492 | IEEE80211_ELEMID_XRATES = 50,
|
||
493 | IEEE80211_ELEMID_TIE = 56, /* 11r */ |
||
494 | IEEE80211_ELEMID_HTINFO = 61, /* 11n */ |
||
495 | IEEE80211_ELEMID_MMIE = 76, /* 11w */ |
||
496 | IEEE80211_ELEMID_TPC = 150,
|
||
497 | IEEE80211_ELEMID_CCKM = 156,
|
||
498 | IEEE80211_ELEMID_VENDOR = 221 /* vendor private */ |
||
499 | }; |
||
500 | |||
501 | struct ieee80211_tim_ie {
|
||
502 | u_int8_t tim_ie; /* IEEE80211_ELEMID_TIM */
|
||
503 | u_int8_t tim_len; |
||
504 | u_int8_t tim_count; /* DTIM count */
|
||
505 | u_int8_t tim_period; /* DTIM period */
|
||
506 | u_int8_t tim_bitctl; /* bitmap control */
|
||
507 | u_int8_t tim_bitmap[1]; /* variable-length bitmap */ |
||
508 | } __packed; |
||
509 | |||
510 | struct ieee80211_band {
|
||
511 | u_int8_t schan; /* starting channel */
|
||
512 | u_int8_t nchan; /* number channels */
|
||
513 | u_int8_t maxtxpwr; /* tx power cap */
|
||
514 | } __packed; |
||
515 | |||
516 | struct ieee80211_country_ie {
|
||
517 | u_int8_t ie; /* IEEE80211_ELEMID_COUNTRY */
|
||
518 | u_int8_t len; |
||
519 | u_int8_t cc[3]; /* ISO CC+(I)ndoor/(O)utdoor */ |
||
520 | struct ieee80211_band band[4]; /* up to 4 sub bands */ |
||
521 | } __packed; |
||
522 | |||
523 | #define IEEE80211_CHALLENGE_LEN 128 |
||
524 | |||
525 | #define IEEE80211_RATE_BASIC 0x80 |
||
526 | #define IEEE80211_RATE_VAL 0x7f |
||
527 | |||
528 | /* EPR information element flags */
|
||
529 | #define IEEE80211_ERP_NON_ERP_PRESENT 0x01 |
||
530 | #define IEEE80211_ERP_USE_PROTECTION 0x02 |
||
531 | #define IEEE80211_ERP_LONG_PREAMBLE 0x04 |
||
532 | |||
533 | /* Atheros private advanced capabilities info */
|
||
534 | #define ATHEROS_CAP_TURBO_PRIME 0x01 |
||
535 | #define ATHEROS_CAP_COMPRESSION 0x02 |
||
536 | #define ATHEROS_CAP_FAST_FRAME 0x04 |
||
537 | /* bits 3-6 reserved */
|
||
538 | #define ATHEROS_CAP_BOOST 0x80 |
||
539 | |||
540 | #define ATH_OUI 0x7f0300 /* Atheros OUI */ |
||
541 | #define ATH_OUI_TYPE 0x01 |
||
542 | #define ATH_OUI_VERSION 0x01 |
||
543 | |||
544 | #define WPA_OUI 0xf25000 |
||
545 | #define WPA_OUI_TYPE 0x01 |
||
546 | #define WPA_VERSION 1 /* current supported version */ |
||
547 | |||
548 | #define WPA_CSE_NULL 0x00 |
||
549 | #define WPA_CSE_WEP40 0x01 |
||
550 | #define WPA_CSE_TKIP 0x02 |
||
551 | #define WPA_CSE_CCMP 0x04 |
||
552 | #define WPA_CSE_WEP104 0x05 |
||
553 | |||
554 | #define WPA_ASE_NONE 0x00 |
||
555 | #define WPA_ASE_8021X_UNSPEC 0x01 |
||
556 | #define WPA_ASE_8021X_PSK 0x02 |
||
557 | |||
558 | #define RSN_OUI 0xac0f00 |
||
559 | #define RSN_VERSION 1 /* current supported version */ |
||
560 | |||
561 | #define RSN_CSE_NULL 0x00 |
||
562 | #define RSN_CSE_WEP40 0x01 |
||
563 | #define RSN_CSE_TKIP 0x02 |
||
564 | #define RSN_CSE_WRAP 0x03 |
||
565 | #define RSN_CSE_CCMP 0x04 |
||
566 | #define RSN_CSE_WEP104 0x05 |
||
567 | |||
568 | #define RSN_ASE_NONE 0x00 |
||
569 | #define RSN_ASE_8021X_UNSPEC 0x01 |
||
570 | #define RSN_ASE_8021X_PSK 0x02 |
||
571 | |||
572 | #define RSN_CAP_PREAUTH 0x01 |
||
573 | |||
574 | #define WME_OUI 0xf25000 |
||
575 | #define WME_OUI_TYPE 0x02 |
||
576 | #define WME_INFO_OUI_SUBTYPE 0x00 |
||
577 | #define WME_PARAM_OUI_SUBTYPE 0x01 |
||
578 | #define WME_VERSION 1 |
||
579 | |||
580 | /*
|
||
581 | * AUTH management packets
|
||
582 | *
|
||
583 | * octet algo[2]
|
||
584 | * octet seq[2]
|
||
585 | * octet status[2]
|
||
586 | * octet chal.id
|
||
587 | * octet chal.length
|
||
588 | * octet chal.text[253]
|
||
589 | */
|
||
590 | |||
591 | typedef u_int8_t *ieee80211_mgt_auth_t;
|
||
592 | |||
593 | #define IEEE80211_AUTH_ALGORITHM(auth) \
|
||
594 | ((auth)[0] | ((auth)[1] << 8)) |
||
595 | #define IEEE80211_AUTH_TRANSACTION(auth) \
|
||
596 | ((auth)[2] | ((auth)[3] << 8)) |
||
597 | #define IEEE80211_AUTH_STATUS(auth) \
|
||
598 | ((auth)[4] | ((auth)[5] << 8)) |
||
599 | |||
600 | #define IEEE80211_AUTH_ALG_OPEN 0x0000 |
||
601 | #define IEEE80211_AUTH_ALG_SHARED 0x0001 |
||
602 | #define IEEE80211_AUTH_ALG_LEAP 0x0080 |
||
603 | |||
604 | enum {
|
||
605 | IEEE80211_AUTH_OPEN_REQUEST = 1,
|
||
606 | IEEE80211_AUTH_OPEN_RESPONSE = 2
|
||
607 | }; |
||
608 | |||
609 | enum {
|
||
610 | IEEE80211_AUTH_SHARED_REQUEST = 1,
|
||
611 | IEEE80211_AUTH_SHARED_CHALLENGE = 2,
|
||
612 | IEEE80211_AUTH_SHARED_RESPONSE = 3,
|
||
613 | IEEE80211_AUTH_SHARED_PASS = 4
|
||
614 | }; |
||
615 | |||
616 | /*
|
||
617 | * Reason codes
|
||
618 | *
|
||
619 | * Unlisted codes are reserved
|
||
620 | */
|
||
621 | |||
622 | enum {
|
||
623 | IEEE80211_REASON_UNSPECIFIED = 1,
|
||
624 | IEEE80211_REASON_AUTH_EXPIRE = 2,
|
||
625 | IEEE80211_REASON_AUTH_LEAVE = 3,
|
||
626 | IEEE80211_REASON_ASSOC_EXPIRE = 4,
|
||
627 | IEEE80211_REASON_ASSOC_TOOMANY = 5,
|
||
628 | IEEE80211_REASON_NOT_AUTHED = 6,
|
||
629 | IEEE80211_REASON_NOT_ASSOCED = 7,
|
||
630 | IEEE80211_REASON_ASSOC_LEAVE = 8,
|
||
631 | IEEE80211_REASON_ASSOC_NOT_AUTHED = 9,
|
||
632 | |||
633 | IEEE80211_REASON_RSN_REQUIRED = 11,
|
||
634 | IEEE80211_REASON_RSN_INCONSISTENT = 12,
|
||
635 | IEEE80211_REASON_IE_INVALID = 13,
|
||
636 | IEEE80211_REASON_MIC_FAILURE = 14,
|
||
637 | |||
638 | IEEE80211_STATUS_SUCCESS = 0,
|
||
639 | IEEE80211_STATUS_UNSPECIFIED = 1,
|
||
640 | IEEE80211_STATUS_CAPINFO = 10,
|
||
641 | IEEE80211_STATUS_NOT_ASSOCED = 11,
|
||
642 | IEEE80211_STATUS_OTHER = 12,
|
||
643 | IEEE80211_STATUS_ALG = 13,
|
||
644 | IEEE80211_STATUS_SEQUENCE = 14,
|
||
645 | IEEE80211_STATUS_CHALLENGE = 15,
|
||
646 | IEEE80211_STATUS_TIMEOUT = 16,
|
||
647 | IEEE80211_STATUS_TOOMANY = 17,
|
||
648 | IEEE80211_STATUS_BASIC_RATE = 18,
|
||
649 | IEEE80211_STATUS_SP_REQUIRED = 19,
|
||
650 | IEEE80211_STATUS_PBCC_REQUIRED = 20,
|
||
651 | IEEE80211_STATUS_CA_REQUIRED = 21,
|
||
652 | IEEE80211_STATUS_TOO_MANY_STATIONS = 22,
|
||
653 | IEEE80211_STATUS_RATES = 23,
|
||
654 | IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25,
|
||
655 | IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26
|
||
656 | }; |
||
657 | |||
658 | #define IEEE80211_WEP_KEYLEN 5 /* 40bit */ |
||
659 | #define IEEE80211_WEP_IVLEN 3 /* 24bit */ |
||
660 | #define IEEE80211_WEP_KIDLEN 1 /* 1 octet */ |
||
661 | #define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */ |
||
662 | #define IEEE80211_WEP_TOTLEN (IEEE80211_WEP_IVLEN + \
|
||
663 | IEEE80211_WEP_KIDLEN + \ |
||
664 | IEEE80211_WEP_CRCLEN) |
||
665 | #define IEEE80211_WEP_NKID 4 /* number of key ids */ |
||
666 | |||
667 | /*
|
||
668 | * 802.11i defines an extended IV for use with non-WEP ciphers.
|
||
669 | * When the EXTIV bit is set in the key id byte an additional
|
||
670 | * 4 bytes immediately follow the IV for TKIP. For CCMP the
|
||
671 | * EXTIV bit is likewise set but the 8 bytes represent the
|
||
672 | * CCMP header rather than IV+extended-IV.
|
||
673 | */
|
||
674 | #define IEEE80211_WEP_EXTIV 0x20 |
||
675 | #define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */ |
||
676 | #define IEEE80211_WEP_MICLEN 8 /* trailing MIC */ |
||
677 | |||
678 | #define IEEE80211_CRC_LEN 4 |
||
679 | |||
680 | /*
|
||
681 | * Maximum acceptable MTU is:
|
||
682 | * IEEE80211_MAX_LEN - WEP overhead - CRC -
|
||
683 | * QoS overhead - RSN/WPA overhead
|
||
684 | * Min is arbitrarily chosen > IEEE80211_MIN_LEN. The default
|
||
685 | * mtu is Ethernet-compatible; it's set by ether_ifattach.
|
||
686 | */
|
||
687 | #define IEEE80211_MTU_MAX 2290 |
||
688 | #define IEEE80211_MTU_MIN 32 |
||
689 | |||
690 | #define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \ |
||
691 | (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN)) |
||
692 | #define IEEE80211_ACK_LEN \
|
||
693 | (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN) |
||
694 | #define IEEE80211_MIN_LEN \
|
||
695 | (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN) |
||
696 | |||
697 | /*
|
||
698 | * The 802.11 spec says at most 2007 stations may be
|
||
699 | * associated at once. For most AP's this is way more
|
||
700 | * than is feasible so we use a default of 128. This
|
||
701 | * number may be overridden by the driver and/or by
|
||
702 | * user configuration.
|
||
703 | */
|
||
704 | #define IEEE80211_AID_MAX 2007 |
||
705 | #define IEEE80211_AID_DEF 128 |
||
706 | |||
707 | #define IEEE80211_AID(b) ((b) &~ 0xc000) |
||
708 | |||
709 | /*
|
||
710 | * RTS frame length parameters. The default is specified in
|
||
711 | * the 802.11 spec as 512; we treat it as implementation-dependent
|
||
712 | * so it's defined in ieee80211_var.h. The max may be wrong
|
||
713 | * for jumbo frames.
|
||
714 | */
|
||
715 | #define IEEE80211_RTS_MIN 1 |
||
716 | #define IEEE80211_RTS_MAX 2346 |
||
717 | |||
718 | /*
|
||
719 | * TX fragmentation parameters. As above for RTS, we treat
|
||
720 | * default as implementation-dependent so define it elsewhere.
|
||
721 | */
|
||
722 | #define IEEE80211_FRAG_MIN 256 |
||
723 | #define IEEE80211_FRAG_MAX 2346 |
||
724 | |||
725 | /*
|
||
726 | * 802.11 frame duration definitions.
|
||
727 | */
|
||
728 | |||
729 | struct ieee80211_duration {
|
||
730 | uint16_t d_rts_dur; |
||
731 | uint16_t d_data_dur; |
||
732 | uint16_t d_plcp_len; |
||
733 | uint8_t d_residue; /* unused octets in time slot */
|
||
734 | }; |
||
735 | |||
736 | /* One Time Unit (TU) is 1Kus = 1024 microseconds. */
|
||
737 | #define IEEE80211_DUR_TU 1024 |
||
738 | |||
739 | /* IEEE 802.11b durations for DSSS PHY in microseconds */
|
||
740 | #define IEEE80211_DUR_DS_LONG_PREAMBLE 144 |
||
741 | #define IEEE80211_DUR_DS_SHORT_PREAMBLE 72 |
||
742 | |||
743 | #define IEEE80211_DUR_DS_SLOW_PLCPHDR 48 |
||
744 | #define IEEE80211_DUR_DS_FAST_PLCPHDR 24 |
||
745 | #define IEEE80211_DUR_DS_SLOW_ACK 112 |
||
746 | #define IEEE80211_DUR_DS_FAST_ACK 56 |
||
747 | #define IEEE80211_DUR_DS_SLOW_CTS 112 |
||
748 | #define IEEE80211_DUR_DS_FAST_CTS 56 |
||
749 | |||
750 | #define IEEE80211_DUR_DS_SLOT 20 |
||
751 | #define IEEE80211_DUR_DS_SIFS 10 |
||
752 | #define IEEE80211_DUR_DS_PIFS (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT)
|
||
753 | #define IEEE80211_DUR_DS_DIFS (IEEE80211_DUR_DS_SIFS + \
|
||
754 | 2 * IEEE80211_DUR_DS_SLOT)
|
||
755 | #define IEEE80211_DUR_DS_EIFS (IEEE80211_DUR_DS_SIFS + \
|
||
756 | IEEE80211_DUR_DS_SLOW_ACK + \ |
||
757 | IEEE80211_DUR_DS_LONG_PREAMBLE + \ |
||
758 | IEEE80211_DUR_DS_SLOW_PLCPHDR + \ |
||
759 | IEEE80211_DUR_DS_DIFS) |
||
760 | |||
761 | |||
762 | #endif /* !_NET80211_IEEE80211_H_ */ |