pppstats from ppp-2.1.2

This commit is contained in:
Lars Fredriksen 1994-11-12 06:07:15 +00:00
parent 9b1aec4804
commit 1b4d00dd27
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/pppd/dist/; revision=4381
3 changed files with 528 additions and 0 deletions

View File

@ -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 <bsd.prog.mk>

View File

@ -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

View File

@ -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 <ctype.h>
#include <errno.h>
#include <nlist.h>
#include <stdio.h>
#include <limits.h>
#include <signal.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>
#ifndef STREAMS
#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
#ifndef KVMLIB
#include <machine/pte.h>
#ifdef ultrix
#include <machine/cpu.h>
#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.h>
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 <paths.h>
#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;
}