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