Home | History | Annotate | Download | only in tcpdump
      1 /* @(#) $Header: /tcpdump/master/tcpdump/ieee802_11.h,v 1.12 2007-07-22 19:59:06 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_CTL_LEN		2
     34 #define	IEEE802_11_IV_LEN		3
     35 #define	IEEE802_11_KID_LEN		1
     36 
     37 /* Frame check sequence length. */
     38 #define	IEEE802_11_FCS_LEN		4
     39 
     40 /* Lengths of beacon components. */
     41 #define	IEEE802_11_TSTAMP_LEN		8
     42 #define	IEEE802_11_BCNINT_LEN		2
     43 #define	IEEE802_11_CAPINFO_LEN		2
     44 #define	IEEE802_11_LISTENINT_LEN	2
     45 
     46 #define	IEEE802_11_AID_LEN		2
     47 #define	IEEE802_11_STATUS_LEN		2
     48 #define	IEEE802_11_REASON_LEN		2
     49 
     50 /* Length of previous AP in reassocation frame */
     51 #define	IEEE802_11_AP_LEN		6
     52 
     53 #define	T_MGMT 0x0  /* management */
     54 #define	T_CTRL 0x1  /* control */
     55 #define	T_DATA 0x2 /* data */
     56 #define	T_RESV 0x3  /* reserved */
     57 
     58 #define	ST_ASSOC_REQUEST   	0x0
     59 #define	ST_ASSOC_RESPONSE 	0x1
     60 #define	ST_REASSOC_REQUEST   	0x2
     61 #define	ST_REASSOC_RESPONSE  	0x3
     62 #define	ST_PROBE_REQUEST   	0x4
     63 #define	ST_PROBE_RESPONSE   	0x5
     64 /* RESERVED 			0x6  */
     65 /* RESERVED 			0x7  */
     66 #define	ST_BEACON   		0x8
     67 #define	ST_ATIM			0x9
     68 #define	ST_DISASSOC		0xA
     69 #define	ST_AUTH			0xB
     70 #define	ST_DEAUTH		0xC
     71 #define	ST_ACTION		0xD
     72 /* RESERVED 			0xE  */
     73 /* RESERVED 			0xF  */
     74 
     75 
     76 #define CTRL_CONTROL_WRAPPER	0x7
     77 #define	CTRL_BAR	0x8
     78 #define	CTRL_BA		0x9
     79 #define	CTRL_PS_POLL	0xA
     80 #define	CTRL_RTS	0xB
     81 #define	CTRL_CTS	0xC
     82 #define	CTRL_ACK	0xD
     83 #define	CTRL_CF_END	0xE
     84 #define	CTRL_END_ACK	0xF
     85 
     86 #define	DATA_DATA			0x0
     87 #define	DATA_DATA_CF_ACK		0x1
     88 #define	DATA_DATA_CF_POLL		0x2
     89 #define	DATA_DATA_CF_ACK_POLL		0x3
     90 #define	DATA_NODATA			0x4
     91 #define	DATA_NODATA_CF_ACK		0x5
     92 #define	DATA_NODATA_CF_POLL		0x6
     93 #define	DATA_NODATA_CF_ACK_POLL		0x7
     94 
     95 #define DATA_QOS_DATA			0x8
     96 #define DATA_QOS_DATA_CF_ACK		0x9
     97 #define DATA_QOS_DATA_CF_POLL		0xA
     98 #define DATA_QOS_DATA_CF_ACK_POLL	0xB
     99 #define DATA_QOS_NODATA			0xC
    100 #define DATA_QOS_CF_POLL_NODATA		0xE
    101 #define DATA_QOS_CF_ACK_POLL_NODATA	0xF
    102 
    103 /*
    104  * The subtype field of a data frame is, in effect, composed of 4 flag
    105  * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have
    106  * any data), and QoS.
    107  */
    108 #define DATA_FRAME_IS_CF_ACK(x)		((x) & 0x01)
    109 #define DATA_FRAME_IS_CF_POLL(x)	((x) & 0x02)
    110 #define DATA_FRAME_IS_NULL(x)		((x) & 0x04)
    111 #define DATA_FRAME_IS_QOS(x)		((x) & 0x08)
    112 
    113 /*
    114  * Bits in the frame control field.
    115  */
    116 #define	FC_VERSION(fc)		((fc) & 0x3)
    117 #define	FC_TYPE(fc)		(((fc) >> 2) & 0x3)
    118 #define	FC_SUBTYPE(fc)		(((fc) >> 4) & 0xF)
    119 #define	FC_TO_DS(fc)		((fc) & 0x0100)
    120 #define	FC_FROM_DS(fc)		((fc) & 0x0200)
    121 #define	FC_MORE_FLAG(fc)	((fc) & 0x0400)
    122 #define	FC_RETRY(fc)		((fc) & 0x0800)
    123 #define	FC_POWER_MGMT(fc)	((fc) & 0x1000)
    124 #define	FC_MORE_DATA(fc)	((fc) & 0x2000)
    125 #define	FC_WEP(fc)		((fc) & 0x4000)
    126 #define	FC_ORDER(fc)		((fc) & 0x8000)
    127 
    128 struct mgmt_header_t {
    129 	u_int16_t	fc;
    130 	u_int16_t 	duration;
    131 	u_int8_t	da[6];
    132 	u_int8_t	sa[6];
    133 	u_int8_t	bssid[6];
    134 	u_int16_t	seq_ctrl;
    135 };
    136 
    137 #define	MGMT_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    138 			 IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\
    139 			 IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN)
    140 
    141 #define	CAPABILITY_ESS(cap)	((cap) & 0x0001)
    142 #define	CAPABILITY_IBSS(cap)	((cap) & 0x0002)
    143 #define	CAPABILITY_CFP(cap)	((cap) & 0x0004)
    144 #define	CAPABILITY_CFP_REQ(cap)	((cap) & 0x0008)
    145 #define	CAPABILITY_PRIVACY(cap)	((cap) & 0x0010)
    146 
    147 struct ssid_t {
    148 	u_int8_t	element_id;
    149 	u_int8_t	length;
    150 	u_char		ssid[33];  /* 32 + 1 for null */
    151 };
    152 
    153 struct rates_t {
    154 	u_int8_t	element_id;
    155 	u_int8_t	length;
    156 	u_int8_t	rate[16];
    157 };
    158 
    159 struct challenge_t {
    160 	u_int8_t	element_id;
    161 	u_int8_t	length;
    162 	u_int8_t	text[254]; /* 1-253 + 1 for null */
    163 };
    164 
    165 struct fh_t {
    166 	u_int8_t	element_id;
    167 	u_int8_t	length;
    168 	u_int16_t	dwell_time;
    169 	u_int8_t	hop_set;
    170 	u_int8_t 	hop_pattern;
    171 	u_int8_t	hop_index;
    172 };
    173 
    174 struct ds_t {
    175 	u_int8_t	element_id;
    176 	u_int8_t	length;
    177 	u_int8_t	channel;
    178 };
    179 
    180 struct cf_t {
    181 	u_int8_t	element_id;
    182 	u_int8_t	length;
    183 	u_int8_t	count;
    184 	u_int8_t	period;
    185 	u_int16_t	max_duration;
    186 	u_int16_t	dur_remaing;
    187 };
    188 
    189 struct tim_t {
    190 	u_int8_t	element_id;
    191 	u_int8_t	length;
    192 	u_int8_t	count;
    193 	u_int8_t	period;
    194 	u_int8_t	bitmap_control;
    195 	u_int8_t	bitmap[251];
    196 };
    197 
    198 #define	E_SSID 		0
    199 #define	E_RATES 	1
    200 #define	E_FH	 	2
    201 #define	E_DS 		3
    202 #define	E_CF	 	4
    203 #define	E_TIM	 	5
    204 #define	E_IBSS 		6
    205 /* reserved 		7 */
    206 /* reserved 		8 */
    207 /* reserved 		9 */
    208 /* reserved 		10 */
    209 /* reserved 		11 */
    210 /* reserved 		12 */
    211 /* reserved 		13 */
    212 /* reserved 		14 */
    213 /* reserved 		15 */
    214 /* reserved 		16 */
    215 
    216 #define	E_CHALLENGE 	16
    217 /* reserved 		17 */
    218 /* reserved 		18 */
    219 /* reserved 		19 */
    220 /* reserved 		16 */
    221 /* reserved 		16 */
    222 
    223 
    224 struct mgmt_body_t {
    225 	u_int8_t   	timestamp[IEEE802_11_TSTAMP_LEN];
    226 	u_int16_t  	beacon_interval;
    227 	u_int16_t 	listen_interval;
    228 	u_int16_t 	status_code;
    229 	u_int16_t 	aid;
    230 	u_char		ap[IEEE802_11_AP_LEN];
    231 	u_int16_t	reason_code;
    232 	u_int16_t	auth_alg;
    233 	u_int16_t	auth_trans_seq_num;
    234 	int		challenge_present;
    235 	struct challenge_t  challenge;
    236 	u_int16_t	capability_info;
    237 	int		ssid_present;
    238 	struct ssid_t	ssid;
    239 	int		rates_present;
    240 	struct rates_t 	rates;
    241 	int		ds_present;
    242 	struct ds_t	ds;
    243 	int		cf_present;
    244 	struct cf_t	cf;
    245 	int		fh_present;
    246 	struct fh_t	fh;
    247 	int		tim_present;
    248 	struct tim_t	tim;
    249 };
    250 
    251 struct ctrl_rts_t {
    252 	u_int16_t	fc;
    253 	u_int16_t	duration;
    254 	u_int8_t	ra[6];
    255 	u_int8_t	ta[6];
    256 	u_int8_t	fcs[4];
    257 };
    258 
    259 #define	CTRL_RTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    260 			 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN)
    261 
    262 struct ctrl_cts_t {
    263 	u_int16_t	fc;
    264 	u_int16_t	duration;
    265 	u_int8_t	ra[6];
    266 	u_int8_t	fcs[4];
    267 };
    268 
    269 #define	CTRL_CTS_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
    270 
    271 struct ctrl_ack_t {
    272 	u_int16_t	fc;
    273 	u_int16_t	duration;
    274 	u_int8_t	ra[6];
    275 	u_int8_t	fcs[4];
    276 };
    277 
    278 #define	CTRL_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
    279 
    280 struct ctrl_ps_poll_t {
    281 	u_int16_t	fc;
    282 	u_int16_t	aid;
    283 	u_int8_t	bssid[6];
    284 	u_int8_t	ta[6];
    285 	u_int8_t	fcs[4];
    286 };
    287 
    288 #define	CTRL_PS_POLL_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\
    289 				 IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN)
    290 
    291 struct ctrl_end_t {
    292 	u_int16_t	fc;
    293 	u_int16_t	duration;
    294 	u_int8_t	ra[6];
    295 	u_int8_t	bssid[6];
    296 	u_int8_t	fcs[4];
    297 };
    298 
    299 #define	CTRL_END_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    300 			 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
    301 
    302 struct ctrl_end_ack_t {
    303 	u_int16_t	fc;
    304 	u_int16_t	duration;
    305 	u_int8_t	ra[6];
    306 	u_int8_t	bssid[6];
    307 	u_int8_t	fcs[4];
    308 };
    309 
    310 #define	CTRL_END_ACK_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    311 				 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN)
    312 
    313 struct ctrl_ba_t {
    314 	u_int16_t	fc;
    315 	u_int16_t	duration;
    316 	u_int8_t	ra[6];
    317 	u_int8_t	fcs[4];
    318 };
    319 
    320 #define	CTRL_BA_HDRLEN	(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN)
    321 
    322 struct ctrl_bar_t {
    323 	u_int16_t	fc;
    324 	u_int16_t	dur;
    325 	u_int8_t	ra[6];
    326 	u_int8_t	ta[6];
    327 	u_int16_t	ctl;
    328 	u_int16_t	seq;
    329 	u_int8_t	fcs[4];
    330 };
    331 
    332 #define	CTRL_BAR_HDRLEN		(IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\
    333 				 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN+\
    334 				 IEEE802_11_CTL_LEN+IEEE802_11_SEQ_LEN)
    335 
    336 struct meshcntl_t {
    337 	u_int8_t	flags;
    338 	u_int8_t	ttl;
    339 	u_int8_t	seq[4];
    340 	u_int8_t	addr4[6];
    341 	u_int8_t	addr5[6];
    342 	u_int8_t	addr6[6];
    343 };
    344 
    345 #define	IV_IV(iv)	((iv) & 0xFFFFFF)
    346 #define	IV_PAD(iv)	(((iv) >> 24) & 0x3F)
    347 #define	IV_KEYID(iv)	(((iv) >> 30) & 0x03)
    348