home *** CD-ROM | disk | FTP | other *** search
/ Super Net 1 / SUPERNET_1.iso / PC / OTROS / SUN / PPP / SUNOS_OL / PPPD_1_0.TAR / slstats.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-01-09  |  6.6 KB  |  310 lines

  1. /*
  2.  * print serial line IP statistics:
  3.  *     slstats [-i interval] [-v] [interface] [system] [core] 
  4.  *
  5.  * Copyright (c) 1989 Regents of the University of California.
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms are permitted
  9.  * provided that the above copyright notice and this paragraph are
  10.  * duplicated in all such forms and that any documentation,
  11.  * advertising materials, and other materials related to such
  12.  * distribution and use acknowledge that the software was developed
  13.  * by the University of California, Berkeley.  The name of the
  14.  * University may not be used to endorse or promote products derived
  15.  * from this software without specific prior written permission.
  16.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  17.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  18.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19.  *
  20.  *    Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
  21.  *    - Initial distribution.
  22.  */
  23.  
  24. #ifndef lint
  25. static char *rcsid = "$Header: slstats.c,v 1.6 89/12/31 08:53:05 van Exp $";
  26. #endif
  27.  
  28.  
  29. #include <sys/param.h>
  30. #include <sys/mbuf.h>
  31. #include <sys/types.h>
  32. #include <sys/vmmac.h>
  33. #include <sys/socket.h>
  34. #include <sys/file.h>
  35. #include <machine/pte.h>
  36. #include <ctype.h>
  37. #include <errno.h>
  38. #include <nlist.h>
  39. #include <stdio.h>
  40. #include <signal.h>
  41. #include <net/if.h>
  42. #include <netinet/in.h>
  43. #include <netinet/in_systm.h>
  44. #include <netinet/ip.h>
  45. #include <netinet/ip_var.h>
  46.  
  47. #include "slcompress.h"
  48. #ifdef    PPP
  49. #define    VJC    1
  50. #define    PPP_STATS    1
  51. #include <sys/slip_var.h>
  52. #include <sys/stream.h>
  53. #include <sys/stropts.h>
  54. #include "ppp_str.h"
  55. #else
  56. #include <net/if_slvar.h>
  57. #endif
  58. #ifdef sun
  59. #define KERNBASE KERNELBASE
  60. #endif
  61. #ifdef    sun386
  62. struct nlist nl[] = {
  63. #define N_SOFTC 0
  64. #ifdef    PPP
  65.     { "pii" },
  66. #else
  67.     { "sl_softc" },
  68. #endif
  69. #define N_SYSSIZE 1
  70.     { "syssize" },
  71. #define N_SYSMAP 2
  72.     { "sysmap" },
  73.     "",
  74. };
  75.  
  76. #else
  77. struct nlist nl[] = {
  78. #define N_SOFTC 0
  79. #ifdef    PPP
  80.     { "_pii" },
  81. #else
  82.     { "_sl_softc" },
  83. #endif
  84. #define N_SYSSIZE 1
  85.     { "_syssize" },
  86. #define N_SYSMAP 2
  87.     { "_sysmap" },
  88.     "",
  89. };
  90. #endif
  91. struct    pte *Sysmap;
  92.  
  93. char    *system = "/vmunix";
  94. char    *kmemf = "/dev/kmem";
  95. int    kmem;
  96. int    kflag;
  97. int    vflag;
  98. unsigned interval = 5;
  99. int    unit;
  100.  
  101.  
  102. extern    char *malloc();
  103. extern    off_t lseek();
  104.  
  105. main(argc, argv)
  106.     int argc;
  107.     char *argv[];
  108. {
  109.     --argc; ++argv;
  110.     while (argc > 0) {
  111.         if (strcmp(argv[0], "-v") == 0) {
  112.             ++vflag;
  113.             ++argv, --argc;
  114.             continue;
  115.         }
  116.         if (strcmp(argv[0], "-i") == 0 && argv[1] &&
  117.             isdigit(argv[1][0])) {
  118.             interval = atoi(argv[1]);
  119.             if (interval <= 0)
  120.                 usage();
  121.             ++argv, --argc;
  122.             ++argv, --argc;
  123.             continue;
  124.         }
  125.         if (isdigit(argv[0][0])) {
  126.             unit = atoi(argv[0]);
  127.             if (unit < 0)
  128.                 usage();
  129.             ++argv, --argc;
  130.             continue;
  131.         }
  132.         if (kflag)
  133.             usage();
  134.  
  135.         system = *argv;
  136.         ++argv, --argc;
  137.         if (argc > 0) {
  138.             kmemf = *argv++;
  139.             --argc;
  140.             kflag++;
  141.         }
  142.     }
  143. #ifdef    sun386
  144.     if (nlist(system, nl) < 0 || nl[0].n_value== 0) {
  145. #else
  146.     if (nlist(system, nl) < 0 || nl[0].n_type == 0) {
  147. #endif
  148.         fprintf(stderr, "%s: no namelist\n", system);
  149.         exit(1);
  150.     }
  151.     kmem = open(kmemf, O_RDONLY);
  152.     if (kmem < 0) {
  153.         perror(kmemf);
  154.         exit(1);
  155.     }
  156.     if (kflag) {
  157.         off_t off;
  158.  
  159.         Sysmap = (struct pte *)
  160.            malloc((u_int)(nl[N_SYSSIZE].n_value * sizeof(struct pte)));
  161.         if (!Sysmap) {
  162.             fputs("netstat: can't get memory for Sysmap.\n", stderr);
  163.             exit(1);
  164.         }
  165.         off = nl[N_SYSMAP].n_value & ~KERNBASE;
  166.         (void)lseek(kmem, off, L_SET);
  167.         (void)read(kmem, (char *)Sysmap,
  168.             (int)(nl[N_SYSSIZE].n_value * sizeof(struct pte)));
  169.     }
  170.     intpr();
  171.     exit(0);
  172. }
  173.  
  174. /*
  175.  * Seek into the kernel for a value.
  176.  */
  177. off_t
  178. klseek(fd, base, off)
  179.     int fd, off;
  180.     off_t base;
  181. {
  182.     if (kflag) {
  183.         /* get kernel pte */
  184.         base &= ~KERNBASE;
  185.  
  186. #ifdef _sun3x_pte_h
  187.                 base = ctob(Sysmap[btop(base)].pte_pfn) + (base & PGOFSET);
  188. #else
  189.                 base = ctob(Sysmap[btop(base)].pg_pfnum) + (base & PGOFSET);
  190. #endif
  191.  
  192.     }
  193.     return (lseek(fd, base, off));
  194. }
  195.  
  196. usage()
  197. {
  198.     fprintf(stderr,"usage: slstats [-i interval] [-v] [unit] [system] [core]\n");
  199.     exit(1);
  200. }
  201.  
  202. u_char    signalled;            /* set if alarm goes off "early" */
  203.  
  204. #define V(offset) ((line % 20)? sc->offset - osc->offset : sc->offset)
  205. #ifndef    PPP
  206. #define AMT (sizeof(*sc) - 2 * sizeof(sc->sc_comp.tstate))
  207. #else
  208. #define AMT (sizeof(*sc))
  209. #endif
  210. /*
  211.  * Print a running summary of interface statistics.
  212.  * Repeat display every interval seconds, showing statistics
  213.  * collected over that interval.  Assumes that interval is non-zero.
  214.  * First line printed at top of screen is always cumulative.
  215.  */
  216. intpr()
  217. {
  218.     register int line = 0;
  219.     int oldmask;
  220.     int catchalarm();
  221. #ifdef    PPP
  222.     struct ppp_if_info    *sc, *osc;
  223.     nl[N_SOFTC].n_value += unit * sizeof(struct ppp_if_info);
  224.     sc = (struct ppp_if_info *)malloc(AMT);
  225.     osc = (struct ppp_if_info  *)malloc(AMT);
  226.  
  227. #else
  228.     struct sl_softc *sc, *osc;
  229.     nl[N_SOFTC].n_value += unit * sizeof(struct sl_softc);
  230.     sc = (struct sl_softc *)malloc(AMT);
  231.     osc = (struct sl_softc *)malloc(AMT);
  232. #endif
  233.     bzero((char *)osc, AMT);
  234.  
  235.     while (1) {
  236.         if (klseek(kmem, (off_t)nl[N_SOFTC].n_value, 0) < 0)
  237.             if(errno != EINTR)
  238.                 perror("kmem seek");
  239.         if (read(kmem, (char *)sc, AMT) <= 0)
  240.             perror("kmem read");
  241.  
  242.         (void)signal(SIGALRM, catchalarm);
  243.         signalled = 0;
  244.         (void)alarm(interval);
  245.  
  246.         if ((line % 20) == 0) {
  247.             printf("%6.6s %6.6s %6.6s %6.6s %6.6s",
  248.                 "in", "pack", "comp", "uncomp", "err");
  249.             if (vflag)
  250.                 printf(" %6.6s %6.6s", "toss", "ip");
  251.             printf(" | %6.6s %6.6s %6.6s %6.6s %6.6s",
  252.                 "out", "pack", "comp", "uncomp", "ip");
  253.             if (vflag)
  254.                 printf(" %6.6s %6.6s", "search", "miss");
  255.             putchar('\n');
  256.         }
  257. #ifdef    PPP
  258. #define    COMP    pii_sc_comp
  259. #define    STATS    pii_stats
  260. #else
  261. #define    COMP    sc_comp
  262. #define    STATS    stats
  263. #endif
  264.         printf("%6d %6d %6d %6d %6d",
  265.             V(STATS.sl_ibytes),
  266.             V(STATS.sl_ipackets),
  267.             V(COMP.sls_compressedin),
  268.             V(COMP.sls_uncompressedin),
  269.             V(COMP.sls_errorin));
  270.         if (vflag)
  271.             printf(" %6d %6d",
  272.                 V(COMP.sls_tossed),
  273.                 V(STATS.sl_ipackets) -
  274.                   V(COMP.sls_compressedin) -
  275.                   V(COMP.sls_uncompressedin) -
  276.                   V(COMP.sls_errorin));
  277.         printf(" | %6d %6d %6d %6d %6d",
  278.             V(STATS.sl_obytes),
  279.             V(STATS.sl_opackets),
  280.             V(COMP.sls_compressed),
  281.             V(COMP.sls_packets) - V(COMP.sls_compressed),
  282.             V(STATS.sl_opackets) - V(COMP.sls_packets));
  283.         if (vflag)
  284.             printf(" %6d %6d",
  285.                 V(COMP.sls_searches),
  286.                 V(COMP.sls_misses));
  287.  
  288.         putchar('\n');
  289.         fflush(stdout);
  290.         line++;
  291.         oldmask = sigblock(sigmask(SIGALRM));
  292.         if (! signalled) {
  293.             sigpause(0);
  294.         }
  295.         sigsetmask(oldmask);
  296.         signalled = 0;
  297.         (void)alarm(interval);
  298.         bcopy((char *)sc, (char *)osc, AMT);
  299.     }
  300. }
  301.  
  302. /*
  303.  * Called if an interval expires before sidewaysintpr has completed a loop.
  304.  * Sets a flag to not wait for the alarm.
  305.  */
  306. catchalarm()
  307. {
  308.     signalled = 1;
  309. }
  310.