diff options
author | peter <peter@FreeBSD.org> | 1997-08-22 15:15:28 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1997-08-22 15:15:28 +0000 |
commit | 8f0a0f9c29655b25dcc0b10c2eb21ffda94642b9 (patch) | |
tree | 8c60739b9bdc50e24fc28fc7a8effda1d7151c1b /usr.sbin | |
parent | 5a827a90e7e7304577a3d373f52acd72b3cdc17c (diff) | |
download | FreeBSD-src-8f0a0f9c29655b25dcc0b10c2eb21ffda94642b9.zip FreeBSD-src-8f0a0f9c29655b25dcc0b10c2eb21ffda94642b9.tar.gz |
Import pppstats from the ppp-2.3.1 distribution
Obtained from: Paul Mackerras <paulus@cs.anu.edu.au>
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/pppstats/Makefile | 8 | ||||
-rw-r--r-- | usr.sbin/pppstats/pppstats.8 | 316 | ||||
-rw-r--r-- | usr.sbin/pppstats/pppstats.c | 729 |
3 files changed, 637 insertions, 416 deletions
diff --git a/usr.sbin/pppstats/Makefile b/usr.sbin/pppstats/Makefile index e29e830..ef61364 100644 --- a/usr.sbin/pppstats/Makefile +++ b/usr.sbin/pppstats/Makefile @@ -1,12 +1,10 @@ -# $Id: Makefile.bsd,v 1.2 1994/04/25 06:48:25 paulus Exp $ +# $Id: Makefile.bsd,v 1.5 1996/10/08 04:38:08 paulus Exp $ PROG= pppstats SRCS= pppstats.c +CFLAGS+=-I.. -D_BITYPES MAN8= pppstats.8 - -LDADD= -lutil -lkvm -BINMODE=2555 -BINGRP= kmem +MAN= pppstats.cat8 BINDIR= /usr/sbin .include <bsd.prog.mk> diff --git a/usr.sbin/pppstats/pppstats.8 b/usr.sbin/pppstats/pppstats.8 index b305740..d7f89f7 100644 --- a/usr.sbin/pppstats/pppstats.8 +++ b/usr.sbin/pppstats/pppstats.8 @@ -1,131 +1,217 @@ -.\" 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 +.\" @(#) $Id: pppstats.8,v 1.3 1996/07/01 01:22:35 paulus Exp $ +.TH PPPSTATS 8 "26 June 1995" .SH NAME -pppstats \- report Point to Point Protocol statistics +pppstats \- print PPP statistics .SH SYNOPSIS -.nf -.ft B -pppstats [ \-i interval ] [ \-v ] [ unit ] [ system ] [ core ] -.ft R -.fi +.B pppstats +[ +.B -a +] [ +.B -v +] [ +.B -r +] [ +.B -z +] [ +.B -c +.I <count> +] [ +.B -w +.I <secs> +] [ +.I interface +] +.ti 12 .SH DESCRIPTION -.I Pppstats -reports certain kernel statistics kept about Point to Point -Protocol traffic. +The +.B pppstats +utility reports PPP-related statistics at regular intervals for the +specified PPP interface. If the interface is unspecified, it will +default to ppp0. +The display is split horizontally +into input and output sections containing columns of statistics +describing the properties and volume of packets received and +transmitted by the interface. .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. +.B -a +Display absolute values rather than deltas. With this option, all +reports show statistics for the time since the link was initiated. +Without this option, the second and subsequent reports show statistics +for the time since the last report. +.TP +.B -c \fIcount +Repeat the display +.I count +times. If this option is not specified, the default repeat count is 1 +if the +.B -w +option is not specified, otherwise infinity. +.TP +.B -r +Display additional statistics summarizing the compression ratio +achieved by the packet compression algorithm in use. +.TP +.B -v +Display additional statistics relating to the performance of the Van +Jacobson TCP header compression algorithm. +.TP +.B -w \fIwait +Pause +.I wait +seconds between each display. If this option is not specified, the +default interval is 5 seconds. +.TP +.B -z +Instead of the standard display, show statistics indicating the +performance of the packet compression algorithm in use. .PP -By default, -.I pppstats -displays the following information: +The following fields are printed on the input side when the +.B -z +option is not used: +.TP +.B IN +The total number of bytes received by this interface. +.TP +.B PACK +The total number of packets received by this interface. +.TP +.B VJCOMP +The number of header-compressed TCP packets received by this interface. +.TP +.B VJUNC +The number of header-uncompressed TCP packets received by this +interface. Not reported when the +.B -r +option is specified. +.TP +.B VJERR +The number of corrupted or bogus header-compressed TCP packets +received by this interface. Not reported when the +.B -r +option is specified. +.TP +.B VJTOSS +The number of VJ header-compressed TCP packets dropped on reception by +this interface because of preceding errors. Only reported when the +.B -v +option is specified. +.TP +.B NON-VJ +The total number of non-TCP packets received by this interface. Only +reported when the +.B -v +option is specified. +.TP +.B RATIO +The compression ratio achieved for received packets by the +packet compression scheme in use, defined as the uncompressed size +divided by the compressed size. +Only reported when the +.B -r +option is specified. +.TP +.B UBYTE +The total number of bytes received, after decompression of compressed +packets. Only reported when the +.B -r +option is specified. .PP +The following fields are printed on the output side: .TP -in -bytes received +.B OUT +The total number of bytes transmitted from this interface. .TP -out -bytes sent +.B PACK +The total number of packets transmitted from this interface. .TP -pack -packets received or sent +.B VJCOMP +The number of TCP packets transmitted from this interface with +VJ-compressed TCP headers. .TP -comp -compressed packets received or sent +.B VJUNC +The number of TCP packets transmitted from this interface with +VJ-uncompressed TCP headers. +Not reported when the +.B -r +option is specified. .TP -uncomp -uncompressed packets received or sent +.B NON-VJ +The total number of non-TCP packets transmitted from this interface. +Not reported when the +.B -r +option is specified. .TP -err -input or output errors +.B VJSRCH +The number of searches for the cached header entry for a VJ header +compressed TCP packet. Only reported when the +.B -v +option is specified. +.TP +.B VJMISS +The number of failed searches for the cached header entry for a +VJ header compressed TCP packet. Only reported when the +.B -v +option is specified. +.TP +.B RATIO +The compression ratio achieved for transmitted packets by the +packet compression scheme in use, defined as the size +before compression divided by the compressed size. +Only reported when the +.B -r +option is specified. +.TP +.B UBYTE +The total number of bytes to be transmitted, before packet compression +is applied. Only reported when the +.B -r +option is specified. +.PP +When the +.B -z +option is specified, +.Nm pppstats +instead displays the following fields, relating to the packet +compression algorithm currently in use. If packet compression is not +in use, these fields will all display zeroes. The fields displayed on +the input side are: +.TP +.B COMPRESSED BYTE +The number of bytes of compressed packets received. +.TP +.B COMPRESSED PACK +The number of compressed packets received. +.TP +.B INCOMPRESSIBLE BYTE +The number of bytes of incompressible packets (that is, those which +were transmitted in uncompressed form) received. +.TP +.B INCOMPRESSIBLE PACK +The number of incompressible packets received. +.TP +.B COMP RATIO +The recent compression ratio for incoming packets, defined as the +uncompressed size divided by the compressed size (including both +compressible and incompressible packets). .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 +The fields displayed on the output side are: +.TP +.B COMPRESSED BYTE +The number of bytes of compressed packets transmitted. +.TP +.B COMPRESSED PACK +The number of compressed packets transmitted. +.TP +.B INCOMPRESSIBLE BYTE +The number of bytes of incompressible packets transmitted (that is, +those which were transmitted in uncompressed form). +.TP +.B INCOMPRESSIBLE PACK +The number of incompressible packets transmitted. +.TP +.B COMP RATIO +The recent compression ratio for outgoing packets. .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 - +pppd(8) diff --git a/usr.sbin/pppstats/pppstats.c b/usr.sbin/pppstats/pppstats.c index cabaced..781e5b2 100644 --- a/usr.sbin/pppstats/pppstats.c +++ b/usr.sbin/pppstats/pppstats.c @@ -1,10 +1,19 @@ /* * print PPP statistics: - * pppstats [-i interval] [-v] [interface] [system] [core] + * pppstats [-a|-d] [-v|-r|-z] [-c count] [-w wait] [interface] * + * -a Show absolute values rather than deltas + * -d Show data rate (kB/s) rather than bytes + * -v Show more stats for VJ TCP header compression + * -r Show compression ratio + * -z Show compression statistics instead of default display + * + * History: + * perkins@cps.msu.edu: Added compression statistics and alternate + * display. 11/94 * Brad Parker (brad@cayman.com) 6/92 * - * from the original "slstats" by Van Jaconson + * from the original "slstats" by Van Jacobson * * Copyright (c) 1989 Regents of the University of California. * All rights reserved. @@ -20,366 +29,494 @@ * 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 $"; +static char rcsid[] = "$Id: pppstats.c,v 1.19 1997/04/30 06:00:27 paulus Exp $"; #endif +#include <stdio.h> +#include <stddef.h> +#include <stdlib.h> +#include <string.h> #include <ctype.h> #include <errno.h> -#include <nlist.h> -#include <stdio.h> -#include <limits.h> #include <signal.h> +#include <fcntl.h> +#include <unistd.h> #include <sys/param.h> -#include <sys/mbuf.h> #include <sys/types.h> -#include <sys/socket.h> -#include <sys/file.h> -#include <net/if.h> -#include <netinet/in.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> -#include <netinet/ip_var.h> - -#define VJC 1 -#include <net/slcompress.h> +#include <sys/ioctl.h> +#include <net/ppp_defs.h> #ifndef STREAMS +#include <sys/socket.h> /* *BSD, Linux, NeXT, Ultrix etc. */ +#include <net/if.h> +#ifndef _linux_ +#include <net/if_ppp.h> +#else #include <net/if_ppp.h> #endif -#ifdef STREAMS -#define PPP_STATS 1 /* should be defined iff it is in ppp_if.c */ -#include <sys/stream.h> -#include <net/ppp_str.h> -#endif - -#ifdef BSD4_4 -#define KVMLIB -#endif +#else /* STREAMS */ +#include <sys/stropts.h> /* SVR4, Solaris 2, SunOS 4, OSF/1, etc. */ +#include <net/pppio.h> -#ifndef KVMLIB +#endif /* STREAMS */ -#include <machine/pte.h> -#ifdef ultrix -#include <machine/cpu.h> +int vflag, rflag, zflag; /* select type of display */ +int aflag; /* print absolute values, not deltas */ +int dflag; /* print data rates, not bytes */ +int interval, count; +int infinite; +int unit; +int s; /* socket or /dev/ppp file descriptor */ +int signalled; /* set if alarm goes off "early" */ +char *progname; +char *interface; + +#if defined(SUNOS4) || defined(ULTRIX) || defined(NeXT) +extern int optind; +extern char *optarg; #endif -struct pte *Sysmap; -int kmem; -char *kmemf = "/dev/kmem"; -extern off_t lseek(); +static void usage __P((void)); +static void catchalarm __P((int)); +static void get_ppp_stats __P((struct ppp_stats *)); +static void get_ppp_cstats __P((struct ppp_comp_stats *)); +static void intpr __P((void)); -#else /* KVMLIB */ +int main __P((int, char *argv[])); -char *kmemf; +static void +usage() +{ + fprintf(stderr, "Usage: %s [-a|-d] [-v|-r|-z] [-c count] [-w wait] [interface]\n", + progname); + exit(1); +} -#if defined(sun) || defined(__FreeBSD__) -#include <kvm.h> -kvm_t *kd; -#define KDARG kd, +/* + * Called if an interval expires before intpr has completed a loop. + * Sets a flag to not wait for the alarm. + */ +static void +catchalarm(arg) + int arg; +{ + signalled = 1; +} -#else /* sun */ -#define KDARG -#endif /* sun */ -#endif /* KVMLIB */ +#ifndef STREAMS +static void +get_ppp_stats(curp) + struct ppp_stats *curp; +{ + struct ifpppstatsreq req; -#ifdef STREAMS -struct nlist nl[] = { -#define N_SOFTC 0 - { "_pii" }, - "", -}; -#else -struct nlist nl[] = { -#define N_SOFTC 0 - { "_ppp_softc" }, - "", -}; -#endif + memset (&req, 0, sizeof (req)); -#ifndef BSD4_4 -char *system = "/vmunix"; -#else -#include <paths.h> -#if defined(__FreeBSD__) - /* _PATH_UNIX is defined as "Do not use _PATH_UNIX" */ -char *system = NULL; -#else -char *system = _PATH_UNIX; +#ifdef _linux_ + req.stats_ptr = (caddr_t) &req.stats; +#undef ifr_name +#define ifr_name ifr__name #endif -#endif - -int kflag; -int vflag; -unsigned interval = 5; -int unit; -extern char *malloc(); + strncpy(req.ifr_name, interface, sizeof(req.ifr_name)); + if (ioctl(s, SIOCGPPPSTATS, &req) < 0) { + fprintf(stderr, "%s: ", progname); + if (errno == ENOTTY) + fprintf(stderr, "kernel support missing\n"); + else + perror("couldn't get PPP statistics"); + exit(1); + } + *curp = req.stats; +} -main(argc, argv) - int argc; - char *argv[]; +static void +get_ppp_cstats(csp) + struct ppp_comp_stats *csp; { + struct ifpppcstatsreq creq; - 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); - } + memset (&creq, 0, sizeof (creq)); + +#ifdef _linux_ + creq.stats_ptr = (caddr_t) &creq.stats; +#undef ifr_name +#define ifr_name ifr__name #endif - if (kvm_nlist(KDARG nl)) { - fprintf(stderr, "pppstats: can't find symbols in nlist\n"); + strncpy(creq.ifr_name, interface, sizeof(creq.ifr_name)); + if (ioctl(s, SIOCGPPPCSTATS, &creq) < 0) { + fprintf(stderr, "%s: ", progname); + if (errno == ENOTTY) { + fprintf(stderr, "no kernel compression support\n"); + if (zflag) + exit(1); + rflag = 0; + } else { + perror("couldn't get PPP compression stats"); exit(1); } + } + +#ifdef _linux_ + if (creq.stats.c.bytes_out == 0) + creq.stats.c.ratio = 0.0; + else + creq.stats.c.ratio = (double) creq.stats.c.in_count / + (double) creq.stats.c.bytes_out; + + if (creq.stats.d.bytes_out == 0) + creq.stats.d.ratio = 0.0; + else + creq.stats.d.ratio = (double) creq.stats.d.in_count / + (double) creq.stats.d.bytes_out; #endif - intpr(); - exit(0); + + *csp = creq.stats; } -#ifndef KVMLIB -/* - * Seek into the kernel for a value. - */ -off_t -klseek(fd, base, off) - int fd, off; - off_t base; +#else /* STREAMS */ + +int +strioctl(fd, cmd, ptr, ilen, olen) + int fd, cmd, ilen, olen; + char *ptr; { - 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)); + struct strioctl str; + + str.ic_cmd = cmd; + str.ic_timout = 0; + str.ic_len = ilen; + str.ic_dp = ptr; + if (ioctl(fd, I_STR, &str) == -1) + return -1; + if (str.ic_len != olen) + fprintf(stderr, "strioctl: expected %d bytes, got %d for cmd %x\n", + olen, str.ic_len, cmd); + return 0; } -#endif -usage() +static void +get_ppp_stats(curp) + struct ppp_stats *curp; { - fprintf(stderr,"usage: pppstats [-i interval] [-v] [unit] [system] [core]\n"); + if (strioctl(s, PPPIO_GETSTAT, curp, 0, sizeof(*curp)) < 0) { + fprintf(stderr, "%s: ", progname); + if (errno == EINVAL) + fprintf(stderr, "kernel support missing\n"); + else + perror("couldn't get PPP statistics"); exit(1); + } } -u_char signalled; /* set if alarm goes off "early" */ +static void +get_ppp_cstats(csp) + struct ppp_comp_stats *csp; +{ + if (strioctl(s, PPPIO_GETCSTAT, csp, 0, sizeof(*csp)) < 0) { + fprintf(stderr, "%s: ", progname); + if (errno == ENOTTY) { + fprintf(stderr, "no kernel compression support\n"); + if (zflag) + exit(1); + rflag = 0; + } else { + perror("couldn't get PPP compression statistics"); + exit(1); + } + } +} -#define V(offset) ((line % 20)? sc->offset - osc->offset : sc->offset) +#endif /* STREAMS */ -#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 +#define MAX0(a) ((int)(a) > 0? (a): 0) +#define V(offset) MAX0(cur.offset - old.offset) +#define W(offset) MAX0(ccs.offset - ocs.offset) + +#define RATIO(c, i, u) ((c) == 0? 1.0: (u) / ((double)(c) + (i))) +#define CRATE(x) RATIO(W(x.comp_bytes), W(x.inc_bytes), W(x.unc_bytes)) + +#define KBPS(n) ((n) / (interval * 1000.0)) /* * 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. + * First line printed is cumulative. */ +static void 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)); + register int line = 0; + sigset_t oldmask, mask; + char *bunit; + int ratef = 0; + struct ppp_stats cur, old; + struct ppp_comp_stats ccs, ocs; + + memset(&old, 0, sizeof(old)); + memset(&ocs, 0, sizeof(ocs)); + + while (1) { + get_ppp_stats(&cur); + if (zflag || rflag) + get_ppp_cstats(&ccs); + + (void)signal(SIGALRM, catchalarm); + signalled = 0; + (void)alarm(interval); + + if ((line % 20) == 0) { + if (zflag) { + printf("IN: COMPRESSED INCOMPRESSIBLE COMP | "); + printf("OUT: COMPRESSED INCOMPRESSIBLE COMP\n"); + bunit = dflag? "KB/S": "BYTE"; + printf(" %s PACK %s PACK RATIO | ", bunit, bunit); + printf(" %s PACK %s PACK RATIO", bunit, bunit); + } else { + printf("%8.8s %6.6s %6.6s", + "IN", "PACK", "VJCOMP"); + + if (!rflag) + printf(" %6.6s %6.6s", "VJUNC", "VJERR"); + if (vflag) + printf(" %6.6s %6.6s", "VJTOSS", "NON-VJ"); + if (rflag) + printf(" %6.6s %6.6s", "RATIO", "UBYTE"); + printf(" | %8.8s %6.6s %6.6s", + "OUT", "PACK", "VJCOMP"); + + if (!rflag) + printf(" %6.6s %6.6s", "VJUNC", "NON-VJ"); + if (vflag) + printf(" %6.6s %6.6s", "VJSRCH", "VJMISS"); + if (rflag) + printf(" %6.6s %6.6s", "RATIO", "UBYTE"); + } + putchar('\n'); + } - while (1) { -#ifndef KVMLIB - if (klseek(kmem, (off_t)nl[N_SOFTC].n_value, 0) == -1) { - perror("kmem seek"); - exit(1); + if (zflag) { + if (ratef) { + printf("%8.3f %6u %8.3f %6u %6.2f", + KBPS(W(d.comp_bytes)), + W(d.comp_packets), + KBPS(W(d.inc_bytes)), + W(d.inc_packets), + ccs.d.ratio * 256.0); + printf(" | %8.3f %6u %8.3f %6u %6.2f", + KBPS(W(c.comp_bytes)), + W(c.comp_packets), + KBPS(W(c.inc_bytes)), + W(c.inc_packets), + ccs.c.ratio * 256.0); + } else { + printf("%8u %6u %8u %6u %6.2f", + W(d.comp_bytes), + W(d.comp_packets), + W(d.inc_bytes), + W(d.inc_packets), + ccs.d.ratio * 256.0); + printf(" | %8u %6u %8u %6u %6.2f", + W(c.comp_bytes), + W(c.comp_packets), + W(c.inc_bytes), + W(c.inc_packets), + ccs.c.ratio * 256.0); } - if (read(kmem, (char *)sc, sizeof(STRUCT)) <= 0) { - perror("kmem read"); - exit(1); + + } else { + if (ratef) + printf("%8.3f", KBPS(V(p.ppp_ibytes))); + else + printf("%8u", V(p.ppp_ibytes)); + printf(" %6u %6u", + V(p.ppp_ipackets), + V(vj.vjs_compressedin)); + if (!rflag) + printf(" %6u %6u", + V(vj.vjs_uncompressedin), + V(vj.vjs_errorin)); + if (vflag) + printf(" %6u %6u", + V(vj.vjs_tossed), + V(p.ppp_ipackets) - V(vj.vjs_compressedin) + - V(vj.vjs_uncompressedin) - V(vj.vjs_errorin)); + if (rflag) { + printf(" %6.2f ", CRATE(d)); + if (ratef) + printf("%6.2f", KBPS(W(d.unc_bytes))); + else + printf("%6u", W(d.unc_bytes)); } -#else - if (kvm_read(KDARG nl[N_SOFTC].n_value, sc, - sizeof(STRUCT)) != sizeof(STRUCT)) { - perror("kvm_read"); - exit(1); + if (ratef) + printf(" | %8.3f", KBPS(V(p.ppp_obytes))); + else + printf(" | %8u", V(p.ppp_obytes)); + printf(" %6u %6u", + V(p.ppp_opackets), + V(vj.vjs_compressed)); + if (!rflag) + printf(" %6u %6u", + V(vj.vjs_packets) - V(vj.vjs_compressed), + V(p.ppp_opackets) - V(vj.vjs_packets)); + if (vflag) + printf(" %6u %6u", + V(vj.vjs_searches), + V(vj.vjs_misses)); + if (rflag) { + printf(" %6.2f ", CRATE(c)); + if (ratef) + printf("%6.2f", KBPS(W(c.unc_bytes))); + else + printf("%6u", W(c.unc_bytes)); } -#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'); - } + putchar('\n'); + fflush(stdout); + line++; - 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 + count--; + if (!infinite && !count) + break; + + sigemptyset(&mask); + sigaddset(&mask, SIGALRM); + sigprocmask(SIG_BLOCK, &mask, &oldmask); + if (!signalled) { + sigemptyset(&mask); + sigsuspend(&mask); + } + sigprocmask(SIG_SETMASK, &oldmask, NULL); + signalled = 0; + (void)alarm(interval); + + if (!aflag) { + old = cur; + ocs = ccs; + ratef = dflag; + } + } +} + +int +main(argc, argv) + int argc; + char *argv[]; +{ + int c; +#ifdef STREAMS + char *dev; #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 + + interface = "ppp0"; + if ((progname = strrchr(argv[0], '/')) == NULL) + progname = argv[0]; + else + ++progname; + + while ((c = getopt(argc, argv, "advrzc:w:")) != -1) { + switch (c) { + case 'a': + ++aflag; + break; + case 'd': + ++dflag; + break; + case 'v': + ++vflag; + break; + case 'r': + ++rflag; + break; + case 'z': + ++zflag; + break; + case 'c': + count = atoi(optarg); + if (count <= 0) + usage(); + break; + case 'w': + interval = atoi(optarg); + if (interval <= 0) + usage(); + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (!interval && count) + interval = 5; + if (interval && !count) + infinite = 1; + if (!interval && !count) + count = 1; + if (aflag) + dflag = 0; + + if (argc > 1) + usage(); + if (argc > 0) + interface = argv[0]; + + if (sscanf(interface, "ppp%d", &unit) != 1) { + fprintf(stderr, "%s: invalid interface '%s' specified\n", + progname, interface); + } + #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)); + { + struct ifreq ifr; - putchar('\n'); - fflush(stdout); - line++; + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + fprintf(stderr, "%s: ", progname); + perror("couldn't create IP socket"); + exit(1); + } - oldmask = sigblock(sigmask(SIGALRM)); - if (! signalled) { - sigpause(0); - } - sigsetmask(oldmask); - signalled = 0; - (void)alarm(interval); - bcopy((char *)sc, (char *)osc, sizeof(STRUCT)); +#ifdef _linux_ +#undef ifr_name +#define ifr_name ifr_ifrn.ifrn_name +#endif + strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); + if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { + fprintf(stderr, "%s: nonexistent interface '%s' specified\n", + progname, interface); + exit(1); } -} + } -/* - * 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; +#else /* STREAMS */ +#ifdef __osf__ + dev = "/dev/streams/ppp"; +#else + dev = "/dev/ppp"; +#endif + if ((s = open(dev, O_RDONLY)) < 0) { + fprintf(stderr, "%s: couldn't open ", progname); + perror(dev); + exit(1); + } + if (strioctl(s, PPPIO_ATTACH, &unit, sizeof(int), 0) < 0) { + fprintf(stderr, "%s: ppp%d is not available\n", progname, unit); + exit(1); + } + +#endif /* STREAMS */ + + intpr(); + exit(0); } |