throughput.c revision 31272
131272Sbrian/*
231272Sbrian * $Id$
331272Sbrian */
431272Sbrian
531272Sbrian#include <sys/param.h>
631272Sbrian
731272Sbrian#include <stdio.h>
831272Sbrian#include <time.h>
931272Sbrian#include <netinet/in.h>
1031272Sbrian
1131272Sbrian#include "timer.h"
1231272Sbrian#include "throughput.h"
1331272Sbrian#include "defs.h"
1431272Sbrian#include "loadalias.h"
1531272Sbrian#include "command.h"
1631272Sbrian#include "vars.h"
1731272Sbrian#include "mbuf.h"
1831272Sbrian#include "log.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
7731272Sbrianthroughput_sampler(struct pppThroughput *t)
7831272Sbrian{
7931272Sbrian  u_long old;
8031272Sbrian
8131272Sbrian  StopTimer(&t->Timer);
8231272Sbrian  t->Timer.state = TIMER_STOPPED;
8331272Sbrian
8431272Sbrian  old = t->SampleOctets[t->nSample];
8531272Sbrian  t->SampleOctets[t->nSample] = t->OctetsIn + t->OctetsOut;
8631272Sbrian  t->OctetsPerSecond = (t->SampleOctets[t->nSample] - old) / SAMPLE_PERIOD;
8731272Sbrian  if (t->BestOctetsPerSecond < t->OctetsPerSecond)
8831272Sbrian    t->BestOctetsPerSecond = t->OctetsPerSecond;
8931272Sbrian  if (++t->nSample == SAMPLE_PERIOD)
9031272Sbrian    t->nSample = 0;
9131272Sbrian
9231272Sbrian  StartTimer(&t->Timer);
9331272Sbrian}
9431272Sbrian
9531272Sbrianvoid
9631272Sbrianthroughput_start(struct pppThroughput *t)
9731272Sbrian{
9831272Sbrian  throughput_init(t);
9931272Sbrian  time(&t->uptime);
10031272Sbrian  if (Enabled(ConfThroughput)) {
10131272Sbrian    t->Timer.state = TIMER_STOPPED;
10231272Sbrian    t->Timer.load = SECTICKS;
10331272Sbrian    t->Timer.func = throughput_sampler;
10431272Sbrian    t->Timer.arg = t;
10531272Sbrian    StartTimer(&t->Timer);
10631272Sbrian  }
10731272Sbrian}
10831272Sbrian
10931272Sbrianvoid
11031272Sbrianthroughput_stop(struct pppThroughput *t)
11131272Sbrian{
11231272Sbrian  if (Enabled(ConfThroughput))
11331272Sbrian    StopTimer(&t->Timer);
11431272Sbrian}
11531272Sbrian
11631272Sbrianvoid
11731272Sbrianthroughput_addin(struct pppThroughput *t, int n)
11831272Sbrian{
11931272Sbrian  t->OctetsIn += n;
12031272Sbrian}
12131272Sbrian
12231272Sbrianvoid
12331272Sbrianthroughput_addout(struct pppThroughput *t, int n)
12431272Sbrian{
12531272Sbrian  t->OctetsOut += n;
12631272Sbrian}
127