X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppstats%2Fpppstats.c;h=92ebc2a4e007284f2a050f5b007cf5ac378a7dd8;hp=0e988a67b6a78b78ade901138c65734b16fee54c;hb=HEAD;hpb=a39959c575d0025ba4f569d4d3643fd56946eaf9 diff --git a/pppstats/pppstats.c b/pppstats/pppstats.c index 0e988a6..22d1154 100644 --- a/pppstats/pppstats.c +++ b/pppstats/pppstats.c @@ -1,10 +1,11 @@ /* * print PPP statistics: - * pppstats [-a] [-v] [-r] [-z] [-c count] [-w wait] [interface] + * pppstats [-a|-d] [-v|-r|-z] [-c count] [-w wait] [interface] * * -a Show absolute values rather than deltas - * -v Verbose mode for default display - * -r Show compression ratio in default display + * -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: @@ -30,8 +31,12 @@ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ +#ifndef __STDC__ +#define const +#endif + #ifndef lint -static char rcsid[] = "$Id: pppstats.c,v 1.13 1996/07/01 01:22:36 paulus Exp $"; +static const char rcsid[] = "$Id: pppstats.c,v 1.29 2002/10/27 12:56:26 fcusack Exp $"; #endif #include @@ -46,33 +51,73 @@ static char rcsid[] = "$Id: pppstats.c,v 1.13 1996/07/01 01:22:36 paulus Exp $"; #include #include #include -#include #ifndef STREAMS +#if defined(__linux__) && defined(__powerpc__) \ + && (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0) +/* kludge alert! */ +#undef __GLIBC__ +#endif #include /* *BSD, Linux, NeXT, Ultrix etc. */ +#ifndef __linux__ +#include +#include +#else +/* Linux */ +#if __GLIBC__ >= 2 +#include /* glibc 2 conflicts with linux/types.h */ #include -#include +#else +#include +#include +#endif +#include +#include + +#endif /* __linux__ */ #else /* STREAMS */ #include /* SVR4, Solaris 2, SunOS 4, OSF/1, etc. */ +#include #include #endif /* STREAMS */ 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; -void -usage() +#if defined(SUNOS4) || defined(ULTRIX) || defined(NeXT) +extern int optind; +extern char *optarg; +#endif + +/* + * If PPP_DRV_NAME is not defined, use the legacy "ppp" as the + * device name. + */ +#if !defined(PPP_DRV_NAME) +#define PPP_DRV_NAME "ppp" +#endif /* !defined(PPP_DRV_NAME) */ + +static void usage(void); +static void catchalarm(int); +static void get_ppp_stats(struct ppp_stats *); +static void get_ppp_cstats(struct ppp_comp_stats *); +static void intpr(void); + +int main(int, char *argv[]); + +static void +usage(void) { - fprintf(stderr, "Usage: %s [-v|-r|-z] [-a] [-c count] [-w wait] [interface]\n", + fprintf(stderr, "Usage: %s [-a|-d] [-v|-r|-z] [-c count] [-w wait] [interface]\n", progname); exit(1); } @@ -81,30 +126,25 @@ usage() * Called if an interval expires before intpr has completed a loop. * Sets a flag to not wait for the alarm. */ -void -catchalarm(arg) - int arg; +static void +catchalarm(int arg) { signalled = 1; } #ifndef STREAMS -void -get_ppp_stats(curp) - struct ppp_stats *curp; +static void +get_ppp_stats(struct ppp_stats *curp) { - struct ifpppstatsreq req; + struct ifreq req; memset (&req, 0, sizeof (req)); -#ifdef _linux_ - req.stats_ptr = (caddr_t) &req.stats; -#undef ifr_name -#define ifr_name ifr__name -#endif + req.ifr_data = (caddr_t) curp; - strncpy(req.ifr_name, interface, sizeof(req.ifr_name)); + strncpy(req.ifr_name, interface, IFNAMSIZ); + req.ifr_name[IFNAMSIZ - 1] = 0; if (ioctl(s, SIOCGPPPSTATS, &req) < 0) { fprintf(stderr, "%s: ", progname); if (errno == ENOTTY) @@ -113,25 +153,21 @@ get_ppp_stats(curp) perror("couldn't get PPP statistics"); exit(1); } - *curp = req.stats; } -void -get_ppp_cstats(csp) - struct ppp_comp_stats *csp; +static void +get_ppp_cstats(struct ppp_comp_stats *csp) { - struct ifpppcstatsreq creq; + struct ifreq req; + struct ppp_comp_stats stats; - memset (&creq, 0, sizeof (creq)); + memset (&req, 0, sizeof (req)); -#ifdef _linux_ - creq.stats_ptr = (caddr_t) &creq.stats; -#undef ifr_name -#define ifr_name ifr__name -#endif + req.ifr_data = (caddr_t) &stats; - strncpy(creq.ifr_name, interface, sizeof(creq.ifr_name)); - if (ioctl(s, SIOCGPPPCSTATS, &creq) < 0) { + strncpy(req.ifr_name, interface, IFNAMSIZ); + req.ifr_name[IFNAMSIZ - 1] = 0; + if (ioctl(s, SIOCGPPPCSTATS, &req) < 0) { fprintf(stderr, "%s: ", progname); if (errno == ENOTTY) { fprintf(stderr, "no kernel compression support\n"); @@ -144,29 +180,33 @@ get_ppp_cstats(csp) } } -#ifdef _linux_ - if (creq.stats.c.bytes_out == 0) - creq.stats.c.ratio = 0.0; +#ifdef __linux__ + if (stats.c.bytes_out == 0) { + stats.c.bytes_out = stats.c.comp_bytes + stats.c.inc_bytes; + stats.c.in_count = stats.c.unc_bytes; + } + if (stats.c.bytes_out == 0) + stats.c.ratio = 0.0; else - creq.stats.c.ratio = (double) creq.stats.c.in_count / - (double) creq.stats.c.bytes_out; + stats.c.ratio = 256.0 * stats.c.in_count / stats.c.bytes_out; - if (creq.stats.d.bytes_out == 0) - creq.stats.d.ratio = 0.0; + if (stats.d.bytes_out == 0) { + stats.d.bytes_out = stats.d.comp_bytes + stats.d.inc_bytes; + stats.d.in_count = stats.d.unc_bytes; + } + if (stats.d.bytes_out == 0) + stats.d.ratio = 0.0; else - creq.stats.d.ratio = (double) creq.stats.d.in_count / - (double) creq.stats.d.bytes_out; + stats.d.ratio = 256.0 * stats.d.in_count / stats.d.bytes_out; #endif - *csp = creq.stats; + *csp = stats; } #else /* STREAMS */ int -strioctl(fd, cmd, ptr, ilen, olen) - int fd, cmd, ilen, olen; - char *ptr; +strioctl(int fd, int cmd, char *ptr, int ilen, int olen) { struct strioctl str; @@ -182,11 +222,10 @@ strioctl(fd, cmd, ptr, ilen, olen) return 0; } -void -get_ppp_stats(curp) - struct ppp_stats *curp; +static void +get_ppp_stats(struct ppp_stats *curp) { - if (strioctl(s, PPPIO_GETSTAT, curp, 0, sizeof(*curp)) < 0) { + if (strioctl(s, PPPIO_GETSTAT, (char*) curp, 0, sizeof(*curp)) < 0) { fprintf(stderr, "%s: ", progname); if (errno == EINVAL) fprintf(stderr, "kernel support missing\n"); @@ -196,11 +235,10 @@ get_ppp_stats(curp) } } -void -get_ppp_cstats(csp) - struct ppp_comp_stats *csp; +static void +get_ppp_cstats(struct ppp_comp_stats *csp) { - if (strioctl(s, PPPIO_GETCSTAT, csp, 0, sizeof(*csp)) < 0) { + if (strioctl(s, PPPIO_GETCSTAT, (char*) csp, 0, sizeof(*csp)) < 0) { fprintf(stderr, "%s: ", progname); if (errno == ENOTTY) { fprintf(stderr, "no kernel compression support\n"); @@ -223,17 +261,21 @@ get_ppp_cstats(csp) #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 is cumulative. */ -void -intpr() +static void +intpr(void) { register int line = 0; sigset_t oldmask, mask; + char *bunit; + int ratef = 0; struct ppp_stats cur, old; struct ppp_comp_stats ccs, ocs; @@ -253,8 +295,9 @@ intpr() if (zflag) { printf("IN: COMPRESSED INCOMPRESSIBLE COMP | "); printf("OUT: COMPRESSED INCOMPRESSIBLE COMP\n"); - printf(" BYTE PACK BYTE PACK RATIO | "); - printf(" BYTE PACK BYTE PACK RATIO"); + 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"); @@ -279,24 +322,40 @@ intpr() } if (zflag) { - 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 (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); + } } else { - - printf("%8u %6u %6u", - V(p.ppp_ibytes), + 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) @@ -308,12 +367,18 @@ intpr() 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 %6u", - CRATE(d), - W(d.unc_bytes)); - printf(" | %8u %6u %6u", - V(p.ppp_obytes), + if (rflag) { + printf(" %6.2f ", CRATE(d)); + if (ratef) + printf("%6.2f", KBPS(W(d.unc_bytes))); + else + printf("%6u", W(d.unc_bytes)); + } + 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) @@ -324,11 +389,13 @@ intpr() printf(" %6u %6u", V(vj.vjs_searches), V(vj.vjs_misses)); - - if (rflag) - printf(" %6.2f %6u", - CRATE(c), - W(c.unc_bytes)); + if (rflag) { + printf(" %6.2f ", CRATE(c)); + if (ratef) + printf("%6.2f", KBPS(W(c.unc_bytes))); + else + printf("%6u", W(c.unc_bytes)); + } } @@ -354,28 +421,34 @@ intpr() if (!aflag) { old = cur; ocs = ccs; + ratef = dflag; } } } int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { int c; +#ifdef STREAMS + int unit; + char *dev; +#endif - interface = "ppp0"; + interface = PPP_DRV_NAME "0"; if ((progname = strrchr(argv[0], '/')) == NULL) progname = argv[0]; else ++progname; - while ((c = getopt(argc, argv, "avrzc:w:")) != -1) { + while ((c = getopt(argc, argv, "advrzc:w:")) != -1) { switch (c) { case 'a': ++aflag; break; + case 'd': + ++dflag; + break; case 'v': ++vflag; break; @@ -408,17 +481,14 @@ main(argc, argv) 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 { struct ifreq ifr; @@ -429,7 +499,13 @@ main(argc, argv) perror("couldn't create IP socket"); exit(1); } - strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name)); + +#ifdef __linux__ +#undef ifr_name +#define ifr_name ifr_ifrn.ifrn_name +#endif + strncpy(ifr.ifr_name, interface, IFNAMSIZ); + ifr.ifr_name[IFNAMSIZ - 1] = 0; if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { fprintf(stderr, "%s: nonexistent interface '%s' specified\n", progname, interface); @@ -438,12 +514,22 @@ main(argc, argv) } #else /* STREAMS */ - if ((s = open("/dev/ppp", O_RDONLY)) < 0) { - fprintf(stderr, "%s: ", progname); - perror("couldn't open /dev/ppp"); + if (sscanf(interface, PPP_DRV_NAME "%d", &unit) != 1) { + fprintf(stderr, "%s: invalid interface '%s' specified\n", + progname, interface); + } + +#ifdef __osf__ + dev = "/dev/streams/ppp"; +#else + dev = "/dev/" PPP_DRV_NAME; +#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) { + if (strioctl(s, PPPIO_ATTACH, (char*) &unit, sizeof(int), 0) < 0) { fprintf(stderr, "%s: ppp%d is not available\n", progname, unit); exit(1); }