/*- * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting * 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. * 3. Neither the names of the above-listed copyright holders nor the names * of any contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * 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: src/tools/tools/ath/80211stats.c,v 1.2 2003/12/07 21:38:28 sam Exp $ */ /* * 80211stats [-i interface] * (default interface is ath0). */ #include #include #include #include #include #include #include #include "net80211/_ieee80211.h" #include "net80211/ieee80211.h" #include "net80211/ieee80211_crypto.h" #include "net80211/ieee80211_ioctl.h" #ifndef SIOCG80211STATS #define SIOCG80211STATS (SIOCDEVPRIVATE+2) #endif static void printstats(FILE *fd, const struct ieee80211_stats *stats) { #define N(a) (sizeof(a) / sizeof(a[0])) #define STAT(x,fmt) \ if (stats->is_##x) fprintf(fd, "%u " fmt "\n", stats->is_##x) STAT(rx_badversion, "rx frame with bad version"); STAT(rx_tooshort, "rx frame too short"); STAT(rx_wrongbss, "rx from wrong bssid"); STAT(rx_dup, "rx discard 'cuz dup"); STAT(rx_wrongdir, "rx w/ wrong direction"); STAT(rx_mcastecho, "rx discard 'cuz mcast echo"); STAT(rx_notassoc, "rx discard 'cuz sta !assoc"); STAT(rx_noprivacy, "rx w/ wep but privacy off"); STAT(rx_unencrypted, "rx w/o wep and privacy on"); STAT(rx_wepfail, "rx wep processing failed"); STAT(rx_decap, "rx decapsulation failed"); STAT(rx_mgtdiscard, "rx discard mgt frames"); STAT(rx_ctl, "rx discard ctrl frames"); STAT(rx_beacon, "rx beacon frames"); STAT(rx_rstoobig, "rx rate set truncated"); STAT(rx_elem_missing, "rx required element missing"); STAT(rx_elem_toobig, "rx element too big"); STAT(rx_elem_toosmall, "rx element too small"); STAT(rx_elem_unknown, "rx element unknown"); STAT(rx_badchan, "rx frame w/ invalid chan"); STAT(rx_chanmismatch, "rx frame chan mismatch"); STAT(rx_nodealloc, "nodes allocated (rx)"); STAT(rx_ssidmismatch, "rx frame ssid mismatch"); STAT(rx_auth_unsupported,"rx w/ unsupported auth alg"); STAT(rx_auth_fail, "rx sta auth failure"); STAT(rx_auth_countermeasures, "rx sta auth failure 'cuz of TKIP countermeasures"); STAT(rx_assoc_bss, "rx assoc from wrong bssid"); STAT(rx_assoc_notauth, "rx assoc w/o auth"); STAT(rx_assoc_capmismatch,"rx assoc w/ cap mismatch"); STAT(rx_assoc_norate, "rx assoc w/ no rate match"); STAT(rx_assoc_badwpaie, "rx assoc w/ bad WPA IE"); STAT(rx_deauth, "rx deauthentication"); STAT(rx_disassoc, "rx disassociation"); STAT(rx_badsubtype, "rx frame w/ unknown subtype"); STAT(rx_nobuf, "rx failed for lack of sk_buffer"); STAT(rx_decryptcrc, "rx decrypt failed on crc"); STAT(rx_ahdemo_mgt, "rx discard mgmt frame received in ahdoc demo mode"); STAT(rx_bad_auth, "rx bad authentication request"); STAT(rx_unauth, "rx discard 'cuz port unauthorized"); STAT(rx_badkeyid, "rx w/ incorrect keyid"); STAT(rx_ccmpreplay, "rx seq# violation (CCMP)"); STAT(rx_ccmpformat, "rx format bad (CCMP)"); STAT(rx_ccmpmic, "rx MIC check failed (CCMP)"); STAT(rx_tkipreplay, "rx seq# violation (TKIP)"); STAT(rx_tkipformat, "rx format bad (TKIP)"); STAT(rx_tkipmic, "rx MIC check failed (TKIP)"); STAT(rx_tkipicv, "rx ICV check failed (TKIP)"); STAT(rx_badcipher, "rx failed 'cuz bad cipher/key type"); STAT(rx_nocipherctx, "rx failed 'cuz key/cipher ctx not setup"); STAT(rx_acl, "rx discard 'cuz acl policy"); STAT(tx_nobuf, "tx failed for lack of sk_buffer"); STAT(tx_nonode, "tx failed for no node"); STAT(tx_unknownmgt, "tx of unknown mgt frame"); STAT(tx_badcipher, "tx failed 'cuz bad ciper/key type"); STAT(tx_nodefkey, "tx failed 'cuz no defkey"); STAT(tx_noheadroom, "tx failed 'cuz no space for crypto hdrs"); STAT(scan_active, "active scans started"); STAT(scan_passive, "passive scans started"); STAT(node_timeout, "nodes timed out inactivity"); STAT(crypto_nomem, "cipher context malloc failed"); STAT(crypto_tkip, "tkip crypto done in s/w"); STAT(crypto_tkipenmic, "tkip tx MIC done in s/w"); STAT(crypto_tkipdemic, "tkip rx MIC done in s/w"); STAT(crypto_tkipcm, "tkip dropped frames 'cuz of countermeasures"); STAT(crypto_ccmp, "ccmp crypto done in s/w"); STAT(crypto_wep, "wep crypto done in s/w"); STAT(crypto_setkey_cipher,"setkey failed 'cuz cipher rejected data"); STAT(crypto_setkey_nokey,"setkey failed 'cuz no key index"); STAT(crypto_delkey, "driver key delete failed"); STAT(crypto_badcipher, "setkey failed 'cuz unknown cipher"); STAT(crypto_nocipher, "setkey failed 'cuz cipher module unavailable"); STAT(crypto_attachfail, "setkey failed 'cuz cipher attach failed"); STAT(crypto_swfallback, "crypto fell back to s/w implementation"); STAT(crypto_keyfail, "setkey faied 'cuz driver key alloc failed"); STAT(crypto_enmicfail, "en-MIC failed"); STAT(ibss_capmismatch, "ibss merge failed-cap mismatch"); STAT(ibss_norate, "ibss merge failed-rate mismatch"); STAT(ps_unassoc, "ps-poll for unassoc. sta"); STAT(ps_badaid, "ps-poll w/ incorrect aid"); STAT(ps_qempty, "ps-poll w/ nothing to send"); #undef STAT #undef N } int main(int argc, char *argv[]) { int s; struct ifreq ifr; struct ieee80211_stats stats; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) err(1, "socket"); if (argc > 1 && strcmp(argv[1], "-i") == 0) { if (argc < 2) { fprintf(stderr, "%s: missing interface name for -i\n", argv[0]); exit(-1); } strncpy(ifr.ifr_name, argv[2], sizeof (ifr.ifr_name)); argc -= 2, argv += 2; } else strncpy(ifr.ifr_name, "ath0", sizeof (ifr.ifr_name)); ifr.ifr_data = (caddr_t) &stats; if (ioctl(s, SIOCG80211STATS, &ifr) < 0) err(1, ifr.ifr_name); printstats(stdout, &stats); return 0; }