From 1b4d00dd27ea837cd1df1902dadae26bec0cd467 Mon Sep 17 00:00:00 2001 From: Lars Fredriksen Date: Sat, 12 Nov 1994 06:07:15 +0000 Subject: [PATCH] pppstats from ppp-2.1.2 --- usr.sbin/pppstats/Makefile | 12 ++ usr.sbin/pppstats/pppstats.8 | 131 ++++++++++++ usr.sbin/pppstats/pppstats.c | 385 +++++++++++++++++++++++++++++++++++ 3 files changed, 528 insertions(+) create mode 100644 usr.sbin/pppstats/Makefile create mode 100644 usr.sbin/pppstats/pppstats.8 create mode 100644 usr.sbin/pppstats/pppstats.c diff --git a/usr.sbin/pppstats/Makefile b/usr.sbin/pppstats/Makefile new file mode 100644 index 000000000000..e29e8301f96d --- /dev/null +++ b/usr.sbin/pppstats/Makefile @@ -0,0 +1,12 @@ +# $Id: Makefile.bsd,v 1.2 1994/04/25 06:48:25 paulus Exp $ + +PROG= pppstats +SRCS= pppstats.c +MAN8= pppstats.8 + +LDADD= -lutil -lkvm +BINMODE=2555 +BINGRP= kmem +BINDIR= /usr/sbin + +.include diff --git a/usr.sbin/pppstats/pppstats.8 b/usr.sbin/pppstats/pppstats.8 new file mode 100644 index 000000000000..b30574048183 --- /dev/null +++ b/usr.sbin/pppstats/pppstats.8 @@ -0,0 +1,131 @@ +.\" Modified from slstat.8 by Lars Fredriksen +.\" +.\" Copyright (c) 1986 The Regents of the University of California. +.\" 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 the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. +.\" +.\" @(#)pppstats.8 6.8 (Berkeley) 6/20/91 +.\" +.TH PPPSTATS 1 "November 09, 1994" +.UC 4 +.SH NAME +pppstats \- report Point to Point Protocol statistics +.SH SYNOPSIS +.nf +.ft B +pppstats [ \-i interval ] [ \-v ] [ unit ] [ system ] [ core ] +.ft R +.fi +.SH DESCRIPTION +.I Pppstats +reports certain kernel statistics kept about Point to Point +Protocol traffic. +.PP +The options are as follows: +.TP +\-i +Repeat the display indefinitely every +.I interval +seconds. +If no +.I interval +is specified, the default is 5 seconds. +.TP +\-v +Verbose display of extra fields of information. +.TP +unit +is a single digit specifying the slip interface. The default unit is +.I 0 +for interface +.I ppp0. +.TP +system +Extract the name list from the specified system instead of the default, /kernel. +.TP +core +Extract values associated with the name list from the specified +core instead of the default, /dev/kmem. +.PP +By default, +.I pppstats +displays the following information: +.PP +.TP +in +bytes received +.TP +out +bytes sent +.TP +pack +packets received or sent +.TP +comp +compressed packets received or sent +.TP +uncomp +uncompressed packets received or sent +.TP +err +input or output errors +.PP +With the \-v option, the following information is also displayed: +.TP +toss +inbound packets tossed because of error +.TP +search +searches for connection state +.TP +miss +times we could not find a connectoin state +.SH EXAMPLES +The command ``pppstats -i 5'' will print what the system is doing every five +seconds. +.SH FILES +.ta \w'/dev/kmem 'u +/kernel default kernel namelist +.br +/dev/kmem default memory file +.SH SEE ALSO +.IR fstat (1), +.IR netstat (1), +.IR nfsstat (1), +.IR ps (1), +.IR systat (1), +.IR iostat (8), +.IR pstat (8) +.IR slstat (8) +.sp +The sections starting with ``Interpreting system activity'' in +.IR "Installing and Operating 4.3BSD" . +.SH BUGS + diff --git a/usr.sbin/pppstats/pppstats.c b/usr.sbin/pppstats/pppstats.c new file mode 100644 index 000000000000..cabaced98b32 --- /dev/null +++ b/usr.sbin/pppstats/pppstats.c @@ -0,0 +1,385 @@ +/* + * print PPP statistics: + * pppstats [-i interval] [-v] [interface] [system] [core] + * + * Brad Parker (brad@cayman.com) 6/92 + * + * from the original "slstats" by Van Jaconson + * + * Copyright (c) 1989 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: + * - Initial distribution. + */ + +#ifndef lint +static char rcsid[] = "$Id: pppstats.c,v 1.4 1994/06/08 00:38:49 paulus Exp $"; +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define VJC 1 +#include + +#ifndef STREAMS +#include +#endif + +#ifdef STREAMS +#define PPP_STATS 1 /* should be defined iff it is in ppp_if.c */ +#include +#include +#endif + +#ifdef BSD4_4 +#define KVMLIB +#endif + +#ifndef KVMLIB + +#include +#ifdef ultrix +#include +#endif + +struct pte *Sysmap; +int kmem; +char *kmemf = "/dev/kmem"; +extern off_t lseek(); + +#else /* KVMLIB */ + +char *kmemf; + +#if defined(sun) || defined(__FreeBSD__) +#include +kvm_t *kd; +#define KDARG kd, + +#else /* sun */ +#define KDARG +#endif /* sun */ + +#endif /* KVMLIB */ + +#ifdef STREAMS +struct nlist nl[] = { +#define N_SOFTC 0 + { "_pii" }, + "", +}; +#else +struct nlist nl[] = { +#define N_SOFTC 0 + { "_ppp_softc" }, + "", +}; +#endif + +#ifndef BSD4_4 +char *system = "/vmunix"; +#else +#include +#if defined(__FreeBSD__) + /* _PATH_UNIX is defined as "Do not use _PATH_UNIX" */ +char *system = NULL; +#else +char *system = _PATH_UNIX; +#endif +#endif + +int kflag; +int vflag; +unsigned interval = 5; +int unit; + +extern char *malloc(); + +main(argc, argv) + int argc; + char *argv[]; +{ + + char errbuf[_POSIX2_LINE_MAX]; + --argc; ++argv; + while (argc > 0) { + if (strcmp(argv[0], "-v") == 0) { + ++vflag; + ++argv, --argc; + continue; + } + if (strcmp(argv[0], "-i") == 0 && argv[1] && + isdigit(argv[1][0])) { + interval = atoi(argv[1]); + if (interval <= 0) + usage(); + ++argv, --argc; + ++argv, --argc; + continue; + } + if (isdigit(argv[0][0])) { + unit = atoi(argv[0]); + if (unit < 0) + usage(); + ++argv, --argc; + continue; + } + if (kflag) + usage(); + + system = *argv; + ++argv, --argc; + if (argc > 0) { + kmemf = *argv++; + --argc; + kflag++; + } + } +#ifndef KVMLIB + if (nlist(system, nl) < 0 || nl[0].n_type == 0) { + fprintf(stderr, "%s: no namelist\n", system); + exit(1); + } + kmem = open(kmemf, O_RDONLY); + if (kmem < 0) { + perror(kmemf); + exit(1); + } +#ifndef ultrix + if (kflag) { + off_t off; + + Sysmap = (struct pte *) + malloc((u_int)(nl[N_SYSSIZE].n_value * sizeof(struct pte))); + if (!Sysmap) { + fputs("pppstats: can't get memory for Sysmap.\n", stderr); + exit(1); + } + off = nl[N_SYSMAP].n_value & ~KERNBASE; + (void)lseek(kmem, off, L_SET); + (void)read(kmem, (char *)Sysmap, + (int)(nl[N_SYSSIZE].n_value * sizeof(struct pte))); + } +#endif +#else +#if defined(sun) + /* SunOS */ + if ((kd = kvm_open(system, kmemf, (char *)0, O_RDONLY, NULL)) == NULL) { + perror("kvm_open"); + exit(1); + } +#else + /* BSD4.3+ */ + if ((kd = kvm_openfiles(system, kmemf, NULL, O_RDONLY, errbuf)) == NULL) { + fprintf(stderr, "kvm_openfiles: %s", errbuf); + exit(1); + } +#endif + + if (kvm_nlist(KDARG nl)) { + fprintf(stderr, "pppstats: can't find symbols in nlist\n"); + exit(1); + } +#endif + intpr(); + exit(0); +} + +#ifndef KVMLIB +/* + * Seek into the kernel for a value. + */ +off_t +klseek(fd, base, off) + int fd, off; + off_t base; +{ + if (kflag) { +#ifdef ultrix + base = K0_TO_PHYS(base); +#else + /* get kernel pte */ + base &= ~KERNBASE; + base = ctob(Sysmap[btop(base)].pg_pfnum) + (base & PGOFSET); +#endif + } + return (lseek(fd, base, off)); +} +#endif + +usage() +{ + fprintf(stderr,"usage: pppstats [-i interval] [-v] [unit] [system] [core]\n"); + exit(1); +} + +u_char signalled; /* set if alarm goes off "early" */ + +#define V(offset) ((line % 20)? sc->offset - osc->offset : sc->offset) + +#ifdef STREAMS +#define STRUCT struct ppp_if_info +#define COMP pii_sc_comp +#define STATS pii_ifnet +#else +#define STRUCT struct ppp_softc +#define COMP sc_comp +#define STATS sc_if +#endif + +/* + * Print a running summary of interface statistics. + * Repeat display every interval seconds, showing statistics + * collected over that interval. Assumes that interval is non-zero. + * First line printed at top of screen is always cumulative. + */ +intpr() +{ + register int line = 0; + int oldmask; +#ifdef __STDC__ + void catchalarm(int); +#else + void catchalarm(); +#endif + + STRUCT *sc, *osc; + + nl[N_SOFTC].n_value += unit * sizeof(STRUCT); + sc = (STRUCT *)malloc(sizeof(STRUCT)); + osc = (STRUCT *)malloc(sizeof(STRUCT)); + + bzero((char *)osc, sizeof(STRUCT)); + + while (1) { +#ifndef KVMLIB + if (klseek(kmem, (off_t)nl[N_SOFTC].n_value, 0) == -1) { + perror("kmem seek"); + exit(1); + } + if (read(kmem, (char *)sc, sizeof(STRUCT)) <= 0) { + perror("kmem read"); + exit(1); + } +#else + if (kvm_read(KDARG nl[N_SOFTC].n_value, sc, + sizeof(STRUCT)) != sizeof(STRUCT)) { + perror("kvm_read"); + exit(1); + } +#endif + + (void)signal(SIGALRM, catchalarm); + signalled = 0; + (void)alarm(interval); + + if ((line % 20) == 0) { + printf("%6.6s %6.6s %6.6s %6.6s %6.6s", + "in", "pack", "comp", "uncomp", "err"); + if (vflag) + printf(" %6.6s %6.6s", "toss", "ip"); + printf(" | %6.6s %6.6s %6.6s %6.6s %6.6s", + "out", "pack", "comp", "uncomp", "ip"); + if (vflag) + printf(" %6.6s %6.6s", "search", "miss"); + putchar('\n'); + } + + printf("%6d %6d %6d %6d %6d", +#ifdef BSD4_4 + V(STATS.if_ibytes), +#else +#ifndef STREAMS + V(sc_bytesrcvd), +#else +#ifdef PPP_STATS + V(pii_stats.ppp_ibytes), +#else + 0, +#endif +#endif +#endif + V(STATS.if_ipackets), + V(COMP.sls_compressedin), + V(COMP.sls_uncompressedin), + V(COMP.sls_errorin)); + if (vflag) + printf(" %6d %6d", + V(COMP.sls_tossed), + V(STATS.if_ipackets) - V(COMP.sls_compressedin) - + V(COMP.sls_uncompressedin) - V(COMP.sls_errorin)); + printf(" | %6d %6d %6d %6d %6d", +#ifdef BSD4_4 + V(STATS.if_obytes), +#else +#ifndef STREAMS + V(sc_bytessent), +#else +#ifdef PPP_STATS + V(pii_stats.ppp_obytes), +#else + 0, +#endif +#endif +#endif + V(STATS.if_opackets), + V(COMP.sls_compressed), + V(COMP.sls_packets) - V(COMP.sls_compressed), + V(STATS.if_opackets) - V(COMP.sls_packets)); + if (vflag) + printf(" %6d %6d", + V(COMP.sls_searches), + V(COMP.sls_misses)); + + putchar('\n'); + fflush(stdout); + line++; + + oldmask = sigblock(sigmask(SIGALRM)); + if (! signalled) { + sigpause(0); + } + sigsetmask(oldmask); + signalled = 0; + (void)alarm(interval); + bcopy((char *)sc, (char *)osc, sizeof(STRUCT)); + } +} + +/* + * Called if an interval expires before sidewaysintpr has completed a loop. + * Sets a flag to not wait for the alarm. + */ +void catchalarm(arg) +int arg; +{ + signalled = 1; +}