1/* @(#) $Header: /tcpdump/master/tcpdump/ieee802_11.h,v 1.9.4.2 2005/11/13 12:07:44 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/* 92 * Bits in the frame control field. 93 */ 94#define FC_VERSION(fc) ((fc) & 0x3) 95#define FC_TYPE(fc) (((fc) >> 2) & 0x3) 96#define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF) 97#define FC_TO_DS(fc) ((fc) & 0x0100) 98#define FC_FROM_DS(fc) ((fc) & 0x0200) 99#define FC_MORE_FLAG(fc) ((fc) & 0x0400) 100#define FC_RETRY(fc) ((fc) & 0x0800) 101#define FC_POWER_MGMT(fc) ((fc) & 0x1000) 102#define FC_MORE_DATA(fc) ((fc) & 0x2000) 103#define FC_WEP(fc) ((fc) & 0x4000) 104#define FC_ORDER(fc) ((fc) & 0x8000) 105 106struct mgmt_header_t { 107 u_int16_t fc; 108 u_int16_t duration; 109 u_int8_t da[6]; 110 u_int8_t sa[6]; 111 u_int8_t bssid[6]; 112 u_int16_t seq_ctrl; 113}; 114 115#define MGMT_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 116 IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\ 117 IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN) 118 119#define CAPABILITY_ESS(cap) ((cap) & 0x0001) 120#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) 121#define CAPABILITY_CFP(cap) ((cap) & 0x0004) 122#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) 123#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) 124 125typedef enum { 126 NOT_PRESENT, 127 PRESENT, 128 TRUNCATED 129} elem_status_t; 130 131struct ssid_t { 132 u_int8_t element_id; 133 u_int8_t length; 134 u_char ssid[33]; /* 32 + 1 for null */ 135}; 136 137struct rates_t { 138 u_int8_t element_id; 139 u_int8_t length; 140 u_int8_t rate[16]; 141}; 142 143struct challenge_t { 144 u_int8_t element_id; 145 u_int8_t length; 146 u_int8_t text[254]; /* 1-253 + 1 for null */ 147}; 148 149struct fh_t { 150 u_int8_t element_id; 151 u_int8_t length; 152 u_int16_t dwell_time; 153 u_int8_t hop_set; 154 u_int8_t hop_pattern; 155 u_int8_t hop_index; 156}; 157 158struct ds_t { 159 u_int8_t element_id; 160 u_int8_t length; 161 u_int8_t channel; 162}; 163 164struct cf_t { 165 u_int8_t element_id; 166 u_int8_t length; 167 u_int8_t count; 168 u_int8_t period; 169 u_int16_t max_duration; 170 u_int16_t dur_remaing; 171}; 172 173struct tim_t { 174 u_int8_t element_id; 175 u_int8_t length; 176 u_int8_t count; 177 u_int8_t period; 178 u_int8_t bitmap_control; 179 u_int8_t bitmap[251]; 180}; 181 182#define E_SSID 0 183#define E_RATES 1 184#define E_FH 2 185#define E_DS 3 186#define E_CF 4 187#define E_TIM 5 188#define E_IBSS 6 189/* reserved 7 */ 190/* reserved 8 */ 191/* reserved 9 */ 192/* reserved 10 */ 193/* reserved 11 */ 194/* reserved 12 */ 195/* reserved 13 */ 196/* reserved 14 */ 197/* reserved 15 */ 198/* reserved 16 */ 199 200#define E_CHALLENGE 16 201/* reserved 17 */ 202/* reserved 18 */ 203/* reserved 19 */ 204/* reserved 16 */ 205/* reserved 16 */ 206 207 208struct mgmt_body_t { 209 u_int8_t timestamp[IEEE802_11_TSTAMP_LEN]; 210 u_int16_t beacon_interval; 211 u_int16_t listen_interval; 212 u_int16_t status_code; 213 u_int16_t aid; 214 u_char ap[IEEE802_11_AP_LEN]; 215 u_int16_t reason_code; 216 u_int16_t auth_alg; 217 u_int16_t auth_trans_seq_num; 218 elem_status_t challenge_status; 219 struct challenge_t challenge; 220 u_int16_t capability_info; 221 elem_status_t ssid_status; 222 struct ssid_t ssid; 223 elem_status_t rates_status; 224 struct rates_t rates; 225 elem_status_t ds_status; 226 struct ds_t ds; 227 elem_status_t cf_status; 228 struct cf_t cf; 229 elem_status_t fh_status; 230 struct fh_t fh; 231 elem_status_t tim_status; 232 struct tim_t tim; 233}; 234 235struct ctrl_rts_t { 236 u_int16_t fc; 237 u_int16_t duration; 238 u_int8_t ra[6]; 239 u_int8_t ta[6]; 240 u_int8_t fcs[4]; 241}; 242 243#define CTRL_RTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 244 IEEE802_11_RA_LEN+IEEE802_11_TA_LEN) 245 246struct ctrl_cts_t { 247 u_int16_t fc; 248 u_int16_t duration; 249 u_int8_t ra[6]; 250 u_int8_t fcs[4]; 251}; 252 253#define CTRL_CTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 254 255struct ctrl_ack_t { 256 u_int16_t fc; 257 u_int16_t duration; 258 u_int8_t ra[6]; 259 u_int8_t fcs[4]; 260}; 261 262#define CTRL_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 263 264struct ctrl_ps_poll_t { 265 u_int16_t fc; 266 u_int16_t aid; 267 u_int8_t bssid[6]; 268 u_int8_t ta[6]; 269 u_int8_t fcs[4]; 270}; 271 272#define CTRL_PS_POLL_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\ 273 IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN) 274 275struct ctrl_end_t { 276 u_int16_t fc; 277 u_int16_t duration; 278 u_int8_t ra[6]; 279 u_int8_t bssid[6]; 280 u_int8_t fcs[4]; 281}; 282 283#define CTRL_END_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 284 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 285 286struct ctrl_end_ack_t { 287 u_int16_t fc; 288 u_int16_t duration; 289 u_int8_t ra[6]; 290 u_int8_t bssid[6]; 291 u_int8_t fcs[4]; 292}; 293 294#define CTRL_END_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 295 IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 296 297#define IV_IV(iv) ((iv) & 0xFFFFFF) 298#define IV_PAD(iv) (((iv) >> 24) & 0x3F) 299#define IV_KEYID(iv) (((iv) >> 30) & 0x03) 300