]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
tc: sfq: add support for JSON output
authorLeslie Monis <lesliemonis@gmail.com>
Wed, 25 Dec 2019 19:04:16 +0000 (00:34 +0530)
committerStephen Hemminger <stephen@networkplumber.org>
Sun, 29 Dec 2019 17:57:27 +0000 (09:57 -0800)
Enable proper JSON output for the SFQ Qdisc.
Use the long double format specifier to print the value of
"probability".
Also, fix the indentation in the online output of the contents in the
tc_sfqred_stats structure.

Signed-off-by: Leslie Monis <lesliemonis@gmail.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
tc/q_sfq.c

index 4998921d3f8ac8dd630a91094d652f71031cbb5e..2b9bbcd230b9b21d0614576ac235adc8a074175d 100644 (file)
@@ -217,35 +217,53 @@ static int sfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
        if (RTA_PAYLOAD(opt) >= sizeof(*qopt_ext))
                qopt_ext = RTA_DATA(opt);
        qopt = RTA_DATA(opt);
-       fprintf(f, "limit %up ", qopt->limit);
-       fprintf(f, "quantum %s ", sprint_size(qopt->quantum, b1));
+
+       print_uint(PRINT_ANY, "limit", "limit %up ", qopt->limit);
+       print_uint(PRINT_JSON, "quantum", NULL, qopt->quantum);
+       print_string(PRINT_FP, NULL, "quantum %s ",
+                    sprint_size(qopt->quantum, b1));
+
        if (qopt_ext && qopt_ext->depth)
-               fprintf(f, "depth %u ", qopt_ext->depth);
+               print_uint(PRINT_ANY, "depth", "depth %u ", qopt_ext->depth);
        if (qopt_ext && qopt_ext->headdrop)
-               fprintf(f, "headdrop ");
+               print_bool(PRINT_ANY, "headdrop", "headdrop ", true);
+       if (show_details)
+               print_uint(PRINT_ANY, "flows", "flows %u ", qopt->flows);
+
+       print_uint(PRINT_ANY, "divisor", "divisor %u ", qopt->divisor);
 
-       if (show_details) {
-               fprintf(f, "flows %u/%u ", qopt->flows, qopt->divisor);
-       }
-       fprintf(f, "divisor %u ", qopt->divisor);
        if (qopt->perturb_period)
-               fprintf(f, "perturb %dsec ", qopt->perturb_period);
+               print_int(PRINT_ANY, "perturb", "perturb %dsec ",
+                          qopt->perturb_period);
        if (qopt_ext && qopt_ext->qth_min) {
-               fprintf(f, "\n ewma %u ", qopt_ext->Wlog);
-               fprintf(f, "min %s max %s probability %g ",
-                       sprint_size(qopt_ext->qth_min, b2),
-                       sprint_size(qopt_ext->qth_max, b3),
-                       qopt_ext->max_P / pow(2, 32));
+               print_uint(PRINT_ANY, "ewma", "ewma %u ", qopt_ext->Wlog);
+               print_uint(PRINT_JSON, "min", NULL, qopt_ext->qth_min);
+               print_string(PRINT_FP, NULL, "min %s ",
+                            sprint_size(qopt_ext->qth_min, b2));
+               print_uint(PRINT_JSON, "max", NULL, qopt_ext->qth_max);
+               print_string(PRINT_FP, NULL, "max %s ",
+                            sprint_size(qopt_ext->qth_max, b3));
+               print_float(PRINT_ANY, "probability", "probability %lg ",
+                           qopt_ext->max_P / pow(2, 32));
                tc_red_print_flags(qopt_ext->flags);
                if (show_stats) {
-                       fprintf(f, "\n prob_mark %u prob_mark_head %u prob_drop %u",
-                               qopt_ext->stats.prob_mark,
-                               qopt_ext->stats.prob_mark_head,
-                               qopt_ext->stats.prob_drop);
-                       fprintf(f, "\n forced_mark %u forced_mark_head %u forced_drop %u",
-                               qopt_ext->stats.forced_mark,
-                               qopt_ext->stats.forced_mark_head,
-                               qopt_ext->stats.forced_drop);
+                       print_nl();
+                       print_uint(PRINT_ANY, "prob_mark", "  prob_mark %u",
+                                  qopt_ext->stats.prob_mark);
+                       print_uint(PRINT_ANY, "prob_mark_head",
+                                  " prob_mark_head %u",
+                                  qopt_ext->stats.prob_mark_head);
+                       print_uint(PRINT_ANY, "prob_drop", " prob_drop %u",
+                                  qopt_ext->stats.prob_drop);
+                       print_nl();
+                       print_uint(PRINT_ANY, "forced_mark",
+                                  "  forced_mark %u",
+                                  qopt_ext->stats.forced_mark);
+                       print_uint(PRINT_ANY, "forced_mark_head",
+                                  " forced_mark_head %u",
+                                  qopt_ext->stats.forced_mark_head);
+                       print_uint(PRINT_ANY, "forced_drop", " forced_drop %u",
+                                  qopt_ext->stats.forced_drop);
                }
        }
        return 0;
@@ -262,8 +280,8 @@ static int sfq_print_xstats(struct qdisc_util *qu, FILE *f,
                return -1;
        st = RTA_DATA(xstats);
 
-       fprintf(f, " allot %d ", st->allot);
-       fprintf(f, "\n");
+       print_int(PRINT_ANY, "allot", "  allot %d", st->allot);
+
        return 0;
 }