ieee802_11.h revision 172686
1170533Ssam/* $FreeBSD: head/contrib/tcpdump/ieee802_11.h 172686 2007-10-16 02:31:48Z mlaier $ */ 2172686Smlaier/* @(#) $Header: /tcpdump/master/tcpdump/ieee802_11.h,v 1.9.4.3 2007/07/22 20:01:16 guy Exp $ (LBL) */ 398524Sfenner/* 498524Sfenner * Copyright (c) 2001 598524Sfenner * Fortress Technologies 698524Sfenner * Charlie Lenahan ( clenahan@fortresstech.com ) 798524Sfenner * 898524Sfenner * Redistribution and use in source and binary forms, with or without 998524Sfenner * modification, are permitted provided that: (1) source code distributions 1098524Sfenner * retain the above copyright notice and this paragraph in its entirety, (2) 1198524Sfenner * distributions including binary code include the above copyright notice and 1298524Sfenner * this paragraph in its entirety in the documentation or other materials 1398524Sfenner * provided with the distribution, and (3) all advertising materials mentioning 1498524Sfenner * features or use of this software display the following acknowledgement: 1598524Sfenner * ``This product includes software developed by the University of California, 1698524Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 1798524Sfenner * the University nor the names of its contributors may be used to endorse 1898524Sfenner * or promote products derived from this software without specific prior 1998524Sfenner * written permission. 2098524Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 2198524Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 2298524Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 2398524Sfenner */ 2498524Sfenner 25127668Sbms/* Lengths of 802.11 header components. */ 26127668Sbms#define IEEE802_11_FC_LEN 2 27127668Sbms#define IEEE802_11_DUR_LEN 2 28127668Sbms#define IEEE802_11_DA_LEN 6 29127668Sbms#define IEEE802_11_SA_LEN 6 30127668Sbms#define IEEE802_11_BSSID_LEN 6 31127668Sbms#define IEEE802_11_RA_LEN 6 32127668Sbms#define IEEE802_11_TA_LEN 6 33127668Sbms#define IEEE802_11_SEQ_LEN 2 34170533Ssam#define IEEE802_11_CTL_LEN 2 35127668Sbms#define IEEE802_11_IV_LEN 3 36127668Sbms#define IEEE802_11_KID_LEN 1 3798524Sfenner 38127668Sbms/* Frame check sequence length. */ 39127668Sbms#define IEEE802_11_FCS_LEN 4 4098524Sfenner 41127668Sbms/* Lengths of beacon components. */ 42127668Sbms#define IEEE802_11_TSTAMP_LEN 8 43127668Sbms#define IEEE802_11_BCNINT_LEN 2 44127668Sbms#define IEEE802_11_CAPINFO_LEN 2 45127668Sbms#define IEEE802_11_LISTENINT_LEN 2 46127668Sbms 47127668Sbms#define IEEE802_11_AID_LEN 2 48127668Sbms#define IEEE802_11_STATUS_LEN 2 49127668Sbms#define IEEE802_11_REASON_LEN 2 50127668Sbms 51127668Sbms/* Length of previous AP in reassocation frame */ 52127668Sbms#define IEEE802_11_AP_LEN 6 53127668Sbms 54127668Sbms#define T_MGMT 0x0 /* management */ 55127668Sbms#define T_CTRL 0x1 /* control */ 56127668Sbms#define T_DATA 0x2 /* data */ 57127668Sbms#define T_RESV 0x3 /* reserved */ 58127668Sbms 59127668Sbms#define ST_ASSOC_REQUEST 0x0 60127668Sbms#define ST_ASSOC_RESPONSE 0x1 61127668Sbms#define ST_REASSOC_REQUEST 0x2 62127668Sbms#define ST_REASSOC_RESPONSE 0x3 63127668Sbms#define ST_PROBE_REQUEST 0x4 64127668Sbms#define ST_PROBE_RESPONSE 0x5 6598524Sfenner/* RESERVED 0x6 */ 6698524Sfenner/* RESERVED 0x7 */ 67127668Sbms#define ST_BEACON 0x8 68127668Sbms#define ST_ATIM 0x9 69127668Sbms#define ST_DISASSOC 0xA 70127668Sbms#define ST_AUTH 0xB 71127668Sbms#define ST_DEAUTH 0xC 7298524Sfenner/* RESERVED 0xD */ 7398524Sfenner/* RESERVED 0xE */ 7498524Sfenner/* RESERVED 0xF */ 7598524Sfenner 7698524Sfenner 77170533Ssam#define CTRL_BAR 0x8 78127668Sbms#define CTRL_PS_POLL 0xA 79127668Sbms#define CTRL_RTS 0xB 80127668Sbms#define CTRL_CTS 0xC 81127668Sbms#define CTRL_ACK 0xD 82127668Sbms#define CTRL_CF_END 0xE 83127668Sbms#define CTRL_END_ACK 0xF 8498524Sfenner 85172686Smlaier#define DATA_DATA 0x0 86172686Smlaier#define DATA_DATA_CF_ACK 0x1 87172686Smlaier#define DATA_DATA_CF_POLL 0x2 88172686Smlaier#define DATA_DATA_CF_ACK_POLL 0x3 89172686Smlaier#define DATA_NODATA 0x4 90172686Smlaier#define DATA_NODATA_CF_ACK 0x5 91172686Smlaier#define DATA_NODATA_CF_POLL 0x6 92172686Smlaier#define DATA_NODATA_CF_ACK_POLL 0x7 93127668Sbms 94172686Smlaier#define DATA_QOS_DATA 0x8 95172686Smlaier#define DATA_QOS_DATA_CF_ACK 0x9 96172686Smlaier#define DATA_QOS_DATA_CF_POLL 0xA 97172686Smlaier#define DATA_QOS_DATA_CF_ACK_POLL 0xB 98172686Smlaier#define DATA_QOS_NODATA 0xC 99172686Smlaier#define DATA_QOS_CF_POLL_NODATA 0xE 100172686Smlaier#define DATA_QOS_CF_ACK_POLL_NODATA 0xF 101172686Smlaier 10298524Sfenner/* 103172686Smlaier * The subtype field of a data frame is, in effect, composed of 4 flag 104172686Smlaier * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have 105172686Smlaier * any data), and QoS. 106172686Smlaier */ 107172686Smlaier#define DATA_FRAME_IS_CF_ACK(x) ((x) & 0x01) 108172686Smlaier#define DATA_FRAME_IS_CF_POLL(x) ((x) & 0x02) 109172686Smlaier#define DATA_FRAME_IS_NULL(x) ((x) & 0x04) 110172686Smlaier#define DATA_FRAME_IS_QOS(x) ((x) & 0x08) 111172686Smlaier 112172686Smlaier/* 11398524Sfenner * Bits in the frame control field. 11498524Sfenner */ 115127668Sbms#define FC_VERSION(fc) ((fc) & 0x3) 116127668Sbms#define FC_TYPE(fc) (((fc) >> 2) & 0x3) 117127668Sbms#define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF) 118127668Sbms#define FC_TO_DS(fc) ((fc) & 0x0100) 119127668Sbms#define FC_FROM_DS(fc) ((fc) & 0x0200) 120127668Sbms#define FC_MORE_FLAG(fc) ((fc) & 0x0400) 121127668Sbms#define FC_RETRY(fc) ((fc) & 0x0800) 122127668Sbms#define FC_POWER_MGMT(fc) ((fc) & 0x1000) 123127668Sbms#define FC_MORE_DATA(fc) ((fc) & 0x2000) 124127668Sbms#define FC_WEP(fc) ((fc) & 0x4000) 125127668Sbms#define FC_ORDER(fc) ((fc) & 0x8000) 12698524Sfenner 12798524Sfennerstruct mgmt_header_t { 12898524Sfenner u_int16_t fc; 12998524Sfenner u_int16_t duration; 13098524Sfenner u_int8_t da[6]; 13198524Sfenner u_int8_t sa[6]; 13298524Sfenner u_int8_t bssid[6]; 13398524Sfenner u_int16_t seq_ctrl; 13498524Sfenner}; 13598524Sfenner 136127668Sbms#define MGMT_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 137127668Sbms IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\ 138127668Sbms IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN) 13998524Sfenner 140127668Sbms#define CAPABILITY_ESS(cap) ((cap) & 0x0001) 141127668Sbms#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) 142127668Sbms#define CAPABILITY_CFP(cap) ((cap) & 0x0004) 143127668Sbms#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) 144127668Sbms#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) 14598524Sfenner 146172686Smlaiertypedef enum { 147172686Smlaier NOT_PRESENT, 148172686Smlaier PRESENT, 149172686Smlaier TRUNCATED 150172686Smlaier} elem_status_t; 151172686Smlaier 15298524Sfennerstruct ssid_t { 15398524Sfenner u_int8_t element_id; 15498524Sfenner u_int8_t length; 15598524Sfenner u_char ssid[33]; /* 32 + 1 for null */ 156127668Sbms}; 15798524Sfenner 15898524Sfennerstruct rates_t { 15998524Sfenner u_int8_t element_id; 16098524Sfenner u_int8_t length; 161172686Smlaier u_int8_t rate[16]; 16298524Sfenner}; 16398524Sfenner 16498524Sfennerstruct challenge_t { 16598524Sfenner u_int8_t element_id; 16698524Sfenner u_int8_t length; 16798524Sfenner u_int8_t text[254]; /* 1-253 + 1 for null */ 16898524Sfenner}; 169172686Smlaier 17098524Sfennerstruct fh_t { 17198524Sfenner u_int8_t element_id; 17298524Sfenner u_int8_t length; 17398524Sfenner u_int16_t dwell_time; 17498524Sfenner u_int8_t hop_set; 17598524Sfenner u_int8_t hop_pattern; 17698524Sfenner u_int8_t hop_index; 17798524Sfenner}; 17898524Sfenner 17998524Sfennerstruct ds_t { 18098524Sfenner u_int8_t element_id; 18198524Sfenner u_int8_t length; 18298524Sfenner u_int8_t channel; 18398524Sfenner}; 18498524Sfenner 18598524Sfennerstruct cf_t { 18698524Sfenner u_int8_t element_id; 18798524Sfenner u_int8_t length; 18898524Sfenner u_int8_t count; 18998524Sfenner u_int8_t period; 19098524Sfenner u_int16_t max_duration; 19198524Sfenner u_int16_t dur_remaing; 19298524Sfenner}; 19398524Sfenner 19498524Sfennerstruct tim_t { 19598524Sfenner u_int8_t element_id; 19698524Sfenner u_int8_t length; 19798524Sfenner u_int8_t count; 19898524Sfenner u_int8_t period; 19998524Sfenner u_int8_t bitmap_control; 20098524Sfenner u_int8_t bitmap[251]; 20198524Sfenner}; 20298524Sfenner 203127668Sbms#define E_SSID 0 204127668Sbms#define E_RATES 1 205127668Sbms#define E_FH 2 206127668Sbms#define E_DS 3 207127668Sbms#define E_CF 4 208127668Sbms#define E_TIM 5 209127668Sbms#define E_IBSS 6 21098524Sfenner/* reserved 7 */ 21198524Sfenner/* reserved 8 */ 21298524Sfenner/* reserved 9 */ 21398524Sfenner/* reserved 10 */ 21498524Sfenner/* reserved 11 */ 21598524Sfenner/* reserved 12 */ 21698524Sfenner/* reserved 13 */ 21798524Sfenner/* reserved 14 */ 21898524Sfenner/* reserved 15 */ 21998524Sfenner/* reserved 16 */ 22098524Sfenner 221127668Sbms#define E_CHALLENGE 16 22298524Sfenner/* reserved 17 */ 22398524Sfenner/* reserved 18 */ 22498524Sfenner/* reserved 19 */ 22598524Sfenner/* reserved 16 */ 22698524Sfenner/* reserved 16 */ 22798524Sfenner 22898524Sfenner 22998524Sfennerstruct mgmt_body_t { 230172686Smlaier u_int8_t timestamp[IEEE802_11_TSTAMP_LEN]; 23198524Sfenner u_int16_t beacon_interval; 23298524Sfenner u_int16_t listen_interval; 23398524Sfenner u_int16_t status_code; 23498524Sfenner u_int16_t aid; 235172686Smlaier u_char ap[IEEE802_11_AP_LEN]; 23698524Sfenner u_int16_t reason_code; 23798524Sfenner u_int16_t auth_alg; 23898524Sfenner u_int16_t auth_trans_seq_num; 239172686Smlaier elem_status_t challenge_status; 24098524Sfenner struct challenge_t challenge; 24198524Sfenner u_int16_t capability_info; 242172686Smlaier elem_status_t ssid_status; 24398524Sfenner struct ssid_t ssid; 244172686Smlaier elem_status_t rates_status; 24598524Sfenner struct rates_t rates; 246172686Smlaier elem_status_t ds_status; 24798524Sfenner struct ds_t ds; 248172686Smlaier elem_status_t cf_status; 24998524Sfenner struct cf_t cf; 250172686Smlaier elem_status_t fh_status; 25198524Sfenner struct fh_t fh; 252172686Smlaier elem_status_t tim_status; 25398524Sfenner struct tim_t tim; 25498524Sfenner}; 25598524Sfenner 25698524Sfennerstruct ctrl_rts_t { 25798524Sfenner u_int16_t fc; 25898524Sfenner u_int16_t duration; 25998524Sfenner u_int8_t ra[6]; 26098524Sfenner u_int8_t ta[6]; 26198524Sfenner u_int8_t fcs[4]; 26298524Sfenner}; 26398524Sfenner 264127668Sbms#define CTRL_RTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 265127668Sbms IEEE802_11_RA_LEN+IEEE802_11_TA_LEN) 26698524Sfenner 26798524Sfennerstruct ctrl_cts_t { 26898524Sfenner u_int16_t fc; 26998524Sfenner u_int16_t duration; 27098524Sfenner u_int8_t ra[6]; 27198524Sfenner u_int8_t fcs[4]; 27298524Sfenner}; 27398524Sfenner 274127668Sbms#define CTRL_CTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 27598524Sfenner 27698524Sfennerstruct ctrl_ack_t { 27798524Sfenner u_int16_t fc; 27898524Sfenner u_int16_t duration; 27998524Sfenner u_int8_t ra[6]; 28098524Sfenner u_int8_t fcs[4]; 28198524Sfenner}; 28298524Sfenner 283127668Sbms#define CTRL_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 28498524Sfenner 28598524Sfennerstruct ctrl_ps_poll_t { 28698524Sfenner u_int16_t fc; 28798524Sfenner u_int16_t aid; 28898524Sfenner u_int8_t bssid[6]; 28998524Sfenner u_int8_t ta[6]; 29098524Sfenner u_int8_t fcs[4]; 29198524Sfenner}; 29298524Sfenner 293127668Sbms#define CTRL_PS_POLL_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\ 294127668Sbms IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN) 29598524Sfenner 29698524Sfennerstruct ctrl_end_t { 29798524Sfenner u_int16_t fc; 29898524Sfenner u_int16_t duration; 29998524Sfenner u_int8_t ra[6]; 30098524Sfenner u_int8_t bssid[6]; 30198524Sfenner u_int8_t fcs[4]; 30298524Sfenner}; 30398524Sfenner 304127668Sbms#define CTRL_END_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 305127668Sbms IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 30698524Sfenner 30798524Sfennerstruct ctrl_end_ack_t { 30898524Sfenner u_int16_t fc; 30998524Sfenner u_int16_t duration; 31098524Sfenner u_int8_t ra[6]; 31198524Sfenner u_int8_t bssid[6]; 31298524Sfenner u_int8_t fcs[4]; 31398524Sfenner}; 31498524Sfenner 315127668Sbms#define CTRL_END_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 316127668Sbms IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 31798524Sfenner 318170533Ssamstruct ctrl_bar_t { 319170533Ssam u_int16_t fc; 320170533Ssam u_int16_t dur; 321170533Ssam u_int8_t ra[6]; 322170533Ssam u_int8_t ta[6]; 323170533Ssam u_int16_t ctl; 324170533Ssam u_int16_t seq; 325170533Ssam u_int8_t fcs[4]; 326170533Ssam}; 327170533Ssam 328170533Ssam#define CTRL_BAR_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 329170533Ssam IEEE802_11_RA_LEN+IEEE802_11_TA_LEN+\ 330170533Ssam IEEE802_11_CTL_LEN+IEEE802_11_SEQ_LEN) 331170533Ssam 332127668Sbms#define IV_IV(iv) ((iv) & 0xFFFFFF) 333127668Sbms#define IV_PAD(iv) (((iv) >> 24) & 0x3F) 334127668Sbms#define IV_KEYID(iv) (((iv) >> 30) & 0x03) 335