htb: support 64bit rates
Starting from linux-3.13, we can break the 32bit limitation of
rates on HTB qdisc/classes.
Prior limit was 34.359.738.360 bits per second.
lpq83:~# tc -s qdisc show dev lo ; tc -s class show dev lo
qdisc htb 1: root refcnt 2 r2q 2000 default 1 direct_packets_stat 0 direct_qlen 6000
Sent 6591936144493 bytes 149549182 pkt (dropped 0, overlimits 213757419 requeues 0)
rate 39464Mbit 114938pps backlog 0b 15p requeues 0
class htb 1:1 root prio 0 rate 50000Mbit ceil 50000Mbit burst 200000b cburst 0b
Sent 6591942184547 bytes 149549310 pkt (dropped 0, overlimits 0 requeues 0)
rate 39464Mbit 114938pps backlog 0b 15p requeues 0
lended: 149549310 borrowed: 0 giants: 0
tokens: 336 ctokens: -164
Signed-off-by: Eric Dumazet <edumazet@google.com>
diff --git a/tc/tc_util.c b/tc/tc_util.c
index be3ed07..2f979df 100644
--- a/tc/tc_util.c
+++ b/tc/tc_util.c
@@ -171,6 +171,31 @@
return 0;
}
+int get_rate64(__u64 *rate, const char *str)
+{
+ char *p;
+ double bps = strtod(str, &p);
+ const struct rate_suffix *s;
+
+ if (p == str)
+ return -1;
+
+ for (s = suffixes; s->name; ++s) {
+ if (strcasecmp(s->name, p) == 0) {
+ bps *= s->scale;
+ p += strlen(p);
+ break;
+ }
+ }
+
+ if (*p)
+ return -1; /* unknown suffix */
+
+ bps /= 8; /* -> bytes per second */
+ *rate = bps;
+ return 0;
+}
+
void print_rate(char *buf, int len, __u64 rate)
{
double tmp = (double)rate*8;