mirror of
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git
synced 2024-11-15 22:15:13 +08:00
abf70ef494
Using a 32 bit field to represent time in nanoseconds results in a maximum value of about 4.3 seconds, which is well below many observed delays in WiFi and LTE, and barely in the ballpark for a trip past the Earth's moon, Luna. Using 64 bit time fields in nanoseconds allows us to simulate network diameters of several hundred light-years. However, only conversions to and from ns, us, ms, and seconds are provided. The iproute2 64 bit api uses signed values for time. Being able to represent positive or negative time allows us to calculate +/- deltas between, for example, the CLOCK_TAI and CLOCK_REALTIME clocks. Time related utility functions in tc_util.c are moved to lib/utils.c. Signed-off-by: Yousuk Seung <ysseung@google.com> Signed-off-by: Dave Taht <dave.taht@gmail.com> Signed-off-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: David Ahern <dsahern@gmail.com>
59 lines
1.5 KiB
C
59 lines
1.5 KiB
C
/*
|
|
* tc_cbq.c CBQ maintanance routines.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*
|
|
* Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <math.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <string.h>
|
|
|
|
#include "utils.h"
|
|
#include "tc_core.h"
|
|
#include "tc_cbq.h"
|
|
|
|
unsigned int tc_cbq_calc_maxidle(unsigned int bndw, unsigned int rate, unsigned int avpkt,
|
|
int ewma_log, unsigned int maxburst)
|
|
{
|
|
double maxidle;
|
|
double g = 1.0 - 1.0/(1<<ewma_log);
|
|
double xmt = (double)avpkt/bndw;
|
|
|
|
maxidle = xmt*(1-g);
|
|
if (bndw != rate && maxburst) {
|
|
double vxmt = (double)avpkt/rate - xmt;
|
|
|
|
vxmt *= (pow(g, -(double)maxburst) - 1);
|
|
if (vxmt > maxidle)
|
|
maxidle = vxmt;
|
|
}
|
|
return tc_core_time2tick(maxidle*(1<<ewma_log)*TIME_UNITS_PER_SEC);
|
|
}
|
|
|
|
unsigned int tc_cbq_calc_offtime(unsigned int bndw, unsigned int rate, unsigned int avpkt,
|
|
int ewma_log, unsigned int minburst)
|
|
{
|
|
double g = 1.0 - 1.0/(1<<ewma_log);
|
|
double offtime = (double)avpkt/rate - (double)avpkt/bndw;
|
|
|
|
if (minburst == 0)
|
|
return 0;
|
|
if (minburst == 1)
|
|
offtime *= pow(g, -(double)minburst) - 1;
|
|
else
|
|
offtime *= 1 + (pow(g, -(double)(minburst-1)) - 1)/(1-g);
|
|
return tc_core_time2tick(offtime*TIME_UNITS_PER_SEC);
|
|
}
|