netem: use fixed rather than floating point for scaling
Don't need to do floating point math to compute scaled random. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
0c7d651b38
commit
e4beb52787
12
tc/q_netem.c
12
tc/q_netem.c
|
|
@ -17,6 +17,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
@ -53,15 +54,12 @@ static void explain1(const char *arg)
|
||||||
*/
|
*/
|
||||||
#define MAX_DIST (16*1024)
|
#define MAX_DIST (16*1024)
|
||||||
|
|
||||||
static const double max_percent_value = 0xffffffff;
|
|
||||||
|
|
||||||
/* scaled value used to percent of maximum. */
|
/* scaled value used to percent of maximum. */
|
||||||
static void set_percent(__u32 *percent, double per)
|
static void set_percent(__u32 *percent, double per)
|
||||||
{
|
{
|
||||||
*percent = (unsigned int) rint(per * max_percent_value);
|
*percent = rint(per * UINT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Parse either a fraction '.3' or percent '30%
|
/* Parse either a fraction '.3' or percent '30%
|
||||||
* return: 0 = ok, -1 = error, 1 = out of range
|
* return: 0 = ok, -1 = error, 1 = out of range
|
||||||
*/
|
*/
|
||||||
|
|
@ -89,7 +87,7 @@ static int get_percent(__u32 *percent, const char *str)
|
||||||
|
|
||||||
static void print_percent(char *buf, int len, __u32 per)
|
static void print_percent(char *buf, int len, __u32 per)
|
||||||
{
|
{
|
||||||
snprintf(buf, len, "%g%%", 100. * (double) per / max_percent_value);
|
snprintf(buf, len, "%g%%", (100. * per) / UINT32_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *sprint_percent(__u32 per, char *buf)
|
static char *sprint_percent(__u32 per, char *buf)
|
||||||
|
|
@ -323,7 +321,7 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
|
||||||
/* netem option is "1-h" but kernel
|
/* netem option is "1-h" but kernel
|
||||||
* expects "h".
|
* expects "h".
|
||||||
*/
|
*/
|
||||||
gemodel.h = max_percent_value - gemodel.h;
|
gemodel.h = UINT32_MAX - gemodel.h;
|
||||||
|
|
||||||
if (!NEXT_IS_NUMBER())
|
if (!NEXT_IS_NUMBER())
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -630,7 +628,7 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
|
||||||
fprintf(f, " loss gemodel p %s",
|
fprintf(f, " loss gemodel p %s",
|
||||||
sprint_percent(gemodel->p, b1));
|
sprint_percent(gemodel->p, b1));
|
||||||
fprintf(f, " r %s", sprint_percent(gemodel->r, b1));
|
fprintf(f, " r %s", sprint_percent(gemodel->r, b1));
|
||||||
fprintf(f, " 1-h %s", sprint_percent(max_percent_value -
|
fprintf(f, " 1-h %s", sprint_percent(UINT32_MAX -
|
||||||
gemodel->h, b1));
|
gemodel->h, b1));
|
||||||
fprintf(f, " 1-k %s", sprint_percent(gemodel->k1, b1));
|
fprintf(f, " 1-k %s", sprint_percent(gemodel->k1, b1));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue