1190207Srpaulo/* @(#) $Header: /tcpdump/master/tcpdump/ieee802_11.h,v 1.12 2007-07-22 19:59:06 guy Exp $ (LBL) */ 298524Sfenner/* 398524Sfenner * Copyright (c) 2001 498524Sfenner * Fortress Technologies 598524Sfenner * Charlie Lenahan ( clenahan@fortresstech.com ) 698524Sfenner * 798524Sfenner * Redistribution and use in source and binary forms, with or without 898524Sfenner * modification, are permitted provided that: (1) source code distributions 998524Sfenner * retain the above copyright notice and this paragraph in its entirety, (2) 1098524Sfenner * distributions including binary code include the above copyright notice and 1198524Sfenner * this paragraph in its entirety in the documentation or other materials 1298524Sfenner * provided with the distribution, and (3) all advertising materials mentioning 1398524Sfenner * features or use of this software display the following acknowledgement: 1498524Sfenner * ``This product includes software developed by the University of California, 1598524Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 1698524Sfenner * the University nor the names of its contributors may be used to endorse 1798524Sfenner * or promote products derived from this software without specific prior 1898524Sfenner * written permission. 1998524Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 2098524Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 2198524Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 2298524Sfenner */ 2398524Sfenner 24127668Sbms/* Lengths of 802.11 header components. */ 25127668Sbms#define IEEE802_11_FC_LEN 2 26127668Sbms#define IEEE802_11_DUR_LEN 2 27127668Sbms#define IEEE802_11_DA_LEN 6 28127668Sbms#define IEEE802_11_SA_LEN 6 29127668Sbms#define IEEE802_11_BSSID_LEN 6 30127668Sbms#define IEEE802_11_RA_LEN 6 31127668Sbms#define IEEE802_11_TA_LEN 6 32127668Sbms#define IEEE802_11_SEQ_LEN 2 33170533Ssam#define IEEE802_11_CTL_LEN 2 34127668Sbms#define IEEE802_11_IV_LEN 3 35127668Sbms#define IEEE802_11_KID_LEN 1 3698524Sfenner 37127668Sbms/* Frame check sequence length. */ 38127668Sbms#define IEEE802_11_FCS_LEN 4 3998524Sfenner 40127668Sbms/* Lengths of beacon components. */ 41127668Sbms#define IEEE802_11_TSTAMP_LEN 8 42127668Sbms#define IEEE802_11_BCNINT_LEN 2 43127668Sbms#define IEEE802_11_CAPINFO_LEN 2 44127668Sbms#define IEEE802_11_LISTENINT_LEN 2 45127668Sbms 46127668Sbms#define IEEE802_11_AID_LEN 2 47127668Sbms#define IEEE802_11_STATUS_LEN 2 48127668Sbms#define IEEE802_11_REASON_LEN 2 49127668Sbms 50127668Sbms/* Length of previous AP in reassocation frame */ 51127668Sbms#define IEEE802_11_AP_LEN 6 52127668Sbms 53127668Sbms#define T_MGMT 0x0 /* management */ 54127668Sbms#define T_CTRL 0x1 /* control */ 55127668Sbms#define T_DATA 0x2 /* data */ 56127668Sbms#define T_RESV 0x3 /* reserved */ 57127668Sbms 58127668Sbms#define ST_ASSOC_REQUEST 0x0 59127668Sbms#define ST_ASSOC_RESPONSE 0x1 60127668Sbms#define ST_REASSOC_REQUEST 0x2 61127668Sbms#define ST_REASSOC_RESPONSE 0x3 62127668Sbms#define ST_PROBE_REQUEST 0x4 63127668Sbms#define ST_PROBE_RESPONSE 0x5 6498524Sfenner/* RESERVED 0x6 */ 6598524Sfenner/* RESERVED 0x7 */ 66127668Sbms#define ST_BEACON 0x8 67127668Sbms#define ST_ATIM 0x9 68127668Sbms#define ST_DISASSOC 0xA 69127668Sbms#define ST_AUTH 0xB 70127668Sbms#define ST_DEAUTH 0xC 71195684Ssam#define ST_ACTION 0xD 7298524Sfenner/* RESERVED 0xE */ 7398524Sfenner/* RESERVED 0xF */ 7498524Sfenner 7598524Sfenner 76214478Srpaulo#define CTRL_CONTROL_WRAPPER 0x7 77170533Ssam#define CTRL_BAR 0x8 78195684Ssam#define CTRL_BA 0x9 79127668Sbms#define CTRL_PS_POLL 0xA 80127668Sbms#define CTRL_RTS 0xB 81127668Sbms#define CTRL_CTS 0xC 82127668Sbms#define CTRL_ACK 0xD 83127668Sbms#define CTRL_CF_END 0xE 84127668Sbms#define CTRL_END_ACK 0xF 8598524Sfenner 86172686Smlaier#define DATA_DATA 0x0 87172686Smlaier#define DATA_DATA_CF_ACK 0x1 88172686Smlaier#define DATA_DATA_CF_POLL 0x2 89172686Smlaier#define DATA_DATA_CF_ACK_POLL 0x3 90172686Smlaier#define DATA_NODATA 0x4 91172686Smlaier#define DATA_NODATA_CF_ACK 0x5 92172686Smlaier#define DATA_NODATA_CF_POLL 0x6 93172686Smlaier#define DATA_NODATA_CF_ACK_POLL 0x7 94127668Sbms 95172686Smlaier#define DATA_QOS_DATA 0x8 96172686Smlaier#define DATA_QOS_DATA_CF_ACK 0x9 97172686Smlaier#define DATA_QOS_DATA_CF_POLL 0xA 98172686Smlaier#define DATA_QOS_DATA_CF_ACK_POLL 0xB 99172686Smlaier#define DATA_QOS_NODATA 0xC 100172686Smlaier#define DATA_QOS_CF_POLL_NODATA 0xE 101172686Smlaier#define DATA_QOS_CF_ACK_POLL_NODATA 0xF 102172686Smlaier 10398524Sfenner/* 104172686Smlaier * The subtype field of a data frame is, in effect, composed of 4 flag 105172686Smlaier * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have 106172686Smlaier * any data), and QoS. 107172686Smlaier */ 108172686Smlaier#define DATA_FRAME_IS_CF_ACK(x) ((x) & 0x01) 109172686Smlaier#define DATA_FRAME_IS_CF_POLL(x) ((x) & 0x02) 110172686Smlaier#define DATA_FRAME_IS_NULL(x) ((x) & 0x04) 111172686Smlaier#define DATA_FRAME_IS_QOS(x) ((x) & 0x08) 112172686Smlaier 113172686Smlaier/* 11498524Sfenner * Bits in the frame control field. 11598524Sfenner */ 116127668Sbms#define FC_VERSION(fc) ((fc) & 0x3) 117127668Sbms#define FC_TYPE(fc) (((fc) >> 2) & 0x3) 118127668Sbms#define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF) 119127668Sbms#define FC_TO_DS(fc) ((fc) & 0x0100) 120127668Sbms#define FC_FROM_DS(fc) ((fc) & 0x0200) 121127668Sbms#define FC_MORE_FLAG(fc) ((fc) & 0x0400) 122127668Sbms#define FC_RETRY(fc) ((fc) & 0x0800) 123127668Sbms#define FC_POWER_MGMT(fc) ((fc) & 0x1000) 124127668Sbms#define FC_MORE_DATA(fc) ((fc) & 0x2000) 125127668Sbms#define FC_WEP(fc) ((fc) & 0x4000) 126127668Sbms#define FC_ORDER(fc) ((fc) & 0x8000) 12798524Sfenner 12898524Sfennerstruct mgmt_header_t { 12998524Sfenner u_int16_t fc; 13098524Sfenner u_int16_t duration; 13198524Sfenner u_int8_t da[6]; 13298524Sfenner u_int8_t sa[6]; 13398524Sfenner u_int8_t bssid[6]; 13498524Sfenner u_int16_t seq_ctrl; 13598524Sfenner}; 13698524Sfenner 137127668Sbms#define MGMT_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 138127668Sbms IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\ 139127668Sbms IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN) 14098524Sfenner 141127668Sbms#define CAPABILITY_ESS(cap) ((cap) & 0x0001) 142127668Sbms#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) 143127668Sbms#define CAPABILITY_CFP(cap) ((cap) & 0x0004) 144127668Sbms#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) 145127668Sbms#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) 14698524Sfenner 14798524Sfennerstruct ssid_t { 14898524Sfenner u_int8_t element_id; 14998524Sfenner u_int8_t length; 15098524Sfenner u_char ssid[33]; /* 32 + 1 for null */ 151127668Sbms}; 15298524Sfenner 15398524Sfennerstruct rates_t { 15498524Sfenner u_int8_t element_id; 15598524Sfenner u_int8_t length; 156172686Smlaier u_int8_t rate[16]; 15798524Sfenner}; 15898524Sfenner 15998524Sfennerstruct challenge_t { 16098524Sfenner u_int8_t element_id; 16198524Sfenner u_int8_t length; 16298524Sfenner u_int8_t text[254]; /* 1-253 + 1 for null */ 16398524Sfenner}; 164172686Smlaier 16598524Sfennerstruct fh_t { 16698524Sfenner u_int8_t element_id; 16798524Sfenner u_int8_t length; 16898524Sfenner u_int16_t dwell_time; 16998524Sfenner u_int8_t hop_set; 17098524Sfenner u_int8_t hop_pattern; 17198524Sfenner u_int8_t hop_index; 17298524Sfenner}; 17398524Sfenner 17498524Sfennerstruct ds_t { 17598524Sfenner u_int8_t element_id; 17698524Sfenner u_int8_t length; 17798524Sfenner u_int8_t channel; 17898524Sfenner}; 17998524Sfenner 18098524Sfennerstruct cf_t { 18198524Sfenner u_int8_t element_id; 18298524Sfenner u_int8_t length; 18398524Sfenner u_int8_t count; 18498524Sfenner u_int8_t period; 18598524Sfenner u_int16_t max_duration; 18698524Sfenner u_int16_t dur_remaing; 18798524Sfenner}; 18898524Sfenner 18998524Sfennerstruct tim_t { 19098524Sfenner u_int8_t element_id; 19198524Sfenner u_int8_t length; 19298524Sfenner u_int8_t count; 19398524Sfenner u_int8_t period; 19498524Sfenner u_int8_t bitmap_control; 19598524Sfenner u_int8_t bitmap[251]; 19698524Sfenner}; 19798524Sfenner 198127668Sbms#define E_SSID 0 199127668Sbms#define E_RATES 1 200127668Sbms#define E_FH 2 201127668Sbms#define E_DS 3 202127668Sbms#define E_CF 4 203127668Sbms#define E_TIM 5 204127668Sbms#define E_IBSS 6 20598524Sfenner/* reserved 7 */ 20698524Sfenner/* reserved 8 */ 20798524Sfenner/* reserved 9 */ 20898524Sfenner/* reserved 10 */ 20998524Sfenner/* reserved 11 */ 21098524Sfenner/* reserved 12 */ 21198524Sfenner/* reserved 13 */ 21298524Sfenner/* reserved 14 */ 21398524Sfenner/* reserved 15 */ 21498524Sfenner/* reserved 16 */ 21598524Sfenner 216127668Sbms#define E_CHALLENGE 16 21798524Sfenner/* reserved 17 */ 21898524Sfenner/* reserved 18 */ 21998524Sfenner/* reserved 19 */ 22098524Sfenner/* reserved 16 */ 22198524Sfenner/* reserved 16 */ 22298524Sfenner 22398524Sfenner 22498524Sfennerstruct mgmt_body_t { 225172686Smlaier u_int8_t timestamp[IEEE802_11_TSTAMP_LEN]; 22698524Sfenner u_int16_t beacon_interval; 22798524Sfenner u_int16_t listen_interval; 22898524Sfenner u_int16_t status_code; 22998524Sfenner u_int16_t aid; 230172686Smlaier u_char ap[IEEE802_11_AP_LEN]; 23198524Sfenner u_int16_t reason_code; 23298524Sfenner u_int16_t auth_alg; 23398524Sfenner u_int16_t auth_trans_seq_num; 234214478Srpaulo int challenge_present; 23598524Sfenner struct challenge_t challenge; 23698524Sfenner u_int16_t capability_info; 237214478Srpaulo int ssid_present; 23898524Sfenner struct ssid_t ssid; 239214478Srpaulo int rates_present; 24098524Sfenner struct rates_t rates; 241214478Srpaulo int ds_present; 24298524Sfenner struct ds_t ds; 243214478Srpaulo int cf_present; 24498524Sfenner struct cf_t cf; 245214478Srpaulo int fh_present; 24698524Sfenner struct fh_t fh; 247214478Srpaulo int tim_present; 24898524Sfenner struct tim_t tim; 24998524Sfenner}; 25098524Sfenner 25198524Sfennerstruct ctrl_rts_t { 25298524Sfenner u_int16_t fc; 25398524Sfenner u_int16_t duration; 25498524Sfenner u_int8_t ra[6]; 25598524Sfenner u_int8_t ta[6]; 25698524Sfenner u_int8_t fcs[4]; 25798524Sfenner}; 25898524Sfenner 259127668Sbms#define CTRL_RTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 260127668Sbms IEEE802_11_RA_LEN+IEEE802_11_TA_LEN) 26198524Sfenner 26298524Sfennerstruct ctrl_cts_t { 26398524Sfenner u_int16_t fc; 26498524Sfenner u_int16_t duration; 26598524Sfenner u_int8_t ra[6]; 26698524Sfenner u_int8_t fcs[4]; 26798524Sfenner}; 26898524Sfenner 269127668Sbms#define CTRL_CTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 27098524Sfenner 27198524Sfennerstruct ctrl_ack_t { 27298524Sfenner u_int16_t fc; 27398524Sfenner u_int16_t duration; 27498524Sfenner u_int8_t ra[6]; 27598524Sfenner u_int8_t fcs[4]; 27698524Sfenner}; 27798524Sfenner 278127668Sbms#define CTRL_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 27998524Sfenner 28098524Sfennerstruct ctrl_ps_poll_t { 28198524Sfenner u_int16_t fc; 28298524Sfenner u_int16_t aid; 28398524Sfenner u_int8_t bssid[6]; 28498524Sfenner u_int8_t ta[6]; 28598524Sfenner u_int8_t fcs[4]; 28698524Sfenner}; 28798524Sfenner 288127668Sbms#define CTRL_PS_POLL_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\ 289127668Sbms IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN) 29098524Sfenner 29198524Sfennerstruct ctrl_end_t { 29298524Sfenner u_int16_t fc; 29398524Sfenner u_int16_t duration; 29498524Sfenner u_int8_t ra[6]; 29598524Sfenner u_int8_t bssid[6]; 29698524Sfenner u_int8_t fcs[4]; 29798524Sfenner}; 29898524Sfenner 299127668Sbms#define CTRL_END_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 300127668Sbms IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 30198524Sfenner 30298524Sfennerstruct ctrl_end_ack_t { 30398524Sfenner u_int16_t fc; 30498524Sfenner u_int16_t duration; 30598524Sfenner u_int8_t ra[6]; 30698524Sfenner u_int8_t bssid[6]; 30798524Sfenner u_int8_t fcs[4]; 30898524Sfenner}; 30998524Sfenner 310127668Sbms#define CTRL_END_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 311127668Sbms IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 31298524Sfenner 313195684Ssamstruct ctrl_ba_t { 314195684Ssam u_int16_t fc; 315195684Ssam u_int16_t duration; 316195684Ssam u_int8_t ra[6]; 317195684Ssam u_int8_t fcs[4]; 318195684Ssam}; 319195684Ssam 320195684Ssam#define CTRL_BA_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 321195684Ssam 322170533Ssamstruct ctrl_bar_t { 323170533Ssam u_int16_t fc; 324170533Ssam u_int16_t dur; 325170533Ssam u_int8_t ra[6]; 326170533Ssam u_int8_t ta[6]; 327170533Ssam u_int16_t ctl; 328170533Ssam u_int16_t seq; 329170533Ssam u_int8_t fcs[4]; 330170533Ssam}; 331170533Ssam 332170533Ssam#define CTRL_BAR_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 333170533Ssam IEEE802_11_RA_LEN+IEEE802_11_TA_LEN+\ 334170533Ssam IEEE802_11_CTL_LEN+IEEE802_11_SEQ_LEN) 335170533Ssam 336195684Ssamstruct meshcntl_t { 337195684Ssam u_int8_t flags; 338195684Ssam u_int8_t ttl; 339195684Ssam u_int8_t seq[4]; 340195684Ssam u_int8_t addr4[6]; 341195684Ssam u_int8_t addr5[6]; 342195684Ssam u_int8_t addr6[6]; 343195684Ssam}; 344195684Ssam 345127668Sbms#define IV_IV(iv) ((iv) & 0xFFFFFF) 346127668Sbms#define IV_PAD(iv) (((iv) >> 24) & 0x3F) 347127668Sbms#define IV_KEYID(iv) (((iv) >> 30) & 0x03) 348