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@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 124struct 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 143typedef enum { 144 NOT_PRESENT, 145 PRESENT, 146 TRUNCATED 147} elem_status_t; 148 149struct ssid_t { 150 u_int8_t element_id; 151 u_int8_t length; 152 u_char ssid[33]; /* 32 + 1 for null */ 153}; 154 155struct rates_t { 156 u_int8_t element_id; 157 u_int8_t length; 158 u_int8_t rate[16]; 159}; 160 161struct 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 167struct 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 176struct ds_t { 177 u_int8_t element_id; 178 u_int8_t length; 179 u_int8_t channel; 180}; 181 182struct 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 191struct 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 226struct 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 253struct 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 264struct 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 273struct 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 282struct 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 293struct 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 304struct 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