Add more complete rate values including IEC syntax.
(Logical change 1.26)
This commit is contained in:
parent
9b79281219
commit
72fc2040f5
48
tc/tc_util.c
48
tc/tc_util.c
|
|
@ -98,8 +98,9 @@ char * sprint_tc_classid(__u32 h, char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NB: rates are in Kilo = 1000 but sizes are in Kilo = 1024
|
* NB: rates are scaled differently depending on bits or bytes.
|
||||||
* according to standard usage.
|
* if bits are requested then k == 1000
|
||||||
|
* for bytes k = 1024
|
||||||
*/
|
*/
|
||||||
int get_rate(unsigned *rate, const char *str)
|
int get_rate(unsigned *rate, const char *str)
|
||||||
{
|
{
|
||||||
|
|
@ -109,23 +110,28 @@ int get_rate(unsigned *rate, const char *str)
|
||||||
if (p == str)
|
if (p == str)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (*p) {
|
if (*p == 0 || strcasecmp(p, "bit") == 0)
|
||||||
if (strcasecmp(p, "kbps") == 0)
|
|
||||||
bps *= 1000;
|
|
||||||
else if (strcasecmp(p, "gbps") == 0)
|
|
||||||
bps *= 1000000000.;
|
|
||||||
else if (strcasecmp(p, "gbit") == 0)
|
|
||||||
bps = (bps * 1000000000.)/8;
|
|
||||||
else if (strcasecmp(p, "mbps") == 0)
|
|
||||||
bps *= 1000000.;
|
|
||||||
else if (strcasecmp(p, "mbit") == 0)
|
|
||||||
bps = (bps * 1000000.)/8;
|
|
||||||
else if (strcasecmp(p, "kbit") == 0)
|
|
||||||
bps = (bps * 1000.) / 8;
|
|
||||||
else if (strcasecmp(p, "bps") != 0)
|
|
||||||
return -1;
|
|
||||||
} else
|
|
||||||
bps /= 8;
|
bps /= 8;
|
||||||
|
else if (strcasecmp(p, "kbit") == 0)
|
||||||
|
bps = (bps * 1000.) / 8;
|
||||||
|
else if (strcasecmp(p, "mbit") == 0)
|
||||||
|
bps = (bps * 1000000.)/8;
|
||||||
|
else if (strcasecmp(p, "gbit") == 0)
|
||||||
|
bps = (bps * 1000000000.)/8;
|
||||||
|
else if (strcasecmp(p, "kibit") == 0)
|
||||||
|
bps *= 1024 / 8;
|
||||||
|
else if (strcasecmp(p, "mibit") == 0)
|
||||||
|
bps *= 1024*1024/8;
|
||||||
|
else if (strcasecmp(p, "gibit") == 0)
|
||||||
|
bps *= 1024*1024*1024/8;
|
||||||
|
else if (strcasecmp(p, "kbps") == 0)
|
||||||
|
bps *= 1024;
|
||||||
|
else if (strcasecmp(p, "mbps") == 0)
|
||||||
|
bps *= 1024*1024;
|
||||||
|
else if (strcasecmp(p, "gbps") == 0)
|
||||||
|
bps *= 1024*1024*1024;
|
||||||
|
else if (strcasecmp(p, "bps") != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
*rate = bps;
|
*rate = bps;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -166,11 +172,11 @@ int print_rate(char *buf, int len, __u32 rate)
|
||||||
double tmp = (double)rate*8;
|
double tmp = (double)rate*8;
|
||||||
|
|
||||||
if (tmp >= 999999 && fabs(1000000.*rint(tmp/1000000.) - tmp) < 1000)
|
if (tmp >= 999999 && fabs(1000000.*rint(tmp/1000000.) - tmp) < 1000)
|
||||||
snprintf(buf, len, "%gMbit", rint(tmp/1000000.));
|
snprintf(buf, len, "%gmbit", rint(tmp/1000000.));
|
||||||
else if (tmp >= 990 && fabs(1000.*rint(tmp/1000.) - tmp) < 10)
|
else if (tmp >= 990 && fabs(1000.*rint(tmp/1000.) - tmp) < 10)
|
||||||
snprintf(buf, len, "%gKbit", rint(tmp/1000.));
|
snprintf(buf, len, "%gkbit", rint(tmp/1000.));
|
||||||
else
|
else
|
||||||
snprintf(buf, len, "%ubps", rate);
|
snprintf(buf, len, "%ubit", rate);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue