From owner-svn-src-user@FreeBSD.ORG Tue Jun 19 23:45:18 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3683E106566B; Tue, 19 Jun 2012 23:45:18 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1711C8FC22; Tue, 19 Jun 2012 23:45:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q5JNjIPF004265; Tue, 19 Jun 2012 23:45:18 GMT (envelope-from adrian@svn.freebsd.org) Received: (from adrian@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q5JNjHRu004257; Tue, 19 Jun 2012 23:45:17 GMT (envelope-from adrian@svn.freebsd.org) Message-Id: <201206192345.q5JNjHRu004257@svn.freebsd.org> From: Adrian Chadd Date: Tue, 19 Jun 2012 23:45:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r237278 - in user/adrian/ath_radar_stuff: . lib lib/libradarpkt src src/pktlog X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 Jun 2012 23:45:18 -0000 Author: adrian Date: Tue Jun 19 23:45:17 2012 New Revision: 237278 URL: http://svn.freebsd.org/changeset/base/237278 Log: Add some locally written code to tinker with radar frame capture and decoding from userland. * lib/libradarpkt/ has some bits that I've written to decode the PHY error frame format, for AR5416 and post-AR5416. The AR9280 code is just as applicable for AR9130/AR9160. * src/pktlog will read either a radiotap interface or a capture file and dump phy errors out at you. It includes a BPF filter which limits the amount of stuff that gets pushed to userland. It doesn't output anything by default; you'll have to enable debug printing for that to happen. check the source. The code relies on the patch at http://wiki.freebsd.org/ath(4)/RadarFFT. There's hard-coded -I references to my home-directory, sorry. You should replace that with the path to your kernel tree which has the ath(4) radiotap vendor extension patch. Added: user/adrian/ath_radar_stuff/ user/adrian/ath_radar_stuff/lib/ user/adrian/ath_radar_stuff/lib/libradarpkt/ user/adrian/ath_radar_stuff/lib/libradarpkt/Makefile user/adrian/ath_radar_stuff/lib/libradarpkt/ar5416_radar.c user/adrian/ath_radar_stuff/lib/libradarpkt/ar5416_radar.h user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.c user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.h user/adrian/ath_radar_stuff/lib/libradarpkt/pkt.h user/adrian/ath_radar_stuff/src/ user/adrian/ath_radar_stuff/src/pktlog/ user/adrian/ath_radar_stuff/src/pktlog/Makefile user/adrian/ath_radar_stuff/src/pktlog/main.c Added: user/adrian/ath_radar_stuff/lib/libradarpkt/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/lib/libradarpkt/Makefile Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,8 @@ +LIB= radarpkt + +SRCS= ar9280_radar.c ar5416_radar.c +CFLAGS+= -I/home/adrian/work/freebsd/ath/head/src/sys -g -ggdb + +NO_MAN= 1 + +.include Added: user/adrian/ath_radar_stuff/lib/libradarpkt/ar5416_radar.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/lib/libradarpkt/ar5416_radar.c Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,99 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#include +#include +#include +#include +#include /* for memcpy() */ + +/* Headers required for the ioctl interface */ +#include +#include +#include + +//#include "net80211/ieee80211_var.h" +#include "net80211/ieee80211_radiotap.h" + +#include "dev/ath/if_athioctl.h" + +#include "pkt.h" + +#include "ar5416_radar.h" + +int +ar5416_radar_decode(struct ieee80211_radiotap_header *rh, + const unsigned char *pkt, int len, struct radar_entry *re) +{ + uint64_t tsf; + int8_t rssi, nf; + struct ath_rx_radiotap_header *rx = + (struct ath_rx_radiotap_header *) rh; + + /* XXX we should really be implementing a real radiotap parser */ + tsf = le64toh(rx->wr_tsf); + + /* + * XXX For AR5416, we should use the ctl[0] RSSI for pre Owl-2.2. + */ + rssi = rx->wr_v.rssi_ctl[0]; + nf = rx->wr_antnoise; + + /* Last byte is the pulse width */ + if (len < 1) { + printf("short radar frame\n"); + return (0); + } + +#if 0 + printf("phyerr: %d ", rx->wr_v.vh_phyerr_code); + printf("ts: %lld", tsf); + printf("\tit_present: %x", le32toh(rh->it_present)); + printf("\tlen: %d", len); + printf("\trssi: %d, nf: %d", rssi, nf); + printf("\tpri: %u", pkt[len - 1] & 0xff); + printf("\n"); +#endif + + /* + * If RSSI > 0x80, it's a negative RSSI. We store it signed + * so we can at least log that it was negative in order to + * plot it. The radar code IIRC just tosses it. + */ + re->re_rssi = rssi; + + re->re_timestamp = tsf; + /* XXX TODO: re->re_freq */ + re->re_dur = pkt[len - 1] & 0xff; + /* XXX TODO: also store ctl/ext RSSI, and some flags */ + re->re_freq = 0; + + return(1); +} Added: user/adrian/ath_radar_stuff/lib/libradarpkt/ar5416_radar.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/lib/libradarpkt/ar5416_radar.h Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __AR5416_RADAR_H__ +#define __AR5416_RADAR_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define CHIP_AR5416 1 + +extern int ar5416_radar_decode(struct ieee80211_radiotap_header *rh, + const unsigned char *pkt, int len, struct radar_entry *re); + +#ifdef __cplusplus +} +#endif + +#endif /* __AR5416_RADAR__ */ Added: user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.c Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,100 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#include +#include +#include +#include +#include /* for memcpy() */ + +#include +#include + +#include "net80211/ieee80211_radiotap.h" + +#include "dev/ath/if_athioctl.h" + +#include "pkt.h" +#include "ar9280_radar.h" + +/* Relevant for Sowl and later */ +#define EXT_CH_RADAR_EARLY_FOUND 0x04 +#define EXT_CH_RADAR_FOUND 0x02 +#define PRI_CH_RADAR_FOUND 0x01 + +int +ar9280_radar_decode(struct ieee80211_radiotap_header *rh, + const unsigned char *pkt, int len, struct radar_entry *re) +{ + uint64_t tsf; + int8_t comb_rssi, pri_rssi, ext_rssi, nf; + struct ath_rx_radiotap_header *rx = + (struct ath_rx_radiotap_header *) rh; + + /* XXX we should really be implementing a real radiotap parser */ + tsf = le64toh(rx->wr_tsf); + + /* + * XXX which rssi should we use? + * XXX ext rssi? + */ + comb_rssi = rx->wr_antsignal; + pri_rssi = rx->wr_v.rssi_ctl[0]; + ext_rssi = rx->wr_v.rssi_ext[0]; + nf = rx->wr_antnoise; + + /* Last three bytes are the radar parameters */ + if (len < 3) { + printf("short radar frame\n"); + return (0); + } + +#if 0 + printf("tsf: %lld", tsf); + printf(" len: %d", len); + printf(" rssi %d/%d", comb_rssi, nf); + printf(", pri/ext rssi: %d/%d", pri_rssi, ext_rssi); + printf(" pri: %u", pkt[len - 3] & 0xff); + printf(" ext: %u", pkt[len - 2] & 0xff); + printf(" flags: %s %s %s\n", + pkt[len - 1] & PRI_CH_RADAR_FOUND ? "pri" : "", + pkt[len - 1] & EXT_CH_RADAR_FOUND ? "ext" : "", + pkt[len - 1] & EXT_CH_RADAR_EARLY_FOUND ? "extearly" : "" + ); +#endif + + re->re_timestamp = tsf; + re->re_rssi = comb_rssi; /* XXX extension rssi? */ + re->re_dur = pkt[len - 3]; /* XXX extension duration? */ + /* XXX flags? */ + /* XXX freq? */ + + return(1); +} Added: user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/lib/libradarpkt/ar9280_radar.h Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __AR9280_RADAR_H__ +#define __AR9280_RADAR_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define CHIP_AR9280 2 + +extern int ar9280_radar_decode(struct ieee80211_radiotap_header *rh, + const unsigned char *pkt, int len, struct radar_entry *re); + +#ifdef __cplusplus +} +#endif + +#endif /* __AR9280_RADAR_H__ */ Added: user/adrian/ath_radar_stuff/lib/libradarpkt/pkt.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/lib/libradarpkt/pkt.h Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 2012 Adrian Chadd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#ifndef __PKTHDR_PKT_H__ +#define __PKTHDR_PKT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct radar_entry { + uint64_t re_timestamp; + uint32_t re_freq; + /* + * The hardware may give it to us as a negative number; + * eg CCK decode which can use self-correlation to decode + * a very very weak signal. + */ + int32_t re_rssi; + uint32_t re_dur; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __PKTHDR_PKT_H__ */ Added: user/adrian/ath_radar_stuff/src/pktlog/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/pktlog/Makefile Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,12 @@ +PROG= main + +X_INCS= -I../../lib/ +X_LIBS= -L../../lib/libradarpkt/ + +SRCS= main.c +CFLAGS+= -I/home/adrian/work/freebsd/ath/head/src/sys $(X_INCS) -g -ggdb +LDADD+= $(X_LIBS) -lpcap -lradarpkt + +NO_MAN= 1 + +.include Added: user/adrian/ath_radar_stuff/src/pktlog/main.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/pktlog/main.c Tue Jun 19 23:45:17 2012 (r237278) @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include /* for ntohl etc */ + +#include + +#include "net80211/ieee80211_radiotap.h" + +#include "libradarpkt/pkt.h" +#include "libradarpkt/ar5416_radar.h" +#include "libradarpkt/ar9280_radar.h" + +/* + * Compile up a rule that's bound to be useful - it only matches on + * radar errors. + * + * tcpdump -ni wlan0 -y IEEE802_11_RADIO -x -X -s0 -v -ve \ + * 'radio[73] == 0x2 && (radio[72] == 5 || radio[72] == 24) + */ + +#define PKTRULE "radio[73] == 0x2 && (radio[72] == 5 || radio[72] == 24)" + +static int +pkt_compile(pcap_t *p, struct bpf_program *fp) +{ + if (pcap_compile(p, fp, PKTRULE, 1, 0) != 0) + return 0; + return 1; +} + +static void +pkt_print(struct radar_entry *re) +{ + printf("ts: %llu, freq=%u, rssi=%d, dur=%d\n", + re->re_timestamp, + re->re_freq, + re->re_rssi, + re->re_dur); +} + +void +pkt_handle(int chip, const char *pkt, int len) +{ + struct ieee80211_radiotap_header *rh; + uint8_t rssi, nf; + struct radar_entry re; + + /* XXX assume it's a radiotap frame */ + rh = (struct ieee80211_radiotap_header *) pkt; + + if (rh->it_version != 0) { + printf("%s: incorrect version (%d)\n", __func__, + rh->it_version); + return; + } + +#if 0 + /* XXX short frames? */ + if (len < 73) { + printf("%s: short frame (%d bytes)\n", __func__, len); + return; + } +#endif + +#if 0 + printf("%s: len=%d, present=0x%08x\n", + __func__, + (rh->it_len), /* XXX why aren't these endian-converted? */ + (rh->it_present)); +#endif + +#if 0 + /* + * XXX local hack - enable the radar checking + * XXX by assuming byte 72 is the radar status code. + */ + if (pkt[72] != 5 && pkt[72] != 24) { + printf("%s: not a radar error (code %d)?!\n", + __func__, + pkt[72]); + return; + } +#endif + + if (chip == CHIP_AR5416) + ar5416_radar_decode(rh, pkt + rh->it_len, len - rh->it_len, + &re); + else if (chip == CHIP_AR9280) + ar9280_radar_decode(rh, pkt + rh->it_len, len - rh->it_len, + &re); + + /* + * TODO: Print the summary record + */ + //pkt_print(&re); +} + +static pcap_t * +open_offline(const char *fname) +{ + pcap_t *p; + char errbuf[PCAP_ERRBUF_SIZE]; + + p = pcap_open_offline(fname, errbuf); + if (p == NULL) { + printf("pcap_create failed: %s\n", errbuf); + return (NULL); + } + + return (p); +} + +static pcap_t * +open_online(const char *ifname) +{ + pcap_t *p; + char errbuf[PCAP_ERRBUF_SIZE]; + struct bpf_program fp; + + p = pcap_open_live(ifname, 65536, 1, 1000, errbuf); + if (! p) { + err(1, "pcap_create: %s\n", errbuf); + return (NULL); + } + + if (pcap_set_datalink(p, DLT_IEEE802_11_RADIO) != 0) { + pcap_perror(p, "pcap_set_datalink"); + return (NULL); + } + + /* XXX pcap_is_swapped() ? */ + + if (! pkt_compile(p, &fp)) { + pcap_perror(p, "pkg_compile compile error\n"); + return (NULL); + } + + if (pcap_setfilter(p, &fp) != 0) { + printf("pcap_setfilter failed\n"); + return (NULL); + } + + return (p); +} + +static void +usage(const char *progname) +{ + + printf("Usage: %s \n", + progname); +} + +int +main(int argc, const char *argv[]) +{ + char *dev; + pcap_t * p; + const char *fname; + const unsigned char *pkt; + struct pcap_pkthdr *hdr; + int len, r; + int chip = 0; + + if (argc < 4) { + usage(argv[0]); + exit(255); + } + + if (strcmp(argv[1], "ar5416") == 0) { + chip = CHIP_AR5416; + } else if (strcmp(argv[1], "ar9280") == 0) { + chip = CHIP_AR9280; + } else { + usage(argv[0]); + exit(255); + } + + /* XXX verify */ + fname = argv[3]; + + if (strcmp(argv[2], "file") == 0) { + p = open_offline(fname); + } else if (strcmp(argv[2], "if") == 0) { + p = open_online(fname); + } else { + usage(argv[0]); + exit(255); + } + + if (p == NULL) + exit(255); + + /* + * Iterate over frames, looking for radiotap frames + * which have PHY errors. + * + * XXX We should compile a filter for this, but the + * XXX access method is a non-standard hack atm. + */ + while ((r = pcap_next_ex(p, &hdr, &pkt)) >= 0) { +#if 0 + printf("capture: len=%d, caplen=%d\n", + hdr->len, hdr->caplen); +#endif + if (r > 0) + pkt_handle(chip, pkt, hdr->caplen); + } + + pcap_close(p); +}