ieee802_11.h revision 172686
1170533Ssam/* $FreeBSD: head/contrib/tcpdump/ieee802_11.h 172686 2007-10-16 02:31:48Z mlaier $ */
2172686Smlaier/* @(#) $Header: /tcpdump/master/tcpdump/ieee802_11.h,v 1.9.4.3 2007/07/22 20:01:16 guy Exp $ (LBL) */
398524Sfenner/*
498524Sfenner * Copyright (c) 2001
598524Sfenner *	Fortress Technologies
698524Sfenner *      Charlie Lenahan ( clenahan@fortresstech.com )
798524Sfenner *
898524Sfenner * Redistribution and use in source and binary forms, with or without
998524Sfenner * modification, are permitted provided that: (1) source code distributions
1098524Sfenner * retain the above copyright notice and this paragraph in its entirety, (2)
1198524Sfenner * distributions including binary code include the above copyright notice and
1298524Sfenner * this paragraph in its entirety in the documentation or other materials
1398524Sfenner * provided with the distribution, and (3) all advertising materials mentioning
1498524Sfenner * features or use of this software display the following acknowledgement:
1598524Sfenner * ``This product includes software developed by the University of California,
1698524Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1798524Sfenner * the University nor the names of its contributors may be used to endorse
1898524Sfenner * or promote products derived from this software without specific prior
1998524Sfenner * written permission.
2098524Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
2198524Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
2298524Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2398524Sfenner */
2498524Sfenner
25127668Sbms/* Lengths of 802.11 header components. */
26127668Sbms#define	IEEE802_11_FC_LEN		2
27127668Sbms#define	IEEE802_11_DUR_LEN		2
28127668Sbms#define	IEEE802_11_DA_LEN		6
29127668Sbms#define	IEEE802_11_SA_LEN		6
30127668Sbms#define	IEEE802_11_BSSID_LEN		6
31127668Sbms#define	IEEE802_11_RA_LEN		6
32127668Sbms#define	IEEE802_11_TA_LEN		6
33127668Sbms#define	IEEE802_11_SEQ_LEN		2
34170533Ssam#define	IEEE802_11_CTL_LEN		2
35127668Sbms#define	IEEE802_11_IV_LEN		3
36127668Sbms#define	IEEE802_11_KID_LEN		1
3798524Sfenner
38127668Sbms/* Frame check sequence length. */
39127668Sbms#define	IEEE802_11_FCS_LEN		4
4098524Sfenner
41127668Sbms/* Lengths of beacon components. */
42127668Sbms#define	IEEE802_11_TSTAMP_LEN		8
43127668Sbms#define	IEEE802_11_BCNINT_LEN		2
44127668Sbms#define	IEEE802_11_CAPINFO_LEN		2
45127668Sbms#define	IEEE802_11_LISTENINT_LEN	2
46127668Sbms
47127668Sbms#define	IEEE802_11_AID_LEN		2
48127668Sbms#define	IEEE802_11_STATUS_LEN		2
49127668Sbms#define	IEEE802_11_REASON_LEN		2
50127668Sbms
51127668Sbms/* Length of previous AP in reassocation frame */
52127668Sbms#define	IEEE802_11_AP_LEN		6
53127668Sbms
54127668Sbms#define	T_MGMT 0x0  /* management */
55127668Sbms#define	T_CTRL 0x1  /* control */
56127668Sbms#define	T_DATA 0x2 /* data */
57127668Sbms#define	T_RESV 0x3  /* reserved */
58127668Sbms
59127668Sbms#define	ST_ASSOC_REQUEST   	0x0
60127668Sbms#define	ST_ASSOC_RESPONSE 	0x1
61127668Sbms#define	ST_REASSOC_REQUEST   	0x2
62127668Sbms#define	ST_REASSOC_RESPONSE  	0x3
63127668Sbms#define	ST_PROBE_REQUEST   	0x4
64127668Sbms#define	ST_PROBE_RESPONSE   	0x5
6598524Sfenner/* RESERVED 			0x6  */
6698524Sfenner/* RESERVED 			0x7  */
67127668Sbms#define	ST_BEACON   		0x8
68127668Sbms#define	ST_ATIM			0x9
69127668Sbms#define	ST_DISASSOC		0xA
70127668Sbms#define	ST_AUTH			0xB
71127668Sbms#define	ST_DEAUTH		0xC
7298524Sfenner/* RESERVED 			0xD  */
7398524Sfenner/* RESERVED 			0xE  */
7498524Sfenner/* RESERVED 			0xF  */
7598524Sfenner
7698524Sfenner
77170533Ssam#define	CTRL_BAR	0x8
78127668Sbms#define	CTRL_PS_POLL	0xA
79127668Sbms#define	CTRL_RTS	0xB
80127668Sbms#define	CTRL_CTS	0xC
81127668Sbms#define	CTRL_ACK	0xD
82127668Sbms#define	CTRL_CF_END	0xE
83127668Sbms#define	CTRL_END_ACK	0xF
8498524Sfenner
85172686Smlaier#define	DATA_DATA			0x0
86172686Smlaier#define	DATA_DATA_CF_ACK		0x1
87172686Smlaier#define	DATA_DATA_CF_POLL		0x2
88172686Smlaier#define	DATA_DATA_CF_ACK_POLL		0x3
89172686Smlaier#define	DATA_NODATA			0x4
90172686Smlaier#define	DATA_NODATA_CF_ACK		0x5
91172686Smlaier#define	DATA_NODATA_CF_POLL		0x6
92172686Smlaier#define	DATA_NODATA_CF_ACK_POLL		0x7
93127668Sbms
94172686Smlaier#define DATA_QOS_DATA			0x8
95172686Smlaier#define DATA_QOS_DATA_CF_ACK		0x9
96172686Smlaier#define DATA_QOS_DATA_CF_POLL		0xA
97172686Smlaier#define DATA_QOS_DATA_CF_ACK_POLL	0xB
98172686Smlaier#define DATA_QOS_NODATA			0xC
99172686Smlaier#define DATA_QOS_CF_POLL_NODATA		0xE
100172686Smlaier#define DATA_QOS_CF_ACK_POLL_NODATA	0xF
101172686Smlaier
10298524Sfenner/*
103172686Smlaier * The subtype field of a data frame is, in effect, composed of 4 flag
104172686Smlaier * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have
105172686Smlaier * any data), and QoS.
106172686Smlaier */
107172686Smlaier#define DATA_FRAME_IS_CF_ACK(x)		((x) & 0x01)
108172686Smlaier#define DATA_FRAME_IS_CF_POLL(x)	((x) & 0x02)
109172686Smlaier#define DATA_FRAME_IS_NULL(x)		((x) & 0x04)
110172686Smlaier#define DATA_FRAME_IS_QOS(x)		((x) & 0x08)
111172686Smlaier
112172686Smlaier/*
11398524Sfenner * Bits in the frame control field.
11498524Sfenner */
115127668Sbms#define	FC_VERSION(fc)		((fc) & 0x3)
116127668Sbms#define	FC_TYPE(fc)		(((fc) >> 2) & 0x3)
117127668Sbms#define	FC_SUBTYPE(fc)		(((fc) >> 4) & 0xF)
118127668Sbms#define	FC_TO_DS(fc)		((fc) & 0x0100)
119127668Sbms#define	FC_FROM_DS(fc)		((fc) & 0x0200)
120127668Sbms#define	FC_MORE_FLAG(fc)	((fc) & 0x0400)
121127668Sbms#define	FC_RETRY(fc)		((fc) & 0x0800)
122127668Sbms#define	FC_POWER_MGMT(fc)	((fc) & 0x1000)
123127668Sbms#define	FC_MORE_DATA(fc)	((fc) & 0x2000)
124127668Sbms#define	FC_WEP(fc)		((fc) & 0x4000)
125127668Sbms#define	FC_ORDER(fc)		((fc) & 0x8000)
12698524Sfenner
12798524Sfennerstruct mgmt_header_t {
12898524Sfenner	u_int16_t	fc;
12998524Sfenner	u_int16_t 	duration;
13098524Sfenner	u_int8_t	da[6];
13198524Sfenner	u_int8_t	sa[6];
13298524Sfenner	u_int8_t	bssid[6];
13398524Sfenner	u_int16_t	seq_ctrl;
13498524Sfenner};
13598524Sfenner
136127668Sbms#define	MGMT_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
137127668Sbms			 IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\
138127668Sbms			 IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN)
13998524Sfenner
140127668Sbms#define	CAPABILITY_ESS(cap)	((cap) & 0x0001)
141127668Sbms#define	CAPABILITY_IBSS(cap)	((cap) & 0x0002)
142127668Sbms#define	CAPABILITY_CFP(cap)	((cap) & 0x0004)
143127668Sbms#define	CAPABILITY_CFP_REQ(cap)	((cap) & 0x0008)
144127668Sbms#define	CAPABILITY_PRIVACY(cap)	((cap) & 0x0010)
14598524Sfenner
146172686Smlaiertypedef enum {
147172686Smlaier	NOT_PRESENT,
148172686Smlaier	PRESENT,
149172686Smlaier	TRUNCATED
150172686Smlaier} elem_status_t;
151172686Smlaier
15298524Sfennerstruct ssid_t {
15398524Sfenner	u_int8_t	element_id;
15498524Sfenner	u_int8_t	length;
15598524Sfenner	u_char		ssid[33];  /* 32 + 1 for null */
156127668Sbms};
15798524Sfenner
15898524Sfennerstruct rates_t {
15998524Sfenner	u_int8_t	element_id;
16098524Sfenner	u_int8_t	length;
161172686Smlaier	u_int8_t	rate[16];
16298524Sfenner};
16398524Sfenner
16498524Sfennerstruct challenge_t {
16598524Sfenner	u_int8_t	element_id;
16698524Sfenner	u_int8_t	length;
16798524Sfenner	u_int8_t	text[254]; /* 1-253 + 1 for null */
16898524Sfenner};
169172686Smlaier
17098524Sfennerstruct fh_t {
17198524Sfenner	u_int8_t	element_id;
17298524Sfenner	u_int8_t	length;
17398524Sfenner	u_int16_t	dwell_time;
17498524Sfenner	u_int8_t	hop_set;
17598524Sfenner	u_int8_t 	hop_pattern;
17698524Sfenner	u_int8_t	hop_index;
17798524Sfenner};
17898524Sfenner
17998524Sfennerstruct ds_t {
18098524Sfenner	u_int8_t	element_id;
18198524Sfenner	u_int8_t	length;
18298524Sfenner	u_int8_t	channel;
18398524Sfenner};
18498524Sfenner
18598524Sfennerstruct cf_t {
18698524Sfenner	u_int8_t	element_id;
18798524Sfenner	u_int8_t	length;
18898524Sfenner	u_int8_t	count;
18998524Sfenner	u_int8_t	period;
19098524Sfenner	u_int16_t	max_duration;
19198524Sfenner	u_int16_t	dur_remaing;
19298524Sfenner};
19398524Sfenner
19498524Sfennerstruct tim_t {
19598524Sfenner	u_int8_t	element_id;
19698524Sfenner	u_int8_t	length;
19798524Sfenner	u_int8_t	count;
19898524Sfenner	u_int8_t	period;
19998524Sfenner	u_int8_t	bitmap_control;
20098524Sfenner	u_int8_t	bitmap[251];
20198524Sfenner};
20298524Sfenner
203127668Sbms#define	E_SSID 		0
204127668Sbms#define	E_RATES 	1
205127668Sbms#define	E_FH	 	2
206127668Sbms#define	E_DS 		3
207127668Sbms#define	E_CF	 	4
208127668Sbms#define	E_TIM	 	5
209127668Sbms#define	E_IBSS 		6
21098524Sfenner/* reserved 		7 */
21198524Sfenner/* reserved 		8 */
21298524Sfenner/* reserved 		9 */
21398524Sfenner/* reserved 		10 */
21498524Sfenner/* reserved 		11 */
21598524Sfenner/* reserved 		12 */
21698524Sfenner/* reserved 		13 */
21798524Sfenner/* reserved 		14 */
21898524Sfenner/* reserved 		15 */
21998524Sfenner/* reserved 		16 */
22098524Sfenner
221127668Sbms#define	E_CHALLENGE 	16
22298524Sfenner/* reserved 		17 */
22398524Sfenner/* reserved 		18 */
22498524Sfenner/* reserved 		19 */
22598524Sfenner/* reserved 		16 */
22698524Sfenner/* reserved 		16 */
22798524Sfenner
22898524Sfenner
22998524Sfennerstruct mgmt_body_t {
230172686Smlaier	u_int8_t   	timestamp[IEEE802_11_TSTAMP_LEN];
23198524Sfenner	u_int16_t  	beacon_interval;
23298524Sfenner	u_int16_t 	listen_interval;
23398524Sfenner	u_int16_t 	status_code;
23498524Sfenner	u_int16_t 	aid;
235172686Smlaier	u_char		ap[IEEE802_11_AP_LEN];
23698524Sfenner	u_int16_t	reason_code;
23798524Sfenner	u_int16_t	auth_alg;
23898524Sfenner	u_int16_t	auth_trans_seq_num;
239172686Smlaier	elem_status_t	challenge_status;
24098524Sfenner	struct challenge_t  challenge;
24198524Sfenner	u_int16_t	capability_info;
242172686Smlaier	elem_status_t	ssid_status;
24398524Sfenner	struct ssid_t	ssid;
244172686Smlaier	elem_status_t	rates_status;
24598524Sfenner	struct rates_t 	rates;
246172686Smlaier	elem_status_t	ds_status;
24798524Sfenner	struct ds_t	ds;
248172686Smlaier	elem_status_t	cf_status;
24998524Sfenner	struct cf_t	cf;
250172686Smlaier	elem_status_t	fh_status;
25198524Sfenner	struct fh_t	fh;
252172686Smlaier	elem_status_t	tim_status;
25398524Sfenner	struct tim_t	tim;
25498524Sfenner};
25598524Sfenner
25698524Sfennerstruct ctrl_rts_t {
25798524Sfenner	u_int16_t	fc;
25898524Sfenner	u_int16_t	duration;
25998524Sfenner	u_int8_t	ra[6];
26098524Sfenner	u_int8_t	ta[6];
26198524Sfenner	u_int8_t	fcs[4];
26298524Sfenner};
26398524Sfenner
264127668Sbms#define	CTRL_RTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
265127668Sbms			 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN)
26698524Sfenner
26798524Sfennerstruct ctrl_cts_t {
26898524Sfenner	u_int16_t	fc;
26998524Sfenner	u_int16_t	duration;
27098524Sfenner	u_int8_t	ra[6];
27198524Sfenner	u_int8_t	fcs[4];
27298524Sfenner};
27398524Sfenner
274127668Sbms#define	CTRL_CTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
27598524Sfenner
27698524Sfennerstruct ctrl_ack_t {
27798524Sfenner	u_int16_t	fc;
27898524Sfenner	u_int16_t	duration;
27998524Sfenner	u_int8_t	ra[6];
28098524Sfenner	u_int8_t	fcs[4];
28198524Sfenner};
28298524Sfenner
283127668Sbms#define	CTRL_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
28498524Sfenner
28598524Sfennerstruct ctrl_ps_poll_t {
28698524Sfenner	u_int16_t	fc;
28798524Sfenner	u_int16_t	aid;
28898524Sfenner	u_int8_t	bssid[6];
28998524Sfenner	u_int8_t	ta[6];
29098524Sfenner	u_int8_t	fcs[4];
29198524Sfenner};
29298524Sfenner
293127668Sbms#define	CTRL_PS_POLL_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\
294127668Sbms				 IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN)
29598524Sfenner
29698524Sfennerstruct ctrl_end_t {
29798524Sfenner	u_int16_t	fc;
29898524Sfenner	u_int16_t	duration;
29998524Sfenner	u_int8_t	ra[6];
30098524Sfenner	u_int8_t	bssid[6];
30198524Sfenner	u_int8_t	fcs[4];
30298524Sfenner};
30398524Sfenner
304127668Sbms#define	CTRL_END_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
305127668Sbms			 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
30698524Sfenner
30798524Sfennerstruct ctrl_end_ack_t {
30898524Sfenner	u_int16_t	fc;
30998524Sfenner	u_int16_t	duration;
31098524Sfenner	u_int8_t	ra[6];
31198524Sfenner	u_int8_t	bssid[6];
31298524Sfenner	u_int8_t	fcs[4];
31398524Sfenner};
31498524Sfenner
315127668Sbms#define	CTRL_END_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
316127668Sbms				 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
31798524Sfenner
318170533Ssamstruct ctrl_bar_t {
319170533Ssam	u_int16_t	fc;
320170533Ssam	u_int16_t	dur;
321170533Ssam	u_int8_t	ra[6];
322170533Ssam	u_int8_t	ta[6];
323170533Ssam	u_int16_t	ctl;
324170533Ssam	u_int16_t	seq;
325170533Ssam	u_int8_t	fcs[4];
326170533Ssam};
327170533Ssam
328170533Ssam#define	CTRL_BAR_HDRLEN		(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
329170533Ssam				 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN+\
330170533Ssam				 IEEE802_11_CTL_LEN+IEEE802_11_SEQ_LEN)
331170533Ssam
332127668Sbms#define	IV_IV(iv)	((iv) & 0xFFFFFF)
333127668Sbms#define	IV_PAD(iv)	(((iv) >> 24) & 0x3F)
334127668Sbms#define	IV_KEYID(iv)	(((iv) >> 30) & 0x03)
335