From 85fdef052b148b69507a7cf87c22825f556578fe Mon Sep 17 00:00:00 2001 From: Leslie Monis Date: Thu, 26 Dec 2019 00:34:16 +0530 Subject: [PATCH] tc: sfq: add support for JSON output 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 Signed-off-by: Stephen Hemminger --- tc/q_sfq.c | 70 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/tc/q_sfq.c b/tc/q_sfq.c index 4998921d..2b9bbcd2 100644 --- a/tc/q_sfq.c +++ b/tc/q_sfq.c @@ -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)); - if (qopt_ext && qopt_ext->depth) - fprintf(f, "depth %u ", qopt_ext->depth); - if (qopt_ext && qopt_ext->headdrop) - fprintf(f, "headdrop "); - if (show_details) { - fprintf(f, "flows %u/%u ", qopt->flows, qopt->divisor); - } - fprintf(f, "divisor %u ", qopt->divisor); + 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) + print_uint(PRINT_ANY, "depth", "depth %u ", qopt_ext->depth); + if (qopt_ext && qopt_ext->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 (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; }