12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 2001 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Fortress Technologies, Inc. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Charlie Lenahan (clenahan@fortresstech.com) 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define NETDISSECT_REWORKED 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "cpack.h" 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 39892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 40892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* Lengths of 802.11 header components. */ 41892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_FC_LEN 2 42892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_DUR_LEN 2 43892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_DA_LEN 6 44892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_SA_LEN 6 45892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_BSSID_LEN 6 46892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_RA_LEN 6 47892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_TA_LEN 6 48892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_SEQ_LEN 2 49892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_CTL_LEN 2 50892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_IV_LEN 3 51892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_KID_LEN 1 52892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 53892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* Frame check sequence length. */ 54892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_FCS_LEN 4 55892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 56892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* Lengths of beacon components. */ 57892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_TSTAMP_LEN 8 58892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_BCNINT_LEN 2 59892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_CAPINFO_LEN 2 60892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_LISTENINT_LEN 2 61892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 62892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_AID_LEN 2 63892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_STATUS_LEN 2 64892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_REASON_LEN 2 65892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 66892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* Length of previous AP in reassocation frame */ 67892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE802_11_AP_LEN 6 68892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 69892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define T_MGMT 0x0 /* management */ 70892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define T_CTRL 0x1 /* control */ 71892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define T_DATA 0x2 /* data */ 72892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define T_RESV 0x3 /* reserved */ 73892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 74892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_ASSOC_REQUEST 0x0 75892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_ASSOC_RESPONSE 0x1 76892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_REASSOC_REQUEST 0x2 77892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_REASSOC_RESPONSE 0x3 78892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_PROBE_REQUEST 0x4 79892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_PROBE_RESPONSE 0x5 80892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* RESERVED 0x6 */ 81892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* RESERVED 0x7 */ 82892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_BEACON 0x8 83892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_ATIM 0x9 84892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_DISASSOC 0xA 85892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_AUTH 0xB 86892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_DEAUTH 0xC 87892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define ST_ACTION 0xD 88892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* RESERVED 0xE */ 89892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* RESERVED 0xF */ 90892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 91892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const struct tok st_str[] = { 92892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_ASSOC_REQUEST, "Assoc Request" }, 93892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_ASSOC_RESPONSE, "Assoc Response" }, 94892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_REASSOC_REQUEST, "ReAssoc Request" }, 95892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_REASSOC_RESPONSE, "ReAssoc Response" }, 96892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_PROBE_REQUEST, "Probe Request" }, 97892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_PROBE_RESPONSE, "Probe Response" }, 98892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_BEACON, "Beacon" }, 99892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_ATIM, "ATIM" }, 100892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_DISASSOC, "Disassociation" }, 101892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_AUTH, "Authentication" }, 102892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_DEAUTH, "DeAuthentication" }, 103892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { ST_ACTION, "Action" }, 104892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { 0, NULL } 105892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 106892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 107892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_CONTROL_WRAPPER 0x7 108892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_BAR 0x8 109892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_BA 0x9 110892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_PS_POLL 0xA 111892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_RTS 0xB 112892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_CTS 0xC 113892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_ACK 0xD 114892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_CF_END 0xE 115892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_END_ACK 0xF 116892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 117892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const struct tok ctrl_str[] = { 118892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_CONTROL_WRAPPER, "Control Wrapper" }, 119892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_BAR, "BAR" }, 120892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_BA, "BA" }, 121892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_PS_POLL, "Power Save-Poll" }, 122892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_RTS, "Request-To-Send" }, 123892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_CTS, "Clear-To-Send" }, 124892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_ACK, "Acknowledgment" }, 125892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_CF_END, "CF-End" }, 126892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { CTRL_END_ACK, "CF-End+CF-Ack" }, 127892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes { 0, NULL } 128892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 129892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 130892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_DATA 0x0 131892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_DATA_CF_ACK 0x1 132892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_DATA_CF_POLL 0x2 133892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_DATA_CF_ACK_POLL 0x3 134892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_NODATA 0x4 135892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_NODATA_CF_ACK 0x5 136892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_NODATA_CF_POLL 0x6 137892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_NODATA_CF_ACK_POLL 0x7 138892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 139892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_QOS_DATA 0x8 140892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_QOS_DATA_CF_ACK 0x9 141892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_QOS_DATA_CF_POLL 0xA 142892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_QOS_DATA_CF_ACK_POLL 0xB 143892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_QOS_NODATA 0xC 144892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_QOS_CF_POLL_NODATA 0xE 145892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_QOS_CF_ACK_POLL_NODATA 0xF 146892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 147892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* 148892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * The subtype field of a data frame is, in effect, composed of 4 flag 149892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * bits - CF-Ack, CF-Poll, Null (means the frame doesn't actually have 150892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * any data), and QoS. 151892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 152892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_FRAME_IS_CF_ACK(x) ((x) & 0x01) 153892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_FRAME_IS_CF_POLL(x) ((x) & 0x02) 154892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_FRAME_IS_NULL(x) ((x) & 0x04) 155892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define DATA_FRAME_IS_QOS(x) ((x) & 0x08) 156892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 157892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* 158892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Bits in the frame control field. 159892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 160892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_VERSION(fc) ((fc) & 0x3) 161892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_TYPE(fc) (((fc) >> 2) & 0x3) 162892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_SUBTYPE(fc) (((fc) >> 4) & 0xF) 163892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_TO_DS(fc) ((fc) & 0x0100) 164892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_FROM_DS(fc) ((fc) & 0x0200) 165892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_MORE_FLAG(fc) ((fc) & 0x0400) 166892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_RETRY(fc) ((fc) & 0x0800) 167892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_POWER_MGMT(fc) ((fc) & 0x1000) 168892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_MORE_DATA(fc) ((fc) & 0x2000) 169892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_WEP(fc) ((fc) & 0x4000) 170892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define FC_ORDER(fc) ((fc) & 0x8000) 171892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 172892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct mgmt_header_t { 173892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 174892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t duration; 175892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t da[6]; 176892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t sa[6]; 177892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bssid[6]; 178892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t seq_ctrl; 179892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 180892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 181892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define MGMT_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 182892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_DA_LEN+IEEE802_11_SA_LEN+\ 183892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_BSSID_LEN+IEEE802_11_SEQ_LEN) 184892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 185892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CAPABILITY_ESS(cap) ((cap) & 0x0001) 186892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CAPABILITY_IBSS(cap) ((cap) & 0x0002) 187892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CAPABILITY_CFP(cap) ((cap) & 0x0004) 188892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CAPABILITY_CFP_REQ(cap) ((cap) & 0x0008) 189892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CAPABILITY_PRIVACY(cap) ((cap) & 0x0010) 190892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 191892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ssid_t { 192892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t element_id; 193892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length; 194892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes u_char ssid[33]; /* 32 + 1 for null */ 195892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 196892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 197892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct rates_t { 198892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t element_id; 199892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length; 200892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t rate[16]; 201892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 202892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 203892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct challenge_t { 204892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t element_id; 205892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length; 206892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t text[254]; /* 1-253 + 1 for null */ 207892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 208892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 209892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct fh_t { 210892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t element_id; 211892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length; 212892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t dwell_time; 213892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t hop_set; 214892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t hop_pattern; 215892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t hop_index; 216892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 217892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 218892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ds_t { 219892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t element_id; 220892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length; 221892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t channel; 222892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 223892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 224892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct cf_t { 225892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t element_id; 226892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length; 227892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t count; 228892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t period; 229892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t max_duration; 230892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t dur_remaing; 231892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 232892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 233892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct tim_t { 234892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t element_id; 235892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length; 236892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t count; 237892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t period; 238892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bitmap_control; 239892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bitmap[251]; 240892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 241892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 242892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_SSID 0 243892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_RATES 1 244892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_FH 2 245892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_DS 3 246892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_CF 4 247892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_TIM 5 248892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_IBSS 6 249892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 7 */ 250892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 8 */ 251892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 9 */ 252892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 10 */ 253892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 11 */ 254892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 12 */ 255892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 13 */ 256892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 14 */ 257892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 15 */ 258892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 16 */ 259892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 260892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define E_CHALLENGE 16 261892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 17 */ 262892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 18 */ 263892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 19 */ 264892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 16 */ 265892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* reserved 16 */ 266892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 267892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 268892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct mgmt_body_t { 269892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t timestamp[IEEE802_11_TSTAMP_LEN]; 270892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t beacon_interval; 271892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t listen_interval; 272892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t status_code; 273892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t aid; 274892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes u_char ap[IEEE802_11_AP_LEN]; 275892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t reason_code; 276892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t auth_alg; 277892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t auth_trans_seq_num; 278892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int challenge_present; 279892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct challenge_t challenge; 280892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t capability_info; 281892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int ssid_present; 282892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct ssid_t ssid; 283892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int rates_present; 284892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct rates_t rates; 285892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int ds_present; 286892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct ds_t ds; 287892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int cf_present; 288892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct cf_t cf; 289892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int fh_present; 290892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct fh_t fh; 291892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int tim_present; 292892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct tim_t tim; 293892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 294892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 295892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_rts_t { 296892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 297892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t duration; 298892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ra[6]; 299892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ta[6]; 300892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 301892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 302892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 303892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_RTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 304892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_RA_LEN+IEEE802_11_TA_LEN) 305892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 306892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_cts_t { 307892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 308892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t duration; 309892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ra[6]; 310892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 311892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 312892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 313892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_CTS_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 314892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 315892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_ack_t { 316892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 317892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t duration; 318892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ra[6]; 319892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 320892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 321892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 322892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 323892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 324892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_ps_poll_t { 325892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 326892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t aid; 327892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bssid[6]; 328892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ta[6]; 329892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 330892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 331892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 332892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_PS_POLL_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_AID_LEN+\ 333892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_BSSID_LEN+IEEE802_11_TA_LEN) 334892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 335892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_end_t { 336892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 337892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t duration; 338892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ra[6]; 339892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bssid[6]; 340892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 341892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 342892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 343892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_END_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 344892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 345892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 346892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_end_ack_t { 347892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 348892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t duration; 349892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ra[6]; 350892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bssid[6]; 351892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 352892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 353892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 354892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_END_ACK_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 355892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_RA_LEN+IEEE802_11_BSSID_LEN) 356892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 357892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_ba_t { 358892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 359892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t duration; 360892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ra[6]; 361892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 362892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 363892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 364892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_BA_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+IEEE802_11_RA_LEN) 365892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 366892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ctrl_bar_t { 367892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 368892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t dur; 369892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ra[6]; 370892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ta[6]; 371892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t ctl; 372892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t seq; 373892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t fcs[4]; 374892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 375892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 376892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define CTRL_BAR_HDRLEN (IEEE802_11_FC_LEN+IEEE802_11_DUR_LEN+\ 377892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_RA_LEN+IEEE802_11_TA_LEN+\ 378892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE802_11_CTL_LEN+IEEE802_11_SEQ_LEN) 379892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 380892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct meshcntl_t { 381892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t flags; 382892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ttl; 383892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t seq[4]; 384892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t addr4[6]; 385892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t addr5[6]; 386892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t addr6[6]; 387892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 388892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 389892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IV_IV(iv) ((iv) & 0xFFFFFF) 390892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IV_PAD(iv) (((iv) >> 24) & 0x3F) 391892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IV_KEYID(iv) (((iv) >> 30) & 0x03) 392892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 393892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* $FreeBSD: src/sys/net80211/ieee80211_radiotap.h,v 1.5 2005/01/22 20:12:05 sam Exp $ */ 394892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* NetBSD: ieee802_11_radio.h,v 1.2 2006/02/26 03:04:03 dyoung Exp */ 395892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 396892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/*- 397892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Copyright (c) 2003, 2004 David Young. All rights reserved. 398892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 399892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Redistribution and use in source and binary forms, with or without 400892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * modification, are permitted provided that the following conditions 401892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * are met: 402892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 1. Redistributions of source code must retain the above copyright 403892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * notice, this list of conditions and the following disclaimer. 404892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 405892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * notice, this list of conditions and the following disclaimer in the 406892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * documentation and/or other materials provided with the distribution. 407892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 3. The name of David Young may not be used to endorse or promote 408892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * products derived from this software without specific prior 409892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * written permission. 410892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 411892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY 412892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 413892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 414892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID 415892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 416892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 417892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 418892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 419892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 420892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 421892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 422892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * OF SUCH DAMAGE. 423892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 424892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 425892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* A generic radio capture format is desirable. It must be 426892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * rigidly defined (e.g., units for fields should be given), 427892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * and easily extensible. 428892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 429892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * The following is an extensible radio capture format. It is 430892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * based on a bitmap indicating which fields are present. 431892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 432892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * I am trying to describe precisely what the application programmer 433892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * should expect in the following, and for that reason I tell the 434892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * units and origin of each measurement (where it applies), or else I 435892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * use sufficiently weaselly language ("is a monotonically nondecreasing 436892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * function of...") that I cannot set false expectations for lawyerly 437892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * readers. 438892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 439892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 440892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* 441892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * The radio capture header precedes the 802.11 header. 442892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 443892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Note well: all radiotap fields are little-endian. 444892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 445892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct ieee80211_radiotap_header { 446892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t it_version; /* Version 0. Only increases 447892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * for drastic changes, 448892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * introduction of compatible 449892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * new fields does not count. 450892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 451892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t it_pad; 452892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t it_len; /* length of the whole 453892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * header in bytes, including 454892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * it_version, it_pad, 455892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * it_len, and data fields. 456892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 457892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t it_present; /* A bitmap telling which 458892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * fields are present. Set bit 31 459892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * (0x80000000) to extend the 460892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * bitmap by another 32 bits. 461892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Additional extensions are made 462892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * by setting bit 31. 463892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 464892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 465892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 466892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* Name Data type Units 467892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * ---- --------- ----- 468892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 469892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_TSFT uint64_t microseconds 470892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 471892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Value in microseconds of the MAC's 64-bit 802.11 Time 472892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Synchronization Function timer when the first bit of the 473892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * MPDU arrived at the MAC. For received frames, only. 474892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 475892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_CHANNEL 2 x uint16_t MHz, bitmap 476892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 477892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Tx/Rx frequency in MHz, followed by flags (see below). 478892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Note that IEEE80211_RADIOTAP_XCHANNEL must be used to 479892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * represent an HT channel as there is not enough room in 480892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * the flags word. 481892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 482892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_FHSS uint16_t see below 483892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 484892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * For frequency-hopping radios, the hop set (first byte) 485892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * and pattern (second byte). 486892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 487892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_RATE uint8_t 500kb/s or index 488892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 489892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Tx/Rx data rate. If bit 0x80 is set then it represents an 490892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * an MCS index and not an IEEE rate. 491892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 492892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_DBM_ANTSIGNAL int8_t decibels from 493892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * one milliwatt (dBm) 494892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 495892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * RF signal power at the antenna, decibel difference from 496892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * one milliwatt. 497892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 498892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_DBM_ANTNOISE int8_t decibels from 499892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * one milliwatt (dBm) 500892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 501892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * RF noise power at the antenna, decibel difference from one 502892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * milliwatt. 503892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 504892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_DB_ANTSIGNAL uint8_t decibel (dB) 505892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 506892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * RF signal power at the antenna, decibel difference from an 507892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * arbitrary, fixed reference. 508892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 509892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_DB_ANTNOISE uint8_t decibel (dB) 510892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 511892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * RF noise power at the antenna, decibel difference from an 512892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * arbitrary, fixed reference point. 513892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 514892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_LOCK_QUALITY uint16_t unitless 515892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 516892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Quality of Barker code lock. Unitless. Monotonically 517892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * nondecreasing with "better" lock strength. Called "Signal 518892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Quality" in datasheets. (Is there a standard way to measure 519892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * this?) 520892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 521892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_TX_ATTENUATION uint16_t unitless 522892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 523892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Transmit power expressed as unitless distance from max 524892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * power set at factory calibration. 0 is max power. 525892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Monotonically nondecreasing with lower power levels. 526892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 527892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_DB_TX_ATTENUATION uint16_t decibels (dB) 528892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 529892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Transmit power expressed as decibel distance from max power 530892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * set at factory calibration. 0 is max power. Monotonically 531892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * nondecreasing with lower power levels. 532892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 533892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_DBM_TX_POWER int8_t decibels from 534892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * one milliwatt (dBm) 535892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 536892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Transmit power expressed as dBm (decibels from a 1 milliwatt 537892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * reference). This is the absolute power level measured at 538892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * the antenna port. 539892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 540892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_FLAGS uint8_t bitmap 541892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 542892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Properties of transmitted and received frames. See flags 543892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * defined below. 544892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 545892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_ANTENNA uint8_t antenna index 546892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 547892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Unitless indication of the Rx/Tx antenna for this packet. 548892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * The first antenna is antenna 0. 549892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 550892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_RX_FLAGS uint16_t bitmap 551892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 552892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Properties of received frames. See flags defined below. 553892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 554892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_XCHANNEL uint32_t bitmap 555892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint16_t MHz 556892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint8_t channel number 557892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint8_t .5 dBm 558892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 559892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Extended channel specification: flags (see below) followed by 560892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * frequency in MHz, the corresponding IEEE channel number, and 561892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * finally the maximum regulatory transmit power cap in .5 dBm 562892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * units. This property supersedes IEEE80211_RADIOTAP_CHANNEL 563892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * and only one of the two should be present. 564892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 565892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_MCS uint8_t known 566892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint8_t flags 567892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint8_t mcs 568892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 569892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Bitset indicating which fields have known values, followed 570892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * by bitset of flag values, followed by the MCS rate index as 571892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * in IEEE 802.11n. 572892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 573892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * IEEE80211_RADIOTAP_VENDOR_NAMESPACE 574892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint8_t OUI[3] 575892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint8_t subspace 576892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * uint16_t length 577892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 578892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * The Vendor Namespace Field contains three sub-fields. The first 579892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * sub-field is 3 bytes long. It contains the vendor's IEEE 802 580892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Organizationally Unique Identifier (OUI). The fourth byte is a 581892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * vendor-specific "namespace selector." 582892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 583892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 584892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesenum ieee80211_radiotap_type { 585892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_TSFT = 0, 586892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_FLAGS = 1, 587892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_RATE = 2, 588892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_CHANNEL = 3, 589892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_FHSS = 4, 590892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5, 591892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_DBM_ANTNOISE = 6, 592892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_LOCK_QUALITY = 7, 593892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_TX_ATTENUATION = 8, 594892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9, 595892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_DBM_TX_POWER = 10, 596892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_ANTENNA = 11, 597892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, 598892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_DB_ANTNOISE = 13, 599892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_RX_FLAGS = 14, 600892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes /* NB: gap for netbsd definitions */ 601892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_XCHANNEL = 18, 602892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_MCS = 19, 603892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_NAMESPACE = 29, 604892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, 605892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IEEE80211_RADIOTAP_EXT = 31 606892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 607892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 608892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* channel attributes */ 609892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_TURBO 0x00010 /* Turbo channel */ 610892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_CCK 0x00020 /* CCK channel */ 611892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_OFDM 0x00040 /* OFDM channel */ 612892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_2GHZ 0x00080 /* 2 GHz spectrum channel. */ 613892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_5GHZ 0x00100 /* 5 GHz spectrum channel */ 614892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_PASSIVE 0x00200 /* Only passive scan allowed */ 615892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_DYN 0x00400 /* Dynamic CCK-OFDM channel */ 616892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_GFSK 0x00800 /* GFSK channel (FHSS PHY) */ 617892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_GSM 0x01000 /* 900 MHz spectrum channel */ 618892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_STURBO 0x02000 /* 11a static turbo channel only */ 619892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_HALF 0x04000 /* Half rate channel */ 620892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_QUARTER 0x08000 /* Quarter rate channel */ 621892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_HT20 0x10000 /* HT 20 channel */ 622892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_HT40U 0x20000 /* HT 40 channel w/ ext above */ 623892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_HT40D 0x40000 /* HT 40 channel w/ ext below */ 624892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 625892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* Useful combinations of channel characteristics, borrowed from Ethereal */ 626892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_A \ 627892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) 628892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_B \ 629892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) 630892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_G \ 631892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) 632892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_TA \ 633892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO) 634892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_CHAN_TG \ 635892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN | IEEE80211_CHAN_TURBO) 636892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 637892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 638892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* For IEEE80211_RADIOTAP_FLAGS */ 639892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received 640892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * during CFP 641892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 642892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02 /* sent/received 643892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * with short 644892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * preamble 645892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 646892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_WEP 0x04 /* sent/received 647892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * with WEP encryption 648892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 649892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_FRAG 0x08 /* sent/received 650892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * with fragmentation 651892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 652892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_FCS 0x10 /* frame includes FCS */ 653892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_DATAPAD 0x20 /* frame has padding between 654892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * 802.11 header and payload 655892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * (to 32-bit boundary) 656892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */ 657892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* does not pass FCS check */ 658892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 659892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* For IEEE80211_RADIOTAP_RX_FLAGS */ 660892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_RX_BADFCS 0x0001 /* frame failed crc check */ 661892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_F_RX_PLCP_CRC 0x0002 /* frame failed PLCP CRC check */ 662892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 663892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* For IEEE80211_RADIOTAP_MCS known */ 664892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN 0x01 665892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN 0x02 /* MCS index field */ 666892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN 0x04 667892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN 0x08 668892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN 0x10 669892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_STBC_KNOWN 0x20 670892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 671892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/* For IEEE80211_RADIOTAP_MCS flags */ 672892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK 0x03 673892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20 0 674892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_40 1 675892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20L 2 676892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20U 3 677892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_SHORT_GI 0x04 /* short guard interval */ 678892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_HT_GREENFIELD 0x08 679892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10 680892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_STBC_MASK 0x60 681892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_STBC_1 1 682892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_STBC_2 2 683892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_STBC_3 3 684892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define IEEE80211_RADIOTAP_MCS_STBC_SHIFT 5 685892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 686892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const char tstr[] = "[|802.11]"; 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 68853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Radiotap state */ 68953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* This is used to save state when parsing/processing parameters */ 69053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct radiotap_state 69153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 692892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t present; 69353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 694892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t rate; 69553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 69653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_SSID(p) \ 69853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.ssid_present) { \ 699892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " (")); \ 700892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes fn_print(ndo, p.ssid.ssid, NULL); \ 701892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, ")")); \ 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_RATE(_sep, _r, _suf) \ 705892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s%2.1f%s", _sep, (.5 * ((_r) & 0x7f)), _suf)) 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_RATES(p) \ 70753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.rates_present) { \ 70853f17a9db278d33517d9888dd77848f554522a38JP Abgrall int z; \ 70953f17a9db278d33517d9888dd77848f554522a38JP Abgrall const char *sep = " ["; \ 71053f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (z = 0; z < p.rates.length ; z++) { \ 71153f17a9db278d33517d9888dd77848f554522a38JP Abgrall PRINT_RATE(sep, p.rates.rate[z], \ 71253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (p.rates.rate[z] & 0x80 ? "*" : "")); \ 71353f17a9db278d33517d9888dd77848f554522a38JP Abgrall sep = " "; \ 71453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } \ 71553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.rates.length != 0) \ 716892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " Mbit]")); \ 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_DS_CHANNEL(p) \ 72053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.ds_present) \ 721892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " CH: %u", p.ds.channel)); \ 722892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", \ 723892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : "")); 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 72553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define MAX_MCS_INDEX 76 72653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 72753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 72853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Indices are: 72953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 73053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the MCS index (0-76); 73153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 73253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 0 for 20 MHz, 1 for 40 MHz; 73353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 73453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 0 for a long guard interval, 1 for a short guard interval. 73553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 73653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const float ieee80211_float_htrates[MAX_MCS_INDEX+1][2][2] = { 73753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 0 */ 73853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 6.5, /* SGI */ 7.2, }, 73953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 13.5, /* SGI */ 15.0, }, 74053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 74153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 74253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 1 */ 74353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 13.0, /* SGI */ 14.4, }, 74453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 27.0, /* SGI */ 30.0, }, 74553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 74653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 74753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 2 */ 74853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 19.5, /* SGI */ 21.7, }, 74953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 40.5, /* SGI */ 45.0, }, 75053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 75153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 75253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 3 */ 75353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, 75453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, 75553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 75653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 75753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 4 */ 75853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 75953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 76053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 76153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 76253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 5 */ 76353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 76453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 76553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 76653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 76753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 6 */ 76853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, 76953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, 77053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 77153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 77253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 7 */ 77353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 77453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 77553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 77653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 77753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 8 */ 77853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 13.0, /* SGI */ 14.4, }, 77953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 27.0, /* SGI */ 30.0, }, 78053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 78153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 78253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 9 */ 78353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, 78453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, 78553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 78653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 78753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 10 */ 78853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 78953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 79053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 79153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 79253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 11 */ 79353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 79453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 79553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 79653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 79753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 12 */ 79853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 79953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 80053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 80153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 80253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 13 */ 80353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 80453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 80553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 80653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 80753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 14 */ 80853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 80953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 81053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 81153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 81253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 15 */ 81353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, 81453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, 81553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 81653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 81753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 16 */ 81853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 19.5, /* SGI */ 21.7, }, 81953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 40.5, /* SGI */ 45.0, }, 82053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 82153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 82253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 17 */ 82353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 82453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 82553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 82653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 82753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 18 */ 82853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, 82953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, 83053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 83153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 83253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 19 */ 83353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 83453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 83653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 83753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 20 */ 83853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 83953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 84053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 84153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 84253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 21 */ 84353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 84453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 84553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 84653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 22 */ 84853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, 84953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, 85053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 85153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 85253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 23 */ 85353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, 85453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, 85553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 85653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 85753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 24 */ 85853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, 85953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, 86053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 86153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 86253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 25 */ 86353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 86453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 86553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 86653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 86753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 26 */ 86853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 86953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 87053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 87153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 87253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 27 */ 87353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 87453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 87553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 87653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 87753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 28 */ 87853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 87953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 88053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 88153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 88253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 29 */ 88353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 208.0, /* SGI */ 231.1, }, 88453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 432.0, /* SGI */ 480.0, }, 88553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 88653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 88753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 30 */ 88853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 234.0, /* SGI */ 260.0, }, 88953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 486.0, /* SGI */ 540.0, }, 89053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 89153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 89253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 31 */ 89353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 260.0, /* SGI */ 288.9, }, 89453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 540.0, /* SGI */ 600.0, }, 89553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 89653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 89753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 32 */ 89853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 0.0, /* SGI */ 0.0, }, /* not valid */ 89953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 6.0, /* SGI */ 6.7, }, 90053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 90153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 90253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 33 */ 90353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 90453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 90553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 90653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 90753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 34 */ 90853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 90953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 91053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 91153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 91253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 35 */ 91353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 91453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 91553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 91653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 91753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 36 */ 91853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, 91953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, 92053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 92153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 92253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 37 */ 92353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 92453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 92553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 92653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 92753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 38 */ 92853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 92953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 93053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 93153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 93253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 39 */ 93353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 93453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 93553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 93653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 93753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 40 */ 93853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 93953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 94053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 94153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 94253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 41 */ 94353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 94453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 94553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 94653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 94753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 42 */ 94853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 94953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 95053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 95153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 95253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 43 */ 95353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 95453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 95553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 95653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 95753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 44 */ 95853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 95953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 96053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 96153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 96253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 45 */ 96353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 96453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 96553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 96653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 96753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 46 */ 96853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 96953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 97053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 97153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 97253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 47 */ 97353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 97453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 97553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 97653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 97753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 48 */ 97853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 97953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 98053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 98153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 98253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 49 */ 98353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 98453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 98553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 98653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 98753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 50 */ 98853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 98953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 99053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 99153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 99253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 51 */ 99353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 99453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 99553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 99653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 99753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 52 */ 99853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 99953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 100053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 100153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 100253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 53 */ 100353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 100453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 100553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 100653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 100753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 54 */ 100853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 100953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 101053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 101153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 101253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 55 */ 101353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 101453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 101553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 101653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 101753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 56 */ 101853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 101953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 102053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 102153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 102253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 57 */ 102353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 102453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 102553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 102653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 102753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 58 */ 102853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 102953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 103053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 103153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 103253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 59 */ 103353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 103453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 103553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 103653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 103753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 60 */ 103853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 103953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 104053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 104153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 104253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 61 */ 104353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 104453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 104553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 104653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 104753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 62 */ 104853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, 104953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, 105053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 105153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 105253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 63 */ 105353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, 105453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, 105553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 105653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 105753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 64 */ 105853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 143.0, /* SGI */ 158.9, }, 105953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 297.0, /* SGI */ 330.0, }, 106053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 106153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 106253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 65 */ 106353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 106453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 106553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 106653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 106753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 66 */ 106853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 106953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 107053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 107153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 107253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 67 */ 107353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 107453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 107553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 107653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 107753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 68 */ 107853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 107953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 108053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 108153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 108253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 69 */ 108353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 108453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 108553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 108653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 108753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 70 */ 108853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 108953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 109053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 109153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 109253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 71 */ 109353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, 109453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, 109553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 109653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 109753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 72 */ 109853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 109953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 110053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 110153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 110253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 73 */ 110353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, 110453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, 110553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 110653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 110753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 74 */ 110853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, 110953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, 111053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 111153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 111253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 75 */ 111353f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, 111453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, 111553f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 111653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 111753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 76 */ 111853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 214.5, /* SGI */ 238.3, }, 111953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 445.5, /* SGI */ 495.0, }, 112053f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 112153f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 112253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *auth_alg_text[]={"Open System","Shared Key","EAP"}; 11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_AUTH_ALGS (sizeof auth_alg_text / sizeof auth_alg_text[0]) 11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *status_text[] = { 112753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Successful", /* 0 */ 112853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unspecified failure", /* 1 */ 112953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 2 */ 113053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 3 */ 113153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 4 */ 113253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 5 */ 113353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 6 */ 113453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 7 */ 113553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 8 */ 113653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 9 */ 113753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Cannot Support all requested capabilities in the Capability " 113853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Information field", /* 10 */ 113953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reassociation denied due to inability to confirm that association " 114053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "exists", /* 11 */ 114153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to reason outside the scope of the " 114253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "standard", /* 12 */ 114353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Responding station does not support the specified authentication " 114453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "algorithm ", /* 13 */ 114553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Received an Authentication frame with authentication transaction " 114653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "sequence number out of expected sequence", /* 14 */ 114753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Authentication rejected because of challenge failure", /* 15 */ 114853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Authentication rejected due to timeout waiting for next frame in " 114953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "sequence", /* 16 */ 115053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied because AP is unable to handle additional" 115153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "associated stations", /* 17 */ 115253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting all of " 115353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "the data rates in BSSBasicRateSet parameter", /* 18 */ 115453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 115553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "short preamble operation", /* 19 */ 115653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 115753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "PBCC encoding", /* 20 */ 115853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 115953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "channel agility", /* 21 */ 116053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association request rejected because Spectrum Management " 116153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "capability is required", /* 22 */ 116253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association request rejected because the information in the " 116353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Power Capability element is unacceptable", /* 23 */ 116453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association request rejected because the information in the " 116553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Supported Channels element is unacceptable", /* 24 */ 116653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 116753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "short slot operation", /* 25 */ 116853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 116953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "DSSS-OFDM operation", /* 26 */ 117053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied because the requested STA does not support HT " 117153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "features", /* 27 */ 117253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 28 */ 117353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied because the requested STA does not support " 117453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "the PCO transition time required by the AP", /* 29 */ 117553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 30 */ 117653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 31 */ 117753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unspecified, QoS-related failure", /* 32 */ 117853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to QAP having insufficient bandwidth " 117953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "to handle another QSTA", /* 33 */ 118053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to excessive frame loss rates and/or " 118153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "poor conditions on current operating channel", /* 34 */ 118253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association (with QBSS) denied due to requesting station not " 118353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "supporting the QoS facility", /* 35 */ 118453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 118553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Block Ack", /* 36 */ 118653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The request has been declined", /* 37 */ 118753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The request has not been successful as one or more parameters " 118853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "have invalid values", /* 38 */ 118953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The TS has not been created because the request cannot be honored. " 1190892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes "Try again with the suggested changes to the TSPEC", /* 39 */ 119153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid Information Element", /* 40 */ 119253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Group Cipher is not valid", /* 41 */ 119353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Pairwise Cipher is not valid", /* 42 */ 119453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "AKMP is not valid", /* 43 */ 119553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unsupported RSN IE version", /* 44 */ 119653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid RSN IE Capabilities", /* 45 */ 119753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Cipher suite is rejected per security policy", /* 46 */ 119853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The TS has not been created. However, the HC may be capable of " 119953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "creating a TS, in response to a request, after the time indicated " 120053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "in the TS Delay element", /* 47 */ 120153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Direct Link is not allowed in the BSS by policy", /* 48 */ 120253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Destination STA is not present within this QBSS.", /* 49 */ 120353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The Destination STA is not a QSTA.", /* 50 */ 120453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_STATUSES (sizeof status_text / sizeof status_text[0]) 12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *reason_text[] = { 120953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 0 */ 121053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unspecified reason", /* 1 */ 121153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Previous authentication no longer valid", /* 2 */ 121253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Deauthenticated because sending station is leaving (or has left) " 121353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "IBSS or ESS", /* 3 */ 121453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated due to inactivity", /* 4 */ 121553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because AP is unable to handle all currently " 121653f17a9db278d33517d9888dd77848f554522a38JP Abgrall " associated stations", /* 5 */ 12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Class 2 frame received from nonauthenticated station", /* 6 */ 121853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Class 3 frame received from nonassociated station", /* 7 */ 121953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because sending station is leaving " 122053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "(or has left) BSS", /* 8 */ 122153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Station requesting (re)association is not authenticated with " 122253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "responding station", /* 9 */ 122353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because the information in the Power Capability " 122453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "element is unacceptable", /* 10 */ 122553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because the information in the SupportedChannels " 122653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "element is unacceptable", /* 11 */ 122753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid Information Element", /* 12 */ 122853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 13 */ 122953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Michael MIC failure", /* 14 */ 123053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "4-Way Handshake timeout", /* 15 */ 123153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Group key update timeout", /* 16 */ 123253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Information element in 4-Way Handshake different from (Re)Association" 123353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Request/Probe Response/Beacon", /* 17 */ 123453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Group Cipher is not valid", /* 18 */ 123553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "AKMP is not valid", /* 20 */ 123653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unsupported RSN IE version", /* 21 */ 123753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid RSN IE Capabilities", /* 22 */ 123853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "IEEE 802.1X Authentication failed", /* 23 */ 123953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Cipher suite is rejected per security policy", /* 24 */ 124053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 25 */ 124153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 26 */ 124253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 27 */ 124353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 28 */ 124453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 29 */ 124553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 30 */ 124653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "TS deleted because QoS AP lacks sufficient bandwidth for this " 124753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "QoS STA due to a change in BSS service characteristics or " 124853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "operational mode (e.g. an HT BSS change from 40 MHz channel " 124953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "to 20 MHz channel)", /* 31 */ 125053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated for unspecified, QoS-related reason", /* 32 */ 125153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because QoS AP lacks sufficient bandwidth for this " 125253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "QoS STA", /* 33 */ 125353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because of excessive number of frames that need to be " 125453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "acknowledged, but are not acknowledged for AP transmissions " 125553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "and/or poor channel conditions", /* 34 */ 125653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because STA is transmitting outside the limits " 125753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "of its TXOPs", /* 35 */ 125853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA as the STA is leaving the BSS " 125953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "(or resetting)", /* 36 */ 126053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA as it does not want to use the " 126153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "mechanism", /* 37 */ 126253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA as the STA received frames using the " 126353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "mechanism for which a set up is required", /* 38 */ 126453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA due to time out", /* 39 */ 126553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 40 */ 126653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 41 */ 126753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 42 */ 126853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 43 */ 126953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 44 */ 127053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Peer STA does not support the requested cipher suite", /* 45 */ 127153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting STA not supporting HT " 127253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "features", /* 46 */ 12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_REASONS (sizeof reason_text / sizeof reason_text[0]) 12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1277892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheswep_print(netdissect_options *ndo, 1278892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p) 12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1280892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t iv; 12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1282892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_IV_LEN + IEEE802_11_KID_LEN)) 12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project iv = EXTRACT_LE_32BITS(p); 12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1286892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Data IV:%3x Pad %x KeyID %x", IV_IV(iv), IV_PAD(iv), 1287892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes IV_KEYID(iv))); 12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 129253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int 1293892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesparse_elements(netdissect_options *ndo, 1294892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct mgmt_body_t *pbody, const u_char *p, int offset, 1295892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes u_int length) 12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 129753f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int elementlen; 129853f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct ssid_t ssid; 129953f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct challenge_t challenge; 130053f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct rates_t rates; 130153f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct ds_t ds; 130253f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct cf_t cf; 130353f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct tim_t tim; 130453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * We haven't seen any elements yet. 13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 130853f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->challenge_present = 0; 130953f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ssid_present = 0; 131053f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->rates_present = 0; 131153f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ds_present = 0; 131253f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->cf_present = 0; 131353f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->tim_present = 0; 131453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 131553f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (length != 0) { 1316892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes /* Make sure we at least have the element ID and length. */ 1317892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*(p + offset), 2)) 1318892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return 0; 1319892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (length < 2) 1320892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return 0; 1321892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes elementlen = *(p + offset + 1); 1322892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 1323892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes /* Make sure we have the entire element. */ 1324892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*(p + offset + 2), elementlen)) 132553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1326892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (length < elementlen + 2) 132753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1328892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes 13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (*(p + offset)) { 13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_SSID: 133153f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&ssid, p + offset, 2); 13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 133353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 133453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ssid.length != 0) { 133553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ssid.length > sizeof(ssid.ssid) - 1) 133653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1337892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*(p + offset), ssid.length)) 133853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 133953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < ssid.length) 134053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 134153f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&ssid.ssid, p + offset, ssid.length); 134253f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += ssid.length; 134353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= ssid.length; 134453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 134553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ssid.ssid[ssid.length] = '\0'; 134653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 134753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 134853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 134953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen an SSID IE, 135053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 135153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 135253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 135353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->ssid_present) { 135453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ssid = ssid; 135553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ssid_present = 1; 13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_CHALLENGE: 135953f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&challenge, p + offset, 2); 13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 136153f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 136253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (challenge.length != 0) { 136353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (challenge.length > 136453f17a9db278d33517d9888dd77848f554522a38JP Abgrall sizeof(challenge.text) - 1) 136553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1366892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*(p + offset), challenge.length)) 136753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 136853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < challenge.length) 136953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 137053f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&challenge.text, p + offset, 137153f17a9db278d33517d9888dd77848f554522a38JP Abgrall challenge.length); 137253f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += challenge.length; 137353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= challenge.length; 137453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 137553f17a9db278d33517d9888dd77848f554522a38JP Abgrall challenge.text[challenge.length] = '\0'; 137653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 137753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 137853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 137953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a challenge IE, 138053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 138153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 138253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 138353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->challenge_present) { 138453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->challenge = challenge; 138553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->challenge_present = 1; 13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_RATES: 138953f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&rates, p + offset, 2); 13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 139153f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 139253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rates.length != 0) { 139353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rates.length > sizeof rates.rate) 139453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1395892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*(p + offset), rates.length)) 139653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 139753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < rates.length) 139853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 139953f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&rates.rate, p + offset, rates.length); 140053f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += rates.length; 140153f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= rates.length; 140253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 140353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 140453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 140553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 140653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a rates IE, 140753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one if it's not zero-length, 140853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * otherwise ignore this one, so we later 140953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * report the first one we saw. 141053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 141153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We ignore zero-length rates IEs as some 141253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * devices seem to put a zero-length rates 141353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * IE, followed by an SSID IE, followed by 141453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * a non-zero-length rates IE into frames, 141553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * even though IEEE Std 802.11-2007 doesn't 141653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * seem to indicate that a zero-length rates 141753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * IE is valid. 141853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 141953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->rates_present && rates.length != 0) { 142053f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->rates = rates; 142153f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->rates_present = 1; 14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_DS: 1425892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes memcpy(&ds, p + offset, 2); 1426892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += 2; 1427892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= 2; 1428892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ds.length != 1) { 1429892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += ds.length; 1430892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= ds.length; 1431892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes break; 1432892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes } 1433892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ds.channel = *(p + offset); 1434892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += 1; 1435892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= 1; 143653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 143753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 143853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 143953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a DS IE, 144053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 144153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 144253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 144353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->ds_present) { 144453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ds = ds; 144553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ds_present = 1; 144653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_CF: 1449892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes memcpy(&cf, p + offset, 2); 1450892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += 2; 1451892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= 2; 1452892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (cf.length != 6) { 1453892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += cf.length; 1454892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= cf.length; 1455892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes break; 1456892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes } 1457892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes memcpy(&cf.count, p + offset, 6); 1458892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += 6; 1459892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= 6; 146053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 146153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 146253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 146353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a CF IE, 146453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 146553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 146653f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 146753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->cf_present) { 146853f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->cf = cf; 146953f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->cf_present = 1; 147053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 14712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_TIM: 147353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&tim, p + offset, 2); 14742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 147553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 1476892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (tim.length <= 3) { 1477892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += tim.length; 1478892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= tim.length; 1479892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes break; 1480892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes } 1481892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (tim.length - 3 > (int)sizeof tim.bitmap) 148253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 148353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&tim.count, p + offset, 3); 14842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 3; 148553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 3; 14862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 148753f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(tim.bitmap, p + (tim.length - 3), 148853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (tim.length - 3)); 148953f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += tim.length - 3; 149053f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= tim.length - 3; 149153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 149253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 149353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 149453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a TIM IE, 149553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 149653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 149753f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 149853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->tim_present) { 149953f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->tim = tim; 150053f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->tim_present = 1; 150153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 15022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 15042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 1505892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "(1) unhandled element_id (%d) ", 1506892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes *(p + offset))); 15072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1508892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes offset += 2 + elementlen; 1509892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length -= 2 + elementlen; 15102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 15122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 151353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 151453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* No problems found. */ 151553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 1; 15162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 15172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 15192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Handle functions for the management frame types 15202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 15212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1523892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_beacon(netdissect_options *ndo, 1524892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 15252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 15262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 152853f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 15292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 15312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1532892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 15332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_CAPINFO_LEN)) 15342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 153553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 153653f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_CAPINFO_LEN) 153753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 15382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); 15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_TSTAMP_LEN; 154053f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_TSTAMP_LEN; 15412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 15422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_BCNINT_LEN; 154353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_BCNINT_LEN; 15442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 15452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 154653f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 15472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1548892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ret = parse_elements(ndo, &pbody, p, offset, length); 15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 15512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 1552892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", 1553892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes CAPABILITY_ESS(pbody.capability_info) ? "ESS" : "IBSS")); 15542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_DS_CHANNEL(pbody); 15552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 155653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 15572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 15582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1560892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_assoc_request(netdissect_options *ndo, 1561892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 15622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 15632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 15642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 156553f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 15662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 15682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1569892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN)) 15702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 157153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN) 157253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 15732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 15742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 157553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 15762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.listen_interval = EXTRACT_LE_16BITS(p+offset); 15772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_LISTENINT_LEN; 157853f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_LISTENINT_LEN; 15792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1580892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ret = parse_elements(ndo, &pbody, p, offset, length); 15812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 15832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 158453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 15852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 15862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1588892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_assoc_response(netdissect_options *ndo, 1589892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 15902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 15912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 15922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 159353f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 15942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 15962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1597892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN + 15982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_AID_LEN)) 15992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 160053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN + 160153f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_AID_LEN) 160253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 16032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 16042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 160553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 16062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.status_code = EXTRACT_LE_16BITS(p+offset); 16072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_STATUS_LEN; 160853f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_STATUS_LEN; 16092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.aid = EXTRACT_LE_16BITS(p+offset); 16102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_AID_LEN; 161153f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_AID_LEN; 16122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1613892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ret = parse_elements(ndo, &pbody, p, offset, length); 16142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1615892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " AID(%x) :%s: %s", ((uint16_t)(pbody.aid << 2 )) >> 2 , 16162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CAPABILITY_PRIVACY(pbody.capability_info) ? " PRIVACY " : "", 16172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.status_code < NUM_STATUSES 16182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 1619892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes : "n/a"))); 16202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 162153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 16222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 16232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1625892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_reassoc_request(netdissect_options *ndo, 1626892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 16272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 16282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 16292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 163053f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 16312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 16332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1634892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN + 16352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_AP_LEN)) 16362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 163753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN + 163853f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_AP_LEN) 163953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 16402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 16412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 164253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 16432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.listen_interval = EXTRACT_LE_16BITS(p+offset); 16442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_LISTENINT_LEN; 164553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_LISTENINT_LEN; 16462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.ap, p+offset, IEEE802_11_AP_LEN); 16472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_AP_LEN; 164853f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_AP_LEN; 16492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1650892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ret = parse_elements(ndo, &pbody, p, offset, length); 16512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 1653892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " AP : %s", etheraddr_string(ndo, pbody.ap ))); 16542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 165553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1659892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_reassoc_response(netdissect_options *ndo, 1660892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 16612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 16622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Same as a Association Reponse */ 1663892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_assoc_response(ndo, p, length); 16642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 16652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1667892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_probe_request(netdissect_options *ndo, 1668892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 16692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 16702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 16712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 167253f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 16732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 16752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1676892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ret = parse_elements(ndo, &pbody, p, offset, length); 16772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 16792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 16802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 168153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 16822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 16832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1685892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_probe_response(netdissect_options *ndo, 1686892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 16872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 16892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 169053f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 16912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 16932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1694892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 16952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_CAPINFO_LEN)) 16962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 169753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 169853f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_CAPINFO_LEN) 169953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 17002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); 17012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_TSTAMP_LEN; 170253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_TSTAMP_LEN; 17032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 17042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_BCNINT_LEN; 170553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_BCNINT_LEN; 17062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 17072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 170853f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 17092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1710892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ret = parse_elements(ndo, &pbody, p, offset, length); 17112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 17132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 17142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_DS_CHANNEL(pbody); 17152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 171653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 17172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 17182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 17202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_atim(void) 17212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 17222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the frame body for ATIM is null. */ 17232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 17242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 17252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1727892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_disassoc(netdissect_options *ndo, 1728892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 17292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 17302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 17312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 17332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1734892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_REASON_LEN)) 17352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 173653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_REASON_LEN) 173753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 17382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.reason_code = EXTRACT_LE_16BITS(p); 17392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1740892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, ": %s", 17412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.reason_code < NUM_REASONS) 17422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? reason_text[pbody.reason_code] 1743892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes : "Reserved")); 17442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 17462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 17472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1749892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_auth(netdissect_options *ndo, 1750892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 17512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 17522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 17532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 175453f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 17552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 17572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1758892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, 6)) 17592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 176053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 6) 176153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 17622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_alg = EXTRACT_LE_16BITS(p); 17632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 176453f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 17652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num = EXTRACT_LE_16BITS(p + offset); 17662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 176753f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 17682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.status_code = EXTRACT_LE_16BITS(p + offset); 17692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 177053f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 17712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1772892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ret = parse_elements(ndo, &pbody, p, offset, length); 17732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((pbody.auth_alg == 1) && 17752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pbody.auth_trans_seq_num == 2) || 17762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_trans_seq_num == 3))) { 1777892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " (%s)-%x [Challenge Text] %s", 17782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_alg < NUM_AUTH_ALGS) 17792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? auth_alg_text[pbody.auth_alg] 17802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved", 17812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num, 17822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pbody.auth_trans_seq_num % 2) 17832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? ((pbody.status_code < NUM_STATUSES) 17842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 1785892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes : "n/a") : ""))); 178653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 17872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1788892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " (%s)-%x: %s", 17892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_alg < NUM_AUTH_ALGS) 17902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? auth_alg_text[pbody.auth_alg] 17912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved", 17922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num, 17932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_trans_seq_num % 2) 17942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? ((pbody.status_code < NUM_STATUSES) 17952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 17962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "n/a") 1797892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes : "")); 17982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 179953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 18002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 18012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1803892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_deauth(netdissect_options *ndo, 1804892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const struct mgmt_header_t *pmh, const u_char *p, u_int length) 18052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 18062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 18072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *reason = NULL; 18082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 18102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1811892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, IEEE802_11_REASON_LEN)) 18122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 181353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_REASON_LEN) 181453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 18152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.reason_code = EXTRACT_LE_16BITS(p); 18162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project reason = (pbody.reason_code < NUM_REASONS) 18182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? reason_text[pbody.reason_code] 18192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved"; 18202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1821892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_eflag) { 1822892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, ": %s", reason)); 18232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 1824892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " (%s): %s", etheraddr_string(ndo, pmh->sa), reason)); 18252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 18272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 18282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 182953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_HT_ACTION(v) (\ 1830892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 0 ? ND_PRINT((ndo, "TxChWidth")) : \ 1831892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "MIMOPwrSave")) : \ 1832892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 183353f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 183453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_BA_ACTION(v) (\ 1835892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 0 ? ND_PRINT((ndo, "ADDBA Request")) : \ 1836892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "ADDBA Response")) : \ 1837892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 2 ? ND_PRINT((ndo, "DELBA")) : \ 1838892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 183953f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 184053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESHLINK_ACTION(v) (\ 1841892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 0 ? ND_PRINT((ndo, "Request")) : \ 1842892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "Report")) : \ 1843892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 184453f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 184553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESHPEERING_ACTION(v) (\ 1846892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 0 ? ND_PRINT((ndo, "Open")) : \ 1847892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "Confirm")) : \ 1848892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 2 ? ND_PRINT((ndo, "Close")) : \ 1849892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 185053f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 185153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESHPATH_ACTION(v) (\ 1852892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 0 ? ND_PRINT((ndo, "Request")) : \ 1853892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "Report")) : \ 1854892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 2 ? ND_PRINT((ndo, "Error")) : \ 1855892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 3 ? ND_PRINT((ndo, "RootAnnouncement")) : \ 1856892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 185753f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 185853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 185953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESH_ACTION(v) (\ 1860892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 0 ? ND_PRINT((ndo, "MeshLink")) : \ 1861892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "HWMP")) : \ 1862892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 2 ? ND_PRINT((ndo, "Gate Announcement")) : \ 1863892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 3 ? ND_PRINT((ndo, "Congestion Control")) : \ 1864892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 4 ? ND_PRINT((ndo, "MCCA Setup Request")) : \ 1865892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 5 ? ND_PRINT((ndo, "MCCA Setup Reply")) : \ 1866892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 6 ? ND_PRINT((ndo, "MCCA Advertisement Request")) : \ 1867892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 7 ? ND_PRINT((ndo, "MCCA Advertisement")) : \ 1868892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 8 ? ND_PRINT((ndo, "MCCA Teardown")) : \ 1869892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 9 ? ND_PRINT((ndo, "TBTT Adjustment Request")) : \ 1870892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 10 ? ND_PRINT((ndo, "TBTT Adjustment Response")) : \ 1871892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 187253f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 187353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MULTIHOP_ACTION(v) (\ 1874892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 0 ? ND_PRINT((ndo, "Proxy Update")) : \ 1875892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "Proxy Update Confirmation")) : \ 1876892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 187753f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 187853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_SELFPROT_ACTION(v) (\ 1879892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 1 ? ND_PRINT((ndo, "Peering Open")) : \ 1880892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 2 ? ND_PRINT((ndo, "Peering Confirm")) : \ 1881892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 3 ? ND_PRINT((ndo, "Peering Close")) : \ 1882892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 4 ? ND_PRINT((ndo, "Group Key Inform")) : \ 1883892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (v) == 5 ? ND_PRINT((ndo, "Group Key Acknowledge")) : \ 1884892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Act#%d", (v))) \ 188553f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 188653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 188753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int 1888892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheshandle_action(netdissect_options *ndo, 1889892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const struct mgmt_header_t *pmh, const u_char *p, u_int length) 189053f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 1891892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, 2)) 189253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 189353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 2) 189453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1895892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_eflag) { 1896892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, ": ")); 189753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 1898892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " (%s): ", etheraddr_string(ndo, pmh->sa))); 189953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 190053f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (p[0]) { 1901892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes case 0: ND_PRINT((ndo, "Spectrum Management Act#%d", p[1])); break; 1902892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes case 1: ND_PRINT((ndo, "QoS Act#%d", p[1])); break; 1903892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes case 2: ND_PRINT((ndo, "DLS Act#%d", p[1])); break; 1904892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes case 3: ND_PRINT((ndo, "BA ")); PRINT_BA_ACTION(p[1]); break; 1905892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes case 7: ND_PRINT((ndo, "HT ")); PRINT_HT_ACTION(p[1]); break; 1906892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes case 13: ND_PRINT((ndo, "MeshAction ")); PRINT_MESH_ACTION(p[1]); break; 190753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 14: 1908892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "MultiohopAction ")); 190953f17a9db278d33517d9888dd77848f554522a38JP Abgrall PRINT_MULTIHOP_ACTION(p[1]); break; 191053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 15: 1911892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "SelfprotectAction ")); 191253f17a9db278d33517d9888dd77848f554522a38JP Abgrall PRINT_SELFPROT_ACTION(p[1]); break; 1913892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes case 127: ND_PRINT((ndo, "Vendor Act#%d", p[1])); break; 191453f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 1915892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Reserved(%d) Act#%d", p[0], p[1])); 191653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 191753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 191853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 1; 191953f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 192053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 19232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Body funcs 19242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 19252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1928892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesmgmt_body_print(netdissect_options *ndo, 1929892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc, const struct mgmt_header_t *pmh, 1930892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length) 19312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1932892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tok2str(st_str, "Unhandled Management subtype(%x)", FC_SUBTYPE(fc)))); 19332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 19342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ASSOC_REQUEST: 1935892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_assoc_request(ndo, p, length); 19362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ASSOC_RESPONSE: 1937892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_assoc_response(ndo, p, length); 19382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_REASSOC_REQUEST: 1939892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_reassoc_request(ndo, p, length); 19402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_REASSOC_RESPONSE: 1941892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_reassoc_response(ndo, p, length); 19422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_PROBE_REQUEST: 1943892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_probe_request(ndo, p, length); 19442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_PROBE_RESPONSE: 1945892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_probe_response(ndo, p, length); 19462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_BEACON: 1947892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_beacon(ndo, p, length); 19482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ATIM: 19492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_atim(); 19502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_DISASSOC: 1951892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_disassoc(ndo, p, length); 19522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_AUTH: 1953892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, 3)) 19542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 19552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((p[0] == 0 ) && (p[1] == 0) && (p[2] == 0)) { 1956892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Authentication (Shared-Key)-3 ")); 1957892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return wep_print(ndo, p); 19582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1959892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_auth(ndo, p, length); 19602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_DEAUTH: 1961892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_deauth(ndo, pmh, p, length); 196253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case ST_ACTION: 1963892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return handle_action(ndo, pmh, p, length); 19642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 19652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 19662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 19672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 19682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 19712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handles printing all the control frame types 19722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 19732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 19742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1975892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesctrl_body_print(netdissect_options *ndo, 1976892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc, const u_char *p) 19772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1978892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tok2str(ctrl_str, "Unknown Ctrl Subtype", FC_SUBTYPE(fc)))); 19792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 198053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_CONTROL_WRAPPER: 198153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* XXX - requires special handling */ 198253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 198353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BAR: 1984892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_BAR_HDRLEN)) 198553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1986892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 1987892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " RA:%s TA:%s CTL(%x) SEQ(%u) ", 1988892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ra), 1989892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ta), 199053f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->ctl)), 1991892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->seq)))); 199253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 199353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BA: 1994892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_BA_HDRLEN)) 199553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 1996892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 1997892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " RA:%s ", 1998892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_ba_t *)p)->ra))); 199953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 20002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 2001892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_PS_POLL_HDRLEN)) 20022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2003892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " AID(%x)", 2004892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_LE_16BITS(&(((const struct ctrl_ps_poll_t *)p)->aid)))); 20052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 2007892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_RTS_HDRLEN)) 20082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2009892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 2010892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " TA:%s ", 2011892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_rts_t *)p)->ta))); 20122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 2014892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_CTS_HDRLEN)) 20152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2016892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 2017892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " RA:%s ", 2018892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_cts_t *)p)->ra))); 20192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 2021892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_ACK_HDRLEN)) 20222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2023892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 2024892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " RA:%s ", 2025892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_ack_t *)p)->ra))); 20262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 2028892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_END_HDRLEN)) 20292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2030892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 2031892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " RA:%s ", 2032892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_end_t *)p)->ra))); 20332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 2035892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ND_TTEST2(*p, CTRL_END_ACK_HDRLEN)) 20362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2037892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 2038892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " RA:%s ", 2039892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_end_ack_t *)p)->ra))); 20402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 20432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 20442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 20462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Header funcs 20472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 20482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 20502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Data Frame - Address field contents 20512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 20522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * To Ds | From DS | Addr 1 | Addr 2 | Addr 3 | Addr 4 20532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 | 0 | DA | SA | BSSID | n/a 20542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 | 1 | DA | BSSID | SA | n/a 20552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1 | 0 | BSSID | SA | DA | n/a 20562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1 | 1 | RA | TA | DA | SA 20572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 20582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2060892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesdata_header_print(netdissect_options *ndo, 2061892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc, const u_char *p, const uint8_t **srcp, 2062892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const uint8_t **dstp) 20632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 20642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int subtype = FC_SUBTYPE(fc); 20652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_ACK(subtype) || DATA_FRAME_IS_CF_POLL(subtype) || 20672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DATA_FRAME_IS_QOS(subtype)) { 2068892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "CF ")); 20692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_ACK(subtype)) { 20702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_POLL(subtype)) 2071892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Ack/Poll")); 20722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 2073892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Ack")); 20742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 20752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_POLL(subtype)) 2076892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Poll")); 20772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_QOS(subtype)) 2079892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "+QoS")); 2080892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " ")); 20812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR1 (p + 4) 20842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR2 (p + 10) 20852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR3 (p + 16) 20862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR4 (p + 24) 20872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!FC_TO_DS(fc) && !FC_FROM_DS(fc)) { 20892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 20902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR2; 20912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 20922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR1; 2093892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 20942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2095892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "DA:%s SA:%s BSSID:%s ", 2096892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2), 2097892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR3))); 20982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (!FC_TO_DS(fc) && FC_FROM_DS(fc)) { 20992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 21002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR3; 21012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 21022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR1; 2103892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 21042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2105892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "DA:%s BSSID:%s SA:%s ", 2106892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2), 2107892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR3))); 21082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (FC_TO_DS(fc) && !FC_FROM_DS(fc)) { 21092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 21102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR2; 21112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 21122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR3; 2113892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 21142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2115892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "BSSID:%s SA:%s DA:%s ", 2116892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2), 2117892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR3))); 21182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (FC_TO_DS(fc) && FC_FROM_DS(fc)) { 21192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 21202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR4; 21212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 21222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR3; 2123892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 21242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2125892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RA:%s TA:%s DA:%s SA:%s ", 2126892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR1), etheraddr_string(ndo, ADDR2), 2127892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ADDR3), etheraddr_string(ndo, ADDR4))); 21282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 21292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 21302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR1 21312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR2 21322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR3 21332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR4 21342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 21352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 21362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2137892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesmgmt_header_print(netdissect_options *ndo, 2138892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, const uint8_t **srcp, const uint8_t **dstp) 21392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 21402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct mgmt_header_t *hp = (const struct mgmt_header_t *) p; 21412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 21422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 21432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = hp->sa; 21442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 21452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = hp->da; 2146892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 21472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 21482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2149892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "BSSID:%s DA:%s SA:%s ", 2150892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, (hp)->bssid), etheraddr_string(ndo, (hp)->da), 2151892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, (hp)->sa))); 21522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 21532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 21542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2155892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesctrl_header_print(netdissect_options *ndo, 2156892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc, const u_char *p, const uint8_t **srcp, 2157892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const uint8_t **dstp) 21582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 21592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 21602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = NULL; 21612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 21622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = NULL; 2163892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 21642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 21652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 21662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 216753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BAR: 2168892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " RA:%s TA:%s CTL(%x) SEQ(%u) ", 2169892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ra), 2170892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_bar_t *)p)->ta), 217153f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->ctl)), 2172892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->seq)))); 217353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 217453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BA: 2175892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RA:%s ", 2176892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_ba_t *)p)->ra))); 217753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 21782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 2179892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "BSSID:%s TA:%s ", 2180892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_ps_poll_t *)p)->bssid), 2181892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_ps_poll_t *)p)->ta))); 21822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 21832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 2184892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RA:%s TA:%s ", 2185892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_rts_t *)p)->ra), 2186892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_rts_t *)p)->ta))); 21872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 21882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 2189892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RA:%s ", 2190892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_cts_t *)p)->ra))); 21912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 21922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 2193892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RA:%s ", 2194892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_ack_t *)p)->ra))); 21952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 21962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 2197892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RA:%s BSSID:%s ", 2198892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_end_t *)p)->ra), 2199892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_end_t *)p)->bssid))); 22002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 22012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 2202892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RA:%s BSSID:%s ", 2203892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_end_ack_t *)p)->ra), 2204892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes etheraddr_string(ndo, ((const struct ctrl_end_ack_t *)p)->bssid))); 22052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 22062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2207892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "(H) Unknown Ctrl Subtype")); 22082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 22092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 22102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 22112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 2213892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesextract_header_length(netdissect_options *ndo, 2214892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc) 22152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 22162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int len; 22172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 22192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 22202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return MGMT_HDRLEN; 22212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 22222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 222353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BAR: 222453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return CTRL_BAR_HDRLEN; 22252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 22262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_PS_POLL_HDRLEN; 22272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 22282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_RTS_HDRLEN; 22292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 22302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_CTS_HDRLEN; 22312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 22322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_ACK_HDRLEN; 22332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 22342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_END_HDRLEN; 22352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 22362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_END_ACK_HDRLEN; 22372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 22382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 22392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 22402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 22412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = (FC_TO_DS(fc) && FC_FROM_DS(fc)) ? 30 : 24; 22422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) 22432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len += 2; 22442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return len; 22452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2246892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "unknown IEEE802.11 frame type (%d)", FC_TYPE(fc))); 22472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 22482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 22492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 22502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 225153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int 225253f17a9db278d33517d9888dd77848f554522a38JP Abgrallextract_mesh_header_length(const u_char *p) 225353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 225453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (p[0] &~ 3) ? 0 : 6*(1 + (p[0] & 3)); 225553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 225653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print the 802.11 MAC header if eflag is set, and set "*srcp" and "*dstp" 22592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to point to the source and destination MAC addresses in any case if 22602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * "srcp" and "dstp" aren't null. 22612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 226253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void 2263892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesieee_802_11_hdr_print(netdissect_options *ndo, 2264892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc, const u_char *p, u_int hdrlen, 2265892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes u_int meshdrlen, const uint8_t **srcp, 2266892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const uint8_t **dstp) 22672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2268892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_vflag) { 22692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_MORE_DATA(fc)) 2270892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "More Data ")); 22712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_MORE_FLAG(fc)) 2272892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "More Fragments ")); 22732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_POWER_MGMT(fc)) 2274892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Pwr Mgmt ")); 22752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_RETRY(fc)) 2276892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Retry ")); 22772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_ORDER(fc)) 2278892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "Strictly Ordered ")); 22792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_WEP(fc)) 2280892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "WEP Encrypted ")); 22812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_TYPE(fc) != T_CTRL || FC_SUBTYPE(fc) != CTRL_PS_POLL) 2282892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%dus ", 22832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_LE_16BITS( 2284892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes &((const struct mgmt_header_t *)p)->duration))); 22852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 228653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (meshdrlen != 0) { 228753f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct meshcntl_t *mc = 228853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (const struct meshcntl_t *)&p[hdrlen - meshdrlen]; 228953f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ae = mc->flags & 3; 229053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 2291892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "MeshData (AE %d TTL %u seq %u", ae, mc->ttl, 2292892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_LE_32BITS(mc->seq))); 229353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ae > 0) 2294892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " A4:%s", etheraddr_string(ndo, mc->addr4))); 229553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ae > 1) 2296892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " A5:%s", etheraddr_string(ndo, mc->addr5))); 229753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ae > 2) 2298892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " A6:%s", etheraddr_string(ndo, mc->addr6))); 2299892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, ") ")); 230053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 23012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 23032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 2304892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes mgmt_header_print(ndo, p, srcp, dstp); 23052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 23062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 2307892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ctrl_header_print(ndo, fc, p, srcp, dstp); 23082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 23092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 2310892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes data_header_print(ndo, fc, p, srcp, dstp); 23112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 23122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2313892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "(header) unknown IEEE802.11 frame type (%d)", 2314892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes FC_TYPE(fc))); 23152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = NULL; 23162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = NULL; 23172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 23182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 23202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef roundup2 23222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */ 23232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 23242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 2326892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesieee802_11_print(netdissect_options *ndo, 2327892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length, u_int orig_caplen, int pad, 2328892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes u_int fcslen) 23292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2330892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t fc; 233153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int caplen, hdrlen, meshdrlen; 2332892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const uint8_t *src, *dst; 23332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short extracted_ethertype; 23342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 233553f17a9db278d33517d9888dd77848f554522a38JP Abgrall caplen = orig_caplen; 233653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Remove FCS, if present */ 233753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < fcslen) { 2338892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 23392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 23402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 234153f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= fcslen; 234253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (caplen > length) { 234353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Amount of FCS in actual packet data, if any */ 234453f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen = caplen - length; 234553f17a9db278d33517d9888dd77848f554522a38JP Abgrall caplen -= fcslen; 2346892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ndo->ndo_snapend -= fcslen; 234753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 234853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 234953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (caplen < IEEE802_11_FC_LEN) { 2350892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 235153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return orig_caplen; 235253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 23532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fc = EXTRACT_LE_16BITS(p); 2355892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes hdrlen = extract_header_length(ndo, fc); 23562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pad) 23572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen = roundup2(hdrlen, 4); 2358892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_Hflag && FC_TYPE(fc) == T_DATA && 235953f17a9db278d33517d9888dd77848f554522a38JP Abgrall DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) { 236053f17a9db278d33517d9888dd77848f554522a38JP Abgrall meshdrlen = extract_mesh_header_length(p+hdrlen); 236153f17a9db278d33517d9888dd77848f554522a38JP Abgrall hdrlen += meshdrlen; 236253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else 236353f17a9db278d33517d9888dd77848f554522a38JP Abgrall meshdrlen = 0; 236453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 23652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < hdrlen) { 2367892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 23682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 23692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2371892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ieee_802_11_hdr_print(ndo, fc, p, hdrlen, meshdrlen, &src, &dst); 23722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 23742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Go past the 802.11 header. 23752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 23762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= hdrlen; 23772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project caplen -= hdrlen; 23782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += hdrlen; 23792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 23812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 2382892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!mgmt_body_print(ndo, fc, 238353f17a9db278d33517d9888dd77848f554522a38JP Abgrall (const struct mgmt_header_t *)(p - hdrlen), p, length)) { 2384892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 23852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 23862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 23882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 2389892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ctrl_body_print(ndo, fc, p - hdrlen)) { 2390892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 23912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 23922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 23942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 23952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_NULL(FC_SUBTYPE(fc))) 23962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; /* no-data frame */ 23972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* There may be a problem w/ AP not having this bit set */ 23982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_WEP(fc)) { 2399892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!wep_print(ndo, p)) { 2400892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 24012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 24022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2403892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes } else if (llc_print(ndo, p, length, caplen, dst, src, 24042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project &extracted_ethertype) == 0) { 24052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 24062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Some kinds of LLC packet we cannot 24072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * handle intelligently 24082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2409892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_eflag) 2410892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ieee_802_11_hdr_print(ndo, fc, p - hdrlen, hdrlen, 241153f17a9db278d33517d9888dd77848f554522a38JP Abgrall meshdrlen, NULL, NULL); 24122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (extracted_ethertype) 2413892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "(LLC %s) ", 24142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etherproto_string( 2415892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes htons(extracted_ethertype)))); 2416892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_suppress_default_print) 2417892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_DEFAULTPRINT(p, caplen); 24182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 24192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 24202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2421892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "unknown 802.11 frame type (%d)", FC_TYPE(fc))); 24222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 24232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 24242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 24252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 24262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 24272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 24282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 24292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the top level routine of the printer. 'p' points 24302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to the 802.11 header of the packet, 'h->ts' is the timestamp, 24312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'h->len' is the length of the packet off the wire, and 'h->caplen' 24322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is the number of bytes actually captured. 24332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 24342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 2435892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesieee802_11_if_print(netdissect_options *ndo, 2436892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const struct pcap_pkthdr *h, const u_char *p) 24372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2438892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return ieee802_11_print(ndo, p, h->len, h->caplen, 0, 0); 243953f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 244053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 244153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_FHSS \ 244253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK) 244353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_A \ 244453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) 244553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_B \ 244653f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) 244753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_PUREG \ 244853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) 244953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_G \ 245053f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) 245153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 245253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_FHSS(flags) \ 245353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS) 245453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_A(flags) \ 245553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) 245653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_B(flags) \ 245753f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B) 245853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_PUREG(flags) \ 245953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG) 246053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_G(flags) \ 246153f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G) 246253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_ANYG(flags) \ 246353f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IS_CHAN_PUREG(flags) || IS_CHAN_G(flags)) 246453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 246553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void 2466892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesprint_chaninfo(netdissect_options *ndo, 2467892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes int freq, int flags) 246853f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 2469892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%u MHz", freq)); 247053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (IS_CHAN_FHSS(flags)) 2471892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " FHSS")); 247253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (IS_CHAN_A(flags)) { 247353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_HALF) 2474892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " 11a/10Mhz")); 247553f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_QUARTER) 2476892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " 11a/5Mhz")); 247753f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 2478892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " 11a")); 247953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 248053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (IS_CHAN_ANYG(flags)) { 248153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_HALF) 2482892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " 11g/10Mhz")); 248353f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_QUARTER) 2484892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " 11g/5Mhz")); 248553f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 2486892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " 11g")); 248753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else if (IS_CHAN_B(flags)) 2488892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " 11b")); 248953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_TURBO) 2490892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " Turbo")); 249153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_HT20) 2492892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " ht/20")); 249353f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_HT40D) 2494892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " ht/40-")); 249553f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_HT40U) 2496892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " ht/40+")); 2497892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " ")); 24982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 24992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 25002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 2501892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesprint_radiotap_field(netdissect_options *ndo, 2502892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct cpack_state *s, uint32_t bit, uint8_t *flags, 2503892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes struct radiotap_state *state, uint32_t presentflags) 25042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 25052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 25062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int8_t i8; 2507892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t u8; 25082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int16_t i16; 2509892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t u16; 2510892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t u32; 2511892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint64_t u64; 251253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } u, u2, u3, u4; 25132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int rc; 25142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 25152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bit) { 25162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FLAGS: 25172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 251853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 251953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 252053f17a9db278d33517d9888dd77848f554522a38JP Abgrall *flags = u.u8; 25212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_RATE: 252353f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u.u8); 252453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 252553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 252653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 252753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Save state rate */ 252853f17a9db278d33517d9888dd77848f554522a38JP Abgrall state->rate = u.u8; 252953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 25302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTSIGNAL: 25312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTNOISE: 25322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_ANTENNA: 25332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 25342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: 25362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTNOISE: 25372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_int8(s, &u.i8); 25382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_CHANNEL: 25402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u.u16); 25412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rc != 0) 25422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u2.u16); 25442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FHSS: 25462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_LOCK_QUALITY: 25472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TX_ATTENUATION: 254853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_RX_FLAGS: 25492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u.u16); 25502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: 25522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 25532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_TX_POWER: 25552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_int8(s, &u.i8); 25562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 25572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TSFT: 25582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint64(s, &u.u64); 25592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 256053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_XCHANNEL: 256153f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint32(s, &u.u32); 256253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 256353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 256453f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint16(s, &u2.u16); 256553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 256653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 256753f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u3.u8); 256853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 256953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 257053f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u4.u8); 257153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 257253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_MCS: 257353f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u.u8); 257453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 257553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 257653f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u2.u8); 257753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 257853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 257953f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u3.u8); 258053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 258153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_VENDOR_NAMESPACE: { 2582892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t vns[3]; 2583892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t length; 2584892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t subspace; 258553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 258653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if ((cpack_align_and_reserve(s, 2)) == NULL) { 258753f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = -1; 258853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 258953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 259053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 259153f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &vns[0]); 259253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 259353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 259453f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &vns[1]); 259553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 259653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 259753f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &vns[2]); 259853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 259953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 260053f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &subspace); 260153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 260253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 260353f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint16(s, &length); 260453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 260553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 260653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 260753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Skip up to length */ 260853f17a9db278d33517d9888dd77848f554522a38JP Abgrall s->c_next += length; 260953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 261053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 26112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 26122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this bit indicates a field whose 26132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * size we do not know, so we cannot 261453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * proceed. Just print the bit number. 26152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2616892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[bit %u] ", bit)); 26172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 26182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 26192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 26202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rc != 0) { 2621892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 26222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return rc; 26232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 26242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Preserve the state present flags */ 262653f17a9db278d33517d9888dd77848f554522a38JP Abgrall state->present = presentflags; 262753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 26282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bit) { 26292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_CHANNEL: 263053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 263153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If CHANNEL and XCHANNEL are both present, skip 263253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * CHANNEL. 263353f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 263453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (presentflags & (1 << IEEE80211_RADIOTAP_XCHANNEL)) 263553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 2636892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes print_chaninfo(ndo, u.u16, u2.u16); 26372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FHSS: 2639892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff)); 26402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_RATE: 264253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 264353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * XXX On FreeBSD rate & 0x80 means we have an MCS. On 264453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Linux and AirPcap it does not. (What about 264553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Mac OS X, NetBSD, OpenBSD, and DragonFly BSD?) 264653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 264753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * This is an issue either for proprietary extensions 264853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * to 11a or 11g, which do exist, or for 11n 264953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * implementations that stuff a rate value into 265053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * this field, which also appear to exist. 265153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 265253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We currently handle that by assuming that 265353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * if the 0x80 bit is set *and* the remaining 265453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * bits have a value between 0 and 15 it's 265553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * an MCS value, otherwise it's a rate. If 265653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * there are cases where systems that use 265753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * "0x80 + MCS index" for MCS indices > 15, 265853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * or stuff a rate value here between 64 and 265953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 71.5 Mb/s in here, we'll need a preference 266053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * setting. Such rates do exist, e.g. 11n 266153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * MCS 7 at 20 MHz with a long guard interval. 266253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 266353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 >= 0x80 && u.u8 <= 0x8f) { 266453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 266553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * XXX - we don't know the channel width 266653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * or guard interval length, so we can't 266753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * convert this to a data rate. 266853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 266953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If you want us to show a data rate, 267053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * use the MCS field, not the Rate field; 267153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the MCS field includes not only the 267253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * MCS index, it also includes bandwidth 267353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * and guard interval information. 267453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 267553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * XXX - can we get the channel width 267653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * from XChannel and the guard interval 267753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * information from Flags, at least on 267853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * FreeBSD? 267953f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 2680892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "MCS %u ", u.u8 & 0x7f)); 268153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else 2682892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%2.1f Mb/s ", .5 * u.u8)); 26832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: 2685892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%ddB signal ", u.i8)); 26862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTNOISE: 2688892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%ddB noise ", u.i8)); 26892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTSIGNAL: 2691892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%ddB signal ", u.u8)); 26922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTNOISE: 2694892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%ddB noise ", u.u8)); 26952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_LOCK_QUALITY: 2697892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%u sq ", u.u16)); 26982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 26992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TX_ATTENUATION: 2700892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%d tx power ", -(int)u.u16)); 27012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 27022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: 2703892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%ddB tx power ", -(int)u.u8)); 27042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 27052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_TX_POWER: 2706892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%ddBm tx power ", u.i8)); 27072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 27082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FLAGS: 27092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_CFP) 2710892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "cfp ")); 27112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_SHORTPRE) 2712892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "short preamble ")); 27132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_WEP) 2714892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "wep ")); 27152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_FRAG) 2716892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "fragmented ")); 27172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_BADFCS) 2718892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "bad-fcs ")); 27192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 27202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_ANTENNA: 2721892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "antenna %d ", u.u8)); 27222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 27232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TSFT: 2724892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%" PRIu64 "us tsft ", u.u64)); 27252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 272653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_RX_FLAGS: 272753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Do nothing for now */ 272853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 272953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_XCHANNEL: 2730892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes print_chaninfo(ndo, u2.u16, u.u32); 273153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 273253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_MCS: { 273353f17a9db278d33517d9888dd77848f554522a38JP Abgrall static const char *bandwidth[4] = { 273453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "20 MHz", 273553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "40 MHz", 273653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "20 MHz (L)", 273753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "20 MHz (U)" 273853f17a9db278d33517d9888dd77848f554522a38JP Abgrall }; 273953f17a9db278d33517d9888dd77848f554522a38JP Abgrall float htrate; 274053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 274153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN) { 274253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 274353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We know the MCS index. 274453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 274553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u3.u8 <= MAX_MCS_INDEX) { 274653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 274753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * And it's in-range. 274853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 274953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & (IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN|IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN)) { 275053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 275153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * And we know both the bandwidth and 275253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the guard interval, so we can look 275353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * up the rate. 275453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 2755892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes htrate = 275653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ieee80211_float_htrates \ 275753f17a9db278d33517d9888dd77848f554522a38JP Abgrall [u3.u8] \ 275853f17a9db278d33517d9888dd77848f554522a38JP Abgrall [((u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK) == IEEE80211_RADIOTAP_MCS_BANDWIDTH_40 ? 1 : 0)] \ 275953f17a9db278d33517d9888dd77848f554522a38JP Abgrall [((u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ? 1 : 0)]; 276053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 276153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 276253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We don't know both the bandwidth 276353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * and the guard interval, so we can 276453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * only report the MCS index. 276553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 276653f17a9db278d33517d9888dd77848f554522a38JP Abgrall htrate = 0.0; 276753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 276853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 276953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 277053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * The MCS value is out of range. 277153f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 277253f17a9db278d33517d9888dd77848f554522a38JP Abgrall htrate = 0.0; 277353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 277453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (htrate != 0.0) { 277553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 277653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We have the rate. 277753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print it. 277853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 2779892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%.1f Mb/s MCS %u ", htrate, u3.u8)); 278053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 278153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 278253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We at least have the MCS index. 278353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print it. 278453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 2785892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "MCS %u ", u3.u8)); 278653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 278753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 278853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN) { 2789892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s ", 2790892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes bandwidth[u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK])); 279153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 279253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN) { 2793892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s GI ", 279453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ? 2795892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes "short" : "lon")); 279653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 279753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN) { 2798892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s ", 279953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (u2.u8 & IEEE80211_RADIOTAP_MCS_HT_GREENFIELD) ? 2800892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes "greenfield" : "mixed")); 280153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 280253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN) { 2803892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s FEC ", 280453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (u2.u8 & IEEE80211_RADIOTAP_MCS_FEC_LDPC) ? 2805892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes "LDPC" : "BCC")); 280653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 280753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_STBC_KNOWN) { 2808892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "RX-STBC%u ", 2809892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes (u2.u8 & IEEE80211_RADIOTAP_MCS_STBC_MASK) >> IEEE80211_RADIOTAP_MCS_STBC_SHIFT)); 281053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 281153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 281253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 281353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 28142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 28152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 28162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 28172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 2819892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesieee802_11_radio_print(netdissect_options *ndo, 2820892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length, u_int caplen) 28212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 28222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_32(x) (((x) >> 16) ? 16 + BITNO_16((x) >> 16) : BITNO_16((x))) 28232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_16(x) (((x) >> 8) ? 8 + BITNO_8((x) >> 8) : BITNO_8((x))) 28242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_8(x) (((x) >> 4) ? 4 + BITNO_4((x) >> 4) : BITNO_4((x))) 28252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_4(x) (((x) >> 2) ? 2 + BITNO_2((x) >> 2) : BITNO_2((x))) 28262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_2(x) (((x) & 2) ? 1 : 0) 282753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define BIT(n) (1U << n) 28282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IS_EXTENDED(__p) \ 28292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_LE_32BITS(__p) & BIT(IEEE80211_RADIOTAP_EXT)) != 0 28302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct cpack_state cpacker; 28322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ieee80211_radiotap_header *hdr; 2833892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t present, next_present; 2834892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t presentflags = 0; 2835892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t *presentp, *last_presentp; 28362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum ieee80211_radiotap_type bit; 28372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int bit0; 28382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int len; 2839892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t flags; 28402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int pad; 284153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int fcslen; 284253f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct radiotap_state state; 28432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < sizeof(*hdr)) { 2845892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 28462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 28472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 28482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdr = (struct ieee80211_radiotap_header *)p; 28502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_LE_16BITS(&hdr->it_len); 28522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < len) { 2854892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 28552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 28562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2857892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes cpack_init(&cpacker, (uint8_t *)hdr, len); /* align against header start */ 285853f17a9db278d33517d9888dd77848f554522a38JP Abgrall cpack_advance(&cpacker, sizeof(*hdr)); /* includes the 1st bitmap */ 28592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (last_presentp = &hdr->it_present; 28602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IS_EXTENDED(last_presentp) && 28612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (u_char*)(last_presentp + 1) <= p + len; 286253f17a9db278d33517d9888dd77848f554522a38JP Abgrall last_presentp++) 286353f17a9db278d33517d9888dd77848f554522a38JP Abgrall cpack_advance(&cpacker, sizeof(hdr->it_present)); /* more bitmaps */ 28642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* are there more bitmap extensions than bytes in header? */ 28662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IS_EXTENDED(last_presentp)) { 2867892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 28682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 28692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 28702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 287153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Assume no flags */ 287253f17a9db278d33517d9888dd77848f554522a38JP Abgrall flags = 0; 28732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Assume no Atheros padding between 802.11 header and body */ 28742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pad = 0; 287553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Assume no FCS at end of frame */ 287653f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen = 0; 28772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (bit0 = 0, presentp = &hdr->it_present; presentp <= last_presentp; 28782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project presentp++, bit0 += 32) { 287953f17a9db278d33517d9888dd77848f554522a38JP Abgrall presentflags = EXTRACT_LE_32BITS(presentp); 288053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 288153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Clear state. */ 288253f17a9db278d33517d9888dd77848f554522a38JP Abgrall memset(&state, 0, sizeof(state)); 288353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 28842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (present = EXTRACT_LE_32BITS(presentp); present; 28852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project present = next_present) { 28862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* clear the least significant bit that is set */ 28872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project next_present = present & (present - 1); 28882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 28892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* extract the least significant bit that is set */ 28902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bit = (enum ieee80211_radiotap_type) 28912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (bit0 + BITNO_32(present ^ next_present)); 28922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2893892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (print_radiotap_field(ndo, &cpacker, bit, &flags, &state, presentflags) != 0) 28942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto out; 28952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 28962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 289753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 28982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectout: 289953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_RADIOTAP_F_DATAPAD) 290053f17a9db278d33517d9888dd77848f554522a38JP Abgrall pad = 1; /* Atheros padding */ 290153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_RADIOTAP_F_FCS) 290253f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen = 4; /* FCS at end of packet */ 2903892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return len + ieee802_11_print(ndo, p + len, length - len, caplen - len, pad, 290453f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen); 29052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_32 29062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_16 29072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_8 29082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_4 29092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_2 29102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BIT 29112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 29122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 2914892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesieee802_11_avs_radio_print(netdissect_options *ndo, 2915892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const u_char *p, u_int length, u_int caplen) 29162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2917892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t caphdr_len; 29182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 291953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (caplen < 8) { 2920892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 292153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return caplen; 292253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 292353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 29242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project caphdr_len = EXTRACT_32BITS(p + 4); 29252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caphdr_len < 8) { 29262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 29272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Yow! The capture header length is claimed not 29282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to be large enough to include even the version 29292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * cookie or capture header length! 29302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2931892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 29322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 29332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 29342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < caphdr_len) { 2936892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 29372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 29382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 29392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2940892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return caphdr_len + ieee802_11_print(ndo, p + caphdr_len, 294153f17a9db278d33517d9888dd77848f554522a38JP Abgrall length - caphdr_len, caplen - caphdr_len, 0, 0); 29422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 29432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRISM_HDR_LEN 144 29452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 294653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define WLANCAP_MAGIC_COOKIE_BASE 0x80211000 29472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define WLANCAP_MAGIC_COOKIE_V1 0x80211001 294853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define WLANCAP_MAGIC_COOKIE_V2 0x80211002 29492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 29512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * For DLT_PRISM_HEADER; like DLT_IEEE802_11, but with an extra header, 29522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * containing information such as radio information, which we 29532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * currently ignore. 29542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 295553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If, however, the packet begins with WLANCAP_MAGIC_COOKIE_V1 or 295653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * WLANCAP_MAGIC_COOKIE_V2, it's really DLT_IEEE802_11_RADIO_AVS 295753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * (currently, on Linux, there's no ARPHRD_ type for 295853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * DLT_IEEE802_11_RADIO_AVS, as there is a ARPHRD_IEEE80211_PRISM 295953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * for DLT_PRISM_HEADER, so ARPHRD_IEEE80211_PRISM is used for 296053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the AVS header, and the first 4 bytes of the header are used to 296153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * indicate whether it's a Prism header or an AVS header). 29622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 29632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 2964892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesprism_if_print(netdissect_options *ndo, 2965892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const struct pcap_pkthdr *h, const u_char *p) 29662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 29672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int caplen = h->caplen; 29682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int length = h->len; 2969892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t msgcode; 29702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < 4) { 2972892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 29732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 29742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 29752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 297653f17a9db278d33517d9888dd77848f554522a38JP Abgrall msgcode = EXTRACT_32BITS(p); 297753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (msgcode == WLANCAP_MAGIC_COOKIE_V1 || 297853f17a9db278d33517d9888dd77848f554522a38JP Abgrall msgcode == WLANCAP_MAGIC_COOKIE_V2) 2979892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return ieee802_11_avs_radio_print(ndo, p, length, caplen); 29802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < PRISM_HDR_LEN) { 2982892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s", tstr)); 29832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 29842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 29852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2986892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return PRISM_HDR_LEN + ieee802_11_print(ndo, p + PRISM_HDR_LEN, 298753f17a9db278d33517d9888dd77848f554522a38JP Abgrall length - PRISM_HDR_LEN, caplen - PRISM_HDR_LEN, 0, 0); 29882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 29892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 29912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * For DLT_IEEE802_11_RADIO; like DLT_IEEE802_11, but with an extra 299253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * header, containing information such as radio information. 29932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 29942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 2995892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesieee802_11_radio_if_print(netdissect_options *ndo, 2996892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const struct pcap_pkthdr *h, const u_char *p) 29972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2998892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return ieee802_11_radio_print(ndo, p, h->len, h->caplen); 299953f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 30002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 300153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 300253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * For DLT_IEEE802_11_RADIO_AVS; like DLT_IEEE802_11, but with an 300353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * extra header, containing information such as radio information, 300453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * which we currently ignore. 300553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 300653f17a9db278d33517d9888dd77848f554522a38JP Abgrallu_int 3007892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesieee802_11_radio_avs_if_print(netdissect_options *ndo, 3008892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes const struct pcap_pkthdr *h, const u_char *p) 300953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 3010892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes return ieee802_11_avs_radio_print(ndo, p, h->len, h->caplen); 30112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3012