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 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