Home | History | Annotate | Download | only in tcpdump
      1 /* @(#) $Header: /tcpdump/master/tcpdump/ieee802_11.h,v 1.9.4.3 2007/07/22 20:01:16 guy Exp $ (LBL) */
      2 /*
      3  * Copyright (c) 2001
      4  *	Fortress Technologies
      5  *      Charlie Lenahan ( clenahan (at) fortresstech.com )
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that: (1) source code distributions
      9  * retain the above copyright notice and this paragraph in its entirety, (2)
     10  * distributions including binary code include the above copyright notice and
     11  * this paragraph in its entirety in the documentation or other materials
     12  * provided with the distribution, and (3) all advertising materials mentioning
     13  * features or use of this software display the following acknowledgement:
     14  * ``This product includes software developed by the University of California,
     15  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
     16  * the University nor the names of its contributors may be used to endorse
     17  * or promote products derived from this software without specific prior
     18  * written permission.
     19  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
     20  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
     21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     22  */
     23 
     24 /* Lengths of 802.11 header components. */
     25 #define	IEEE802_11_FC_LEN		2
     26 #define	IEEE802_11_DUR_LEN		2
     27 #define	IEEE802_11_DA_LEN		6
     28 #define	IEEE802_11_SA_LEN		6
     29 #define	IEEE802_11_BSSID_LEN		6
     30 #define	IEEE802_11_RA_LEN		6
     31 #define	IEEE802_11_TA_LEN		6
     32 #define	IEEE802_11_SEQ_LEN		2
     33 #define	IEEE802_11_IV_LEN		3
     34 #define	IEEE802_11_KID_LEN		1
     35 
     36 /* Frame check sequence length. */
     37 #define	IEEE802_11_FCS_LEN		4
     38 
     39 /* Lengths of beacon components. */
     40 #define	IEEE802_11_TSTAMP_LEN		8
     41 #define	IEEE802_11_BCNINT_LEN		2
     42 #define	IEEE802_11_CAPINFO_LEN		2
     43 #define	IEEE802_11_LISTENINT_LEN	2
     44 
     45 #define	IEEE802_11_AID_LEN		2
     46 #define	IEEE802_11_STATUS_LEN		2
     47 #define	IEEE802_11_REASON_LEN		2
     48 
     49 /* Length of previous AP in reassocation frame */
     50 #define	IEEE802_11_AP_LEN		6
     51 
     52 #define	T_MGMT 0x0  /* management */
     53 #define	T_CTRL 0x1  /* control */
     54 #define	T_DATA 0x2 /* data */
     55 #define	T_RESV 0x3  /* reserved */
     56 
     57 #define	ST_ASSOC_REQUEST   	0x0
     58 #define	ST_ASSOC_RESPONSE 	0x1
     59 #define	ST_REASSOC_REQUEST   	0x2
     60 #define	ST_REASSOC_RESPONSE  	0x3
     61 #define	ST_PROBE_REQUEST   	0x4
     62 #define	ST_PROBE_RESPONSE   	0x5
     63 /* RESERVED 			0x6  */
     64 /* RESERVED 			0x7  */
     65 #define	ST_BEACON   		0x8
     66 #define	ST_ATIM			0x9
     67 #define	ST_DISASSOC		0xA
     68 #define	ST_AUTH			0xB
     69 #define	ST_DEAUTH		0xC
     70 /* RESERVED 			0xD  */
     71 /* RESERVED 			0xE  */
     72 /* RESERVED 			0xF  */
     73 
     74 
     75 #define	CTRL_PS_POLL	0xA
     76 #define	CTRL_RTS	0xB
     77 #define	CTRL_CTS	0xC
     78 #define	CTRL_ACK	0xD
     79 #define	CTRL_CF_END	0xE
     80 #define	CTRL_END_ACK	0xF
     81 
     82 #define	DATA_DATA			0x0
     83 #define	DATA_DATA_CF_ACK		0x1
     84 #define	DATA_DATA_CF_POLL		0x2
     85 #define	DATA_DATA_CF_ACK_POLL		0x3
     86 #define	DATA_NODATA			0x4
     87 #define	DATA_NODATA_CF_ACK		0x5
     88 #define	DATA_NODATA_CF_POLL		0x6
     89 #define	DATA_NODATA_CF_ACK_POLL		0x7
     90 
     91 #define DATA_QOS_DATA			0x8
     92 #define DATA_QOS_DATA_CF_ACK		0x9
     93 #define DATA_QOS_DATA_CF_POLL		0xA
     94 #define DATA_QOS_DATA_CF_ACK_POLL	0xB
     95 #define DATA_QOS_NODATA			0xC
     96 #define DATA_QOS_CF_POLL_NODATA		0xE
     97 #define DATA_QOS_CF_ACK_POLL_NODATA	0xF
     98 
     99 /*
    100  * The subtype field of a data frame is, in effect, composed of 4 flag
    101  * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have
    102  * any data), and QoS.
    103  */
    104 #define DATA_FRAME_IS_CF_ACK(x)		((x) & 0x01)
    105 #define DATA_FRAME_IS_CF_POLL(x)	((x) & 0x02)
    106 #define DATA_FRAME_IS_NULL(x)		((x) & 0x04)
    107 #define DATA_FRAME_IS_QOS(x)		((x) & 0x08)
    108 
    109 /*
    110  * Bits in the frame control field.
    111  */
    112 #define	FC_VERSION(fc)		((fc) & 0x3)
    113 #define	FC_TYPE(fc)		(((fc) >> 2) & 0x3)
    114 #define	FC_SUBTYPE(fc)		(((fc) >> 4) & 0xF)
    115 #define	FC_TO_DS(fc)		((fc) & 0x0100)
    116 #define	FC_FROM_DS(fc)		((fc) & 0x0200)
    117 #define	FC_MORE_FLAG(fc)	((fc) & 0x0400)
    118 #define	FC_RETRY(fc)		((fc) & 0x0800)
    119 #define	FC_POWER_MGMT(fc)	((fc) & 0x1000)
    120 #define	FC_MORE_DATA(fc)	((fc) & 0x2000)
    121 #define	FC_WEP(fc)		((fc) & 0x4000)
    122 #define	FC_ORDER(fc)		((fc) & 0x8000)
    123 
    124 struct mgmt_header_t {
    125 	u_int16_t	fc;
    126 	u_int16_t 	duration;
    127 	u_int8_t	da[6];
    128 	u_int8_t	sa[6];
    129 	u_int8_t	bssid[6];
    130 	u_int16_t	seq_ctrl;
    131 };
    132 
    133 #define	MGMT_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    134 			 IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\
    135 			 IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN)
    136 
    137 #define	CAPABILITY_ESS(cap)	((cap) & 0x0001)
    138 #define	CAPABILITY_IBSS(cap)	((cap) & 0x0002)
    139 #define	CAPABILITY_CFP(cap)	((cap) & 0x0004)
    140 #define	CAPABILITY_CFP_REQ(cap)	((cap) & 0x0008)
    141 #define	CAPABILITY_PRIVACY(cap)	((cap) & 0x0010)
    142 
    143 typedef enum {
    144 	NOT_PRESENT,
    145 	PRESENT,
    146 	TRUNCATED
    147 } elem_status_t;
    148 
    149 struct ssid_t {
    150 	u_int8_t	element_id;
    151 	u_int8_t	length;
    152 	u_char		ssid[33];  /* 32 + 1 for null */
    153 };
    154 
    155 struct rates_t {
    156 	u_int8_t	element_id;
    157 	u_int8_t	length;
    158 	u_int8_t	rate[16];
    159 };
    160 
    161 struct challenge_t {
    162 	u_int8_t	element_id;
    163 	u_int8_t	length;
    164 	u_int8_t	text[254]; /* 1-253 + 1 for null */
    165 };
    166 
    167 struct fh_t {
    168 	u_int8_t	element_id;
    169 	u_int8_t	length;
    170 	u_int16_t	dwell_time;
    171 	u_int8_t	hop_set;
    172 	u_int8_t 	hop_pattern;
    173 	u_int8_t	hop_index;
    174 };
    175 
    176 struct ds_t {
    177 	u_int8_t	element_id;
    178 	u_int8_t	length;
    179 	u_int8_t	channel;
    180 };
    181 
    182 struct cf_t {
    183 	u_int8_t	element_id;
    184 	u_int8_t	length;
    185 	u_int8_t	count;
    186 	u_int8_t	period;
    187 	u_int16_t	max_duration;
    188 	u_int16_t	dur_remaing;
    189 };
    190 
    191 struct tim_t {
    192 	u_int8_t	element_id;
    193 	u_int8_t	length;
    194 	u_int8_t	count;
    195 	u_int8_t	period;
    196 	u_int8_t	bitmap_control;
    197 	u_int8_t	bitmap[251];
    198 };
    199 
    200 #define	E_SSID 		0
    201 #define	E_RATES 	1
    202 #define	E_FH	 	2
    203 #define	E_DS 		3
    204 #define	E_CF	 	4
    205 #define	E_TIM	 	5
    206 #define	E_IBSS 		6
    207 /* reserved 		7 */
    208 /* reserved 		8 */
    209 /* reserved 		9 */
    210 /* reserved 		10 */
    211 /* reserved 		11 */
    212 /* reserved 		12 */
    213 /* reserved 		13 */
    214 /* reserved 		14 */
    215 /* reserved 		15 */
    216 /* reserved 		16 */
    217 
    218 #define	E_CHALLENGE 	16
    219 /* reserved 		17 */
    220 /* reserved 		18 */
    221 /* reserved 		19 */
    222 /* reserved 		16 */
    223 /* reserved 		16 */
    224 
    225 
    226 struct mgmt_body_t {
    227 	u_int8_t   	timestamp[IEEE802_11_TSTAMP_LEN];
    228 	u_int16_t  	beacon_interval;
    229 	u_int16_t 	listen_interval;
    230 	u_int16_t 	status_code;
    231 	u_int16_t 	aid;
    232 	u_char		ap[IEEE802_11_AP_LEN];
    233 	u_int16_t	reason_code;
    234 	u_int16_t	auth_alg;
    235 	u_int16_t	auth_trans_seq_num;
    236 	elem_status_t	challenge_status;
    237 	struct challenge_t  challenge;
    238 	u_int16_t	capability_info;
    239 	elem_status_t	ssid_status;
    240 	struct ssid_t	ssid;
    241 	elem_status_t	rates_status;
    242 	struct rates_t 	rates;
    243 	elem_status_t	ds_status;
    244 	struct ds_t	ds;
    245 	elem_status_t	cf_status;
    246 	struct cf_t	cf;
    247 	elem_status_t	fh_status;
    248 	struct fh_t	fh;
    249 	elem_status_t	tim_status;
    250 	struct tim_t	tim;
    251 };
    252 
    253 struct ctrl_rts_t {
    254 	u_int16_t	fc;
    255 	u_int16_t	duration;
    256 	u_int8_t	ra[6];
    257 	u_int8_t	ta[6];
    258 	u_int8_t	fcs[4];
    259 };
    260 
    261 #define	CTRL_RTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    262 			 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN)
    263 
    264 struct ctrl_cts_t {
    265 	u_int16_t	fc;
    266 	u_int16_t	duration;
    267 	u_int8_t	ra[6];
    268 	u_int8_t	fcs[4];
    269 };
    270 
    271 #define	CTRL_CTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
    272 
    273 struct ctrl_ack_t {
    274 	u_int16_t	fc;
    275 	u_int16_t	duration;
    276 	u_int8_t	ra[6];
    277 	u_int8_t	fcs[4];
    278 };
    279 
    280 #define	CTRL_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
    281 
    282 struct ctrl_ps_poll_t {
    283 	u_int16_t	fc;
    284 	u_int16_t	aid;
    285 	u_int8_t	bssid[6];
    286 	u_int8_t	ta[6];
    287 	u_int8_t	fcs[4];
    288 };
    289 
    290 #define	CTRL_PS_POLL_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\
    291 				 IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN)
    292 
    293 struct ctrl_end_t {
    294 	u_int16_t	fc;
    295 	u_int16_t	duration;
    296 	u_int8_t	ra[6];
    297 	u_int8_t	bssid[6];
    298 	u_int8_t	fcs[4];
    299 };
    300 
    301 #define	CTRL_END_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    302 			 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
    303 
    304 struct ctrl_end_ack_t {
    305 	u_int16_t	fc;
    306 	u_int16_t	duration;
    307 	u_int8_t	ra[6];
    308 	u_int8_t	bssid[6];
    309 	u_int8_t	fcs[4];
    310 };
    311 
    312 #define	CTRL_END_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    313 				 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
    314 
    315 #define	IV_IV(iv)	((iv) & 0xFFFFFF)
    316 #define	IV_PAD(iv)	(((iv) >> 24) & 0x3F)
    317 #define	IV_KEYID(iv)	(((iv) >> 30) & 0x03)
    318