1236834Sadrian/*- 2236834Sadrian * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting 3236834Sadrian * 2012, Adrian Chadd 4236834Sadrian * All rights reserved. 5236834Sadrian * 6236834Sadrian * Redistribution and use in source and binary forms, with or without 7236834Sadrian * modification, are permitted provided that the following conditions 8236834Sadrian * are met: 9236834Sadrian * 1. Redistributions of source code must retain the above copyright 10236834Sadrian * notice, this list of conditions and the following disclaimer, 11236834Sadrian * without modification. 12236834Sadrian * 2. Redistributions in binary form must reproduce at minimum a disclaimer 13236834Sadrian * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 14236834Sadrian * redistribution must be conditioned upon including a substantially 15236834Sadrian * similar Disclaimer requirement for further binary redistribution. 16236834Sadrian * 17236834Sadrian * NO WARRANTY 18236834Sadrian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19236834Sadrian * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20236834Sadrian * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 21236834Sadrian * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 22236834Sadrian * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 23236834Sadrian * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24236834Sadrian * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25236834Sadrian * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 26236834Sadrian * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27236834Sadrian * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 28236834Sadrian * THE POSSIBILITY OF SUCH DAMAGES. 29236834Sadrian * 30236834Sadrian * $FreeBSD$ 31236834Sadrian */ 32236834Sadrian 33236834Sadrian/* 34236834Sadrian * Simple Atheros-specific tool to inspect and monitor software queue 35236834Sadrian * and aggregate statistics. 36236834Sadrian * 37236834Sadrian * athaggrstats [-i interface] [-bz] [-l] [-o fmtstring] [interval] 38236834Sadrian * 39236834Sadrian * (default interface is ath0). If interval is specified a rolling output 40236834Sadrian * a la netstat -i is displayed every interval seconds. The format of 41236834Sadrian * the rolling display can be controlled a la ps. The -l option will 42236834Sadrian * print a list of all possible statistics for use with the -o option. 43236834Sadrian */ 44236834Sadrian 45287297Srodrigc#include <sys/param.h> 46287297Srodrigc 47287297Srodrigc#include <err.h> 48287297Srodrigc#include <signal.h> 49236834Sadrian#include <stdio.h> 50236834Sadrian#include <stdlib.h> 51287297Srodrigc#include <string.h> 52236834Sadrian#include <unistd.h> 53236834Sadrian 54236834Sadrian#include "athaggrstats.h" 55236834Sadrian 56236834Sadrianstatic struct { 57236834Sadrian const char *tag; 58236834Sadrian const char *fmt; 59236834Sadrian} tags[] = { 60236834Sadrian { "default", 61236834Sadrian "singlepkt,nonbawpkt,aggrpkt,bawclosedpkt,lhsinglepkt,schednopkt,rtsaggrlimit" 62236834Sadrian }, 63236834Sadrian}; 64236834Sadrian 65236834Sadrianstatic const char * 66236834Sadriangetfmt(const char *tag) 67236834Sadrian{ 68236834Sadrian int i; 69287297Srodrigc for (i = 0; i < nitems(tags); i++) 70236834Sadrian if (strcasecmp(tags[i].tag, tag) == 0) 71236834Sadrian return tags[i].fmt; 72236834Sadrian return tag; 73236834Sadrian} 74236834Sadrian 75236834Sadrianstatic int signalled; 76236834Sadrian 77236834Sadrianstatic void 78236834Sadriancatchalarm(int signo __unused) 79236834Sadrian{ 80236834Sadrian signalled = 1; 81236834Sadrian} 82236834Sadrian 83236834Sadrianint 84236834Sadrianmain(int argc, char *argv[]) 85236834Sadrian{ 86236834Sadrian struct athaggrstatfoo *wf; 87236834Sadrian const char *ifname; 88236834Sadrian int c, banner = 1; 89236834Sadrian 90236834Sadrian ifname = getenv("ATH"); 91236834Sadrian if (ifname == NULL) 92295363Sadrian ifname = ATH_DEFAULT; 93236834Sadrian wf = athaggrstats_new(ifname, getfmt("default")); 94236834Sadrian while ((c = getopt(argc, argv, "bi:lo:z")) != -1) { 95236834Sadrian switch (c) { 96236834Sadrian case 'b': 97236834Sadrian banner = 0; 98236834Sadrian break; 99236834Sadrian case 'i': 100236834Sadrian wf->setifname(wf, optarg); 101236834Sadrian break; 102236834Sadrian case 'l': 103236834Sadrian wf->print_fields(wf, stdout); 104236834Sadrian return 0; 105236834Sadrian case 'o': 106236834Sadrian wf->setfmt(wf, getfmt(optarg)); 107236834Sadrian break; 108236834Sadrian case 'z': 109236834Sadrian wf->zerostats(wf); 110236834Sadrian break; 111236834Sadrian default: 112236834Sadrian errx(-1, "usage: %s [-a] [-i ifname] [-l] [-o fmt] [-z] [interval]\n", argv[0]); 113236834Sadrian /*NOTREACHED*/ 114236834Sadrian } 115236834Sadrian } 116236834Sadrian argc -= optind; 117236834Sadrian argv += optind; 118236834Sadrian 119236834Sadrian if (argc > 0) { 120236834Sadrian u_long interval = strtoul(argv[0], NULL, 0); 121236834Sadrian int line, omask; 122236834Sadrian 123236834Sadrian if (interval < 1) 124236834Sadrian interval = 1; 125236834Sadrian signal(SIGALRM, catchalarm); 126236834Sadrian signalled = 0; 127236834Sadrian alarm(interval); 128236834Sadrian banner: 129236834Sadrian if (banner) 130236834Sadrian wf->print_header(wf, stdout); 131236834Sadrian line = 0; 132236834Sadrian loop: 133236834Sadrian if (line != 0) { 134236834Sadrian wf->collect_cur(wf); 135236834Sadrian wf->print_current(wf, stdout); 136236834Sadrian wf->update_tot(wf); 137236834Sadrian } else { 138236834Sadrian wf->collect_tot(wf); 139236834Sadrian wf->print_total(wf, stdout); 140236834Sadrian } 141236834Sadrian fflush(stdout); 142236834Sadrian omask = sigblock(sigmask(SIGALRM)); 143236834Sadrian if (!signalled) 144236834Sadrian sigpause(0); 145236834Sadrian sigsetmask(omask); 146236834Sadrian signalled = 0; 147236834Sadrian alarm(interval); 148236834Sadrian line++; 149236834Sadrian if (line == 21) /* XXX tty line count */ 150236834Sadrian goto banner; 151236834Sadrian else 152236834Sadrian goto loop; 153236834Sadrian /*NOTREACHED*/ 154236834Sadrian } else { 155236834Sadrian wf->collect_tot(wf); 156236834Sadrian wf->print_verbose(wf, stdout); 157236834Sadrian } 158236834Sadrian return 0; 159236834Sadrian} 160