/* For terms of usage/redistribution/modification see the LICENSE file */
/* For authors and contributors see the AUTHORS file */
#include "iptraf-ng-compat.h"
#include "options.h"
#include "rate.h"
void rate_init(struct rate *rate)
{
if (!rate)
return;
rate->index = 0;
rate->sma = 0;
memset(rate->rates, 0, rate->n * sizeof(rate->rates[0]));
}
void rate_alloc(struct rate *rate, unsigned int n)
{
if (!rate)
return;
rate->n = n;
rate->rates = xmalloc(n * sizeof(rate->rates[0]));
rate_init(rate);
}
void rate_destroy(struct rate *rate)
{
if (!rate)
return;
rate->n = 0;
if (!rate->rates)
return;
free(rate->rates);
rate->rates = NULL;
}
void rate_add_rate(struct rate *rate, unsigned long bytes,
unsigned long msecs)
{
if (!rate)
return;
rate->rates[rate->index] = bytes * 1000ULL / msecs;
if ((rate->index + 1) >= rate->n)
rate->index = 0;
else
rate->index++;
/* compute the moving average */
unsigned long long sum = 0;
for(unsigned int i = 0; i < rate->n; i++)
sum += rate->rates[i];
rate->sma = sum / rate->n;
}
unsigned long rate_get_average(struct rate *rate)
{
if (rate)
return rate->sma;
else
return 0UL;
}
int rate_print(unsigned long rate, char *buf, unsigned n)
{
char *suffix[] = { "k", "M", "G", "T", "P", "E", "Z", "Y" };
unsigned n_suffix = ARRAY_SIZE(suffix);
int chars;
if (options.actmode == KBITS) {
unsigned long tmp = rate;
unsigned int i = 0;
unsigned long divider = 1000;
rate *= 8;
while(tmp >= 100000000) {
tmp /= 1000;
i++;
divider *= 1000;
}
if (i >= n_suffix)
chars = snprintf(buf, n, "error");
else
chars = snprintf(buf, n, "%9.2f %sbps", (double)rate / divider, suffix[i]);
} else {
unsigned int i = 0;
while(rate > 99 * (1UL << 20)) {
rate >>= 10;
i++;
}
if (i >= n_suffix)
chars = snprintf(buf, n, "error");
else
chars = snprintf(buf, n, "%9.2f %sBps", (double)rate / 1024, suffix[i]);
}
buf[n - 1] = '\0';
return chars;
}
int rate_print_no_units(unsigned long rate, char *buf, unsigned n)
{
int chars;
if (options.actmode == KBITS) {
chars = snprintf(buf, n, "%8.1f", (double)rate * 8 / 1000);
} else {
chars = snprintf(buf, n, "%8.1f", (double)rate / 1024);
}
buf[n - 1] = '\0';
return chars;
}
int rate_print_pps(unsigned long rate, char *buf, unsigned n)
{
int chars;
chars = snprintf(buf, n, "%9lu pps", rate);
buf[n - 1] = '\0';
return chars;
}