To make a version of pppstats for Linux, you need to perform the following steps. 1. Apply the patches in the file Linux.diffs to the files in this directory. patch -p0 #include #include #include #include - #include #include #include #include #include #include - #include #include #include - - #define VJC 1 #include #ifndef STREAMS #include #endif --- 33,71 ---- #include #include #include #include #include #include #include #include #include + + #define VJC 1 + + #ifdef _linux_ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include /* linux base directory passed on -I parameter */ + + struct ifreq ifreq; + int fd; + + #else /* _linux_ */ + + #include #include #include + #include #include #include #ifndef STREAMS #include #endif *************** *** 69,79 **** #include #endif struct pte *Sysmap; int kmem; - char *kmemf = "/dev/kmem"; extern off_t lseek(); #else /* KVMLIB */ char *kmemf; --- 87,96 ---- *************** *** 101,124 **** { "_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; - extern char *malloc(); - main(argc, argv) int argc; char *argv[]; { --argc; ++argv; --- 118,146 ---- { "_ppp_softc" }, "", }; #endif ! extern char *malloc(); ! #endif /* _linux_ */ ! ! #ifdef BSD4_4 #include ! #endif ! ! #ifndef _PATH_UNIX ! #define _PATH_UNIX "/vmunix" #endif + char *kmemf = "/dev/kmem"; + char *system = _PATH_UNIX; + int kflag; int vflag; unsigned interval = 5; int unit; main(argc, argv) int argc; char *argv[]; { --argc; ++argv; *************** *** 153,162 **** --- 175,195 ---- kmemf = *argv++; --argc; kflag++; } } + + #ifdef _linux_ + memset (&ifreq, '\0', sizeof (ifreq)); + sprintf (ifreq.ifr_ifrn.ifrn_name, "ppp%d", unit); + /* Get an internet socket for doing socket ioctls. */ + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + perror("socket(AF_INET,SOCK_DGRAM,0)"); + exit(1); + } + #else /* _linux_ */ + #ifndef KVMLIB if (nlist(system, nl) < 0 || nl[0].n_type == 0) { fprintf(stderr, "%s: no namelist\n", system); exit(1); } *************** *** 179,189 **** (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); --- 212,222 ---- (void)lseek(kmem, off, L_SET); (void)read(kmem, (char *)Sysmap, (int)(nl[N_SYSSIZE].n_value * sizeof(struct pte))); } #endif ! #else /* KVMLIB */ #ifdef sun /* SunOS */ if ((kd = kvm_open(system, kmemf, (char *)0, O_RDONLY, NULL)) == NULL) { perror("kvm_open"); exit(1); *************** *** 192,212 **** /* BSD4.3+ */ if (kvm_openfiles(system, kmemf, (char *)0) == -1) { fprintf(stderr, "kvm_openfiles: %s", kvm_geterr()); 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 --- 225,247 ---- /* BSD4.3+ */ if (kvm_openfiles(system, kmemf, (char *)0) == -1) { fprintf(stderr, "kvm_openfiles: %s", kvm_geterr()); exit(1); } ! #endif /* sun */ if (kvm_nlist(KDARG nl)) { fprintf(stderr, "pppstats: can't find symbols in nlist\n"); exit(1); } ! #endif /* KVMLIB */ ! #endif /* _linux_ */ intpr(); exit(0); } + #ifndef _linux_ #ifndef KVMLIB /* * Seek into the kernel for a value. */ off_t *************** *** 218,254 **** #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. --- 253,369 ---- #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 + #endif /* _linux_ */ usage() { ! fprintf(stderr,"usage: pppstats [-i interval] [-v] [unit]" ! #ifndef _linux_ ! " [system] [core]" ! #endif ! "\n"); exit(1); } u_char signalled; /* set if alarm goes off "early" */ #define V(offset) ((line % 20)? sc->offset - osc->offset : sc->offset) + #ifdef _linux_ + typedef struct __struct + { + struct ppp_stats stats; + struct slcompress slcomp; + } STRUCT; + + #define STATS stats + #define COMP slcomp + + #define RCOMP V(STATS.rcomp) + #define RUNCOMP V(STATS.runcomp) + #define ROTHERS V(STATS.rothers) + #define RPACKETS (RCOMP+RUNCOMP+ROTHERS) + #define RERRORS V(STATS.rerrors) + #define ROVERRUN V(STATS.roverrun) + #define RTOSSED V(STATS.tossed) + #define RERROR (RERRORS+ROVERRUN+RTOSSED) + #define SCOMP V(STATS.scomp) + #define SUNCOMP V(STATS.suncomp) + #define SOTHERS V(STATS.sothers) + #define SPACKETS (SCOMP+SUNCOMP+SOTHERS) + #define SERROR V(STATS.serrors) + + #define stats_ibytes V(STATS.rbytes) + #define stats_ipackets RPACKETS + #define stats_compressedin RCOMP + #define stats_uncompressedin RUNCOMP + #define stats_errorin RERROR + #define stats_tossed RTOSSED + #define stats_ip (RPACKETS-RERROR-ROTHERS) + #define stats_obytes V(STATS.sbytes) + #define stats_opackets SPACKETS + #define stats_compressedout SCOMP + #define stats_uncompressedout SUNCOMP + #define stats_errorout SERROR + #define stats_searches V(COMP.sls_o_searches) + #define stats_misses V(COMP.sls_o_misses) + + #else /* _linux_ */ + + #define stats_ipackets V(STATS.if_ipackets) + #define stats_compressedin V(COMP.sls_compressedin) + #define stats_uncompressedin V(COMP.sls_uncompressedin) + #define stats_errorin V(COMP.sls_errorin) + #define stats_tossed V(COMP.sls_tossed) + #define stats_ip V(STATS.if_ipackets) - \ + V(COMP.sls_compressedin) - \ + V(COMP.sls_uncompressedin) - \ + V(COMP.sls_errorin) + #define stats_opackets V(STATS.if_opackets) + #define stats_compressedout V(COMP.sls_compressed) + #define stats_uncompressedout V(COMP.sls_packets) - V(COMP.sls_compressed) + #define stats_errorout V(STATS.if_opackets) - V(COMP.sls_packets) + #define stats_searches V(COMP.sls_searches) + #define stats_misses V(COMP.sls_misses) + #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 + #ifdef BSD4_4 + #define stats_ibytes V(STATS.if_ibytes) + #define stats_obytes V(STATS.if_obytes) + #ifndef STREAMS + #define stats_ibytes V(sc_bytesrcvd) + #define stats_obytes V(sc_bytessent) + #else + #ifdef PPP_STATS + #define stats_ibytes V(pii_stats.ppp_ibytes) + #define stats_obytes V(pii_stats.ppp_obytes) + #else + #define stats_ibytes 0 + #define stats_obytes 0 + #endif /* BSD4_4 */ + #endif /* STREAMS */ + #endif /* PPP_STATS */ + #endif /* _linux_ */ + /* * 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. *************** *** 263,279 **** 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); } --- 378,403 ---- void catchalarm(); #endif STRUCT *sc, *osc; ! sc = (STRUCT *) calloc (1, sizeof(STRUCT)); ! osc = (STRUCT *) calloc (1, sizeof(STRUCT)); ! #ifdef _linux_ ! ifreq.ifr_ifru.ifru_data = (caddr_t) sc; ! #else ! nl[N_SOFTC].n_value += unit * sizeof(STRUCT); ! #endif while (1) { + #ifdef _linux_ + if (ioctl (fd, SIOCDEVPRIVATE, (caddr_t) &ifreq) < 0) { + perror ("ioctl(SIOCDEVPRIVATE)"); + exit(1); + } + #else #ifndef KVMLIB if (klseek(kmem, (off_t)nl[N_SOFTC].n_value, 0) == -1) { perror("kmem seek"); exit(1); } *************** *** 286,295 **** --- 410,420 ---- sizeof(STRUCT)) != sizeof(STRUCT)) { perror("kvm_read"); exit(1); } #endif + #endif (void)signal(SIGALRM, catchalarm); signalled = 0; (void)alarm(interval); *************** *** 304,357 **** 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++; --- 429,460 ---- printf(" %6.6s %6.6s", "search", "miss"); putchar('\n'); } printf("%6d %6d %6d %6d %6d", ! stats_ibytes, ! stats_ipackets, ! stats_compressedin, ! stats_uncompressedin, ! stats_errorin); ! if (vflag) printf(" %6d %6d", ! stats_tossed, ! stats_ip); ! printf(" | %6d %6d %6d %6d %6d", ! stats_obytes, ! stats_opackets, ! stats_compressedout, ! stats_uncompressedout, ! stats_errorout); ! if (vflag) printf(" %6d %6d", ! stats_searches, ! stats_misses); putchar('\n'); fflush(stdout); line++; *** /dev/null Tue Nov 30 11:30:13 1993 --- Makefile.linux Sat Jun 11 07:15:35 1994 *************** *** 0 **** --- 1,29 ---- + # + # pppstats makefile + # $Id: Makefile.linux,v 1.1 1994/04/21 03:10:50 paulus Exp $ + # + + PPPSTATSRCS = pppstats.c + PPPSTATOBJS = pppstats.o + + #CC = gcc + COPTS = -O2 + COMPILE_FLAGS = -D_linux_=1 + LIBS = + LINUX = /usr/src/linux + + CFLAGS = -I$(LINUX)/drivers/net -I.. $(COPTS) $(COMPILE_FLAGS) + + all: pppstats + + install: + install -c -g kmem pppstats $(BINDIR)/pppstats + + pppstats: $(PPPSTATSRCS) + $(CC) $(CFLAGS) -o pppstats pppstats.c $(LIBS) + + clean: + rm -f pppstats *~ #* core + + depend: + cpp -M $(CFLAGS) $(PPPSTATSRCS) >.depend -- Al Longyear longyear@netcom.com