summaryrefslogtreecommitdiffstats
path: root/usr.sbin/stallion/stlstats
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1996-05-04 07:22:23 +0000
committerpeter <peter@FreeBSD.org>1996-05-04 07:22:23 +0000
commit60623a69e2ef6bc0ae955d07d8995692874ac467 (patch)
treee2ed2b657261333e0a31ba5afef466c804f5c85c /usr.sbin/stallion/stlstats
parent29ffb5b52ca80d70ab7c8862763ee6557b124c06 (diff)
downloadFreeBSD-src-60623a69e2ef6bc0ae955d07d8995692874ac467.zip
FreeBSD-src-60623a69e2ef6bc0ae955d07d8995692874ac467.tar.gz
Import the user-mode parts of the v0.0.5alpha Stallion driver.
Submitted by: Greg Ungerer (gerg@stallion.oz.au) (Note, patches to compile/install to follow)
Diffstat (limited to 'usr.sbin/stallion/stlstats')
-rw-r--r--usr.sbin/stallion/stlstats/stlstats.c603
1 files changed, 603 insertions, 0 deletions
diff --git a/usr.sbin/stallion/stlstats/stlstats.c b/usr.sbin/stallion/stlstats/stlstats.c
new file mode 100644
index 0000000..fcce5c6
--- /dev/null
+++ b/usr.sbin/stallion/stlstats/stlstats.c
@@ -0,0 +1,603 @@
+/*****************************************************************************/
+
+/*
+ * stlstats.c -- stallion intelligent multiport stats display.
+ *
+ * Copyright (c) 1994-1996 Greg Ungerer (gerg@stallion.oz.au).
+ * 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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Greg Ungerer.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, 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 DAMAGE.
+ */
+
+/*****************************************************************************/
+
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <time.h>
+#include <ncurses.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include "cdk.h"
+#include "comstats.h"
+
+/*****************************************************************************/
+
+char *version = "0.0.5";
+char *defdevice = "/dev/staliomem0";
+
+char *progname;
+char *ctrldevice;
+int ctrlfd;
+int displaybrdnr = 0;
+int displaypanelnr = 0;
+int displayportnr = 0;
+int displayportbank = 0;
+
+#define MAXBRDS 8
+#define MAXPORTS 32
+
+combrd_t brdstats;
+comstats_t stats[MAXPORTS];
+
+char *line = " ";
+
+/*****************************************************************************/
+
+/*
+ * Declare internal function prototypes here.
+ */
+void usage(void);
+void useportdevice(char *devname);
+void localexit(int nr);
+void menuport();
+void displayport();
+void menuallports();
+void displayallports();
+void getallstats();
+void getbrdstats();
+void clearportstats();
+void clearallstats();
+
+/*****************************************************************************/
+
+void usage()
+{
+ fprintf(stderr, "Usage: %s [-hVbpdc]\n\n", progname);
+ fprintf(stderr, " -h print this information\n");
+ fprintf(stderr, " -V show version information and exit\n");
+ fprintf(stderr, " -b display board\n");
+ fprintf(stderr, " -p display panel\n");
+ fprintf(stderr, " -d display port device stats\n");
+ fprintf(stderr, " -c specify control device to use\n");
+ exit(0);
+}
+
+/*****************************************************************************/
+
+void useportdevice(char *devname)
+{
+ struct stat statinfo;
+ int portnr, portcnt;
+ int i, fd;
+
+ if (stat(devname, &statinfo) < 0) {
+ fprintf(stderr, "%s: port device %s does not exist\n",
+ progname, devname);
+ exit(1);
+ }
+ if ((statinfo.st_mode & S_IFMT) != S_IFCHR) {
+ fprintf(stderr, "%s: port device %s is not a char device\n",
+ progname, devname);
+ exit(1);
+ }
+
+ displaybrdnr = (statinfo.st_rdev & 0x00700000) >> 20;
+ portnr = (statinfo.st_rdev & 0x1f) |
+ ((statinfo.st_rdev & 0x00010000) >> 11);
+ getbrdstats();
+ if (brdstats.ioaddr == 0) {
+ fprintf(stderr, "%s: device %s does not exist\n", progname,
+ devname);
+ exit(1);
+ }
+
+ for (portcnt = 0, i = 0; (i < brdstats.nrpanels); i++) {
+ if ((portnr >= portcnt) &&
+ (portnr < (portcnt + brdstats.panels[i].nrports)))
+ break;
+ portcnt += brdstats.panels[i].nrports;
+ }
+ if (i >= brdstats.nrpanels) {
+ fprintf(stderr, "%s: device %s does not exist\n", progname,
+ devname);
+ exit(1);
+ }
+ displaypanelnr = i;
+ displayportnr = portnr - portcnt;
+ if (displayportnr >= 16)
+ displayportbank = 16;
+}
+
+/*****************************************************************************/
+
+/*
+ * Get the board stats for the current display board.
+ */
+
+void getbrdstats()
+{
+ brdstats.brd = displaybrdnr;
+ if (ioctl(ctrlfd, COM_GETBRDSTATS, &brdstats) < 0)
+ memset((combrd_t *) &brdstats, 0, sizeof(combrd_t));
+}
+
+/*****************************************************************************/
+
+/*
+ * Zero out stats for the current display port.
+ */
+
+void clearportstats()
+{
+ stats[displayportnr].brd = displaybrdnr;
+ stats[displayportnr].panel = displaypanelnr;
+ stats[displayportnr].port = displayportnr;
+ ioctl(ctrlfd, COM_CLRPORTSTATS, &stats[displayportnr]);
+}
+
+/*****************************************************************************/
+
+/*
+ * Zero out all stats for all ports on all boards.
+ */
+
+void clearallstats()
+{
+ int brdnr, panelnr, portnr;
+
+ for (brdnr = 0; (brdnr < MAXBRDS); brdnr++) {
+ for (panelnr = 0; (panelnr < COM_MAXPANELS); panelnr++) {
+ for (portnr = 0; (portnr < MAXPORTS); portnr++) {
+ stats[0].brd = brdnr;
+ stats[0].panel = panelnr;
+ stats[0].port = portnr;
+ ioctl(ctrlfd, COM_CLRPORTSTATS, &stats[0]);
+ }
+ }
+ }
+}
+
+/*****************************************************************************/
+
+/*
+ * Get the stats for the current display board/panel.
+ */
+
+void getallstats()
+{
+ int i;
+
+ for (i = 0; (i < brdstats.panels[displaypanelnr].nrports); i++) {
+ stats[i].brd = displaybrdnr;
+ stats[i].panel = displaypanelnr;
+ stats[i].port = i;
+ if (ioctl(ctrlfd, COM_GETPORTSTATS, &stats[i]) < 0) {
+ fprintf(stderr, "\n\r\nERROR: ioctl(COM_GETPORTSTATS) "
+ "failed, errno=%d\n\r\n", errno);
+ localexit(1);
+ }
+ }
+}
+
+/*****************************************************************************/
+
+/*
+ * Display the per ports stats screen.
+ */
+
+void displayport()
+{
+ mvprintw(0, 0, "STALLION SERIAL PORT STATISTICS");
+ mvprintw(2, 0,
+ "Board=%d Type=%d HwID=%02x State=%06x TotalPorts=%d",
+ displaybrdnr, brdstats.type, brdstats.hwid, brdstats.state,
+ brdstats.nrports);
+ mvprintw(3, 0, "Panel=%d HwID=%02x Ports=%d", displaypanelnr,
+ brdstats.panels[displaypanelnr].hwid,
+ brdstats.panels[displaypanelnr].nrports);
+
+ attron(A_REVERSE);
+ mvprintw(5, 0, line);
+ mvprintw(5, 0, "Port=%d ", displayportnr);
+ attroff(A_REVERSE);
+
+ mvprintw(7, 0, "STATE: State=%08x", stats[displayportnr].state);
+ mvprintw(7, 29, "Tty=%08x", stats[displayportnr].ttystate);
+ mvprintw(7, 47, "Flags=%08x", stats[displayportnr].flags);
+ mvprintw(7, 65, "HwID=%02x", stats[displayportnr].hwid);
+
+ mvprintw(8, 0, "CONFIG: Cflag=%08x", stats[displayportnr].cflags);
+ mvprintw(8, 29, "Iflag=%08x", stats[displayportnr].iflags);
+ mvprintw(8, 47, "Oflag=%08x", stats[displayportnr].oflags);
+ mvprintw(8, 65, "Lflag=%08x", stats[displayportnr].lflags);
+
+ mvprintw(10, 0, "TX DATA: Total=%d", stats[displayportnr].txtotal);
+ mvprintw(10, 29, "Buffered=%d ", stats[displayportnr].txbuffered);
+ mvprintw(11, 0, "RX DATA: Total=%d", stats[displayportnr].rxtotal);
+ mvprintw(11, 29, "Buffered=%d ", stats[displayportnr].rxbuffered);
+ mvprintw(12, 0, "RX ERRORS: Parity=%d", stats[displayportnr].rxparity);
+ mvprintw(12, 29, "Framing=%d", stats[displayportnr].rxframing);
+ mvprintw(12, 47, "Overrun=%d", stats[displayportnr].rxoverrun);
+ mvprintw(12, 65, "Lost=%d", stats[displayportnr].rxlost);
+
+ mvprintw(14, 0, "FLOW TX: Xoff=%d", stats[displayportnr].txxoff);
+ mvprintw(14, 29, "Xon=%d", stats[displayportnr].txxon);
+#if 0
+ mvprintw(14, 47, "CTSoff=%d", stats[displayportnr].txctsoff);
+ mvprintw(14, 65, "CTSon=%d", stats[displayportnr].txctson);
+#endif
+ mvprintw(15, 0, "FLOW RX: Xoff=%d", stats[displayportnr].rxxoff);
+ mvprintw(15, 29, "Xon=%d", stats[displayportnr].rxxon);
+ mvprintw(15, 47, "RTSoff=%d", stats[displayportnr].rxrtsoff);
+ mvprintw(15, 65, "RTSon=%d", stats[displayportnr].rxrtson);
+
+ mvprintw(17, 0, "OTHER: TXbreaks=%d",
+ stats[displayportnr].txbreaks);
+ mvprintw(17, 29, "RXbreaks=%d", stats[displayportnr].rxbreaks);
+ mvprintw(17, 47, "Modem=%d", stats[displayportnr].modem);
+
+ mvprintw(19, 0, "SIGNALS: DCD=%d DTR=%d CTS=%d RTS=%d "
+ "DSR=%d RI=%d",
+ (stats[displayportnr].signals & TIOCM_CD) ? 1 : 0,
+ (stats[displayportnr].signals & TIOCM_DTR) ? 1 : 0,
+ (stats[displayportnr].signals & TIOCM_CTS) ? 1 : 0,
+ (stats[displayportnr].signals & TIOCM_RTS) ? 1 : 0,
+ (stats[displayportnr].signals & TIOCM_DSR) ? 1 : 0,
+ (stats[displayportnr].signals & TIOCM_RI) ? 1 : 0);
+
+ attron(A_REVERSE);
+ mvprintw(22, 0, line);
+ attroff(A_REVERSE);
+
+ mvprintw(24, 19, "(q=Quit,0123456789abcdef=Port,Z=ZeroStats)");
+ refresh();
+}
+
+/*****************************************************************************/
+
+/*
+ * Continuously update and display the per ports stats screen.
+ * Also checks for keyboard input, and processes it as appropriate.
+ */
+
+void menuport()
+{
+ int ch, done;
+
+ clear();
+ done = 0;
+
+ while ((ch = getch()) != 27) {
+ switch (ch) {
+ case ERR:
+ break;
+ case ' ':
+ refresh();
+ break;
+ case 'a':
+ case 'b':
+ case 'c':
+ case 'd':
+ case 'e':
+ case 'f':
+ ch = (ch - 'a' + '0' + 10);
+ /* fall thru */
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ ch -= '0';
+ if (ch >= brdstats.panels[displaypanelnr].nrports) {
+ beep();
+ } else {
+ displayportnr = displayportbank + ch;
+ clear();
+ }
+ break;
+ case 'Z':
+ clearportstats();
+ clear();
+ break;
+ case 'q':
+ done = 1;
+ break;
+ default:
+ beep();
+ break;
+ }
+
+ if (done)
+ break;
+
+ getallstats();
+ displayport();
+ }
+}
+
+/*****************************************************************************/
+
+/*
+ * Display the all ports stats screen.
+ */
+
+void displayallports()
+{
+ int i, nrports, portnr;;
+
+ nrports = brdstats.panels[displaypanelnr].nrports;
+
+ mvprintw(0, 0, "STALLION SERIAL PORT STATISTICS");
+ mvprintw(2, 0, "Board=%d Type=%d HwID=%02x State=%06x TotalPorts=%d",
+ displaybrdnr, brdstats.type, brdstats.hwid, brdstats.state,
+ brdstats.nrports);
+ mvprintw(3, 0, "Panel=%d HwID=%02x Ports=%d", displaypanelnr,
+ brdstats.panels[displaypanelnr].hwid, nrports);
+
+ attron(A_REVERSE);
+ mvprintw(5, 0, "Port State Tty Flags Cflag Iflag Oflag Lflag "
+ "Sigs TX Total RX Total ");
+ attroff(A_REVERSE);
+
+ if (nrports > 0) {
+ if (nrports > 16)
+ nrports = 16;
+ portnr = displayportbank;
+ for (i = 0; (i < nrports); i++, portnr++) {
+ mvprintw((6 + i), 1, "%2d", portnr);
+ mvprintw((6 + i), 5, "%06x", stats[portnr].state);
+ mvprintw((6 + i), 12, "%06x", stats[portnr].ttystate);
+ mvprintw((6 + i), 19, "%08x", stats[portnr].flags);
+ mvprintw((6 + i), 28, "%05x", stats[portnr].cflags);
+ mvprintw((6 + i), 34, "%05x", stats[portnr].iflags);
+ mvprintw((6 + i), 40, "%05x", stats[portnr].oflags);
+ mvprintw((6 + i), 46, "%05x", stats[portnr].lflags);
+ mvprintw((6 + i), 52, "%04x", stats[portnr].signals);
+ mvprintw((6 + i), 58, "%10d", stats[portnr].txtotal);
+ mvprintw((6 + i), 69, "%10d", stats[portnr].rxtotal);
+ }
+ } else {
+ mvprintw(12, 32, "NO BOARD %d FOUND", displaybrdnr);
+ i = 16;
+ }
+
+ attron(A_REVERSE);
+ mvprintw((6 + i), 0, line);
+ attroff(A_REVERSE);
+
+ mvprintw(24, 14,
+ "(q=Quit,01234567=Board,n=Panels,p=Ports,Z=ZeroStats)");
+ refresh();
+}
+
+/*****************************************************************************/
+
+/*
+ * Continuously update and display the all ports stats screen.
+ * Also checks for keyboard input, and processes it as appropriate.
+ */
+
+void menuallports()
+{
+ int ch, done;
+
+ clear();
+ getbrdstats();
+
+ done = 0;
+ while ((ch = getch()) != 27) {
+ switch (ch) {
+ case ERR:
+ break;
+ case ' ':
+ refresh();
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ displaybrdnr = ch - '0';
+ displaypanelnr = 0;
+ getbrdstats();
+ if (brdstats.state == 0)
+ beep();
+ clear();
+ break;
+ case 'n':
+ if (brdstats.panels[displaypanelnr].nrports > 16) {
+ if (displayportbank == 0) {
+ displayportbank = 16;
+ clear();
+ break;
+ }
+ }
+ displayportbank = 0;
+ displaypanelnr++;
+ if (displaypanelnr >= brdstats.nrpanels)
+ displaypanelnr = 0;
+ clear();
+ break;
+ case 'p':
+ if (brdstats.panels[displaypanelnr].nrports > 0) {
+ displayportnr = displayportbank;
+ menuport();
+ clear();
+ } else {
+ beep();
+ }
+ break;
+ case 'Z':
+ clearallstats();
+ clear();
+ break;
+ case 'q':
+ done = 1;
+ break;
+ default:
+ beep();
+ break;
+ }
+
+ if (done)
+ break;
+
+ getallstats();
+ displayallports();
+ }
+}
+
+/*****************************************************************************/
+
+/*
+ * A local exit routine - shuts down curses before exiting.
+ */
+
+void localexit(int nr)
+{
+ refresh();
+ endwin();
+ exit(nr);
+}
+
+/*****************************************************************************/
+
+void main(int argc, char *argv[])
+{
+ struct stat statinfo;
+ int optind, c, useport;
+ char *portdev;
+
+ optind = 0;
+ progname = argv[0];
+ ctrldevice = defdevice;
+ useport = 0;
+
+ while ((c = getopt(argc, argv, "hvVb:p:d:c:")) != -1) {
+ switch (c) {
+ case 'V':
+ printf("%s version %s\n", progname, version);
+ exit(0);
+ break;
+ case 'h':
+ usage();
+ break;
+ case 'b':
+ displaybrdnr = atoi(optarg);
+ break;
+ case 'p':
+ displaypanelnr = atoi(optarg);
+ break;
+ case 'd':
+ useport++;
+ portdev = optarg;
+ break;
+ case 'c':
+ ctrldevice = optarg;
+ break;
+ case '?':
+ default:
+ usage();
+ break;
+ }
+ }
+
+/*
+ * Check that the control device exits and is a character device.
+ */
+ if (stat(ctrldevice, &statinfo) < 0) {
+ fprintf(stderr, "%s: control device %s does not exist\n",
+ progname, ctrldevice);
+ exit(1);
+ }
+ if ((statinfo.st_mode & S_IFMT) != S_IFCHR) {
+ fprintf(stderr, "%s: control device %s is not a char device\n",
+ progname, ctrldevice);
+ exit(1);
+ }
+ if ((ctrlfd = open(ctrldevice, O_RDWR)) < 0) {
+ fprintf(stderr, "%s: open of %s failed, errno=%d\n", progname,
+ ctrldevice, errno);
+ exit(1);
+ }
+
+/*
+ * Validate the panel number supplied by user. We do this now since we
+ * need to have parsed the entire command line first.
+ */
+ getbrdstats();
+ if (displaypanelnr >= brdstats.nrpanels)
+ displaypanelnr = 0;
+
+ if (useport)
+ useportdevice(portdev);
+
+/*
+ * Everything is now ready, lets go!
+ */
+ initscr();
+ cbreak();
+ halfdelay(5);
+ noecho();
+ clear();
+ if (useport) {
+ menuport();
+ clear();
+ }
+ menuallports();
+ refresh();
+ endwin();
+
+ close(ctrlfd);
+ printf("\n");
+ exit(0);
+}
+
+/*****************************************************************************/
OpenPOWER on IntegriCloud