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 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-802_11.c,v 1.49 2007-12-29 23:25:02 guy Exp $ (LBL)"; 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "cpack.h" 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ieee802_11.h" 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ieee802_11_radio.h" 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Radiotap state */ 5053f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* This is used to save state when parsing/processing parameters */ 5153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct radiotap_state 5253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 5353f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int32_t present; 5453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 5553f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t rate; 5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_SSID(p) \ 5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.ssid_present) { \ 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" ("); \ 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fn_print(p.ssid.ssid, NULL); \ 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); \ 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_RATE(_sep, _r, _suf) \ 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s%2.1f%s", _sep, (.5 * ((_r) & 0x7f)), _suf) 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_RATES(p) \ 6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.rates_present) { \ 6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall int z; \ 7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall const char *sep = " ["; \ 7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall for (z = 0; z < p.rates.length ; z++) { \ 7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall PRINT_RATE(sep, p.rates.rate[z], \ 7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall (p.rates.rate[z] & 0x80 ? "*" : "")); \ 7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall sep = " "; \ 7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } \ 7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.rates.length != 0) \ 7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" Mbit]"); \ 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_DS_CHANNEL(p) \ 8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (p.ds_present) \ 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" CH: %u", p.ds.channel); \ 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", \ 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : "" ); 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define MAX_MCS_INDEX 76 8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 8953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Indices are: 9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the MCS index (0-76); 9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 0 for 20 MHz, 1 for 40 MHz; 9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 0 for a long guard interval, 1 for a short guard interval. 9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 9753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const float ieee80211_float_htrates[MAX_MCS_INDEX+1][2][2] = { 9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 0 */ 9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 6.5, /* SGI */ 7.2, }, 10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 13.5, /* SGI */ 15.0, }, 10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 10353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 1 */ 10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 13.0, /* SGI */ 14.4, }, 10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 27.0, /* SGI */ 30.0, }, 10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 2 */ 10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 19.5, /* SGI */ 21.7, }, 11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 40.5, /* SGI */ 45.0, }, 11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 3 */ 11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, 11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, 11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 4 */ 11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 5 */ 12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 6 */ 12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, 13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, 13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 7 */ 13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 8 */ 13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 13.0, /* SGI */ 14.4, }, 14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 27.0, /* SGI */ 30.0, }, 14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 9 */ 14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, 14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, 14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 10 */ 14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 11 */ 15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 12 */ 15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 13 */ 16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 14 */ 16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 15 */ 17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, 17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, 17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 16 */ 17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 19.5, /* SGI */ 21.7, }, 18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 40.5, /* SGI */ 45.0, }, 18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 17 */ 18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 18 */ 18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, 19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, 19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 19 */ 19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 20 */ 19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 21 */ 20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 22 */ 20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, 21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, 21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 23 */ 21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, 21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, 21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 24 */ 21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 26.0, /* SGI */ 28.9, }, 22053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 54.0, /* SGI */ 60.0, }, 22153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 22253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 25 */ 22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 26 */ 22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 27 */ 23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 28 */ 23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 29 */ 24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 208.0, /* SGI */ 231.1, }, 24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 432.0, /* SGI */ 480.0, }, 24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 30 */ 24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 234.0, /* SGI */ 260.0, }, 25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 486.0, /* SGI */ 540.0, }, 25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 31 */ 25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 260.0, /* SGI */ 288.9, }, 25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 540.0, /* SGI */ 600.0, }, 25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 32 */ 25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 0.0, /* SGI */ 0.0, }, /* not valid */ 26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 6.0, /* SGI */ 6.7, }, 26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 33 */ 26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 39.0, /* SGI */ 43.3, }, 26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 81.0, /* SGI */ 90.0, }, 26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 34 */ 26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 35 */ 27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 36 */ 27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 58.5, /* SGI */ 65.0, }, 28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 121.5, /* SGI */ 135.0, }, 28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 37 */ 28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 38 */ 28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 39 */ 29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 52.0, /* SGI */ 57.8, }, 29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 108.0, /* SGI */ 120.0, }, 29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 40 */ 29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 41 */ 30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 42 */ 30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 43 */ 31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 44 */ 31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 45 */ 32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 46 */ 32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 47 */ 33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 48 */ 33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 49 */ 34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 50 */ 34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 51 */ 35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 52 */ 35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 53 */ 36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 65.0, /* SGI */ 72.2, }, 36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 135.0, /* SGI */ 150.0, }, 36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 54 */ 36953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 37053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 37353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 55 */ 37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 56 */ 37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 78.0, /* SGI */ 86.7, }, 38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 162.0, /* SGI */ 180.0, }, 38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 38253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 57 */ 38453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 91.0, /* SGI */ 101.1, }, 38553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 189.0, /* SGI */ 210.0, }, 38653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 38753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 38853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 58 */ 38953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 39253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 39353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 59 */ 39453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 39653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 39753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 60 */ 39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 104.0, /* SGI */ 115.6, }, 40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 216.0, /* SGI */ 240.0, }, 40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 61 */ 40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 40653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 62 */ 40953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, 41053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, 41153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 41253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 41353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 63 */ 41453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 130.0, /* SGI */ 144.4, }, 41553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 270.0, /* SGI */ 300.0, }, 41653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 41753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 41853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 64 */ 41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 143.0, /* SGI */ 158.9, }, 42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 297.0, /* SGI */ 330.0, }, 42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 42253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 42353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 65 */ 42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 97.5, /* SGI */ 108.3, }, 42553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 202.5, /* SGI */ 225.0, }, 42653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 42753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 42853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 66 */ 42953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 43053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 43153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 43253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 43353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 67 */ 43453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 43553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 43653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 43753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 43853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 68 */ 43953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 117.0, /* SGI */ 130.0, }, 44053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 243.0, /* SGI */ 270.0, }, 44153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 44353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 69 */ 44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 136.5, /* SGI */ 151.7, }, 44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 283.5, /* SGI */ 315.0, }, 44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 70 */ 44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 71 */ 45453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, 45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, 45653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 72 */ 45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 156.0, /* SGI */ 173.3, }, 46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 324.0, /* SGI */ 360.0, }, 46153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 46353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 73 */ 46453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 175.5, /* SGI */ 195.0, }, 46553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 364.5, /* SGI */ 405.0, }, 46653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 46753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 46853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 74 */ 46953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, 47053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, 47153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 47253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 47353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 75 */ 47453f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 195.0, /* SGI */ 216.7, }, 47553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 405.0, /* SGI */ 450.0, }, 47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 47753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 47853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* MCS 76 */ 47953f17a9db278d33517d9888dd77848f554522a38JP Abgrall { /* 20 Mhz */ { 214.5, /* SGI */ 238.3, }, 48053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 40 Mhz */ { 445.5, /* SGI */ 495.0, }, 48153f17a9db278d33517d9888dd77848f554522a38JP Abgrall }, 48253f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 48353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *auth_alg_text[]={"Open System","Shared Key","EAP"}; 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_AUTH_ALGS (sizeof auth_alg_text / sizeof auth_alg_text[0]) 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *status_text[] = { 48853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Successful", /* 0 */ 48953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unspecified failure", /* 1 */ 49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 2 */ 49153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 3 */ 49253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 4 */ 49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 5 */ 49453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 6 */ 49553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 7 */ 49653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 8 */ 49753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 9 */ 49853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Cannot Support all requested capabilities in the Capability " 49953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Information field", /* 10 */ 50053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reassociation denied due to inability to confirm that association " 50153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "exists", /* 11 */ 50253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to reason outside the scope of the " 50353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "standard", /* 12 */ 50453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Responding station does not support the specified authentication " 50553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "algorithm ", /* 13 */ 50653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Received an Authentication frame with authentication transaction " 50753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "sequence number out of expected sequence", /* 14 */ 50853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Authentication rejected because of challenge failure", /* 15 */ 50953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Authentication rejected due to timeout waiting for next frame in " 51053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "sequence", /* 16 */ 51153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied because AP is unable to handle additional" 51253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "associated stations", /* 17 */ 51353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting all of " 51453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "the data rates in BSSBasicRateSet parameter", /* 18 */ 51553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 51653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "short preamble operation", /* 19 */ 51753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 51853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "PBCC encoding", /* 20 */ 51953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 52053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "channel agility", /* 21 */ 52153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association request rejected because Spectrum Management " 52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "capability is required", /* 22 */ 52353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association request rejected because the information in the " 52453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Power Capability element is unacceptable", /* 23 */ 52553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association request rejected because the information in the " 52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Supported Channels element is unacceptable", /* 24 */ 52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "short slot operation", /* 25 */ 52953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 53053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "DSSS-OFDM operation", /* 26 */ 53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied because the requested STA does not support HT " 53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "features", /* 27 */ 53353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 28 */ 53453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied because the requested STA does not support " 53553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "the PCO transition time required by the AP", /* 29 */ 53653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 30 */ 53753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 31 */ 53853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unspecified, QoS-related failure", /* 32 */ 53953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to QAP having insufficient bandwidth " 54053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "to handle another QSTA", /* 33 */ 54153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to excessive frame loss rates and/or " 54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "poor conditions on current operating channel", /* 34 */ 54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association (with QBSS) denied due to requesting station not " 54453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "supporting the QoS facility", /* 35 */ 54553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting station not supporting " 54653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Block Ack", /* 36 */ 54753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The request has been declined", /* 37 */ 54853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The request has not been successful as one or more parameters " 54953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "have invalid values", /* 38 */ 55053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The TS has not been created because the request cannot be honored. " 55153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "However, a suggested TSPEC is provided so that the initiating QSTA" 55253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "may attempt to set another TS with the suggested changes to the " 55353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "TSPEC", /* 39 */ 55453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid Information Element", /* 40 */ 55553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Group Cipher is not valid", /* 41 */ 55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Pairwise Cipher is not valid", /* 42 */ 55753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "AKMP is not valid", /* 43 */ 55853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unsupported RSN IE version", /* 44 */ 55953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid RSN IE Capabilities", /* 45 */ 56053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Cipher suite is rejected per security policy", /* 46 */ 56153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The TS has not been created. However, the HC may be capable of " 56253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "creating a TS, in response to a request, after the time indicated " 56353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "in the TS Delay element", /* 47 */ 56453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Direct Link is not allowed in the BSS by policy", /* 48 */ 56553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Destination STA is not present within this QBSS.", /* 49 */ 56653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "The Destination STA is not a QSTA.", /* 50 */ 56753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_STATUSES (sizeof status_text / sizeof status_text[0]) 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *reason_text[] = { 57253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 0 */ 57353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unspecified reason", /* 1 */ 57453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Previous authentication no longer valid", /* 2 */ 57553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Deauthenticated because sending station is leaving (or has left) " 57653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "IBSS or ESS", /* 3 */ 57753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated due to inactivity", /* 4 */ 57853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because AP is unable to handle all currently " 57953f17a9db278d33517d9888dd77848f554522a38JP Abgrall " associated stations", /* 5 */ 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Class 2 frame received from nonauthenticated station", /* 6 */ 58153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Class 3 frame received from nonassociated station", /* 7 */ 58253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because sending station is leaving " 58353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "(or has left) BSS", /* 8 */ 58453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Station requesting (re)association is not authenticated with " 58553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "responding station", /* 9 */ 58653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because the information in the Power Capability " 58753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "element is unacceptable", /* 10 */ 58853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because the information in the SupportedChannels " 58953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "element is unacceptable", /* 11 */ 59053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid Information Element", /* 12 */ 59153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 13 */ 59253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Michael MIC failure", /* 14 */ 59353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "4-Way Handshake timeout", /* 15 */ 59453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Group key update timeout", /* 16 */ 59553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Information element in 4-Way Handshake different from (Re)Association" 59653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Request/Probe Response/Beacon", /* 17 */ 59753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Group Cipher is not valid", /* 18 */ 59853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "AKMP is not valid", /* 20 */ 59953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Unsupported RSN IE version", /* 21 */ 60053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Invalid RSN IE Capabilities", /* 22 */ 60153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "IEEE 802.1X Authentication failed", /* 23 */ 60253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Cipher suite is rejected per security policy", /* 24 */ 60353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 25 */ 60453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 26 */ 60553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 27 */ 60653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 28 */ 60753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 29 */ 60853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 30 */ 60953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "TS deleted because QoS AP lacks sufficient bandwidth for this " 61053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "QoS STA due to a change in BSS service characteristics or " 61153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "operational mode (e.g. an HT BSS change from 40 MHz channel " 61253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "to 20 MHz channel)", /* 31 */ 61353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated for unspecified, QoS-related reason", /* 32 */ 61453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because QoS AP lacks sufficient bandwidth for this " 61553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "QoS STA", /* 33 */ 61653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because of excessive number of frames that need to be " 61753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "acknowledged, but are not acknowledged for AP transmissions " 61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "and/or poor channel conditions", /* 34 */ 61953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Disassociated because STA is transmitting outside the limits " 62053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "of its TXOPs", /* 35 */ 62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA as the STA is leaving the BSS " 62253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "(or resetting)", /* 36 */ 62353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA as it does not want to use the " 62453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "mechanism", /* 37 */ 62553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA as the STA received frames using the " 62653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "mechanism for which a set up is required", /* 38 */ 62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Requested from peer STA due to time out", /* 39 */ 62853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 40 */ 62953f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 41 */ 63053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 42 */ 63153f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 43 */ 63253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Reserved", /* 44 */ 63353f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Peer STA does not support the requested cipher suite", /* 45 */ 63453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "Association denied due to requesting STA not supporting HT " 63553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "features", /* 46 */ 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_REASONS (sizeof reason_text / sizeof reason_text[0]) 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectwep_print(const u_char *p) 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t iv; 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_IV_LEN + IEEE802_11_KID_LEN)) 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project iv = EXTRACT_LE_32BITS(p); 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Data IV:%3x Pad %x KeyID %x", IV_IV(iv), IV_PAD(iv), 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IV_KEYID(iv)); 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 65453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int 65553f17a9db278d33517d9888dd77848f554522a38JP Abgrallparse_elements(struct mgmt_body_t *pbody, const u_char *p, int offset, 65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int length) 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 65853f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int elementlen; 65953f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct ssid_t ssid; 66053f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct challenge_t challenge; 66153f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct rates_t rates; 66253f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct ds_t ds; 66353f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct cf_t cf; 66453f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct tim_t tim; 66553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * We haven't seen any elements yet. 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 66953f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->challenge_present = 0; 67053f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ssid_present = 0; 67153f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->rates_present = 0; 67253f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ds_present = 0; 67353f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->cf_present = 0; 67453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->tim_present = 0; 67553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 67653f17a9db278d33517d9888dd77848f554522a38JP Abgrall while (length != 0) { 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 1)) 67853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 67953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 1) 68053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (*(p + offset)) { 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_SSID: 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 68453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 68553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 2) 68653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 68753f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&ssid, p + offset, 2); 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 68953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 69053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ssid.length != 0) { 69153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ssid.length > sizeof(ssid.ssid) - 1) 69253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 69353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*(p + offset), ssid.length)) 69453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 69553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < ssid.length) 69653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 69753f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&ssid.ssid, p + offset, ssid.length); 69853f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += ssid.length; 69953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= ssid.length; 70053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 70153f17a9db278d33517d9888dd77848f554522a38JP Abgrall ssid.ssid[ssid.length] = '\0'; 70253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 70353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 70453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 70553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen an SSID IE, 70653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 70753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 70853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 70953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->ssid_present) { 71053f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ssid = ssid; 71153f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ssid_present = 1; 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_CHALLENGE: 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 71653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 71753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 2) 71853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 71953f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&challenge, p + offset, 2); 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 72153f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 72253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (challenge.length != 0) { 72353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (challenge.length > 72453f17a9db278d33517d9888dd77848f554522a38JP Abgrall sizeof(challenge.text) - 1) 72553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 72653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*(p + offset), challenge.length)) 72753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 72853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < challenge.length) 72953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 73053f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&challenge.text, p + offset, 73153f17a9db278d33517d9888dd77848f554522a38JP Abgrall challenge.length); 73253f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += challenge.length; 73353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= challenge.length; 73453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 73553f17a9db278d33517d9888dd77848f554522a38JP Abgrall challenge.text[challenge.length] = '\0'; 73653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 73753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 73853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 73953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a challenge IE, 74053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 74153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 74253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 74353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->challenge_present) { 74453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->challenge = challenge; 74553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->challenge_present = 1; 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_RATES: 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 75053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 75153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 2) 75253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 75353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&rates, p + offset, 2); 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 75553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 75653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rates.length != 0) { 75753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rates.length > sizeof rates.rate) 75853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 75953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*(p + offset), rates.length)) 76053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 76153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < rates.length) 76253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 76353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&rates.rate, p + offset, rates.length); 76453f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += rates.length; 76553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= rates.length; 76653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 76753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 76853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 76953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 77053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a rates IE, 77153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one if it's not zero-length, 77253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * otherwise ignore this one, so we later 77353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * report the first one we saw. 77453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 77553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We ignore zero-length rates IEs as some 77653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * devices seem to put a zero-length rates 77753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * IE, followed by an SSID IE, followed by 77853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * a non-zero-length rates IE into frames, 77953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * even though IEEE Std 802.11-2007 doesn't 78053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * seem to indicate that a zero-length rates 78153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * IE is valid. 78253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 78353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->rates_present && rates.length != 0) { 78453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->rates = rates; 78553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->rates_present = 1; 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_DS: 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 3)) 79053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 79153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 3) 79253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 79353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&ds, p + offset, 3); 7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 3; 79553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 3; 79653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 79753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 79853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 79953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a DS IE, 80053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 80153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 80253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 80353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->ds_present) { 80453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ds = ds; 80553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->ds_present = 1; 80653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_CF: 8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 8)) 81053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 81153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 8) 81253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 81353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&cf, p + offset, 8); 8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 8; 81553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 8; 81653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 81753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 81853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 81953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a CF IE, 82053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 82153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 82253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 82353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->cf_present) { 82453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->cf = cf; 82553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->cf_present = 1; 82653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_TIM: 8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 83053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 83153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 2) 83253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 83353f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&tim, p + offset, 2); 8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 3)) 83753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 83853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 3) 83953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 84053f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(&tim.count, p + offset, 3); 8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 3; 84253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 3; 8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 84453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tim.length <= 3) 8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 84653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (tim.length - 3 > (int)sizeof tim.bitmap) 84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 84853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*(p + offset), tim.length - 3)) 84953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 85053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < (u_int)(tim.length - 3)) 85153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 85253f17a9db278d33517d9888dd77848f554522a38JP Abgrall memcpy(tim.bitmap, p + (tim.length - 3), 85353f17a9db278d33517d9888dd77848f554522a38JP Abgrall (tim.length - 3)); 85453f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += tim.length - 3; 85553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= tim.length - 3; 85653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 85753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Present and not truncated. 85853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 85953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If we haven't already seen a TIM IE, 86053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * copy this one, otherwise ignore this one, 86153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * so we later report the first one we saw. 86253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 86353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!pbody->tim_present) { 86453f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->tim = tim; 86553f17a9db278d33517d9888dd77848f554522a38JP Abgrall pbody->tim_present = 1; 86653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(1) unhandled element_id (%d) ", 87153f17a9db278d33517d9888dd77848f554522a38JP Abgrall *(p + offset)); 8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 87453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 87553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 2) 87653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 87753f17a9db278d33517d9888dd77848f554522a38JP Abgrall elementlen = *(p + offset + 1); 87853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*(p + offset + 2), elementlen)) 87953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 88053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < elementlen + 2) 88153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 88253f17a9db278d33517d9888dd77848f554522a38JP Abgrall offset += elementlen + 2; 88353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= elementlen + 2; 8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 88753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 88853f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* No problems found. */ 88953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 1; 8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Handle functions for the management frame types 8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 89753f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_beacon(const u_char *p, u_int length) 8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 90153f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_CAPINFO_LEN)) 9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 90853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 90953f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_CAPINFO_LEN) 91053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); 9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_TSTAMP_LEN; 91353f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_TSTAMP_LEN; 9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_BCNINT_LEN; 91653f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_BCNINT_LEN; 9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 91953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 92153f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = parse_elements(&pbody, p, offset, length); 9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s", 9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CAPABILITY_ESS(pbody.capability_info) ? "ESS" : "IBSS"); 9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_DS_CHANNEL(pbody); 9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 92953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 93353f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_assoc_request(const u_char *p, u_int length) 9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 93753f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN)) 9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 94353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN) 94453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 94753f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.listen_interval = EXTRACT_LE_16BITS(p+offset); 9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_LISTENINT_LEN; 95053f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_LISTENINT_LEN; 9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 95253f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = parse_elements(&pbody, p, offset, length); 9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 95653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 96053f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_assoc_response(const u_char *p, u_int length) 9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 96453f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN + 9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_AID_LEN)) 9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 97153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN + 97253f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_AID_LEN) 97353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 97653f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.status_code = EXTRACT_LE_16BITS(p+offset); 9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_STATUS_LEN; 97953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_STATUS_LEN; 9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.aid = EXTRACT_LE_16BITS(p+offset); 9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_AID_LEN; 98253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_AID_LEN; 9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 98453f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = parse_elements(&pbody, p, offset, length); 9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" AID(%x) :%s: %s", ((u_int16_t)(pbody.aid << 2 )) >> 2 , 9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CAPABILITY_PRIVACY(pbody.capability_info) ? " PRIVACY " : "", 9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.status_code < NUM_STATUSES 9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "n/a")); 9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 99253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 99653f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_reassoc_request(const u_char *p, u_int length) 9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 100053f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN + 10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_AP_LEN)) 10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 100753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN + 100853f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_AP_LEN) 100953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 101253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.listen_interval = EXTRACT_LE_16BITS(p+offset); 10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_LISTENINT_LEN; 101553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_LISTENINT_LEN; 10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.ap, p+offset, IEEE802_11_AP_LEN); 10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_AP_LEN; 101853f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_AP_LEN; 10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 102053f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = parse_elements(&pbody, p, offset, length); 10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" AP : %s", etheraddr_string( pbody.ap )); 10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 102553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 102953f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_reassoc_response(const u_char *p, u_int length) 10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Same as a Association Reponse */ 103253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_assoc_response(p, length); 10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 103653f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_probe_request(const u_char *p, u_int length) 10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 104053f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 104453f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = parse_elements(&pbody, p, offset, length); 10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 104953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 105353f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_probe_response(const u_char *p, u_int length) 10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 105753f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_CAPINFO_LEN)) 10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 106453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 106553f17a9db278d33517d9888dd77848f554522a38JP Abgrall IEEE802_11_CAPINFO_LEN) 106653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); 10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_TSTAMP_LEN; 106953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_TSTAMP_LEN; 10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_BCNINT_LEN; 107253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_BCNINT_LEN; 10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 107553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_CAPINFO_LEN; 10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 107753f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = parse_elements(&pbody, p, offset, length); 10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_DS_CHANNEL(pbody); 10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 108353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_atim(void) 10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the frame body for ATIM is null. */ 10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 109453f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_disassoc(const u_char *p, u_int length) 10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_REASON_LEN)) 11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 110253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_REASON_LEN) 110353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.reason_code = EXTRACT_LE_16BITS(p); 11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %s", 11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.reason_code < NUM_REASONS) 11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? reason_text[pbody.reason_code] 11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved" ); 11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 111553f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_auth(const u_char *p, u_int length) 11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 111953f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ret; 11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, 6)) 11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 112553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 6) 112653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_alg = EXTRACT_LE_16BITS(p); 11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 112953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num = EXTRACT_LE_16BITS(p + offset); 11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 113253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.status_code = EXTRACT_LE_16BITS(p + offset); 11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 113553f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= 2; 11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 113753f17a9db278d33517d9888dd77848f554522a38JP Abgrall ret = parse_elements(&pbody, p, offset, length); 11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((pbody.auth_alg == 1) && 11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pbody.auth_trans_seq_num == 2) || 11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_trans_seq_num == 3))) { 11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s)-%x [Challenge Text] %s", 11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_alg < NUM_AUTH_ALGS) 11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? auth_alg_text[pbody.auth_alg] 11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved", 11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num, 11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pbody.auth_trans_seq_num % 2) 11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? ((pbody.status_code < NUM_STATUSES) 11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "n/a") : "")); 115153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s)-%x: %s", 11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_alg < NUM_AUTH_ALGS) 11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? auth_alg_text[pbody.auth_alg] 11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved", 11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num, 11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_trans_seq_num % 2) 11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? ((pbody.status_code < NUM_STATUSES) 11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "n/a") 11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : ""); 11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 116453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ret; 11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 116853f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_deauth(const struct mgmt_header_t *pmh, const u_char *p, u_int length) 11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *reason = NULL; 11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_REASON_LEN)) 11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 117853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < IEEE802_11_REASON_LEN) 117953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.reason_code = EXTRACT_LE_16BITS(p); 11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_REASON_LEN; 118253f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= IEEE802_11_REASON_LEN; 11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project reason = (pbody.reason_code < NUM_REASONS) 11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? reason_text[pbody.reason_code] 11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved"; 11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (eflag) { 11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %s", reason); 11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s): %s", etheraddr_string(pmh->sa), reason); 11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 119653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_HT_ACTION(v) (\ 119753f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 0 ? printf("TxChWidth") : \ 119853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("MIMOPwrSave") : \ 119953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 120053f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 120153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_BA_ACTION(v) (\ 120253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 0 ? printf("ADDBA Request") : \ 120353f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("ADDBA Response") : \ 120453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 2 ? printf("DELBA") : \ 120553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 120653f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 120753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESHLINK_ACTION(v) (\ 120853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 0 ? printf("Request") : \ 120953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("Report") : \ 121053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 121153f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 121253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESHPEERING_ACTION(v) (\ 121353f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 0 ? printf("Open") : \ 121453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("Confirm") : \ 121553f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 2 ? printf("Close") : \ 121653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 121753f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 121853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESHPATH_ACTION(v) (\ 121953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 0 ? printf("Request") : \ 122053f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("Report") : \ 122153f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 2 ? printf("Error") : \ 122253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 3 ? printf("RootAnnouncement") : \ 122353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 122453f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 122553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 122653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MESH_ACTION(v) (\ 122753f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 0 ? printf("MeshLink") : \ 122853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("HWMP") : \ 122953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 2 ? printf("Gate Announcement") : \ 123053f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 3 ? printf("Congestion Control") : \ 123153f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 4 ? printf("MCCA Setup Request") : \ 123253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 5 ? printf("MCCA Setup Reply") : \ 123353f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 6 ? printf("MCCA Advertisement Request") : \ 123453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 7 ? printf("MCCA Advertisement") : \ 123553f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 8 ? printf("MCCA Teardown") : \ 123653f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 9 ? printf("TBTT Adjustment Request") : \ 123753f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 10 ? printf("TBTT Adjustment Response") : \ 123853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 123953f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 124053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_MULTIHOP_ACTION(v) (\ 124153f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 0 ? printf("Proxy Update") : \ 124253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("Proxy Update Confirmation") : \ 124353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 124453f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 124553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PRINT_SELFPROT_ACTION(v) (\ 124653f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 1 ? printf("Peering Open") : \ 124753f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 2 ? printf("Peering Confirm") : \ 124853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 3 ? printf("Peering Close") : \ 124953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 4 ? printf("Group Key Inform") : \ 125053f17a9db278d33517d9888dd77848f554522a38JP Abgrall (v) == 5 ? printf("Group Key Acknowledge") : \ 125153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Act#%d", (v)) \ 125253f17a9db278d33517d9888dd77848f554522a38JP Abgrall) 125353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 125453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int 125553f17a9db278d33517d9888dd77848f554522a38JP Abgrallhandle_action(const struct mgmt_header_t *pmh, const u_char *p, u_int length) 125653f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 125753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*p, 2)) 125853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 125953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < 2) 126053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 126153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (eflag) { 126253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(": "); 126353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 126453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" (%s): ", etheraddr_string(pmh->sa)); 126553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 126653f17a9db278d33517d9888dd77848f554522a38JP Abgrall switch (p[0]) { 126753f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 0: printf("Spectrum Management Act#%d", p[1]); break; 126853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 1: printf("QoS Act#%d", p[1]); break; 126953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 2: printf("DLS Act#%d", p[1]); break; 127053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 3: printf("BA "); PRINT_BA_ACTION(p[1]); break; 127153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 7: printf("HT "); PRINT_HT_ACTION(p[1]); break; 127253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 13: printf("MeshAction "); PRINT_MESH_ACTION(p[1]); break; 127353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 14: 127453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("MultiohopAction "); 127553f17a9db278d33517d9888dd77848f554522a38JP Abgrall PRINT_MULTIHOP_ACTION(p[1]); break; 127653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 15: 127753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("SelfprotectAction "); 127853f17a9db278d33517d9888dd77848f554522a38JP Abgrall PRINT_SELFPROT_ACTION(p[1]); break; 127953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case 127: printf("Vendor Act#%d", p[1]); break; 128053f17a9db278d33517d9888dd77848f554522a38JP Abgrall default: 128153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Reserved(%d) Act#%d", p[0], p[1]); 128253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 128353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 128453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 1; 128553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 128653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Body funcs 12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmgmt_body_print(u_int16_t fc, const struct mgmt_header_t *pmh, 129553f17a9db278d33517d9888dd77848f554522a38JP Abgrall const u_char *p, u_int length) 12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ASSOC_REQUEST: 12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Assoc Request"); 130053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_assoc_request(p, length); 13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ASSOC_RESPONSE: 13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Assoc Response"); 130353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_assoc_response(p, length); 13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_REASSOC_REQUEST: 13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("ReAssoc Request"); 130653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_reassoc_request(p, length); 13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_REASSOC_RESPONSE: 13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("ReAssoc Response"); 130953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_reassoc_response(p, length); 13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_PROBE_REQUEST: 13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Probe Request"); 131253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_probe_request(p, length); 13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_PROBE_RESPONSE: 13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Probe Response"); 131553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_probe_response(p, length); 13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_BEACON: 13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Beacon"); 131853f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_beacon(p, length); 13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ATIM: 13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("ATIM"); 13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_atim(); 13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_DISASSOC: 13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Disassociation"); 132453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_disassoc(p, length); 13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_AUTH: 13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Authentication"); 13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, 3)) 13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((p[0] == 0 ) && (p[1] == 0) && (p[2] == 0)) { 13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Authentication (Shared-Key)-3 "); 13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return wep_print(p); 13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 133353f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_auth(p, length); 13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_DEAUTH: 13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("DeAuthentication"); 133653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_deauth(pmh, p, length); 133753f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 133853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case ST_ACTION: 133953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Action"); 134053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return handle_action(pmh, p, length); 13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Unhandled Management subtype(%x)", 13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project FC_SUBTYPE(fc)); 13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handles printing all the control frame types 13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectctrl_body_print(u_int16_t fc, const u_char *p) 13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 135853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_CONTROL_WRAPPER: 135953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("Control Wrapper"); 136053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* XXX - requires special handling */ 136153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 136253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BAR: 136353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("BAR"); 136453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*p, CTRL_BAR_HDRLEN)) 136553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 136653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!eflag) 136753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" RA:%s TA:%s CTL(%x) SEQ(%u) ", 136853f17a9db278d33517d9888dd77848f554522a38JP Abgrall etheraddr_string(((const struct ctrl_bar_t *)p)->ra), 136953f17a9db278d33517d9888dd77848f554522a38JP Abgrall etheraddr_string(((const struct ctrl_bar_t *)p)->ta), 137053f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->ctl)), 137153f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->seq))); 137253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 137353f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BA: 137453f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("BA"); 137553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!TTEST2(*p, CTRL_BA_HDRLEN)) 137653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return 0; 137753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!eflag) 137853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" RA:%s ", 137953f17a9db278d33517d9888dd77848f554522a38JP Abgrall etheraddr_string(((const struct ctrl_ba_t *)p)->ra)); 138053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Power Save-Poll"); 13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_PS_POLL_HDRLEN)) 13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" AID(%x)", 13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_LE_16BITS(&(((const struct ctrl_ps_poll_t *)p)->aid))); 13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Request-To-Send"); 13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_RTS_HDRLEN)) 13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" TA:%s ", 13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_rts_t *)p)->ta)); 13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Clear-To-Send"); 13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_CTS_HDRLEN)) 13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_cts_t *)p)->ra)); 14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Acknowledgment"); 14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_ACK_HDRLEN)) 14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ack_t *)p)->ra)); 14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("CF-End"); 14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_END_HDRLEN)) 14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_t *)p)->ra)); 14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("CF-End+CF-Ack"); 14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_END_ACK_HDRLEN)) 14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_ack_t *)p)->ra)); 14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Unknown Ctrl Subtype"); 14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Header funcs 14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Data Frame - Address field contents 14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * To Ds | From DS | Addr 1 | Addr 2 | Addr 3 | Addr 4 14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 | 0 | DA | SA | BSSID | n/a 14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 | 1 | DA | BSSID | SA | n/a 14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1 | 0 | BSSID | SA | DA | n/a 14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1 | 1 | RA | TA | DA | SA 14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 14492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdata_header_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp, 14502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t **dstp) 14512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 14522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int subtype = FC_SUBTYPE(fc); 14532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_ACK(subtype) || DATA_FRAME_IS_CF_POLL(subtype) || 14552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DATA_FRAME_IS_QOS(subtype)) { 14562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("CF "); 14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_ACK(subtype)) { 14582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_POLL(subtype)) 14592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Ack/Poll"); 14602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Ack"); 14622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 14632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_POLL(subtype)) 14642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Poll"); 14652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_QOS(subtype)) 14672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("+QoS"); 14682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 14692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 14702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR1 (p + 4) 14722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR2 (p + 10) 14732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR3 (p + 16) 14742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR4 (p + 24) 14752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 14762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!FC_TO_DS(fc) && !FC_FROM_DS(fc)) { 14772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 14782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR2; 14792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 14802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR1; 14812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 14822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 14832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("DA:%s SA:%s BSSID:%s ", 14842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 14852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3)); 14862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (!FC_TO_DS(fc) && FC_FROM_DS(fc)) { 14872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 14882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR3; 14892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 14902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR1; 14912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 14922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 14932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("DA:%s BSSID:%s SA:%s ", 14942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 14952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3)); 14962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (FC_TO_DS(fc) && !FC_FROM_DS(fc)) { 14972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 14982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR2; 14992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 15002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR3; 15012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 15022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("BSSID:%s SA:%s DA:%s ", 15042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 15052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3)); 15062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (FC_TO_DS(fc) && FC_FROM_DS(fc)) { 15072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 15082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR4; 15092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 15102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR3; 15112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 15122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 15132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s TA:%s DA:%s SA:%s ", 15142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 15152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3), etheraddr_string(ADDR4)); 15162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 15172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR1 15192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR2 15202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR3 15212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR4 15222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 15232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 15252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmgmt_header_print(const u_char *p, const u_int8_t **srcp, 15262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t **dstp) 15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 15282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct mgmt_header_t *hp = (const struct mgmt_header_t *) p; 15292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 15312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = hp->sa; 15322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 15332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = hp->da; 15342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 15352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 15362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("BSSID:%s DA:%s SA:%s ", 15382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string((hp)->bssid), etheraddr_string((hp)->da), 15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string((hp)->sa)); 15402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 15412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 15432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectctrl_header_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp, 15442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t **dstp) 15452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 15462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 15472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = NULL; 15482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = NULL; 15502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 15512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 15522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 155453f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BAR: 155553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" RA:%s TA:%s CTL(%x) SEQ(%u) ", 155653f17a9db278d33517d9888dd77848f554522a38JP Abgrall etheraddr_string(((const struct ctrl_bar_t *)p)->ra), 155753f17a9db278d33517d9888dd77848f554522a38JP Abgrall etheraddr_string(((const struct ctrl_bar_t *)p)->ta), 155853f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->ctl)), 155953f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_LE_16BITS(&(((const struct ctrl_bar_t *)p)->seq))); 156053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 156153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BA: 156253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("RA:%s ", 156353f17a9db278d33517d9888dd77848f554522a38JP Abgrall etheraddr_string(((const struct ctrl_ba_t *)p)->ra)); 156453f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 15652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 15662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("BSSID:%s TA:%s ", 15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ps_poll_t *)p)->bssid), 15682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ps_poll_t *)p)->ta)); 15692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 15712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s TA:%s ", 15722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_rts_t *)p)->ra), 15732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_rts_t *)p)->ta)); 15742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 15762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s ", 15772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_cts_t *)p)->ra)); 15782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 15802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s ", 15812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ack_t *)p)->ra)); 15822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 15842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s BSSID:%s ", 15852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_t *)p)->ra), 15862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_t *)p)->bssid)); 15872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 15892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s BSSID:%s ", 15902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_ack_t *)p)->ra), 15912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_ack_t *)p)->bssid)); 15922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 15942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(H) Unknown Ctrl Subtype"); 15952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 15962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 15972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 15982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 15992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 16002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextract_header_length(u_int16_t fc) 16012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 16022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int len; 16032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 16052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 16062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return MGMT_HDRLEN; 16072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 16082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 160953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case CTRL_BAR: 161053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return CTRL_BAR_HDRLEN; 16112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 16122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_PS_POLL_HDRLEN; 16132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 16142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_RTS_HDRLEN; 16152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 16162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_CTS_HDRLEN; 16172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 16182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_ACK_HDRLEN; 16192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 16202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_END_HDRLEN; 16212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 16222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_END_ACK_HDRLEN; 16232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 16242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 16252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 16262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 16272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = (FC_TO_DS(fc) && FC_FROM_DS(fc)) ? 30 : 24; 16282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) 16292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len += 2; 16302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return len; 16312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 16322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("unknown IEEE802.11 frame type (%d)", FC_TYPE(fc)); 16332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 16342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 16352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 16362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 163753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int 163853f17a9db278d33517d9888dd77848f554522a38JP Abgrallextract_mesh_header_length(const u_char *p) 163953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 164053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (p[0] &~ 3) ? 0 : 6*(1 + (p[0] & 3)); 164153f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 164253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 16432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 16442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print the 802.11 MAC header if eflag is set, and set "*srcp" and "*dstp" 16452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to point to the source and destination MAC addresses in any case if 16462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * "srcp" and "dstp" aren't null. 16472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 164853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void 164953f17a9db278d33517d9888dd77848f554522a38JP Abgrallieee_802_11_hdr_print(u_int16_t fc, const u_char *p, u_int hdrlen, 165053f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int meshdrlen, const u_int8_t **srcp, const u_int8_t **dstp) 16512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 16522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 16532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_MORE_DATA(fc)) 16542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("More Data "); 16552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_MORE_FLAG(fc)) 16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("More Fragments "); 16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_POWER_MGMT(fc)) 16582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Pwr Mgmt "); 16592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_RETRY(fc)) 16602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Retry "); 16612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_ORDER(fc)) 16622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Strictly Ordered "); 16632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_WEP(fc)) 16642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("WEP Encrypted "); 16652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_TYPE(fc) != T_CTRL || FC_SUBTYPE(fc) != CTRL_PS_POLL) 16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%dus ", 16672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_LE_16BITS( 16682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project &((const struct mgmt_header_t *)p)->duration)); 16692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 167053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (meshdrlen != 0) { 167153f17a9db278d33517d9888dd77848f554522a38JP Abgrall const struct meshcntl_t *mc = 167253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (const struct meshcntl_t *)&p[hdrlen - meshdrlen]; 167353f17a9db278d33517d9888dd77848f554522a38JP Abgrall int ae = mc->flags & 3; 167453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 167553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("MeshData (AE %d TTL %u seq %u", ae, mc->ttl, 167653f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_LE_32BITS(mc->seq)); 167753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ae > 0) 167853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" A4:%s", etheraddr_string(mc->addr4)); 167953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ae > 1) 168053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" A5:%s", etheraddr_string(mc->addr5)); 168153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (ae > 2) 168253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" A6:%s", etheraddr_string(mc->addr6)); 168353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(") "); 168453f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 16852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 16862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 16872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mgmt_header_print(p, srcp, dstp); 16892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 16902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 16912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ctrl_header_print(fc, p, srcp, dstp); 16922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 16932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 16942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project data_header_print(fc, p, srcp, dstp); 16952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 16962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 16972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(header) unknown IEEE802.11 frame type (%d)", 16982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project FC_TYPE(fc)); 16992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = NULL; 17002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = NULL; 17012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 17042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef roundup2 17062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */ 17072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 17082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 171053f17a9db278d33517d9888dd77848f554522a38JP Abgrallieee802_11_print(const u_char *p, u_int length, u_int orig_caplen, int pad, 171153f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int fcslen) 17122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 17132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t fc; 171453f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int caplen, hdrlen, meshdrlen; 17152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t *src, *dst; 17162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short extracted_ethertype; 17172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 171853f17a9db278d33517d9888dd77848f554522a38JP Abgrall caplen = orig_caplen; 171953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Remove FCS, if present */ 172053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (length < fcslen) { 17212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 17222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 17232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 172453f17a9db278d33517d9888dd77848f554522a38JP Abgrall length -= fcslen; 172553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (caplen > length) { 172653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Amount of FCS in actual packet data, if any */ 172753f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen = caplen - length; 172853f17a9db278d33517d9888dd77848f554522a38JP Abgrall caplen -= fcslen; 172953f17a9db278d33517d9888dd77848f554522a38JP Abgrall snapend -= fcslen; 173053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 173153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 173253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (caplen < IEEE802_11_FC_LEN) { 173353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("[|802.11]"); 173453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return orig_caplen; 173553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 17362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fc = EXTRACT_LE_16BITS(p); 17382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen = extract_header_length(fc); 17392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pad) 17402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen = roundup2(hdrlen, 4); 174153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (Hflag && FC_TYPE(fc) == T_DATA && 174253f17a9db278d33517d9888dd77848f554522a38JP Abgrall DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) { 174353f17a9db278d33517d9888dd77848f554522a38JP Abgrall meshdrlen = extract_mesh_header_length(p+hdrlen); 174453f17a9db278d33517d9888dd77848f554522a38JP Abgrall hdrlen += meshdrlen; 174553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else 174653f17a9db278d33517d9888dd77848f554522a38JP Abgrall meshdrlen = 0; 174753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 17482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < hdrlen) { 17502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 17512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 17522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 175453f17a9db278d33517d9888dd77848f554522a38JP Abgrall ieee_802_11_hdr_print(fc, p, hdrlen, meshdrlen, &src, &dst); 17552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 17572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Go past the 802.11 header. 17582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 17592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= hdrlen; 17602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project caplen -= hdrlen; 17612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += hdrlen; 17622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 17642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 17652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!mgmt_body_print(fc, 176653f17a9db278d33517d9888dd77848f554522a38JP Abgrall (const struct mgmt_header_t *)(p - hdrlen), p, length)) { 17672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 17682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 17692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 17722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!ctrl_body_print(fc, p - hdrlen)) { 17732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 17742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 17752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 17772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 17782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_NULL(FC_SUBTYPE(fc))) 17792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; /* no-data frame */ 17802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* There may be a problem w/ AP not having this bit set */ 17812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_WEP(fc)) { 17822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!wep_print(p)) { 17832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 17842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 17852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 17862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (llc_print(p, length, caplen, dst, src, 17872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project &extracted_ethertype) == 0) { 17882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 17892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Some kinds of LLC packet we cannot 17902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * handle intelligently 17912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 17922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 179353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ieee_802_11_hdr_print(fc, p - hdrlen, hdrlen, 179453f17a9db278d33517d9888dd77848f554522a38JP Abgrall meshdrlen, NULL, NULL); 17952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (extracted_ethertype) 17962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(LLC %s) ", 17972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etherproto_string( 17982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project htons(extracted_ethertype))); 17992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!suppress_default_print) 18002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default_print(p, caplen); 18012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 18032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 18042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("unknown 802.11 frame type (%d)", FC_TYPE(fc)); 18052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 18062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 18072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 18092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 18102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 18122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the top level routine of the printer. 'p' points 18132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to the 802.11 header of the packet, 'h->ts' is the timestamp, 18142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'h->len' is the length of the packet off the wire, and 'h->caplen' 18152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is the number of bytes actually captured. 18162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 18172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 18182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_if_print(const struct pcap_pkthdr *h, const u_char *p) 18192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 182053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ieee802_11_print(p, h->len, h->caplen, 0, 0); 182153f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 182253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 182353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_FHSS \ 182453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK) 182553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_A \ 182653f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) 182753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_B \ 182853f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) 182953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_PUREG \ 183053f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) 183153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IEEE80211_CHAN_G \ 183253f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) 183353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 183453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_FHSS(flags) \ 183553f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS) 183653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_A(flags) \ 183753f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) 183853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_B(flags) \ 183953f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B) 184053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_PUREG(flags) \ 184153f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG) 184253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_G(flags) \ 184353f17a9db278d33517d9888dd77848f554522a38JP Abgrall ((flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G) 184453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define IS_CHAN_ANYG(flags) \ 184553f17a9db278d33517d9888dd77848f554522a38JP Abgrall (IS_CHAN_PUREG(flags) || IS_CHAN_G(flags)) 184653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 184753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void 184853f17a9db278d33517d9888dd77848f554522a38JP Abgrallprint_chaninfo(int freq, int flags) 184953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 185053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%u MHz", freq); 185153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (IS_CHAN_FHSS(flags)) 185253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" FHSS"); 185353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (IS_CHAN_A(flags)) { 185453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_HALF) 185553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" 11a/10Mhz"); 185653f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_QUARTER) 185753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" 11a/5Mhz"); 185853f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 185953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" 11a"); 186053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 186153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (IS_CHAN_ANYG(flags)) { 186253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_HALF) 186353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" 11g/10Mhz"); 186453f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_QUARTER) 186553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" 11g/5Mhz"); 186653f17a9db278d33517d9888dd77848f554522a38JP Abgrall else 186753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" 11g"); 186853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else if (IS_CHAN_B(flags)) 186953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" 11b"); 187053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_TURBO) 187153f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" Turbo"); 187253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_CHAN_HT20) 187353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" ht/20"); 187453f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_HT40D) 187553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" ht/40-"); 187653f17a9db278d33517d9888dd77848f554522a38JP Abgrall else if (flags & IEEE80211_CHAN_HT40U) 187753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" ht/40+"); 187853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(" "); 18792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 18802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 188253f17a9db278d33517d9888dd77848f554522a38JP Abgrallprint_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags, 188353f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct radiotap_state *state, u_int32_t presentflags) 18842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 18852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 18862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int8_t i8; 18872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t u8; 18882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int16_t i16; 18892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t u16; 18902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t u32; 18912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int64_t u64; 189253f17a9db278d33517d9888dd77848f554522a38JP Abgrall } u, u2, u3, u4; 18932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int rc; 18942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bit) { 18962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FLAGS: 18972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 189853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 189953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 190053f17a9db278d33517d9888dd77848f554522a38JP Abgrall *flags = u.u8; 19012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_RATE: 190353f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u.u8); 190453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 190553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 190653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 190753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Save state rate */ 190853f17a9db278d33517d9888dd77848f554522a38JP Abgrall state->rate = u.u8; 190953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 19102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTSIGNAL: 19112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTNOISE: 19122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_ANTENNA: 19132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 19142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: 19162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTNOISE: 19172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_int8(s, &u.i8); 19182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_CHANNEL: 19202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u.u16); 19212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rc != 0) 19222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u2.u16); 19242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FHSS: 19262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_LOCK_QUALITY: 19272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TX_ATTENUATION: 192853f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_RX_FLAGS: 19292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u.u16); 19302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: 19322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 19332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_TX_POWER: 19352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_int8(s, &u.i8); 19362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 19372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TSFT: 19382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint64(s, &u.u64); 19392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 194053f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_XCHANNEL: 194153f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint32(s, &u.u32); 194253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 194353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 194453f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint16(s, &u2.u16); 194553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 194653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 194753f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u3.u8); 194853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 194953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 195053f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u4.u8); 195153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 195253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_MCS: 195353f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u.u8); 195453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 195553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 195653f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u2.u8); 195753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 195853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 195953f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &u3.u8); 196053f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 196153f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_VENDOR_NAMESPACE: { 196253f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t vns[3]; 196353f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int16_t length; 196453f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t subspace; 196553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 196653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if ((cpack_align_and_reserve(s, 2)) == NULL) { 196753f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = -1; 196853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 196953f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 197053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 197153f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &vns[0]); 197253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 197353f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 197453f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &vns[1]); 197553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 197653f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 197753f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &vns[2]); 197853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 197953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 198053f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint8(s, &subspace); 198153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 198253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 198353f17a9db278d33517d9888dd77848f554522a38JP Abgrall rc = cpack_uint16(s, &length); 198453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (rc != 0) 198553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 198653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 198753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Skip up to length */ 198853f17a9db278d33517d9888dd77848f554522a38JP Abgrall s->c_next += length; 198953f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 199053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 19912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 19922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this bit indicates a field whose 19932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * size we do not know, so we cannot 199453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * proceed. Just print the bit number. 19952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 199653f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("[bit %u] ", bit); 19972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 19982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 19992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 20002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rc != 0) { 20012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 20022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return rc; 20032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 20042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 200553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Preserve the state present flags */ 200653f17a9db278d33517d9888dd77848f554522a38JP Abgrall state->present = presentflags; 200753f17a9db278d33517d9888dd77848f554522a38JP Abgrall 20082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bit) { 20092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_CHANNEL: 201053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 201153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If CHANNEL and XCHANNEL are both present, skip 201253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * CHANNEL. 201353f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 201453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (presentflags & (1 << IEEE80211_RADIOTAP_XCHANNEL)) 201553f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 201653f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_chaninfo(u.u16, u2.u16); 20172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FHSS: 20192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff); 20202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_RATE: 202253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 202353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * XXX On FreeBSD rate & 0x80 means we have an MCS. On 202453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Linux and AirPcap it does not. (What about 202553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Mac OS X, NetBSD, OpenBSD, and DragonFly BSD?) 202653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 202753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * This is an issue either for proprietary extensions 202853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * to 11a or 11g, which do exist, or for 11n 202953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * implementations that stuff a rate value into 203053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * this field, which also appear to exist. 203153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 203253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We currently handle that by assuming that 203353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * if the 0x80 bit is set *and* the remaining 203453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * bits have a value between 0 and 15 it's 203553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * an MCS value, otherwise it's a rate. If 203653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * there are cases where systems that use 203753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * "0x80 + MCS index" for MCS indices > 15, 203853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * or stuff a rate value here between 64 and 203953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 71.5 Mb/s in here, we'll need a preference 204053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * setting. Such rates do exist, e.g. 11n 204153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * MCS 7 at 20 MHz with a long guard interval. 204253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 204353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 >= 0x80 && u.u8 <= 0x8f) { 204453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 204553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * XXX - we don't know the channel width 204653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * or guard interval length, so we can't 204753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * convert this to a data rate. 204853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 204953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If you want us to show a data rate, 205053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * use the MCS field, not the Rate field; 205153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the MCS field includes not only the 205253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * MCS index, it also includes bandwidth 205353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * and guard interval information. 205453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * 205553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * XXX - can we get the channel width 205653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * from XChannel and the guard interval 205753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * information from Flags, at least on 205853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * FreeBSD? 205953f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 206053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("MCS %u ", u.u8 & 0x7f); 206153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else 206253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%2.1f Mb/s ", .5*u.u8); 20632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: 20652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB signal ", u.i8); 20662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTNOISE: 20682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB noise ", u.i8); 20692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTSIGNAL: 20712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB signal ", u.u8); 20722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTNOISE: 20742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB noise ", u.u8); 20752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_LOCK_QUALITY: 20772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u sq ", u.u16); 20782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TX_ATTENUATION: 20802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d tx power ", -(int)u.u16); 20812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: 20832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB tx power ", -(int)u.u8); 20842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_TX_POWER: 20862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddBm tx power ", u.i8); 20872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 20882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FLAGS: 20892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_CFP) 20902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("cfp "); 20912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_SHORTPRE) 20922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("short preamble "); 20932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_WEP) 20942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("wep "); 20952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_FRAG) 20962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("fragmented "); 20972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_BADFCS) 20982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("bad-fcs "); 20992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 21002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_ANTENNA: 21012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("antenna %d ", u.u8); 21022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 21032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TSFT: 21042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%" PRIu64 "us tsft ", u.u64); 21052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 210653f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_RX_FLAGS: 210753f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Do nothing for now */ 210853f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 210953f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_XCHANNEL: 211053f17a9db278d33517d9888dd77848f554522a38JP Abgrall print_chaninfo(u2.u16, u.u32); 211153f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 211253f17a9db278d33517d9888dd77848f554522a38JP Abgrall case IEEE80211_RADIOTAP_MCS: { 211353f17a9db278d33517d9888dd77848f554522a38JP Abgrall static const char *bandwidth[4] = { 211453f17a9db278d33517d9888dd77848f554522a38JP Abgrall "20 MHz", 211553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "40 MHz", 211653f17a9db278d33517d9888dd77848f554522a38JP Abgrall "20 MHz (L)", 211753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "20 MHz (U)" 211853f17a9db278d33517d9888dd77848f554522a38JP Abgrall }; 211953f17a9db278d33517d9888dd77848f554522a38JP Abgrall float htrate; 212053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 212153f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN) { 212253f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 212353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We know the MCS index. 212453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 212553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u3.u8 <= MAX_MCS_INDEX) { 212653f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 212753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * And it's in-range. 212853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 212953f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & (IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN|IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN)) { 213053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 213153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * And we know both the bandwidth and 213253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the guard interval, so we can look 213353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * up the rate. 213453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 213553f17a9db278d33517d9888dd77848f554522a38JP Abgrall htrate = 213653f17a9db278d33517d9888dd77848f554522a38JP Abgrall ieee80211_float_htrates \ 213753f17a9db278d33517d9888dd77848f554522a38JP Abgrall [u3.u8] \ 213853f17a9db278d33517d9888dd77848f554522a38JP Abgrall [((u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK) == IEEE80211_RADIOTAP_MCS_BANDWIDTH_40 ? 1 : 0)] \ 213953f17a9db278d33517d9888dd77848f554522a38JP Abgrall [((u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ? 1 : 0)]; 214053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 214153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 214253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We don't know both the bandwidth 214353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * and the guard interval, so we can 214453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * only report the MCS index. 214553f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 214653f17a9db278d33517d9888dd77848f554522a38JP Abgrall htrate = 0.0; 214753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 214853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 214953f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 215053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * The MCS value is out of range. 215153f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 215253f17a9db278d33517d9888dd77848f554522a38JP Abgrall htrate = 0.0; 215353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 215453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (htrate != 0.0) { 215553f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 215653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We have the rate. 215753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print it. 215853f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 215953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%.1f Mb/s MCS %u ", htrate, u3.u8); 216053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else { 216153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* 216253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * We at least have the MCS index. 216353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Print it. 216453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 216553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("MCS %u ", u3.u8); 216653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 216753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 216853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN) { 216953f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%s ", 217053f17a9db278d33517d9888dd77848f554522a38JP Abgrall bandwidth[u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK]); 217153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 217253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN) { 217353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%s GI ", 217453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ? 217553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "short" : "lon"); 217653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 217753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN) { 217853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%s ", 217953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (u2.u8 & IEEE80211_RADIOTAP_MCS_HT_GREENFIELD) ? 218053f17a9db278d33517d9888dd77848f554522a38JP Abgrall "greenfield" : "mixed"); 218153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 218253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN) { 218353f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("%s FEC ", 218453f17a9db278d33517d9888dd77848f554522a38JP Abgrall (u2.u8 & IEEE80211_RADIOTAP_MCS_FEC_LDPC) ? 218553f17a9db278d33517d9888dd77848f554522a38JP Abgrall "LDPC" : "BCC"); 218653f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 218753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (u.u8 & IEEE80211_RADIOTAP_MCS_STBC_KNOWN) { 218853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("RX-STBC%u ", 218953f17a9db278d33517d9888dd77848f554522a38JP Abgrall (u2.u8 & IEEE80211_RADIOTAP_MCS_STBC_MASK) >> IEEE80211_RADIOTAP_MCS_STBC_SHIFT); 219053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 219153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 219253f17a9db278d33517d9888dd77848f554522a38JP Abgrall break; 219353f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 21942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 21952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 21962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 21972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 21982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 21992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_radio_print(const u_char *p, u_int length, u_int caplen) 22002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 22012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_32(x) (((x) >> 16) ? 16 + BITNO_16((x) >> 16) : BITNO_16((x))) 22022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_16(x) (((x) >> 8) ? 8 + BITNO_8((x) >> 8) : BITNO_8((x))) 22032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_8(x) (((x) >> 4) ? 4 + BITNO_4((x) >> 4) : BITNO_4((x))) 22042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_4(x) (((x) >> 2) ? 2 + BITNO_2((x) >> 2) : BITNO_2((x))) 22052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_2(x) (((x) & 2) ? 1 : 0) 220653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define BIT(n) (1U << n) 22072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IS_EXTENDED(__p) \ 22082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_LE_32BITS(__p) & BIT(IEEE80211_RADIOTAP_EXT)) != 0 22092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct cpack_state cpacker; 22112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ieee80211_radiotap_header *hdr; 22122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t present, next_present; 221353f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int32_t presentflags = 0; 22142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t *presentp, *last_presentp; 22152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum ieee80211_radiotap_type bit; 22162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int bit0; 22172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int len; 221853f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int8_t flags; 22192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int pad; 222053f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int fcslen; 222153f17a9db278d33517d9888dd77848f554522a38JP Abgrall struct radiotap_state state; 22222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < sizeof(*hdr)) { 22242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 22252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 22262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 22272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdr = (struct ieee80211_radiotap_header *)p; 22292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_LE_16BITS(&hdr->it_len); 22312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < len) { 22332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 22342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 22352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 223653f17a9db278d33517d9888dd77848f554522a38JP Abgrall cpack_init(&cpacker, (u_int8_t *)hdr, len); /* align against header start */ 223753f17a9db278d33517d9888dd77848f554522a38JP Abgrall cpack_advance(&cpacker, sizeof(*hdr)); /* includes the 1st bitmap */ 22382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (last_presentp = &hdr->it_present; 22392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IS_EXTENDED(last_presentp) && 22402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (u_char*)(last_presentp + 1) <= p + len; 224153f17a9db278d33517d9888dd77848f554522a38JP Abgrall last_presentp++) 224253f17a9db278d33517d9888dd77848f554522a38JP Abgrall cpack_advance(&cpacker, sizeof(hdr->it_present)); /* more bitmaps */ 22432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* are there more bitmap extensions than bytes in header? */ 22452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IS_EXTENDED(last_presentp)) { 22462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 22472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 22482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 22492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 225053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Assume no flags */ 225153f17a9db278d33517d9888dd77848f554522a38JP Abgrall flags = 0; 22522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Assume no Atheros padding between 802.11 header and body */ 22532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pad = 0; 225453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Assume no FCS at end of frame */ 225553f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen = 0; 22562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (bit0 = 0, presentp = &hdr->it_present; presentp <= last_presentp; 22572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project presentp++, bit0 += 32) { 225853f17a9db278d33517d9888dd77848f554522a38JP Abgrall presentflags = EXTRACT_LE_32BITS(presentp); 225953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 226053f17a9db278d33517d9888dd77848f554522a38JP Abgrall /* Clear state. */ 226153f17a9db278d33517d9888dd77848f554522a38JP Abgrall memset(&state, 0, sizeof(state)); 226253f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (present = EXTRACT_LE_32BITS(presentp); present; 22642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project present = next_present) { 22652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* clear the least significant bit that is set */ 22662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project next_present = present & (present - 1); 22672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* extract the least significant bit that is set */ 22692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bit = (enum ieee80211_radiotap_type) 22702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (bit0 + BITNO_32(present ^ next_present)); 22712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 227253f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (print_radiotap_field(&cpacker, bit, &flags, &state, presentflags) != 0) 22732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto out; 22742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 22752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 227653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 22772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectout: 227853f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_RADIOTAP_F_DATAPAD) 227953f17a9db278d33517d9888dd77848f554522a38JP Abgrall pad = 1; /* Atheros padding */ 228053f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (flags & IEEE80211_RADIOTAP_F_FCS) 228153f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen = 4; /* FCS at end of packet */ 228253f17a9db278d33517d9888dd77848f554522a38JP Abgrall return len + ieee802_11_print(p + len, length - len, caplen - len, pad, 228353f17a9db278d33517d9888dd77848f554522a38JP Abgrall fcslen); 22842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_32 22852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_16 22862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_8 22872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_4 22882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_2 22892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BIT 22902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 22912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 22922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 22932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_avs_radio_print(const u_char *p, u_int length, u_int caplen) 22942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 22952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t caphdr_len; 22962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 229753f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (caplen < 8) { 229853f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("[|802.11]"); 229953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return caplen; 230053f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 230153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 23022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project caphdr_len = EXTRACT_32BITS(p + 4); 23032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caphdr_len < 8) { 23042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 23052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Yow! The capture header length is claimed not 23062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to be large enough to include even the version 23072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * cookie or capture header length! 23082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 23092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 23102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 23112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < caphdr_len) { 23142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 23152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 23162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caphdr_len + ieee802_11_print(p + caphdr_len, 231953f17a9db278d33517d9888dd77848f554522a38JP Abgrall length - caphdr_len, caplen - caphdr_len, 0, 0); 23202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 23212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRISM_HDR_LEN 144 23232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 232453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define WLANCAP_MAGIC_COOKIE_BASE 0x80211000 23252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define WLANCAP_MAGIC_COOKIE_V1 0x80211001 232653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define WLANCAP_MAGIC_COOKIE_V2 0x80211002 23272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 23292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * For DLT_PRISM_HEADER; like DLT_IEEE802_11, but with an extra header, 23302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * containing information such as radio information, which we 23312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * currently ignore. 23322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 233353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * If, however, the packet begins with WLANCAP_MAGIC_COOKIE_V1 or 233453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * WLANCAP_MAGIC_COOKIE_V2, it's really DLT_IEEE802_11_RADIO_AVS 233553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * (currently, on Linux, there's no ARPHRD_ type for 233653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * DLT_IEEE802_11_RADIO_AVS, as there is a ARPHRD_IEEE80211_PRISM 233753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * for DLT_PRISM_HEADER, so ARPHRD_IEEE80211_PRISM is used for 233853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the AVS header, and the first 4 bytes of the header are used to 233953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * indicate whether it's a Prism header or an AVS header). 23402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 23412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 23422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprism_if_print(const struct pcap_pkthdr *h, const u_char *p) 23432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 23442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int caplen = h->caplen; 23452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int length = h->len; 234653f17a9db278d33517d9888dd77848f554522a38JP Abgrall u_int32_t msgcode; 23472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < 4) { 23492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 23502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 23512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 235353f17a9db278d33517d9888dd77848f554522a38JP Abgrall msgcode = EXTRACT_32BITS(p); 235453f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (msgcode == WLANCAP_MAGIC_COOKIE_V1 || 235553f17a9db278d33517d9888dd77848f554522a38JP Abgrall msgcode == WLANCAP_MAGIC_COOKIE_V2) 23562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ieee802_11_avs_radio_print(p, length, caplen); 23572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < PRISM_HDR_LEN) { 23592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 23602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 23612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 23622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return PRISM_HDR_LEN + ieee802_11_print(p + PRISM_HDR_LEN, 236453f17a9db278d33517d9888dd77848f554522a38JP Abgrall length - PRISM_HDR_LEN, caplen - PRISM_HDR_LEN, 0, 0); 23652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 23662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 23672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 23682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * For DLT_IEEE802_11_RADIO; like DLT_IEEE802_11, but with an extra 236953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * header, containing information such as radio information. 23702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 23712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 23722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_radio_if_print(const struct pcap_pkthdr *h, const u_char *p) 23732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 237453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ieee802_11_radio_print(p, h->len, h->caplen); 237553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 23762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 237753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* 237853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * For DLT_IEEE802_11_RADIO_AVS; like DLT_IEEE802_11, but with an 237953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * extra header, containing information such as radio information, 238053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * which we currently ignore. 238153f17a9db278d33517d9888dd77848f554522a38JP Abgrall */ 238253f17a9db278d33517d9888dd77848f554522a38JP Abgrallu_int 238353f17a9db278d33517d9888dd77848f554522a38JP Abgrallieee802_11_radio_avs_if_print(const struct pcap_pkthdr *h, const u_char *p) 238453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{ 238553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return ieee802_11_avs_radio_print(p, h->len, h->caplen); 23862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2387