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