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_ = 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-802_11.c,v 1.31.2.15 2007/07/22 23:14:14 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 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_SSID(p) \ 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (p.ssid_status) { \ 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TRUNCATED: \ 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; \ 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PRESENT: \ 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" ("); \ 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fn_print(p.ssid.ssid, NULL); \ 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); \ 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; \ 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case NOT_PRESENT: \ 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; \ 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_RATE(_sep, _r, _suf) \ 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s%2.1f%s", _sep, (.5 * ((_r) & 0x7f)), _suf) 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_RATES(p) \ 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (p.rates_status) { \ 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TRUNCATED: \ 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; \ 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PRESENT: \ 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project do { \ 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int z; \ 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *sep = " ["; \ 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (z = 0; z < p.rates.length ; z++) { \ 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATE(sep, p.rates.rate[z], \ 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (p.rates.rate[z] & 0x80 ? "*" : "")); \ 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sep = " "; \ 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } \ 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (p.rates.length != 0) \ 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" Mbit]"); \ 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } while (0); \ 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; \ 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case NOT_PRESENT: \ 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; \ 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRINT_DS_CHANNEL(p) \ 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (p.ds_status) { \ 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TRUNCATED: \ 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; \ 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PRESENT: \ 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" CH: %u", p.ds.channel); \ 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; \ 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case NOT_PRESENT: \ 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; \ 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } \ 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", \ 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : "" ); 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *auth_alg_text[]={"Open System","Shared Key","EAP"}; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_AUTH_ALGS (sizeof auth_alg_text / sizeof auth_alg_text[0]) 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *status_text[] = { 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Succesful", /* 0 */ 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unspecified failure", /* 1 */ 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 2 */ 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 3 */ 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 4 */ 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 5 */ 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 6 */ 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 7 */ 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 8 */ 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 9 */ 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Cannot Support all requested capabilities in the Capability Information field", /* 10 */ 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reassociation denied due to inability to confirm that association exists", /* 11 */ 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Association denied due to reason outside the scope of the standard", /* 12 */ 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Responding station does not support the specified authentication algorithm ", /* 13 */ 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Received an Authentication frame with authentication transaction " \ 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "sequence number out of expected sequence", /* 14 */ 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Authentication rejected because of challenge failure", /* 15 */ 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Authentication rejected due to timeout waiting for next frame in sequence", /* 16 */ 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Association denied because AP is unable to handle additional associated stations", /* 17 */ 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Association denied due to requesting station not supporting all of the " \ 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "data rates in BSSBasicRateSet parameter", /* 18 */ 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_STATUSES (sizeof status_text / sizeof status_text[0]) 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *reason_text[] = { 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Reserved", /* 0 */ 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unspecified reason", /* 1 */ 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Previous authentication no longer valid", /* 2 */ 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Deauthenticated because sending station is leaving (or has left) IBSS or ESS", /* 3 */ 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Disassociated due to inactivity", /* 4 */ 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Disassociated because AP is unable to handle all currently associated stations", /* 5 */ 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Class 2 frame received from nonauthenticated station", /* 6 */ 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Class 3 frame received from nonassociated station", /* 7 */ 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Disassociated because sending station is leaving (or has left) BSS", /* 8 */ 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Station requesting (re)association is not authenticated with responding station", /* 9 */ 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NUM_REASONS (sizeof reason_text / sizeof reason_text[0]) 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectwep_print(const u_char *p) 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t iv; 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_IV_LEN + IEEE802_11_KID_LEN)) 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project iv = EXTRACT_LE_32BITS(p); 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Data IV:%3x Pad %x KeyID %x", IV_IV(iv), IV_PAD(iv), 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IV_KEYID(iv)); 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparse_elements(struct mgmt_body_t *pbody, const u_char *p, int offset) 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * We haven't seen any elements yet. 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->challenge_status = NOT_PRESENT; 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ssid_status = NOT_PRESENT; 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->rates_status = NOT_PRESENT; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ds_status = NOT_PRESENT; 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->cf_status = NOT_PRESENT; 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->tim_status = NOT_PRESENT; 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (;;) { 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 1)) 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (*(p + offset)) { 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_SSID: 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present, possibly truncated */ 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ssid_status = TRUNCATED; 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->ssid, p + offset, 2); 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->ssid.length != 0) { 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->ssid.length > 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(pbody->ssid.ssid) - 1) 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), pbody->ssid.length)) 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->ssid.ssid, p + offset, 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ssid.length); 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += pbody->ssid.length; 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ssid.ssid[pbody->ssid.length] = '\0'; 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present and not truncated */ 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ssid_status = PRESENT; 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_CHALLENGE: 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present, possibly truncated */ 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->challenge_status = TRUNCATED; 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->challenge, p + offset, 2); 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->challenge.length != 0) { 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->challenge.length > 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(pbody->challenge.text) - 1) 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), pbody->challenge.length)) 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->challenge.text, p + offset, 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->challenge.length); 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += pbody->challenge.length; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->challenge.text[pbody->challenge.length] = '\0'; 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present and not truncated */ 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->challenge_status = PRESENT; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_RATES: 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present, possibly truncated */ 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->rates_status = TRUNCATED; 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&(pbody->rates), p + offset, 2); 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->rates.length != 0) { 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->rates.length > sizeof pbody->rates.rate) 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), pbody->rates.length)) 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->rates.rate, p + offset, 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->rates.length); 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += pbody->rates.length; 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present and not truncated */ 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->rates_status = PRESENT; 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_DS: 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present, possibly truncated */ 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ds_status = TRUNCATED; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 3)) 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->ds, p + offset, 3); 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 3; 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present and not truncated */ 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->ds_status = PRESENT; 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_CF: 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present, possibly truncated */ 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->cf_status = TRUNCATED; 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 8)) 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->cf, p + offset, 8); 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 8; 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present and not truncated */ 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->cf_status = PRESENT; 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case E_TIM: 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present, possibly truncated */ 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->tim_status = TRUNCATED; 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->tim, p + offset, 2); 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 3)) 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody->tim.count, p + offset, 3); 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 3; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->tim.length <= 3) 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pbody->tim.length - 3 > sizeof pbody->tim.bitmap) 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), pbody->tim.length - 3)) 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(pbody->tim.bitmap, p + (pbody->tim.length - 3), 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody->tim.length - 3)); 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += pbody->tim.length - 3; 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Present and not truncated */ 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody->tim_status = PRESENT; 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(1) unhandled element_id (%d) ", 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *(p + offset) ); 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset), 2)) 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*(p + offset + 2), *(p + offset + 1))) 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += *(p + offset + 1) + 2; 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Handle functions for the management frame types 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_beacon(const u_char *p) 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_CAPINFO_LEN)) 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_TSTAMP_LEN; 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_BCNINT_LEN; 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project parse_elements(&pbody, p, offset); 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" %s", 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CAPABILITY_ESS(pbody.capability_info) ? "ESS" : "IBSS"); 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_DS_CHANNEL(pbody); 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_assoc_request(const u_char *p) 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN)) 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.listen_interval = EXTRACT_LE_16BITS(p+offset); 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_LISTENINT_LEN; 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project parse_elements(&pbody, p, offset); 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_assoc_response(const u_char *p) 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_STATUS_LEN + 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_AID_LEN)) 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.status_code = EXTRACT_LE_16BITS(p+offset); 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_STATUS_LEN; 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.aid = EXTRACT_LE_16BITS(p+offset); 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_AID_LEN; 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project parse_elements(&pbody, p, offset); 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" AID(%x) :%s: %s", ((u_int16_t)(pbody.aid << 2 )) >> 2 , 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CAPABILITY_PRIVACY(pbody.capability_info) ? " PRIVACY " : "", 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.status_code < NUM_STATUSES 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "n/a")); 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_reassoc_request(const u_char *p) 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_CAPINFO_LEN + IEEE802_11_LISTENINT_LEN + 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_AP_LEN)) 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p); 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.listen_interval = EXTRACT_LE_16BITS(p+offset); 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_LISTENINT_LEN; 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.ap, p+offset, IEEE802_11_AP_LEN); 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_AP_LEN; 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project parse_elements(&pbody, p, offset); 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" AP : %s", etheraddr_string( pbody.ap )); 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_reassoc_response(const u_char *p) 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Same as a Association Reponse */ 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_assoc_response(p); 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_probe_request(const u_char *p) 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project parse_elements(&pbody, p, offset); 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_probe_response(const u_char *p) 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_TSTAMP_LEN + IEEE802_11_BCNINT_LEN + 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IEEE802_11_CAPINFO_LEN)) 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN); 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_TSTAMP_LEN; 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset); 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_BCNINT_LEN; 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.capability_info = EXTRACT_LE_16BITS(p+offset); 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_CAPINFO_LEN; 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project parse_elements(&pbody, p, offset); 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_SSID(pbody); 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATES(pbody); 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_DS_CHANNEL(pbody); 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_atim(void) 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* the frame body for ATIM is null. */ 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_disassoc(const u_char *p) 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_REASON_LEN)) 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.reason_code = EXTRACT_LE_16BITS(p); 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %s", 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.reason_code < NUM_REASONS) 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? reason_text[pbody.reason_code] 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved" ); 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_auth(const u_char *p) 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, 6)) 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_alg = EXTRACT_LE_16BITS(p); 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num = EXTRACT_LE_16BITS(p + offset); 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.status_code = EXTRACT_LE_16BITS(p + offset); 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += 2; 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project parse_elements(&pbody, p, offset); 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((pbody.auth_alg == 1) && 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pbody.auth_trans_seq_num == 2) || 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_trans_seq_num == 3))) { 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s)-%x [Challenge Text] %s", 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_alg < NUM_AUTH_ALGS) 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? auth_alg_text[pbody.auth_alg] 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved", 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num, 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((pbody.auth_trans_seq_num % 2) 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? ((pbody.status_code < NUM_STATUSES) 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "n/a") : "")); 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s)-%x: %s", 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_alg < NUM_AUTH_ALGS) 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? auth_alg_text[pbody.auth_alg] 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved", 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.auth_trans_seq_num, 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (pbody.auth_trans_seq_num % 2) 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? ((pbody.status_code < NUM_STATUSES) 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? status_text[pbody.status_code] 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "n/a") 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : ""); 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthandle_deauth(const struct mgmt_header_t *pmh, const u_char *p) 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct mgmt_body_t pbody; 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int offset = 0; 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *reason = NULL; 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&pbody, 0, sizeof(pbody)); 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, IEEE802_11_REASON_LEN)) 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pbody.reason_code = EXTRACT_LE_16BITS(p); 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project offset += IEEE802_11_REASON_LEN; 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project reason = (pbody.reason_code < NUM_REASONS) 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ? reason_text[pbody.reason_code] 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : "Reserved"; 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (eflag) { 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(": %s", reason); 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" (%s): %s", etheraddr_string(pmh->sa), reason); 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Body funcs 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmgmt_body_print(u_int16_t fc, const struct mgmt_header_t *pmh, 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *p) 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ASSOC_REQUEST: 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Assoc Request"); 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_assoc_request(p); 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ASSOC_RESPONSE: 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Assoc Response"); 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_assoc_response(p); 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_REASSOC_REQUEST: 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("ReAssoc Request"); 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_reassoc_request(p); 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_REASSOC_RESPONSE: 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("ReAssoc Response"); 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_reassoc_response(p); 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_PROBE_REQUEST: 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Probe Request"); 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_probe_request(p); 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_PROBE_RESPONSE: 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Probe Response"); 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_probe_response(p); 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_BEACON: 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Beacon"); 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_beacon(p); 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_ATIM: 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("ATIM"); 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_atim(); 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_DISASSOC: 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Disassociation"); 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_disassoc(p); 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_AUTH: 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Authentication"); 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, 3)) 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((p[0] == 0 ) && (p[1] == 0) && (p[2] == 0)) { 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Authentication (Shared-Key)-3 "); 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return wep_print(p); 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_auth(p); 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case ST_DEAUTH: 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("DeAuthentication"); 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return handle_deauth(pmh, p); 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Unhandled Management subtype(%x)", 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project FC_SUBTYPE(fc)); 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/********************************************************************************* 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handles printing all the control frame types 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *********************************************************************************/ 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectctrl_body_print(u_int16_t fc, const u_char *p) 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Power Save-Poll"); 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_PS_POLL_HDRLEN)) 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" AID(%x)", 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_LE_16BITS(&(((const struct ctrl_ps_poll_t *)p)->aid))); 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Request-To-Send"); 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_RTS_HDRLEN)) 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" TA:%s ", 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_rts_t *)p)->ta)); 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Clear-To-Send"); 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_CTS_HDRLEN)) 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_cts_t *)p)->ra)); 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Acknowledgment"); 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_ACK_HDRLEN)) 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ack_t *)p)->ra)); 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("CF-End"); 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_END_HDRLEN)) 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_t *)p)->ra)); 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("CF-End+CF-Ack"); 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*p, CTRL_END_ACK_HDRLEN)) 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" RA:%s ", 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_ack_t *)p)->ra)); 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Unknown Ctrl Subtype"); 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print Header funcs 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Data Frame - Address field contents 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * To Ds | From DS | Addr 1 | Addr 2 | Addr 3 | Addr 4 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 | 0 | DA | SA | BSSID | n/a 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 | 1 | DA | BSSID | SA | n/a 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1 | 0 | BSSID | SA | DA | n/a 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1 | 1 | RA | TA | DA | SA 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdata_header_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp, 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t **dstp) 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int subtype = FC_SUBTYPE(fc); 6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_ACK(subtype) || DATA_FRAME_IS_CF_POLL(subtype) || 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project DATA_FRAME_IS_QOS(subtype)) { 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("CF "); 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_ACK(subtype)) { 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_POLL(subtype)) 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Ack/Poll"); 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Ack"); 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_CF_POLL(subtype)) 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Poll"); 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_QOS(subtype)) 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("+QoS"); 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" "); 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR1 (p + 4) 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR2 (p + 10) 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR3 (p + 16) 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ADDR4 (p + 24) 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!FC_TO_DS(fc) && !FC_FROM_DS(fc)) { 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR2; 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR1; 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("DA:%s SA:%s BSSID:%s ", 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3)); 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (!FC_TO_DS(fc) && FC_FROM_DS(fc)) { 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR3; 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR1; 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("DA:%s BSSID:%s SA:%s ", 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3)); 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (FC_TO_DS(fc) && !FC_FROM_DS(fc)) { 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR2; 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR3; 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("BSSID:%s SA:%s DA:%s ", 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3)); 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (FC_TO_DS(fc) && FC_FROM_DS(fc)) { 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = ADDR4; 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = ADDR3; 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s TA:%s DA:%s SA:%s ", 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR1), etheraddr_string(ADDR2), 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(ADDR3), etheraddr_string(ADDR4)); 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR1 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR2 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR3 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef ADDR4 7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmgmt_header_print(const u_char *p, const u_int8_t **srcp, 7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t **dstp) 7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct mgmt_header_t *hp = (const struct mgmt_header_t *) p; 7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = hp->sa; 7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = hp->da; 7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("BSSID:%s DA:%s SA:%s ", 7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string((hp)->bssid), etheraddr_string((hp)->da), 7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string((hp)->sa)); 7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectctrl_header_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp, 7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t **dstp) 7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (srcp != NULL) 7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = NULL; 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (dstp != NULL) 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = NULL; 7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("BSSID:%s TA:%s ", 7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ps_poll_t *)p)->bssid), 7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ps_poll_t *)p)->ta)); 7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s TA:%s ", 7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_rts_t *)p)->ra), 8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_rts_t *)p)->ta)); 8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s ", 8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_cts_t *)p)->ra)); 8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s ", 8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_ack_t *)p)->ra)); 8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s BSSID:%s ", 8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_t *)p)->ra), 8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_t *)p)->bssid)); 8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("RA:%s BSSID:%s ", 8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_ack_t *)p)->ra), 8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etheraddr_string(((const struct ctrl_end_ack_t *)p)->bssid)); 8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(H) Unknown Ctrl Subtype"); 8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextract_header_length(u_int16_t fc) 8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int len; 8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return MGMT_HDRLEN; 8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_SUBTYPE(fc)) { 8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_PS_POLL: 8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_PS_POLL_HDRLEN; 8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_RTS: 8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_RTS_HDRLEN; 8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CTS: 8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_CTS_HDRLEN; 8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_ACK: 8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_ACK_HDRLEN; 8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_CF_END: 8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_END_HDRLEN; 8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CTRL_END_ACK: 8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return CTRL_END_ACK_HDRLEN; 8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = (FC_TO_DS(fc) && FC_FROM_DS(fc)) ? 30 : 24; 8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) 8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len += 2; 8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return len; 8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("unknown IEEE802.11 frame type (%d)", FC_TYPE(fc)); 8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print the 802.11 MAC header if eflag is set, and set "*srcp" and "*dstp" 8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to point to the source and destination MAC addresses in any case if 8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * "srcp" and "dstp" aren't null. 8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void 8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee_802_11_hdr_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp, 8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t **dstp) 8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_MORE_DATA(fc)) 8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("More Data "); 8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_MORE_FLAG(fc)) 8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("More Fragments "); 8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_POWER_MGMT(fc)) 8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Pwr Mgmt "); 8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_RETRY(fc)) 8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Retry "); 8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_ORDER(fc)) 8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("Strictly Ordered "); 8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_WEP(fc)) 8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("WEP Encrypted "); 8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_TYPE(fc) != T_CTRL || FC_SUBTYPE(fc) != CTRL_PS_POLL) 8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%dus ", 8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_LE_16BITS( 8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project &((const struct mgmt_header_t *)p)->duration)); 8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mgmt_header_print(p, srcp, dstp); 8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ctrl_header_print(fc, p, srcp, dstp); 8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project data_header_print(fc, p, srcp, dstp); 8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(header) unknown IEEE802.11 frame type (%d)", 9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project FC_TYPE(fc)); 9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *srcp = NULL; 9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *dstp = NULL; 9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef roundup2 9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */ 9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_print(const u_char *p, u_int length, u_int caplen, int pad) 9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t fc; 9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int hdrlen; 9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int8_t *src, *dst; 9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_short extracted_ethertype; 9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < IEEE802_11_FC_LEN) { 9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fc = EXTRACT_LE_16BITS(p); 9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen = extract_header_length(fc); 9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pad) 9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdrlen = roundup2(hdrlen, 4); 9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < hdrlen) { 9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ieee_802_11_hdr_print(fc, p, &src, &dst); 9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Go past the 802.11 header. 9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= hdrlen; 9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project caplen -= hdrlen; 9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p += hdrlen; 9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (FC_TYPE(fc)) { 9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_MGMT: 9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!mgmt_body_print(fc, 9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (const struct mgmt_header_t *)(p - hdrlen), p)) { 9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_CTRL: 9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!ctrl_body_print(fc, p - hdrlen)) { 9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case T_DATA: 9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (DATA_FRAME_IS_NULL(FC_SUBTYPE(fc))) 9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; /* no-data frame */ 9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* There may be a problem w/ AP not having this bit set */ 9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (FC_WEP(fc)) { 9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!wep_print(p)) { 9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (llc_print(p, length, caplen, dst, src, 9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project &extracted_ethertype) == 0) { 9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Some kinds of LLC packet we cannot 9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * handle intelligently 9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!eflag) 9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ieee_802_11_hdr_print(fc, p - hdrlen, NULL, 9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project NULL); 9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (extracted_ethertype) 9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(LLC %s) ", 9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project etherproto_string( 9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project htons(extracted_ethertype))); 9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!suppress_default_print) 9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default_print(p, caplen); 9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("unknown 802.11 frame type (%d)", FC_TYPE(fc)); 9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return hdrlen; 9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the top level routine of the printer. 'p' points 9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to the 802.11 header of the packet, 'h->ts' is the timestamp, 9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'h->len' is the length of the packet off the wire, and 'h->caplen' 9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is the number of bytes actually captured. 9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_if_print(const struct pcap_pkthdr *h, const u_char *p) 10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ieee802_11_print(p, h->len, h->caplen, 0); 10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_radiotap_field(struct cpack_state *s, u_int32_t bit, int *pad) 10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int8_t i8; 10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t u8; 10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int16_t i16; 10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t u16; 10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t u32; 10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int64_t u64; 10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } u, u2; 10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int rc; 10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bit) { 10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FLAGS: 10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_DATAPAD) 10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *pad = 1; 10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_RATE: 10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTSIGNAL: 10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTNOISE: 10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_ANTENNA: 10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: 10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTNOISE: 10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_int8(s, &u.i8); 10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_CHANNEL: 10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u.u16); 10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rc != 0) 10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u2.u16); 10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FHSS: 10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_LOCK_QUALITY: 10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TX_ATTENUATION: 10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint16(s, &u.u16); 10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: 10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint8(s, &u.u8); 10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_TX_POWER: 10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_int8(s, &u.i8); 10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TSFT: 10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rc = cpack_uint64(s, &u.u64); 10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this bit indicates a field whose 10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * size we do not know, so we cannot 10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * proceed. 10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[0x%08x] ", bit); 10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rc != 0) { 10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return rc; 10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bit) { 10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_CHANNEL: 10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u MHz ", u.u16); 10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u2.u16 != 0) 10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(0x%04x) ", u2.u16); 10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FHSS: 10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff); 10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_RATE: 10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PRINT_RATE("", u.u8, " Mb/s "); 10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: 10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB signal ", u.i8); 10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_ANTNOISE: 10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB noise ", u.i8); 10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTSIGNAL: 10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB signal ", u.u8); 10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_ANTNOISE: 10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB noise ", u.u8); 10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_LOCK_QUALITY: 10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u sq ", u.u16); 10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TX_ATTENUATION: 10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d tx power ", -(int)u.u16); 10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: 10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddB tx power ", -(int)u.u8); 11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_DBM_TX_POWER: 11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%ddBm tx power ", u.i8); 11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_FLAGS: 11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_CFP) 11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("cfp "); 11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_SHORTPRE) 11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("short preamble "); 11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_WEP) 11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("wep "); 11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_FRAG) 11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("fragmented "); 11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (u.u8 & IEEE80211_RADIOTAP_F_BADFCS) 11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("bad-fcs "); 11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_ANTENNA: 11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("antenna %d ", u.u8); 11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IEEE80211_RADIOTAP_TSFT: 11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%" PRIu64 "us tsft ", u.u64); 11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_radio_print(const u_char *p, u_int length, u_int caplen) 11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_32(x) (((x) >> 16) ? 16 + BITNO_16((x) >> 16) : BITNO_16((x))) 11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_16(x) (((x) >> 8) ? 8 + BITNO_8((x) >> 8) : BITNO_8((x))) 11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_8(x) (((x) >> 4) ? 4 + BITNO_4((x) >> 4) : BITNO_4((x))) 11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_4(x) (((x) >> 2) ? 2 + BITNO_2((x) >> 2) : BITNO_2((x))) 11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BITNO_2(x) (((x) & 2) ? 1 : 0) 11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BIT(n) (1 << n) 11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IS_EXTENDED(__p) \ 11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_LE_32BITS(__p) & BIT(IEEE80211_RADIOTAP_EXT)) != 0 11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct cpack_state cpacker; 11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ieee80211_radiotap_header *hdr; 11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t present, next_present; 11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t *presentp, *last_presentp; 11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum ieee80211_radiotap_type bit; 11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int bit0; 11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *iter; 11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int len; 11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int pad; 11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < sizeof(*hdr)) { 11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hdr = (struct ieee80211_radiotap_header *)p; 11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = EXTRACT_LE_16BITS(&hdr->it_len); 11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < len) { 11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (last_presentp = &hdr->it_present; 11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project IS_EXTENDED(last_presentp) && 11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (u_char*)(last_presentp + 1) <= p + len; 11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project last_presentp++); 11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* are there more bitmap extensions than bytes in header? */ 11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IS_EXTENDED(last_presentp)) { 11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project iter = (u_char*)(last_presentp + 1); 11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (cpack_init(&cpacker, (u_int8_t*)iter, len - (iter - p)) != 0) { 11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* XXX */ 11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Assume no Atheros padding between 802.11 header and body */ 11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pad = 0; 11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (bit0 = 0, presentp = &hdr->it_present; presentp <= last_presentp; 11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project presentp++, bit0 += 32) { 11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (present = EXTRACT_LE_32BITS(presentp); present; 11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project present = next_present) { 11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* clear the least significant bit that is set */ 11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project next_present = present & (present - 1); 11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* extract the least significant bit that is set */ 11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bit = (enum ieee80211_radiotap_type) 11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (bit0 + BITNO_32(present ^ next_present)); 11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (print_radiotap_field(&cpacker, bit, &pad) != 0) 11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto out; 11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectout: 11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return len + ieee802_11_print(p + len, length - len, caplen - len, pad); 11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_32 12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_16 12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_8 12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_4 12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BITNO_2 12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef BIT 12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int 12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_avs_radio_print(const u_char *p, u_int length, u_int caplen) 12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t caphdr_len; 12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project caphdr_len = EXTRACT_32BITS(p + 4); 12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caphdr_len < 8) { 12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Yow! The capture header length is claimed not 12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to be large enough to include even the version 12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * cookie or capture header length! 12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < caphdr_len) { 12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caphdr_len + ieee802_11_print(p + caphdr_len, 12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length - caphdr_len, caplen - caphdr_len, 0); 12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PRISM_HDR_LEN 144 12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define WLANCAP_MAGIC_COOKIE_V1 0x80211001 12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * For DLT_PRISM_HEADER; like DLT_IEEE802_11, but with an extra header, 12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * containing information such as radio information, which we 12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * currently ignore. 12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If, however, the packet begins with WLANCAP_MAGIC_COOKIE_V1, it's 12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * really DLT_IEEE802_11_RADIO (currently, on Linux, there's no 12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARPHRD_ type for DLT_IEEE802_11_RADIO, as there is a 12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARPHRD_IEEE80211_PRISM for DLT_PRISM_HEADER, so 12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARPHRD_IEEE80211_PRISM is used for DLT_IEEE802_11_RADIO, and 12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the first 4 bytes of the header are used to indicate which it is). 12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprism_if_print(const struct pcap_pkthdr *h, const u_char *p) 12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int caplen = h->caplen; 12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int length = h->len; 12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < 4) { 12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_32BITS(p) == WLANCAP_MAGIC_COOKIE_V1) 12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ieee802_11_avs_radio_print(p, length, caplen); 12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < PRISM_HDR_LEN) { 12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return PRISM_HDR_LEN + ieee802_11_print(p + PRISM_HDR_LEN, 12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length - PRISM_HDR_LEN, caplen - PRISM_HDR_LEN, 0); 12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * For DLT_IEEE802_11_RADIO; like DLT_IEEE802_11, but with an extra 12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * header, containing information such as radio information, which we 12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * currently ignore. 12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int 12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectieee802_11_radio_if_print(const struct pcap_pkthdr *h, const u_char *p) 12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int caplen = h->caplen; 12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int length = h->len; 12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (caplen < 8) { 12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|802.11]"); 12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return caplen; 12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ieee802_11_radio_print(p, length, caplen); 12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1289