throughput.c revision 31343
131272Sbrian/*
231343Sbrian * $Id: throughput.c,v 1.1 1997/11/18 14:52:07 brian Exp $
331272Sbrian */
431272Sbrian
531272Sbrian#include <sys/param.h>
631272Sbrian
731272Sbrian#include <stdio.h>
831272Sbrian#include <time.h>
931272Sbrian#include <netinet/in.h>
1031272Sbrian
1131343Sbrian#include "command.h"
1231343Sbrian#include "mbuf.h"
1331343Sbrian#include "log.h"
1431272Sbrian#include "timer.h"
1531272Sbrian#include "throughput.h"
1631272Sbrian#include "defs.h"
1731272Sbrian#include "loadalias.h"
1831272Sbrian#include "vars.h"
1931272Sbrian
2031272Sbrianvoid
2131272Sbrianthroughput_init(struct pppThroughput *t)
2231272Sbrian{
2331272Sbrian  int f;
2431272Sbrian
2531272Sbrian  t->OctetsIn = t->OctetsOut = 0;
2631272Sbrian  for (f = 0; f < SAMPLE_PERIOD; f++)
2731272Sbrian    t->SampleOctets[f] = 0;
2831272Sbrian  t->OctetsPerSecond = t->BestOctetsPerSecond = t->nSample = 0;
2931272Sbrian  throughput_stop(t);
3031272Sbrian}
3131272Sbrian
3231272Sbrianvoid
3331272Sbrianthroughput_disp(struct pppThroughput *t, FILE *f)
3431272Sbrian{
3531272Sbrian  int secs_up;
3631272Sbrian
3731272Sbrian  secs_up = time(NULL) - t->uptime;
3831272Sbrian  fprintf(f, "Connect time: %d secs\n", secs_up);
3931272Sbrian  if (secs_up == 0)
4031272Sbrian    secs_up = 1;
4131272Sbrian  fprintf(f, "%ld octets in, %ld octets out\n", t->OctetsIn, t->OctetsOut);
4231272Sbrian  if (Enabled(ConfThroughput)) {
4331272Sbrian    fprintf(f, "  overall   %5ld bytes/sec\n",
4431272Sbrian            (t->OctetsIn+t->OctetsOut)/secs_up);
4531272Sbrian    fprintf(f, "  currently %5d bytes/sec\n", t->OctetsPerSecond);
4631272Sbrian    fprintf(f, "  peak      %5d bytes/sec\n", t->BestOctetsPerSecond);
4731272Sbrian  } else
4831272Sbrian    fprintf(f, "Overall %ld bytes/sec\n", (t->OctetsIn+t->OctetsOut)/secs_up);
4931272Sbrian}
5031272Sbrian
5131272Sbrian
5231272Sbrianvoid
5331272Sbrianthroughput_log(struct pppThroughput *t, int level, const char *title)
5431272Sbrian{
5531272Sbrian  if (t->uptime) {
5631272Sbrian    int secs_up;
5731272Sbrian
5831272Sbrian    secs_up = time(NULL) - t->uptime;
5931272Sbrian    if (title)
6031272Sbrian      LogPrintf(level, "%s: Connect time: %d secs: %ld octets in, %ld octets"
6131272Sbrian                " out\n", title, secs_up, t->OctetsIn, t->OctetsOut);
6231272Sbrian    else
6331272Sbrian      LogPrintf(level, "Connect time: %d secs: %ld octets in, %ld octets out\n",
6431272Sbrian                secs_up, t->OctetsIn, t->OctetsOut);
6531272Sbrian    if (secs_up == 0)
6631272Sbrian      secs_up = 1;
6731272Sbrian    if (Enabled(ConfThroughput))
6831272Sbrian      LogPrintf(level, " total %ld bytes/sec, peak %d bytes/sec\n",
6931272Sbrian                (t->OctetsIn+t->OctetsOut)/secs_up, t->BestOctetsPerSecond);
7031272Sbrian    else
7131272Sbrian      LogPrintf(level, " total %ld bytes/sec\n",
7231272Sbrian                (t->OctetsIn+t->OctetsOut)/secs_up);
7331272Sbrian  }
7431272Sbrian}
7531272Sbrian
7631272Sbrianstatic void
7731343Sbrianthroughput_sampler(void *v)
7831272Sbrian{
7931343Sbrian  struct pppThroughput *t = (struct pppThroughput *)v;
8031272Sbrian  u_long old;
8131272Sbrian
8231272Sbrian  StopTimer(&t->Timer);
8331272Sbrian  t->Timer.state = TIMER_STOPPED;
8431272Sbrian
8531272Sbrian  old = t->SampleOctets[t->nSample];
8631272Sbrian  t->SampleOctets[t->nSample] = t->OctetsIn + t->OctetsOut;
8731272Sbrian  t->OctetsPerSecond = (t->SampleOctets[t->nSample] - old) / SAMPLE_PERIOD;
8831272Sbrian  if (t->BestOctetsPerSecond < t->OctetsPerSecond)
8931272Sbrian    t->BestOctetsPerSecond = t->OctetsPerSecond;
9031272Sbrian  if (++t->nSample == SAMPLE_PERIOD)
9131272Sbrian    t->nSample = 0;
9231272Sbrian
9331272Sbrian  StartTimer(&t->Timer);
9431272Sbrian}
9531272Sbrian
9631272Sbrianvoid
9731272Sbrianthroughput_start(struct pppThroughput *t)
9831272Sbrian{
9931272Sbrian  throughput_init(t);
10031272Sbrian  time(&t->uptime);
10131272Sbrian  if (Enabled(ConfThroughput)) {
10231272Sbrian    t->Timer.state = TIMER_STOPPED;
10331272Sbrian    t->Timer.load = SECTICKS;
10431272Sbrian    t->Timer.func = throughput_sampler;
10531272Sbrian    t->Timer.arg = t;
10631272Sbrian    StartTimer(&t->Timer);
10731272Sbrian  }
10831272Sbrian}
10931272Sbrian
11031272Sbrianvoid
11131272Sbrianthroughput_stop(struct pppThroughput *t)
11231272Sbrian{
11331272Sbrian  if (Enabled(ConfThroughput))
11431272Sbrian    StopTimer(&t->Timer);
11531272Sbrian}
11631272Sbrian
11731272Sbrianvoid
11831272Sbrianthroughput_addin(struct pppThroughput *t, int n)
11931272Sbrian{
12031272Sbrian  t->OctetsIn += n;
12131272Sbrian}
12231272Sbrian
12331272Sbrianvoid
12431272Sbrianthroughput_addout(struct pppThroughput *t, int n)
12531272Sbrian{
12631272Sbrian  t->OctetsOut += n;
12731272Sbrian}
128