1151069Sdamien/* $FreeBSD$ */ 2151069Sdamien 3151069Sdamien/*- 4151069Sdamien * Copyright (c) 2005 5151069Sdamien * Damien Bergamini <damien.bergamini@free.fr>. All rights reserved. 6151069Sdamien * 7151069Sdamien * Redistribution and use in source and binary forms, with or without 8151069Sdamien * modification, are permitted provided that the following conditions 9151069Sdamien * are met: 10151069Sdamien * 1. Redistributions of source code must retain the above copyright 11151069Sdamien * notice unmodified, this list of conditions, and the following 12151069Sdamien * disclaimer. 13151069Sdamien * 2. Redistributions in binary form must reproduce the above copyright 14151069Sdamien * notice, this list of conditions and the following disclaimer in the 15151069Sdamien * documentation and/or other materials provided with the distribution. 16151069Sdamien * 17151069Sdamien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18151069Sdamien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19151069Sdamien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20151069Sdamien * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21151069Sdamien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22151069Sdamien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23151069Sdamien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24151069Sdamien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25151069Sdamien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26151069Sdamien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27151069Sdamien * SUCH DAMAGE. 28151069Sdamien */ 29151069Sdamien 30151069Sdamien#include <sys/cdefs.h> 31151069Sdamien__FBSDID("$FreeBSD$"); 32151069Sdamien 33151069Sdamien#include <sys/types.h> 34151069Sdamien#include <sys/sysctl.h> 35151069Sdamien 36151069Sdamien#include <err.h> 37151069Sdamien#include <stdio.h> 38151069Sdamien#include <sysexits.h> 39151069Sdamien 40151069Sdamienstatic void get_statistics(const char *); 41151069Sdamien 42151069Sdamienint 43151069Sdamienmain(int argc, char **argv) 44151069Sdamien{ 45151069Sdamien get_statistics((argc > 1) ? argv[1] : "iwi0"); 46151069Sdamien 47151069Sdamien return EX_OK; 48151069Sdamien} 49151069Sdamien 50151069Sdamienstatic const struct statistic { 51151069Sdamien int index; 52151069Sdamien const char *desc; 53151069Sdamien} tbl[] = { 54151069Sdamien { 1, "Current transmission rate" }, 55151069Sdamien { 2, "Fragmentation threshold" }, 56151069Sdamien { 3, "RTS threshold" }, 57151069Sdamien { 4, "Number of frames submitted for transfer" }, 58151069Sdamien { 5, "Number of frames transmitted" }, 59151069Sdamien { 6, "Number of unicast frames transmitted" }, 60151069Sdamien { 7, "Number of unicast 802.11b frames transmitted at 1Mb/s" }, 61151069Sdamien { 8, "Number of unicast 802.11b frames transmitted at 2Mb/s" }, 62151069Sdamien { 9, "Number of unicast 802.11b frames transmitted at 5.5Mb/s" }, 63151069Sdamien { 10, "Number of unicast 802.11b frames transmitted at 11Mb/s" }, 64151069Sdamien 65151069Sdamien { 19, "Number of unicast 802.11g frames transmitted at 1Mb/s" }, 66151069Sdamien { 20, "Number of unicast 802.11g frames transmitted at 2Mb/s" }, 67151069Sdamien { 21, "Number of unicast 802.11g frames transmitted at 5.5Mb/s" }, 68151069Sdamien { 22, "Number of unicast 802.11g frames transmitted at 6Mb/s" }, 69151069Sdamien { 23, "Number of unicast 802.11g frames transmitted at 9Mb/s" }, 70151069Sdamien { 24, "Number of unicast 802.11g frames transmitted at 11Mb/s" }, 71151069Sdamien { 25, "Number of unicast 802.11g frames transmitted at 12Mb/s" }, 72151069Sdamien { 26, "Number of unicast 802.11g frames transmitted at 18Mb/s" }, 73151069Sdamien { 27, "Number of unicast 802.11g frames transmitted at 24Mb/s" }, 74151069Sdamien { 28, "Number of unicast 802.11g frames transmitted at 36Mb/s" }, 75151069Sdamien { 29, "Number of unicast 802.11g frames transmitted at 48Mb/s" }, 76151069Sdamien { 30, "Number of unicast 802.11g frames transmitted at 54Mb/s" }, 77151069Sdamien { 31, "Number of multicast frames transmitted" }, 78151069Sdamien { 32, "Number of multicast 802.11b frames transmitted at 1Mb/s" }, 79151069Sdamien { 33, "Number of multicast 802.11b frames transmitted at 2Mb/s" }, 80151069Sdamien { 34, "Number of multicast 802.11b frames transmitted at 5.5Mb/s" }, 81151069Sdamien { 35, "Number of multicast 802.11b frames transmitted at 11Mb/s" }, 82151069Sdamien 83151069Sdamien { 44, "Number of multicast 802.11g frames transmitted at 1Mb/s" }, 84151069Sdamien { 45, "Number of multicast 802.11g frames transmitted at 2Mb/s" }, 85151069Sdamien { 46, "Number of multicast 802.11g frames transmitted at 5.5Mb/s" }, 86151069Sdamien { 47, "Number of multicast 802.11g frames transmitted at 6Mb/s" }, 87151069Sdamien { 48, "Number of multicast 802.11g frames transmitted at 9Mb/s" }, 88151069Sdamien { 49, "Number of multicast 802.11g frames transmitted at 11Mb/s" }, 89151069Sdamien { 50, "Number of multicast 802.11g frames transmitted at 12Mb/s" }, 90151069Sdamien { 51, "Number of multicast 802.11g frames transmitted at 18Mb/s" }, 91151069Sdamien { 52, "Number of multicast 802.11g frames transmitted at 24Mb/s" }, 92151069Sdamien { 53, "Number of multicast 802.11g frames transmitted at 36Mb/s" }, 93151069Sdamien { 54, "Number of multicast 802.11g frames transmitted at 48Mb/s" }, 94151069Sdamien { 55, "Number of multicast 802.11g frames transmitted at 54Mb/s" }, 95151069Sdamien { 56, "Number of transmission retries" }, 96151069Sdamien { 57, "Number of transmission failures" }, 97151069Sdamien { 58, "Number of CRC errors" }, 98151069Sdamien 99151069Sdamien { 61, "Number of full scans" }, 100151069Sdamien { 62, "Number of partial scans" }, 101151069Sdamien 102151069Sdamien { 64, "Number of bytes transmitted" }, 103151069Sdamien { 65, "Current RSSI" }, 104151069Sdamien { 66, "Number of beacons received" }, 105151069Sdamien { 67, "Number of beacons missed" }, 106151069Sdamien 107151069Sdamien { -1, NULL } 108151069Sdamien}; 109151069Sdamien 110151069Sdamienstatic void 111151069Sdamienget_statistics(const char *iface) 112151069Sdamien{ 113151069Sdamien static uint32_t stats[256]; 114151069Sdamien const struct statistic *stat; 115151069Sdamien char oid[32]; 116219527Sbrucec size_t len; 117219527Sbrucec int ifaceno; 118151069Sdamien 119151069Sdamien if (sscanf(iface, "iwi%u", &ifaceno) != 1) 120151069Sdamien errx(EX_DATAERR, "Invalid interface name '%s'", iface); 121151069Sdamien 122219527Sbrucec len = sizeof(stats); 123219527Sbrucec (void)snprintf(oid, sizeof(oid), "dev.iwi.%u.stats", ifaceno); 124151069Sdamien if (sysctlbyname(oid, stats, &len, NULL, 0) == -1) 125151069Sdamien err(EX_OSERR, "Can't retrieve statistics"); 126151069Sdamien 127151069Sdamien for (stat = tbl; stat->index != -1; stat++) 128219527Sbrucec (void)printf("%-60s[%u]\n", stat->desc, stats[stat->index]); 129151069Sdamien} 130