]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
tc/netem: loss gemodel options fixes
authorJay Vosburgh <jay.vosburgh@canonical.com>
Sat, 10 May 2014 20:34:58 +0000 (13:34 -0700)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 4 Aug 2014 17:15:10 +0000 (10:15 -0700)
First, the default value for 1-k is documented as being 0, but is
currently being set to 1. (100%).  This causes all packets to be dropped
in the good state if 1-k is not explicitly specified.  Fix this by setting
the default to 0.

Second, the 1-h option is parsed correctly, however, the kernel is
expecting "h", not 1-h.  Fix this by inverting the "1-h" percentage before
sending to and after receiving from the kernel.  This does change the
behavior, but makes it consistent with the netem documentation and the
literature on the Gilbert-Elliot model, which refer to "1-h" and "1-k,"
not "h" or "k" directly.

Last, fix a minor formatting issue for the options reporting.

Signed-off-by: Jay Vosburgh <jay.vosburgh@canonical.com>
tc/q_netem.c

index c83e301ecae3c30939f7bcd87934be25bea76e27..8abe07f51df6c4715d2a5ae99beb3a4a9955a6b8 100644 (file)
@@ -307,7 +307,7 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                                /* set defaults */
                                set_percent(&gemodel.r, 1.);
                                set_percent(&gemodel.h, 0);
-                               set_percent(&gemodel.k1, 1.);
+                               set_percent(&gemodel.k1, 0);
                                loss_type = NETEM_LOSS_GE;
 
                                if (!NEXT_IS_NUMBER())
@@ -325,6 +325,10 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                                        explain1("loss gemodel h");
                                        return -1;
                                }
+                               /* netem option is "1-h" but kernel
+                                * expects "h".
+                                */
+                               gemodel.h = max_percent_value - gemodel.h;
 
                                if (!NEXT_IS_NUMBER())
                                        continue;
@@ -625,10 +629,11 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
        }
 
        if (gemodel) {
-               fprintf(f, "loss gemodel p %s",
+               fprintf(f, " loss gemodel p %s",
                        sprint_percent(gemodel->p, b1));
                fprintf(f, " r %s", sprint_percent(gemodel->r, b1));
-               fprintf(f, " 1-h %s", sprint_percent(gemodel->h, b1));
+               fprintf(f, " 1-h %s", sprint_percent(max_percent_value -
+                                                    gemodel->h, b1));
                fprintf(f, " 1-k %s", sprint_percent(gemodel->k1, b1));
        }