1190207Srpaulo/* @(#) $Header: /tcpdump/master/tcpdump/ieee802_11.h,v 1.12 2007-07-22 19:59:06 guy Exp $ (LBL) */
298524Sfenner/*
398524Sfenner * Copyright (c) 2001
498524Sfenner *	Fortress Technologies
598524Sfenner *      Charlie Lenahan ( clenahan@fortresstech.com )
698524Sfenner *
798524Sfenner * Redistribution and use in source and binary forms, with or without
898524Sfenner * modification, are permitted provided that: (1) source code distributions
998524Sfenner * retain the above copyright notice and this paragraph in its entirety, (2)
1098524Sfenner * distributions including binary code include the above copyright notice and
1198524Sfenner * this paragraph in its entirety in the documentation or other materials
1298524Sfenner * provided with the distribution, and (3) all advertising materials mentioning
1398524Sfenner * features or use of this software display the following acknowledgement:
1498524Sfenner * ``This product includes software developed by the University of California,
1598524Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1698524Sfenner * the University nor the names of its contributors may be used to endorse
1798524Sfenner * or promote products derived from this software without specific prior
1898524Sfenner * written permission.
1998524Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
2098524Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
2198524Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2298524Sfenner */
2398524Sfenner
24127668Sbms/* Lengths of 802.11 header components. */
25127668Sbms#define	IEEE802_11_FC_LEN		2
26127668Sbms#define	IEEE802_11_DUR_LEN		2
27127668Sbms#define	IEEE802_11_DA_LEN		6
28127668Sbms#define	IEEE802_11_SA_LEN		6
29127668Sbms#define	IEEE802_11_BSSID_LEN		6
30127668Sbms#define	IEEE802_11_RA_LEN		6
31127668Sbms#define	IEEE802_11_TA_LEN		6
32127668Sbms#define	IEEE802_11_SEQ_LEN		2
33170533Ssam#define	IEEE802_11_CTL_LEN		2
34127668Sbms#define	IEEE802_11_IV_LEN		3
35127668Sbms#define	IEEE802_11_KID_LEN		1
3698524Sfenner
37127668Sbms/* Frame check sequence length. */
38127668Sbms#define	IEEE802_11_FCS_LEN		4
3998524Sfenner
40127668Sbms/* Lengths of beacon components. */
41127668Sbms#define	IEEE802_11_TSTAMP_LEN		8
42127668Sbms#define	IEEE802_11_BCNINT_LEN		2
43127668Sbms#define	IEEE802_11_CAPINFO_LEN		2
44127668Sbms#define	IEEE802_11_LISTENINT_LEN	2
45127668Sbms
46127668Sbms#define	IEEE802_11_AID_LEN		2
47127668Sbms#define	IEEE802_11_STATUS_LEN		2
48127668Sbms#define	IEEE802_11_REASON_LEN		2
49127668Sbms
50127668Sbms/* Length of previous AP in reassocation frame */
51127668Sbms#define	IEEE802_11_AP_LEN		6
52127668Sbms
53127668Sbms#define	T_MGMT 0x0  /* management */
54127668Sbms#define	T_CTRL 0x1  /* control */
55127668Sbms#define	T_DATA 0x2 /* data */
56127668Sbms#define	T_RESV 0x3  /* reserved */
57127668Sbms
58127668Sbms#define	ST_ASSOC_REQUEST   	0x0
59127668Sbms#define	ST_ASSOC_RESPONSE 	0x1
60127668Sbms#define	ST_REASSOC_REQUEST   	0x2
61127668Sbms#define	ST_REASSOC_RESPONSE  	0x3
62127668Sbms#define	ST_PROBE_REQUEST   	0x4
63127668Sbms#define	ST_PROBE_RESPONSE   	0x5
6498524Sfenner/* RESERVED 			0x6  */
6598524Sfenner/* RESERVED 			0x7  */
66127668Sbms#define	ST_BEACON   		0x8
67127668Sbms#define	ST_ATIM			0x9
68127668Sbms#define	ST_DISASSOC		0xA
69127668Sbms#define	ST_AUTH			0xB
70127668Sbms#define	ST_DEAUTH		0xC
71195684Ssam#define	ST_ACTION		0xD
7298524Sfenner/* RESERVED 			0xE  */
7398524Sfenner/* RESERVED 			0xF  */
7498524Sfenner
7598524Sfenner
76214478Srpaulo#define CTRL_CONTROL_WRAPPER	0x7
77170533Ssam#define	CTRL_BAR	0x8
78195684Ssam#define	CTRL_BA		0x9
79127668Sbms#define	CTRL_PS_POLL	0xA
80127668Sbms#define	CTRL_RTS	0xB
81127668Sbms#define	CTRL_CTS	0xC
82127668Sbms#define	CTRL_ACK	0xD
83127668Sbms#define	CTRL_CF_END	0xE
84127668Sbms#define	CTRL_END_ACK	0xF
8598524Sfenner
86172686Smlaier#define	DATA_DATA			0x0
87172686Smlaier#define	DATA_DATA_CF_ACK		0x1
88172686Smlaier#define	DATA_DATA_CF_POLL		0x2
89172686Smlaier#define	DATA_DATA_CF_ACK_POLL		0x3
90172686Smlaier#define	DATA_NODATA			0x4
91172686Smlaier#define	DATA_NODATA_CF_ACK		0x5
92172686Smlaier#define	DATA_NODATA_CF_POLL		0x6
93172686Smlaier#define	DATA_NODATA_CF_ACK_POLL		0x7
94127668Sbms
95172686Smlaier#define DATA_QOS_DATA			0x8
96172686Smlaier#define DATA_QOS_DATA_CF_ACK		0x9
97172686Smlaier#define DATA_QOS_DATA_CF_POLL		0xA
98172686Smlaier#define DATA_QOS_DATA_CF_ACK_POLL	0xB
99172686Smlaier#define DATA_QOS_NODATA			0xC
100172686Smlaier#define DATA_QOS_CF_POLL_NODATA		0xE
101172686Smlaier#define DATA_QOS_CF_ACK_POLL_NODATA	0xF
102172686Smlaier
10398524Sfenner/*
104172686Smlaier * The subtype field of a data frame is, in effect, composed of 4 flag
105172686Smlaier * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have
106172686Smlaier * any data), and QoS.
107172686Smlaier */
108172686Smlaier#define DATA_FRAME_IS_CF_ACK(x)		((x) & 0x01)
109172686Smlaier#define DATA_FRAME_IS_CF_POLL(x)	((x) & 0x02)
110172686Smlaier#define DATA_FRAME_IS_NULL(x)		((x) & 0x04)
111172686Smlaier#define DATA_FRAME_IS_QOS(x)		((x) & 0x08)
112172686Smlaier
113172686Smlaier/*
11498524Sfenner * Bits in the frame control field.
11598524Sfenner */
116127668Sbms#define	FC_VERSION(fc)		((fc) & 0x3)
117127668Sbms#define	FC_TYPE(fc)		(((fc) >> 2) & 0x3)
118127668Sbms#define	FC_SUBTYPE(fc)		(((fc) >> 4) & 0xF)
119127668Sbms#define	FC_TO_DS(fc)		((fc) & 0x0100)
120127668Sbms#define	FC_FROM_DS(fc)		((fc) & 0x0200)
121127668Sbms#define	FC_MORE_FLAG(fc)	((fc) & 0x0400)
122127668Sbms#define	FC_RETRY(fc)		((fc) & 0x0800)
123127668Sbms#define	FC_POWER_MGMT(fc)	((fc) & 0x1000)
124127668Sbms#define	FC_MORE_DATA(fc)	((fc) & 0x2000)
125127668Sbms#define	FC_WEP(fc)		((fc) & 0x4000)
126127668Sbms#define	FC_ORDER(fc)		((fc) & 0x8000)
12798524Sfenner
12898524Sfennerstruct mgmt_header_t {
12998524Sfenner	u_int16_t	fc;
13098524Sfenner	u_int16_t 	duration;
13198524Sfenner	u_int8_t	da[6];
13298524Sfenner	u_int8_t	sa[6];
13398524Sfenner	u_int8_t	bssid[6];
13498524Sfenner	u_int16_t	seq_ctrl;
13598524Sfenner};
13698524Sfenner
137127668Sbms#define	MGMT_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
138127668Sbms			 IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\
139127668Sbms			 IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN)
14098524Sfenner
141127668Sbms#define	CAPABILITY_ESS(cap)	((cap) & 0x0001)
142127668Sbms#define	CAPABILITY_IBSS(cap)	((cap) & 0x0002)
143127668Sbms#define	CAPABILITY_CFP(cap)	((cap) & 0x0004)
144127668Sbms#define	CAPABILITY_CFP_REQ(cap)	((cap) & 0x0008)
145127668Sbms#define	CAPABILITY_PRIVACY(cap)	((cap) & 0x0010)
14698524Sfenner
14798524Sfennerstruct ssid_t {
14898524Sfenner	u_int8_t	element_id;
14998524Sfenner	u_int8_t	length;
15098524Sfenner	u_char		ssid[33];  /* 32 + 1 for null */
151127668Sbms};
15298524Sfenner
15398524Sfennerstruct rates_t {
15498524Sfenner	u_int8_t	element_id;
15598524Sfenner	u_int8_t	length;
156172686Smlaier	u_int8_t	rate[16];
15798524Sfenner};
15898524Sfenner
15998524Sfennerstruct challenge_t {
16098524Sfenner	u_int8_t	element_id;
16198524Sfenner	u_int8_t	length;
16298524Sfenner	u_int8_t	text[254]; /* 1-253 + 1 for null */
16398524Sfenner};
164172686Smlaier
16598524Sfennerstruct fh_t {
16698524Sfenner	u_int8_t	element_id;
16798524Sfenner	u_int8_t	length;
16898524Sfenner	u_int16_t	dwell_time;
16998524Sfenner	u_int8_t	hop_set;
17098524Sfenner	u_int8_t 	hop_pattern;
17198524Sfenner	u_int8_t	hop_index;
17298524Sfenner};
17398524Sfenner
17498524Sfennerstruct ds_t {
17598524Sfenner	u_int8_t	element_id;
17698524Sfenner	u_int8_t	length;
17798524Sfenner	u_int8_t	channel;
17898524Sfenner};
17998524Sfenner
18098524Sfennerstruct cf_t {
18198524Sfenner	u_int8_t	element_id;
18298524Sfenner	u_int8_t	length;
18398524Sfenner	u_int8_t	count;
18498524Sfenner	u_int8_t	period;
18598524Sfenner	u_int16_t	max_duration;
18698524Sfenner	u_int16_t	dur_remaing;
18798524Sfenner};
18898524Sfenner
18998524Sfennerstruct tim_t {
19098524Sfenner	u_int8_t	element_id;
19198524Sfenner	u_int8_t	length;
19298524Sfenner	u_int8_t	count;
19398524Sfenner	u_int8_t	period;
19498524Sfenner	u_int8_t	bitmap_control;
19598524Sfenner	u_int8_t	bitmap[251];
19698524Sfenner};
19798524Sfenner
198127668Sbms#define	E_SSID 		0
199127668Sbms#define	E_RATES 	1
200127668Sbms#define	E_FH	 	2
201127668Sbms#define	E_DS 		3
202127668Sbms#define	E_CF	 	4
203127668Sbms#define	E_TIM	 	5
204127668Sbms#define	E_IBSS 		6
20598524Sfenner/* reserved 		7 */
20698524Sfenner/* reserved 		8 */
20798524Sfenner/* reserved 		9 */
20898524Sfenner/* reserved 		10 */
20998524Sfenner/* reserved 		11 */
21098524Sfenner/* reserved 		12 */
21198524Sfenner/* reserved 		13 */
21298524Sfenner/* reserved 		14 */
21398524Sfenner/* reserved 		15 */
21498524Sfenner/* reserved 		16 */
21598524Sfenner
216127668Sbms#define	E_CHALLENGE 	16
21798524Sfenner/* reserved 		17 */
21898524Sfenner/* reserved 		18 */
21998524Sfenner/* reserved 		19 */
22098524Sfenner/* reserved 		16 */
22198524Sfenner/* reserved 		16 */
22298524Sfenner
22398524Sfenner
22498524Sfennerstruct mgmt_body_t {
225172686Smlaier	u_int8_t   	timestamp[IEEE802_11_TSTAMP_LEN];
22698524Sfenner	u_int16_t  	beacon_interval;
22798524Sfenner	u_int16_t 	listen_interval;
22898524Sfenner	u_int16_t 	status_code;
22998524Sfenner	u_int16_t 	aid;
230172686Smlaier	u_char		ap[IEEE802_11_AP_LEN];
23198524Sfenner	u_int16_t	reason_code;
23298524Sfenner	u_int16_t	auth_alg;
23398524Sfenner	u_int16_t	auth_trans_seq_num;
234214478Srpaulo	int		challenge_present;
23598524Sfenner	struct challenge_t  challenge;
23698524Sfenner	u_int16_t	capability_info;
237214478Srpaulo	int		ssid_present;
23898524Sfenner	struct ssid_t	ssid;
239214478Srpaulo	int		rates_present;
24098524Sfenner	struct rates_t 	rates;
241214478Srpaulo	int		ds_present;
24298524Sfenner	struct ds_t	ds;
243214478Srpaulo	int		cf_present;
24498524Sfenner	struct cf_t	cf;
245214478Srpaulo	int		fh_present;
24698524Sfenner	struct fh_t	fh;
247214478Srpaulo	int		tim_present;
24898524Sfenner	struct tim_t	tim;
24998524Sfenner};
25098524Sfenner
25198524Sfennerstruct ctrl_rts_t {
25298524Sfenner	u_int16_t	fc;
25398524Sfenner	u_int16_t	duration;
25498524Sfenner	u_int8_t	ra[6];
25598524Sfenner	u_int8_t	ta[6];
25698524Sfenner	u_int8_t	fcs[4];
25798524Sfenner};
25898524Sfenner
259127668Sbms#define	CTRL_RTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
260127668Sbms			 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN)
26198524Sfenner
26298524Sfennerstruct ctrl_cts_t {
26398524Sfenner	u_int16_t	fc;
26498524Sfenner	u_int16_t	duration;
26598524Sfenner	u_int8_t	ra[6];
26698524Sfenner	u_int8_t	fcs[4];
26798524Sfenner};
26898524Sfenner
269127668Sbms#define	CTRL_CTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
27098524Sfenner
27198524Sfennerstruct ctrl_ack_t {
27298524Sfenner	u_int16_t	fc;
27398524Sfenner	u_int16_t	duration;
27498524Sfenner	u_int8_t	ra[6];
27598524Sfenner	u_int8_t	fcs[4];
27698524Sfenner};
27798524Sfenner
278127668Sbms#define	CTRL_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
27998524Sfenner
28098524Sfennerstruct ctrl_ps_poll_t {
28198524Sfenner	u_int16_t	fc;
28298524Sfenner	u_int16_t	aid;
28398524Sfenner	u_int8_t	bssid[6];
28498524Sfenner	u_int8_t	ta[6];
28598524Sfenner	u_int8_t	fcs[4];
28698524Sfenner};
28798524Sfenner
288127668Sbms#define	CTRL_PS_POLL_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\
289127668Sbms				 IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN)
29098524Sfenner
29198524Sfennerstruct ctrl_end_t {
29298524Sfenner	u_int16_t	fc;
29398524Sfenner	u_int16_t	duration;
29498524Sfenner	u_int8_t	ra[6];
29598524Sfenner	u_int8_t	bssid[6];
29698524Sfenner	u_int8_t	fcs[4];
29798524Sfenner};
29898524Sfenner
299127668Sbms#define	CTRL_END_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
300127668Sbms			 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
30198524Sfenner
30298524Sfennerstruct ctrl_end_ack_t {
30398524Sfenner	u_int16_t	fc;
30498524Sfenner	u_int16_t	duration;
30598524Sfenner	u_int8_t	ra[6];
30698524Sfenner	u_int8_t	bssid[6];
30798524Sfenner	u_int8_t	fcs[4];
30898524Sfenner};
30998524Sfenner
310127668Sbms#define	CTRL_END_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
311127668Sbms				 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
31298524Sfenner
313195684Ssamstruct ctrl_ba_t {
314195684Ssam	u_int16_t	fc;
315195684Ssam	u_int16_t	duration;
316195684Ssam	u_int8_t	ra[6];
317195684Ssam	u_int8_t	fcs[4];
318195684Ssam};
319195684Ssam
320195684Ssam#define	CTRL_BA_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
321195684Ssam
322170533Ssamstruct ctrl_bar_t {
323170533Ssam	u_int16_t	fc;
324170533Ssam	u_int16_t	dur;
325170533Ssam	u_int8_t	ra[6];
326170533Ssam	u_int8_t	ta[6];
327170533Ssam	u_int16_t	ctl;
328170533Ssam	u_int16_t	seq;
329170533Ssam	u_int8_t	fcs[4];
330170533Ssam};
331170533Ssam
332170533Ssam#define	CTRL_BAR_HDRLEN		(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
333170533Ssam				 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN+\
334170533Ssam				 IEEE802_11_CTL_LEN+IEEE802_11_SEQ_LEN)
335170533Ssam
336195684Ssamstruct meshcntl_t {
337195684Ssam	u_int8_t	flags;
338195684Ssam	u_int8_t	ttl;
339195684Ssam	u_int8_t	seq[4];
340195684Ssam	u_int8_t	addr4[6];
341195684Ssam	u_int8_t	addr5[6];
342195684Ssam	u_int8_t	addr6[6];
343195684Ssam};
344195684Ssam
345127668Sbms#define	IV_IV(iv)	((iv) & 0xFFFFFF)
346127668Sbms#define	IV_PAD(iv)	(((iv) >> 24) & 0x3F)
347127668Sbms#define	IV_KEYID(iv)	(((iv) >> 30) & 0x03)
348