ieee80211.h revision 127903
1116742Ssam/*-
2116904Ssam * Copyright (c) 2001 Atsushi Onoe
3116742Ssam * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
4116742Ssam * All rights reserved.
5116742Ssam *
6116742Ssam * Redistribution and use in source and binary forms, with or without
7116742Ssam * modification, are permitted provided that the following conditions
8116742Ssam * are met:
9116742Ssam * 1. Redistributions of source code must retain the above copyright
10116742Ssam *    notice, this list of conditions and the following disclaimer.
11116742Ssam * 2. Redistributions in binary form must reproduce the above copyright
12116742Ssam *    notice, this list of conditions and the following disclaimer in the
13116742Ssam *    documentation and/or other materials provided with the distribution.
14116904Ssam * 3. The name of the author may not be used to endorse or promote products
15116904Ssam *    derived from this software without specific prior written permission.
16116742Ssam *
17116904Ssam * Alternatively, this software may be distributed under the terms of the
18116904Ssam * GNU General Public License ("GPL") version 2 as published by the Free
19116904Ssam * Software Foundation.
20116742Ssam *
21116904Ssam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22116904Ssam * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23116904Ssam * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24116904Ssam * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25116904Ssam * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26116904Ssam * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27116904Ssam * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28116904Ssam * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29116904Ssam * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30116904Ssam * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31116904Ssam *
32116742Ssam * $FreeBSD: head/sys/net80211/ieee80211.h 127903 2004-04-05 17:47:40Z sam $
33116742Ssam */
34116742Ssam#ifndef _NET80211_IEEE80211_H_
35116742Ssam#define _NET80211_IEEE80211_H_
36116742Ssam
37116742Ssam/*
38116742Ssam * 802.11 protocol definitions.
39116742Ssam */
40116742Ssam
41116742Ssam#define	IEEE80211_ADDR_LEN	6		/* size of 802.11 address */
42116742Ssam/* is 802.11 address multicast/broadcast? */
43116742Ssam#define	IEEE80211_IS_MULTICAST(_a)	(*(_a) & 0x01)
44116742Ssam
45116742Ssam/* IEEE 802.11 PLCP header */
46116742Ssamstruct ieee80211_plcp_hdr {
47116742Ssam	u_int16_t	i_sfd;
48116742Ssam	u_int8_t	i_signal;
49116742Ssam	u_int8_t	i_service;
50116742Ssam	u_int16_t	i_length;
51116742Ssam	u_int16_t	i_crc;
52116742Ssam} __attribute__((__packed__));
53116742Ssam
54127903Ssam#define IEEE80211_PLCP_SFD      0xF3A0
55127903Ssam#define IEEE80211_PLCP_SERVICE  0x00
56127903Ssam
57116742Ssam/*
58116742Ssam * generic definitions for IEEE 802.11 frames
59116742Ssam */
60116742Ssamstruct ieee80211_frame {
61116742Ssam	u_int8_t	i_fc[2];
62116742Ssam	u_int8_t	i_dur[2];
63116742Ssam	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
64116742Ssam	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
65116742Ssam	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
66116742Ssam	u_int8_t	i_seq[2];
67116742Ssam	/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
68116742Ssam	/* see below */
69116742Ssam} __attribute__((__packed__));
70116742Ssam
71127903Ssamstruct ieee80211_qosframe {
72127903Ssam	u_int8_t	i_fc[2];
73127903Ssam	u_int8_t	i_dur[2];
74127903Ssam	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
75127903Ssam	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
76127903Ssam	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
77127903Ssam	u_int8_t	i_seq[2];
78127903Ssam	u_int8_t	i_qos[2];
79127903Ssam	/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
80127903Ssam	/* see below */
81127903Ssam} __attribute__((__packed__));
82127903Ssam
83127903Ssamstruct ieee80211_qoscntl {
84127903Ssam	u_int8_t	i_qos[2];
85127903Ssam};
86127903Ssam
87116742Ssamstruct ieee80211_frame_addr4 {
88116742Ssam	u_int8_t	i_fc[2];
89116742Ssam	u_int8_t	i_dur[2];
90116742Ssam	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
91116742Ssam	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
92116742Ssam	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
93116742Ssam	u_int8_t	i_seq[2];
94116742Ssam	u_int8_t	i_addr4[IEEE80211_ADDR_LEN];
95116742Ssam} __attribute__((__packed__));
96116742Ssam
97127903Ssam
98127903Ssamstruct ieee80211_qosframe_addr4 {
99127903Ssam	u_int8_t	i_fc[2];
100127903Ssam	u_int8_t	i_dur[2];
101127903Ssam	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
102127903Ssam	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
103127903Ssam	u_int8_t	i_addr3[IEEE80211_ADDR_LEN];
104127903Ssam	u_int8_t	i_seq[2];
105127903Ssam	u_int8_t	i_addr4[IEEE80211_ADDR_LEN];
106127903Ssam	u_int8_t	i_qos[2];
107127903Ssam} __attribute__((__packed__));
108127903Ssam
109127903Ssam/*
110127903Ssam * Management Notification Frame
111127903Ssam */
112127903Ssamstruct ieee80211_mnf {
113127903Ssam	u_int8_t	mnf_category;
114127903Ssam	u_int8_t	mnf_action;
115127903Ssam	u_int8_t	mnf_dialog;
116127903Ssam	u_int8_t	mnf_status;
117127903Ssam} __attribute__((__packed__));
118127903Ssam#define	MNF_SETUP_REQ	0
119127903Ssam#define	MNF_SETUP_RESP	1
120127903Ssam#define	MNF_TEARDOWN	2
121127903Ssam
122127903Ssam/*
123127903Ssam * WME/802.11e Tspec Element
124127903Ssam */
125127903Ssamstruct ieee80211_wme_tspec {
126127903Ssam	u_int8_t	ts_id;
127127903Ssam	u_int8_t	ts_len;
128127903Ssam	u_int8_t	ts_oui[3];
129127903Ssam	u_int8_t	ts_oui_type;
130127903Ssam	u_int8_t	ts_oui_subtype;
131127903Ssam	u_int8_t	ts_version;
132127903Ssam	u_int8_t	ts_tsinfo[3];
133127903Ssam	u_int8_t	ts_nom_msdu[2];
134127903Ssam	u_int8_t	ts_max_msdu[2];
135127903Ssam	u_int8_t	ts_min_svc[4];
136127903Ssam	u_int8_t	ts_max_svc[4];
137127903Ssam	u_int8_t	ts_inactv_intv[4];
138127903Ssam	u_int8_t	ts_susp_intv[4];
139127903Ssam	u_int8_t	ts_start_svc[4];
140127903Ssam	u_int8_t	ts_min_rate[4];
141127903Ssam	u_int8_t	ts_mean_rate[4];
142127903Ssam	u_int8_t	ts_max_burst[4];
143127903Ssam	u_int8_t	ts_min_phy[4];
144127903Ssam	u_int8_t	ts_peak_rate[4];
145127903Ssam	u_int8_t	ts_delay[4];
146127903Ssam	u_int8_t	ts_surplus[2];
147127903Ssam	u_int8_t	ts_medium_time[2];
148127903Ssam} __attribute__((__packed__));
149127903Ssam
150116742Ssam#define	IEEE80211_FC0_VERSION_MASK		0x03
151116742Ssam#define	IEEE80211_FC0_VERSION_SHIFT		0
152116742Ssam#define	IEEE80211_FC0_VERSION_0			0x00
153116742Ssam#define	IEEE80211_FC0_TYPE_MASK			0x0c
154116742Ssam#define	IEEE80211_FC0_TYPE_SHIFT		2
155116742Ssam#define	IEEE80211_FC0_TYPE_MGT			0x00
156116742Ssam#define	IEEE80211_FC0_TYPE_CTL			0x04
157116742Ssam#define	IEEE80211_FC0_TYPE_DATA			0x08
158116742Ssam
159116742Ssam#define	IEEE80211_FC0_SUBTYPE_MASK		0xf0
160116742Ssam#define	IEEE80211_FC0_SUBTYPE_SHIFT		4
161116742Ssam/* for TYPE_MGT */
162116742Ssam#define	IEEE80211_FC0_SUBTYPE_ASSOC_REQ		0x00
163116742Ssam#define	IEEE80211_FC0_SUBTYPE_ASSOC_RESP	0x10
164116742Ssam#define	IEEE80211_FC0_SUBTYPE_REASSOC_REQ	0x20
165116742Ssam#define	IEEE80211_FC0_SUBTYPE_REASSOC_RESP	0x30
166116742Ssam#define	IEEE80211_FC0_SUBTYPE_PROBE_REQ		0x40
167116742Ssam#define	IEEE80211_FC0_SUBTYPE_PROBE_RESP	0x50
168116742Ssam#define	IEEE80211_FC0_SUBTYPE_BEACON		0x80
169116742Ssam#define	IEEE80211_FC0_SUBTYPE_ATIM		0x90
170116742Ssam#define	IEEE80211_FC0_SUBTYPE_DISASSOC		0xa0
171116742Ssam#define	IEEE80211_FC0_SUBTYPE_AUTH		0xb0
172116742Ssam#define	IEEE80211_FC0_SUBTYPE_DEAUTH		0xc0
173116742Ssam/* for TYPE_CTL */
174116742Ssam#define	IEEE80211_FC0_SUBTYPE_PS_POLL		0xa0
175116742Ssam#define	IEEE80211_FC0_SUBTYPE_RTS		0xb0
176116742Ssam#define	IEEE80211_FC0_SUBTYPE_CTS		0xc0
177116742Ssam#define	IEEE80211_FC0_SUBTYPE_ACK		0xd0
178116742Ssam#define	IEEE80211_FC0_SUBTYPE_CF_END		0xe0
179116742Ssam#define	IEEE80211_FC0_SUBTYPE_CF_END_ACK	0xf0
180116742Ssam/* for TYPE_DATA (bit combination) */
181116742Ssam#define	IEEE80211_FC0_SUBTYPE_DATA		0x00
182116742Ssam#define	IEEE80211_FC0_SUBTYPE_CF_ACK		0x10
183116742Ssam#define	IEEE80211_FC0_SUBTYPE_CF_POLL		0x20
184116742Ssam#define	IEEE80211_FC0_SUBTYPE_CF_ACPL		0x30
185116742Ssam#define	IEEE80211_FC0_SUBTYPE_NODATA		0x40
186116742Ssam#define	IEEE80211_FC0_SUBTYPE_CFACK		0x50
187116742Ssam#define	IEEE80211_FC0_SUBTYPE_CFPOLL		0x60
188116742Ssam#define	IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK	0x70
189127903Ssam#define	IEEE80211_FC0_SUBTYPE_QOS		0x80
190116742Ssam
191116742Ssam#define	IEEE80211_FC1_DIR_MASK			0x03
192116742Ssam#define	IEEE80211_FC1_DIR_NODS			0x00	/* STA->STA */
193116742Ssam#define	IEEE80211_FC1_DIR_TODS			0x01	/* STA->AP  */
194116742Ssam#define	IEEE80211_FC1_DIR_FROMDS		0x02	/* AP ->STA */
195116742Ssam#define	IEEE80211_FC1_DIR_DSTODS		0x03	/* AP ->AP  */
196116742Ssam
197116742Ssam#define	IEEE80211_FC1_MORE_FRAG			0x04
198116742Ssam#define	IEEE80211_FC1_RETRY			0x08
199116742Ssam#define	IEEE80211_FC1_PWR_MGT			0x10
200116742Ssam#define	IEEE80211_FC1_MORE_DATA			0x20
201116742Ssam#define	IEEE80211_FC1_WEP			0x40
202116742Ssam#define	IEEE80211_FC1_ORDER			0x80
203116742Ssam
204116742Ssam#define	IEEE80211_SEQ_FRAG_MASK			0x000f
205116742Ssam#define	IEEE80211_SEQ_FRAG_SHIFT		0
206116742Ssam#define	IEEE80211_SEQ_SEQ_MASK			0xfff0
207116742Ssam#define	IEEE80211_SEQ_SEQ_SHIFT			4
208116742Ssam
209116742Ssam#define	IEEE80211_NWID_LEN			32
210116742Ssam
211127903Ssam#define	IEEE80211_QOS_TXOP			0x00ff
212127903Ssam/* bit 8 is reserved */
213127903Ssam#define	IEEE80211_QOS_ACKPOLICY			0x0600
214127903Ssam#define	IEEE80211_QOS_ESOP			0x0800
215127903Ssam#define	IEEE80211_QOS_TID			0xf000
216127903Ssam
217116742Ssam/*
218120098Ssam * Control frames.
219120098Ssam */
220120098Ssamstruct ieee80211_frame_min {
221120098Ssam	u_int8_t	i_fc[2];
222120098Ssam	u_int8_t	i_dur[2];
223120098Ssam	u_int8_t	i_addr1[IEEE80211_ADDR_LEN];
224120098Ssam	u_int8_t	i_addr2[IEEE80211_ADDR_LEN];
225120098Ssam	/* FCS */
226120098Ssam} __attribute__((__packed__));
227120098Ssam
228120098Ssamstruct ieee80211_frame_rts {
229120098Ssam	u_int8_t	i_fc[2];
230120098Ssam	u_int8_t	i_dur[2];
231120098Ssam	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
232120098Ssam	u_int8_t	i_ta[IEEE80211_ADDR_LEN];
233120098Ssam	/* FCS */
234120098Ssam} __attribute__((__packed__));
235120098Ssam
236120098Ssamstruct ieee80211_frame_cts {
237120098Ssam	u_int8_t	i_fc[2];
238120098Ssam	u_int8_t	i_dur[2];
239120098Ssam	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
240120098Ssam	/* FCS */
241120098Ssam} __attribute__((__packed__));
242120098Ssam
243120098Ssamstruct ieee80211_frame_ack {
244120098Ssam	u_int8_t	i_fc[2];
245120098Ssam	u_int8_t	i_dur[2];
246120098Ssam	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
247120098Ssam	/* FCS */
248120098Ssam} __attribute__((__packed__));
249120098Ssam
250120098Ssamstruct ieee80211_frame_pspoll {
251120098Ssam	u_int8_t	i_fc[2];
252120098Ssam	u_int8_t	i_aid[2];
253120098Ssam	u_int8_t	i_bssid[IEEE80211_ADDR_LEN];
254120098Ssam	u_int8_t	i_ta[IEEE80211_ADDR_LEN];
255120098Ssam	/* FCS */
256120098Ssam} __attribute__((__packed__));
257120098Ssam
258120098Ssamstruct ieee80211_frame_cfend {		/* NB: also CF-End+CF-Ack */
259120098Ssam	u_int8_t	i_fc[2];
260120098Ssam	u_int8_t	i_dur[2];	/* should be zero */
261120098Ssam	u_int8_t	i_ra[IEEE80211_ADDR_LEN];
262120098Ssam	u_int8_t	i_bssid[IEEE80211_ADDR_LEN];
263120098Ssam	/* FCS */
264120098Ssam} __attribute__((__packed__));
265120098Ssam
266120098Ssam/*
267116742Ssam * BEACON management packets
268116742Ssam *
269116742Ssam *	octet timestamp[8]
270116742Ssam *	octet beacon interval[2]
271116742Ssam *	octet capability information[2]
272116742Ssam *	information element
273116742Ssam *		octet elemid
274116742Ssam *		octet length
275116742Ssam *		octet information[length]
276116742Ssam */
277116742Ssam
278116742Ssamtypedef uint8_t *ieee80211_mgt_beacon_t;
279116742Ssam
280116742Ssam#define	IEEE80211_BEACON_INTERVAL(beacon) \
281116742Ssam	((beacon)[8] | ((beacon)[9] << 8))
282116742Ssam#define	IEEE80211_BEACON_CAPABILITY(beacon) \
283116742Ssam	((beacon)[10] | ((beacon)[11] << 8))
284116742Ssam
285116742Ssam#define	IEEE80211_CAPINFO_ESS			0x0001
286116742Ssam#define	IEEE80211_CAPINFO_IBSS			0x0002
287116742Ssam#define	IEEE80211_CAPINFO_CF_POLLABLE		0x0004
288116742Ssam#define	IEEE80211_CAPINFO_CF_POLLREQ		0x0008
289116742Ssam#define	IEEE80211_CAPINFO_PRIVACY		0x0010
290116742Ssam#define	IEEE80211_CAPINFO_SHORT_PREAMBLE	0x0020
291116742Ssam#define	IEEE80211_CAPINFO_PBCC			0x0040
292116742Ssam#define	IEEE80211_CAPINFO_CHNL_AGILITY		0x0080
293116742Ssam/* bits 8-9 are reserved */
294116742Ssam#define	IEEE80211_CAPINFO_SHORT_SLOTTIME	0x0400
295127903Ssam#define	IEEE80211_CAPINFO_RSN			0x0800
296127903Ssam/* bit 12 is reserved */
297116742Ssam#define	IEEE80211_CAPINFO_DSSSOFDM		0x2000
298116742Ssam/* bits 14-15 are reserved */
299116742Ssam
300116742Ssam/*
301127903Ssam * 802.11i/WPA information element (maximally sized).
302127903Ssam */
303127903Ssamstruct ieee80211_ie_wpa {
304127903Ssam	u_int8_t	wpa_oui[3];	/* 0x00, 0x50, 0xf2 */
305127903Ssam	u_int8_t	wpa_type;	/* OUI type */
306127903Ssam	u_int16_t	wpa_version;	/* spec revision */
307127903Ssam	u_int32_t	wpa_mcipher[1];	/* multicast/group key cipher */
308127903Ssam	u_int16_t	wpa_uciphercnt;	/* # pairwise key ciphers */
309127903Ssam	u_int32_t	wpa_uciphers[8];/* ciphers */
310127903Ssam	u_int16_t	wpa_authselcnt;	/* authentication selector cnt*/
311127903Ssam	u_int32_t	wpa_authsels[8];/* selectors */
312127903Ssam} __attribute__((__packed__));
313127903Ssam
314127903Ssam/*
315116742Ssam * Management information elements
316116742Ssam */
317116742Ssamstruct ieee80211_information {
318116742Ssam	char	ssid[IEEE80211_NWID_LEN+1];
319116742Ssam	struct rates {
320116742Ssam		u_int8_t	*p;
321116742Ssam	} rates;
322116742Ssam	struct fh {
323116742Ssam		u_int16_t	dwell;
324116742Ssam		u_int8_t	set;
325116742Ssam		u_int8_t	pattern;
326116742Ssam		u_int8_t	index;
327116742Ssam	} fh;
328116742Ssam	struct ds {
329116742Ssam		u_int8_t	channel;
330116742Ssam	} ds;
331116742Ssam	struct cf {
332116742Ssam		u_int8_t	count;
333116742Ssam		u_int8_t	period;
334116742Ssam		u_int8_t	maxdur[2];
335116742Ssam		u_int8_t	dur[2];
336116742Ssam	} cf;
337116742Ssam	struct tim {
338116742Ssam		u_int8_t	count;
339116742Ssam		u_int8_t	period;
340116742Ssam		u_int8_t	bitctl;
341116742Ssam		/* u_int8_t	pvt[251]; The driver needs to use this. */
342116742Ssam	} tim;
343116742Ssam	struct ibss {
344116742Ssam		u_int16_t	atim;
345116742Ssam	} ibss;
346116742Ssam	struct challenge {
347116742Ssam		u_int8_t	*p;
348116742Ssam		u_int8_t	len;
349116742Ssam	} challenge;
350116742Ssam	struct erp {
351116742Ssam		u_int8_t	flags;
352116742Ssam	} erp;
353127903Ssam	struct country {
354127903Ssam		u_int8_t	cc[3];		/* ISO CC+(I)ndoor/(O)utdoor */
355127903Ssam		struct {
356127903Ssam			u_int8_t schan;		/* starting channel */
357127903Ssam			u_int8_t nchan;		/* number channels */
358127903Ssam			u_int8_t maxtxpwr;
359127903Ssam		} band[4];			/* up to 4 sub bands */
360127903Ssam	} country;
361127903Ssam	struct ath {
362127903Ssam		u_int8_t	flags;
363127903Ssam	} ath;
364127903Ssam	struct ieee80211_ie_wpa	wpa;
365116742Ssam};
366116742Ssam
367116742Ssamenum {
368116742Ssam	IEEE80211_ELEMID_SSID			= 0,
369116742Ssam	IEEE80211_ELEMID_RATES			= 1,
370116742Ssam	IEEE80211_ELEMID_FHPARMS		= 2,
371116742Ssam	IEEE80211_ELEMID_DSPARMS		= 3,
372116742Ssam	IEEE80211_ELEMID_CFPARMS		= 4,
373116742Ssam	IEEE80211_ELEMID_TIM			= 5,
374116742Ssam	IEEE80211_ELEMID_IBSSPARMS		= 6,
375116742Ssam	IEEE80211_ELEMID_COUNTRY		= 7,
376116742Ssam	IEEE80211_ELEMID_CHALLENGE		= 16,
377127903Ssam	/* 17-31 reserved for challenge text extension */
378116742Ssam	IEEE80211_ELEMID_ERP			= 42,
379116742Ssam	IEEE80211_ELEMID_XRATES			= 50,
380127903Ssam	IEEE80211_ELEMID_TPC			= 150,
381127903Ssam	IEEE80211_ELEMID_CCKM			= 156,
382127903Ssam	IEEE80211_ELEMID_VENDOR			= 221,	/* vendor private */
383116742Ssam};
384116742Ssam
385127903Ssam#define IEEE80211_CHALLENGE_LEN			128
386127903Ssam
387116742Ssam#define	IEEE80211_RATE_BASIC			0x80
388116742Ssam#define	IEEE80211_RATE_VAL			0x7f
389116742Ssam
390116742Ssam/* EPR information element flags */
391116742Ssam#define	IEEE80211_ERP_NON_ERP_PRESENT		0x01
392116742Ssam#define	IEEE80211_ERP_USE_PROTECTION		0x02
393116742Ssam#define	IEEE80211_ERP_BARKER_MODE		0x04
394116742Ssam
395127903Ssam/* Atheros private advanced capabilities info */
396127903Ssam#define	ATHEROS_CAP_TURBO_PRIME			0x01
397127903Ssam#define	ATHEROS_CAP_COMPRESSION			0x02
398127903Ssam#define	ATHEROS_CAP_FAST_FRAME			0x04
399127903Ssam/* bits 3-6 reserved */
400127903Ssam#define	ATHEROS_CAP_BOOST			0x80
401127903Ssam
402127903Ssam#define	ATH_OUI			0x7f0300		/* Atheros OUI */
403127903Ssam#define	ATH_OUI_TYPE		0x01
404127903Ssam#define	ATH_OUI_VERSION		0x01
405127903Ssam
406127903Ssam#define	WPA_OUI			0xf25000
407127903Ssam#define	WPA_OUI_TYPE		0x01
408127903Ssam#define	WPA_OUI_VERSION		1		/* current supported version */
409127903Ssam
410127903Ssam#define	WPA_CSE_NULL		0x00
411127903Ssam#define	WPA_CSE_WEP40		0x01
412127903Ssam#define	WPA_CSE_TKIP		0x02
413127903Ssam#define	WPA_CSE_WRAP		0x03		/* WPA2/802.11i */
414127903Ssam#define	WPA_CSE_CCMP		0x04
415127903Ssam#define	WPA_CSE_WEP104		0x05
416127903Ssam
417127903Ssam#define	WPA_ASE_NONE		0x00
418127903Ssam#define	WPA_ASE_8021X_UNSPEC	0x01
419127903Ssam#define	WPA_ASE_8021X_PSK	0x02
420127903Ssam
421116742Ssam/*
422116742Ssam * AUTH management packets
423116742Ssam *
424116742Ssam *	octet algo[2]
425116742Ssam *	octet seq[2]
426116742Ssam *	octet status[2]
427116742Ssam *	octet chal.id
428116742Ssam *	octet chal.length
429116742Ssam *	octet chal.text[253]
430116742Ssam */
431116742Ssam
432116742Ssamtypedef u_int8_t *ieee80211_mgt_auth_t;
433116742Ssam
434116742Ssam#define	IEEE80211_AUTH_ALGORITHM(auth) \
435116742Ssam	((auth)[0] | ((auth)[1] << 8))
436116742Ssam#define	IEEE80211_AUTH_TRANSACTION(auth) \
437116742Ssam	((auth)[2] | ((auth)[3] << 8))
438116742Ssam#define	IEEE80211_AUTH_STATUS(auth) \
439116742Ssam	((auth)[4] | ((auth)[5] << 8))
440116742Ssam
441116742Ssam#define	IEEE80211_AUTH_ALG_OPEN			0x0000
442116742Ssam#define	IEEE80211_AUTH_ALG_SHARED		0x0001
443127903Ssam#define	IEEE80211_AUTH_ALG_LEAP			0x0080
444116742Ssam
445116742Ssamenum {
446116742Ssam	IEEE80211_AUTH_OPEN_REQUEST		= 1,
447116742Ssam	IEEE80211_AUTH_OPEN_RESPONSE		= 2,
448116742Ssam};
449116742Ssam
450116742Ssamenum {
451116742Ssam	IEEE80211_AUTH_SHARED_REQUEST		= 1,
452116742Ssam	IEEE80211_AUTH_SHARED_CHALLENGE		= 2,
453116742Ssam	IEEE80211_AUTH_SHARED_RESPONSE		= 3,
454116742Ssam	IEEE80211_AUTH_SHARED_PASS		= 4,
455116742Ssam};
456116742Ssam
457116742Ssam/*
458116742Ssam * Reason codes
459116742Ssam *
460116742Ssam * Unlisted codes are reserved
461116742Ssam */
462116742Ssam
463116742Ssamenum {
464116742Ssam	IEEE80211_REASON_UNSPECIFIED		= 1,
465116742Ssam	IEEE80211_REASON_AUTH_EXPIRE		= 2,
466116742Ssam	IEEE80211_REASON_AUTH_LEAVE		= 3,
467116742Ssam	IEEE80211_REASON_ASSOC_EXPIRE		= 4,
468116742Ssam	IEEE80211_REASON_ASSOC_TOOMANY		= 5,
469116742Ssam	IEEE80211_REASON_NOT_AUTHED		= 6,
470116742Ssam	IEEE80211_REASON_NOT_ASSOCED		= 7,
471116742Ssam	IEEE80211_REASON_ASSOC_LEAVE		= 8,
472116742Ssam	IEEE80211_REASON_ASSOC_NOT_AUTHED	= 9,
473116742Ssam
474127903Ssam	IEEE80211_REASON_RSN_REQUIRED		= 11,
475127903Ssam	IEEE80211_REASON_RSN_INCONSISTENT	= 12,
476127903Ssam	IEEE80211_REASON_IE_INVALID		= 13,
477127903Ssam	IEEE80211_REASON_MIC_FAILURE		= 14,
478127903Ssam
479116742Ssam	IEEE80211_STATUS_SUCCESS		= 0,
480116742Ssam	IEEE80211_STATUS_UNSPECIFIED		= 1,
481116742Ssam	IEEE80211_STATUS_CAPINFO		= 10,
482116742Ssam	IEEE80211_STATUS_NOT_ASSOCED		= 11,
483116742Ssam	IEEE80211_STATUS_OTHER			= 12,
484116742Ssam	IEEE80211_STATUS_ALG			= 13,
485116742Ssam	IEEE80211_STATUS_SEQUENCE		= 14,
486116742Ssam	IEEE80211_STATUS_CHALLENGE		= 15,
487116742Ssam	IEEE80211_STATUS_TIMEOUT		= 16,
488116742Ssam	IEEE80211_STATUS_TOOMANY		= 17,
489116742Ssam	IEEE80211_STATUS_BASIC_RATE		= 18,
490116742Ssam	IEEE80211_STATUS_SP_REQUIRED		= 19,
491116742Ssam	IEEE80211_STATUS_PBCC_REQUIRED		= 20,
492116742Ssam	IEEE80211_STATUS_CA_REQUIRED		= 21,
493116742Ssam	IEEE80211_STATUS_TOO_MANY_STATIONS	= 22,
494116742Ssam	IEEE80211_STATUS_RATES			= 23,
495116742Ssam	IEEE80211_STATUS_SHORTSLOT_REQUIRED	= 25,
496116742Ssam	IEEE80211_STATUS_DSSSOFDM_REQUIRED	= 26,
497116742Ssam};
498116742Ssam
499116742Ssam#define	IEEE80211_WEP_KEYLEN			5	/* 40bit */
500116742Ssam#define	IEEE80211_WEP_IVLEN			3	/* 24bit */
501116742Ssam#define	IEEE80211_WEP_KIDLEN			1	/* 1 octet */
502116742Ssam#define	IEEE80211_WEP_CRCLEN			4	/* CRC-32 */
503116742Ssam#define	IEEE80211_WEP_NKID			4	/* number of key ids */
504116742Ssam
505116742Ssam#define	IEEE80211_CRC_LEN			4
506116742Ssam
507124457Ssam/*
508124457Ssam * Maximum acceptable MTU is:
509124457Ssam *	IEEE80211_MAX_LEN - WEP overhead - CRC -
510124457Ssam *		QoS overhead - RSN/WPA overhead
511124457Ssam * Min is arbitrarily chosen > IEEE80211_MIN_LEN.  The default
512124457Ssam * mtu is Ethernet-compatible; it's set by ether_ifattach.
513124457Ssam */
514124457Ssam#define	IEEE80211_MTU_MAX			2290
515124457Ssam#define	IEEE80211_MTU_MIN			32
516124457Ssam
517116742Ssam#define	IEEE80211_MAX_LEN			(2300 + IEEE80211_CRC_LEN + \
518116742Ssam    (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
519120098Ssam#define	IEEE80211_MIN_LEN \
520120098Ssam	(sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
521116742Ssam
522116742Ssam/*
523116742Ssam * RTS frame length parameters.  The default is specified in
524116742Ssam * the 802.11 spec.  The max may be wrong for jumbo frames.
525116742Ssam */
526116742Ssam#define	IEEE80211_RTS_DEFAULT			512
527116742Ssam#define	IEEE80211_RTS_MIN			1
528116742Ssam#define	IEEE80211_RTS_MAX			IEEE80211_MAX_LEN
529116742Ssam
530116742Ssamenum {
531116742Ssam	IEEE80211_AUTH_NONE	= 0,
532116742Ssam	IEEE80211_AUTH_OPEN	= 1,
533116742Ssam	IEEE80211_AUTH_SHARED	= 2,
534116742Ssam};
535116742Ssam
536116742Ssam#endif /* _NET80211_IEEE80211_H_ */
537