]> git.ozlabs.org Git - ppp.git/blobdiff - pppstats/pppstats.c
use uint32 for ACCM and other 32-bit quantities
[ppp.git] / pppstats / pppstats.c
index 97239de90db642369352582f0ef56ab5ac608c17..8efe48147cf4313ee845d8ed7de941e86be8d6b1 100644 (file)
  */
 
 #ifndef lint
-static char rcsid[] = "$Id: pppstats.c,v 1.2 1993/12/15 05:00:47 paulus Exp $";
+static char rcsid[] = "$Id: pppstats.c,v 1.4 1994/06/08 00:38:49 paulus Exp $";
 #endif
 
-#include <sys/param.h>
-#include <sys/mbuf.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/file.h>
-#ifdef sun
-#include <kvm.h>
-#endif
 #include <ctype.h>
 #include <errno.h>
 #include <nlist.h>
 #include <stdio.h>
 #include <signal.h>
-#ifndef sun
-#include <paths.h>
-#endif
-
+#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>
@@ -54,13 +47,48 @@ static char rcsid[] = "$Id: pppstats.c,v 1.2 1993/12/15 05:00:47 paulus Exp $";
 
 #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;
+
+#ifdef sun
+#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
@@ -75,17 +103,13 @@ struct nlist nl[] = {
 };
 #endif
 
-#ifdef sun
-kvm_t  *kd;
-#endif
-
-#ifdef sun
+#ifndef BSD4_4
 char   *system = "/vmunix";
 #else
+#include <paths.h>
 char   *system = _PATH_UNIX;
 #endif
 
-char   *kmemf;
 int    kflag;
 int    vflag;
 unsigned interval = 5;
@@ -131,32 +155,78 @@ main(argc, argv)
                        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);
+           perror("kvm_open");
+           exit(1);
        }
 #else
        /* BSD4.3+ */
        if (kvm_openfiles(system, kmemf, (char *)0) == -1) {
-         fprintf(stderr, "kvm_openfiles: %s", kvm_geterr());
-         exit(1);
+           fprintf(stderr, "kvm_openfiles: %s", kvm_geterr());
+           exit(1);
        }
 #endif
 
-#ifdef sun
-       if (kvm_nlist(kd, nl)) {
-#else
-       if (kvm_nlist(nl)) {
-#endif
-         fprintf(stderr, "pppstats: can't find symbols in nlist\n");
-         exit(1);
+       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");
@@ -167,6 +237,16 @@ 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
@@ -183,97 +263,106 @@ intpr()
        void catchalarm();
 #endif
 
-#ifdef STREAMS
-#define STRUCT struct ppp_if_info
-#else
-#define STRUCT struct ppp_softc
-#endif
-
        STRUCT *sc, *osc;
 
-       nl[N_SOFTC].n_value += unit * sizeof(struct ppp_softc);
+       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) {
-#ifdef sun
-               if (kvm_read(kd, nl[N_SOFTC].n_value,
+#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(nl[N_SOFTC].n_value,
+           if (kvm_read(KDARG nl[N_SOFTC].n_value, sc,
+                        sizeof(STRUCT)) != sizeof(STRUCT)) {
+               perror("kvm_read");
+               exit(1);
+           }
 #endif
-                            sc, sizeof(STRUCT)) !=
-                   sizeof(STRUCT))
-                 perror("kvm_read");
-
-               (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');
-               }
 
-#ifdef STREAMS
-#define        COMP    pii_sc_comp
-#define        STATS   pii_ifnet
-#else
-#define        COMP    sc_comp
-#define        STATS   sc_if
-#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",
-#if BSD > 43
-                       V(STATS.if_ibytes),
+           printf("%6d %6d %6d %6d %6d",
+#ifdef BSD4_4
+                  V(STATS.if_ibytes),
+#else
+#ifndef STREAMS
+                  V(sc_bytesrcvd),
 #else
-                       0,
+#ifdef PPP_STATS
+                  V(pii_stats.ppp_ibytes),
+#else
+                  0,
 #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",
-#if BSD > 43
-                       V(STATS.if_obytes),
+#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,
+                  0,
 #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));
+#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));
+           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));
        }
 }