X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppstats%2Fpppstats.c;h=e80b568f3dd2b37bb25820f49b31b01c0031d0fc;hp=8efe48147cf4313ee845d8ed7de941e86be8d6b1;hb=7ff1691466ad589562e84516e29a4a83bab71e1f;hpb=0dfedbf777b7012d6de9ed5a8e496c98b536ac5b;ds=sidebyside diff --git a/pppstats/pppstats.c b/pppstats/pppstats.c index 8efe481..e80b568 100644 --- a/pppstats/pppstats.c +++ b/pppstats/pppstats.c @@ -1,6 +1,6 @@ /* * print PPP statistics: - * pppstats [-i interval] [-v] [interface] [system] [core] + * pppstats [-i interval] [-v] [interface] * * Brad Parker (brad@cayman.com) 6/92 * @@ -26,7 +26,7 @@ */ #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.6 1994/09/21 01:52:58 paulus Exp $"; #endif #include @@ -37,6 +37,7 @@ static char rcsid[] = "$Id: pppstats.c,v 1.4 1994/06/08 00:38:49 paulus Exp $"; #include #include #include +#include #include #include #include @@ -45,8 +46,7 @@ static char rcsid[] = "$Id: pppstats.c,v 1.4 1994/06/08 00:38:49 paulus Exp $"; #include #include -#define VJC 1 -#include +#include #ifndef STREAMS #include @@ -58,194 +58,59 @@ static char rcsid[] = "$Id: pppstats.c,v 1.4 1994/06/08 00:38:49 paulus Exp $"; #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; - -#ifdef sun -#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 -char *system = _PATH_UNIX; -#endif - -int kflag; int vflag; unsigned interval = 5; int unit; +int s; /* socket file descriptor */ +int signalled; /* set if alarm goes off "early" */ extern char *malloc(); +void catchalarm __P((int)); main(argc, argv) - int argc; - char *argv[]; + int argc; + char *argv[]; { - --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("netstat: 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 -#ifdef sun - /* SunOS */ - if ((kd = kvm_open(system, kmemf, (char *)0, O_RDONLY, NULL)) == NULL) { - perror("kvm_open"); - exit(1); + --argc; ++argv; + while (argc > 0) { + if (strcmp(argv[0], "-v") == 0) { + ++vflag; + ++argv, --argc; + continue; } -#else - /* BSD4.3+ */ - if (kvm_openfiles(system, kmemf, (char *)0) == -1) { - fprintf(stderr, "kvm_openfiles: %s", kvm_geterr()); - exit(1); + 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; } -#endif - - if (kvm_nlist(KDARG nl)) { - fprintf(stderr, "pppstats: can't find symbols in nlist\n"); - exit(1); + if (isdigit(argv[0][0])) { + unit = atoi(argv[0]); + if (unit < 0) + usage(); + ++argv, --argc; + continue; } -#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)); + usage(); + } + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + perror("couldn't create IP socket"); + exit(1); + } + intpr(); + exit(0); } -#endif usage() { - fprintf(stderr,"usage: pppstats [-i interval] [-v] [unit] [system] [core]\n"); - exit(1); + fprintf(stderr, "Usage: pppstats [-v] [-i interval] [unit]\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 +#define V(offset) (line % 20? req.stats.offset - osc.offset: req.stats.offset) /* * Print a running summary of interface statistics. @@ -255,115 +120,65 @@ u_char signalled; /* set if alarm goes off "early" */ */ 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'); - } + register int line = 0; + int oldmask; + struct ifpppstatsreq req; + struct ppp_stats osc; + + bzero(&osc, sizeof(osc)); + + sprintf(req.ifr_name, "ppp%d", unit); + while (1) { + if (ioctl(s, SIOCGPPPSTATS, &req) < 0) { + if (errno == ENOTTY) + fprintf(stderr, "pppstats: kernel support missing\n"); + else + perror("ioctl(SIOCGPPPSTATS)"); + exit(1); + } + (void)signal(SIGALRM, catchalarm); + signalled = 0; + (void)alarm(interval); - 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 ((line % 20) == 0) { + printf("%6.6s %6.6s %6.6s %6.6s %6.6s", + "in", "pack", "comp", "uncomp", "err"); 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)); + 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(" %6d %6d", - V(COMP.sls_searches), - V(COMP.sls_misses)); - + printf(" %6.6s %6.6s", "search", "miss"); 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)); + printf("%6d %6d %6d %6d %6d", V(p.ppp_ibytes), + V(p.ppp_ipackets), V(vj.vjs_compressedin), + V(vj.vjs_uncompressedin), V(vj.vjs_errorin)); + if (vflag) + printf(" %6d %6d", V(vj.vjs_tossed), + V(p.ppp_ipackets) - V(vj.vjs_compressedin) - + V(vj.vjs_uncompressedin) - V(vj.vjs_errorin)); + printf(" | %6d %6d %6d %6d %6d", V(p.ppp_obytes), + V(p.ppp_opackets), V(vj.vjs_compressed), + V(vj.vjs_packets) - V(vj.vjs_compressed), + V(p.ppp_opackets) - V(vj.vjs_packets)); + if (vflag) + printf(" %6d %6d", V(vj.vjs_searches), V(vj.vjs_misses)); + + putchar('\n'); + fflush(stdout); + line++; + + oldmask = sigblock(sigmask(SIGALRM)); + if (! signalled) { + sigpause(0); } + sigsetmask(oldmask); + signalled = 0; + (void)alarm(interval); + osc = req.stats; + } } /* @@ -371,7 +186,7 @@ intpr() * Sets a flag to not wait for the alarm. */ void catchalarm(arg) -int arg; + int arg; { - signalled = 1; + signalled = 1; }