diff mbox series

Using rates in bits when limits are specified in %

Message ID 20190206180913.19381-1-marcos.antonio@digirati.com.br
State Changes Requested
Delegated to: stephen hemminger
Headers show
Series Using rates in bits when limits are specified in % | expand

Commit Message

Marcos Antonio Moraes Feb. 6, 2019, 6:09 p.m. UTC
As /sys/class/net/<iface>/speed indicates a value in Mbits/sec, the
transformation is necessary to create the correct limitations.
---
 tc/tc_util.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Stephen Hemminger Feb. 6, 2019, 6:51 p.m. UTC | #1
On Wed,  6 Feb 2019 16:09:13 -0200
Marcos Antonio Moraes <marcos.antonio@digirati.com.br> wrote:

> As /sys/class/net/<iface>/speed indicates a value in Mbits/sec, the
> transformation is necessary to create the correct limitations.

Not sure, if this is correct or not could you give an example?

This patch needs a signed-off-by and a a Fixes tag.

Also please put iproute2 in subject line:

[PATCH iproute2] tc: use bits not mbits/sec in rate percent.

Also, please rebase since I just found a memory leak in this function.
Marcos Antonio Moraes Feb. 7, 2019, 12:46 p.m. UTC | #2
Em 06/02/2019 16:51, Stephen Hemminger escreveu:
> On Wed,  6 Feb 2019 16:09:13 -0200
> Marcos Antonio Moraes <marcos.antonio@digirati.com.br> wrote:
>
>> As /sys/class/net/<iface>/speed indicates a value in Mbits/sec, the
>> transformation is necessary to create the correct limitations.
> Not sure, if this is correct or not could you give an example?

Sure.

With an interface with 1000 Mbits/sec speed, the following commands are 
expected to create the same result:

`tc class add dev enp0s3 parent 1:0 classid 1:1 htb rate 500Mbit`

`tc class add dev enp0s3 parent 1:0 classid 1:1 htb rate 50%`

The first command creates the correct class:

     class htb 1:1 root prio 0 rate 500Mbit ceil 500Mbit burst 1500b 
cburst 1500b

The second one should do the same, instead of creating a class like this:

     class htb 1:1 root prio 0 rate 496bit ceil 496bit burst 1599b 
cburst 1599b

This happens because after parse_percent_rate(), get_rate() (or 
get_rate64()) is called, and it expects to treat the value with the unit 
suffix. And the value read from /sys/class/net/<iface>/speed is in 
Mbit/sec but does not include the unit. Converting the unity from mbit 
to bit would solve the problem.

>
> This patch needs a signed-off-by and a a Fixes tag.
>
> Also please put iproute2 in subject line:
>
> [PATCH iproute2] tc: use bits not mbits/sec in rate percent.
>
> Also, please rebase since I just found a memory leak in this function.
I'll provide a patch with this adjustments.
>
>
diff mbox series

Patch

diff --git a/tc/tc_util.c b/tc/tc_util.c
index ab717890..b82142ab 100644
--- a/tc/tc_util.c
+++ b/tc/tc_util.c
@@ -194,7 +194,7 @@  static int parse_percent_rate(char *rate, const char *str, const char *dev)
 {
 	long dev_mbit;
 	int ret;
-	double perc, rate_mbit;
+	double perc, rate_bit;
 	char *str_perc;
 
 	if (!dev[0]) {
@@ -219,9 +219,9 @@  static int parse_percent_rate(char *rate, const char *str, const char *dev)
 		return -1;
 	}
 
-	rate_mbit = perc * dev_mbit;
+	rate_bit = perc * dev_mbit * 1000 * 1000;
 
-	ret = snprintf(rate, 20, "%lf", rate_mbit);
+	ret = snprintf(rate, 20, "%lf", rate_bit);
 	if (ret <= 0 || ret >= 20) {
 		fprintf(stderr, "Unable to parse calculated rate\n");
 		return -1;