[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20180710210558.20278-25-stephen@networkplumber.org>
Date: Tue, 10 Jul 2018 14:05:51 -0700
From: Stephen Hemminger <stephen@...workplumber.org>
To: netdev@...r.kernel.org
Cc: Stephen Hemminger <sthemmin@...rosoft.com>,
Stephen Hemminger <stephen@...workplumber.org>
Subject: [PATCH v2 iproute2-next 24/31] tc/netem: implement JSON output
From: Stephen Hemminger <sthemmin@...rosoft.com>
Also, fix a spelling error in usage message.
Signed-off-by: Stephen Hemminger <stephen@...workplumber.org>
---
tc/q_netem.c | 94 +++++++++++++++++++++++++---------------------------
1 file changed, 46 insertions(+), 48 deletions(-)
diff --git a/tc/q_netem.c b/tc/q_netem.c
index 623ec9038ad3..3844ec9adaae 100644
--- a/tc/q_netem.c
+++ b/tc/q_netem.c
@@ -39,7 +39,7 @@ static void explain(void)
" [ loss state P13 [P31 [P32 [P23 P14]]]\n" \
" [ loss gemodel PERCENT [R [1-H [1-K]]]\n" \
" [ ecn ]\n" \
-" [ reorder PRECENT [CORRELATION] [ gap DISTANCE ]]\n" \
+" [ reorder PERCENT [CORRELATION] [ gap DISTANCE ]]\n" \
" [ rate RATE [PACKETOVERHEAD] [CELLSIZE] [CELLOVERHEAD]]\n");
}
@@ -70,15 +70,18 @@ static int get_percent(__u32 *percent, const char *str)
return 0;
}
-static void print_percent(char *buf, int len, __u32 per)
+/*
+ * output percent in human readable format or
+ * in json as floating point (ie. .12 == 12%)
+ */
+static void print_percent(const char *key, const char *fmt, __u32 per)
{
- snprintf(buf, len, "%g%%", (100. * per) / UINT32_MAX);
-}
+ double percent = (double) per / UINT32_MAX;
+ SPRINT_BUF(b1);
-static char *sprint_percent(__u32 per, char *buf)
-{
- print_percent(buf, SPRINT_BSIZE-1, per);
- return buf;
+ print_float(PRINT_JSON, key, NULL, per);
+ snprintf(b1, sizeof(b1), "%g%%", 100. * percent);
+ print_string(PRINT_FP, NULL, fmt, b1);
}
/*
@@ -526,8 +529,6 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
int len;
__u64 rate64 = 0;
- SPRINT_BUF(b1);
-
if (opt == NULL)
return 0;
@@ -585,83 +586,80 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
}
}
- fprintf(f, "limit %d", qopt.limit);
+ print_uint(PRINT_ANY, "limit", "limit %u", qopt.limit);
if (qopt.latency) {
- fprintf(f, " delay %s", sprint_ticks(qopt.latency, b1));
+ print_ticks("delay", " delay %s", qopt.latency);
if (qopt.jitter) {
- fprintf(f, " %s", sprint_ticks(qopt.jitter, b1));
+ print_ticks("jitter", " %s", qopt.jitter);
if (cor && cor->delay_corr)
- fprintf(f, " %s", sprint_percent(cor->delay_corr, b1));
+ print_percent("delay_corr", " %s",
+ cor->delay_corr);
}
}
if (qopt.loss) {
- fprintf(f, " loss %s", sprint_percent(qopt.loss, b1));
+ print_percent("loss", " loss %s", qopt.loss);
if (cor && cor->loss_corr)
- fprintf(f, " %s", sprint_percent(cor->loss_corr, b1));
+ print_percent("loss_corr", " %s", cor->loss_corr);
}
if (gimodel) {
- fprintf(f, " loss state p13 %s", sprint_percent(gimodel->p13, b1));
- fprintf(f, " p31 %s", sprint_percent(gimodel->p31, b1));
- fprintf(f, " p32 %s", sprint_percent(gimodel->p32, b1));
- fprintf(f, " p23 %s", sprint_percent(gimodel->p23, b1));
- fprintf(f, " p14 %s", sprint_percent(gimodel->p14, b1));
+ print_string(PRINT_ANY, "loss", "loss %s", "state");
+ print_percent("p13", "p13 %s", gimodel->p13);
+ print_percent("p31", " p31 %s", gimodel->p31);
+ print_percent("p32", " p32 %s", gimodel->p32);
+ print_percent("p23", " p23 %s", gimodel->p23);
+ print_percent("p14", " p14 %s", gimodel->p14);
}
if (gemodel) {
- 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(UINT32_MAX -
- gemodel->h, b1));
- fprintf(f, " 1-k %s", sprint_percent(gemodel->k1, b1));
+ print_string(PRINT_ANY, "loss", "loss %s", "gemodel");
+ print_percent("p", "p %s", gemodel->p);
+ print_percent("r", " r %s", gemodel->r);
+ print_percent("1_h", " 1-h %s", UINT32_MAX - gemodel->h);
+ print_percent("1_k", " 1-k %s", gemodel->k1);
}
if (qopt.duplicate) {
- fprintf(f, " duplicate %s",
- sprint_percent(qopt.duplicate, b1));
+ print_percent("duplicate", " duplicate %s", qopt.duplicate);
if (cor && cor->dup_corr)
- fprintf(f, " %s", sprint_percent(cor->dup_corr, b1));
+ print_percent("dup_corr", " %s", cor->dup_corr);
}
if (reorder && reorder->probability) {
- fprintf(f, " reorder %s",
- sprint_percent(reorder->probability, b1));
+ print_percent("reorder", " reorder %s", reorder->probability);
if (reorder->correlation)
- fprintf(f, " %s",
- sprint_percent(reorder->correlation, b1));
+ print_percent("reorder_corr", " %s",
+ reorder->correlation);
}
if (corrupt && corrupt->probability) {
- fprintf(f, " corrupt %s",
- sprint_percent(corrupt->probability, b1));
+ print_percent("corrupt", " corrupt %s", corrupt->probability);
if (corrupt->correlation)
- fprintf(f, " %s",
- sprint_percent(corrupt->correlation, b1));
+ print_percent("corrupt_corr", " %s", corrupt->correlation);
}
if (rate && rate->rate) {
- if (rate64)
- fprintf(f, " rate %s", sprint_rate(rate64, b1));
- else
- fprintf(f, " rate %s", sprint_rate(rate->rate, b1));
+ print_rate("rate", "rate %s", rate64 ? : rate->rate);
+
if (rate->packet_overhead)
- fprintf(f, " packetoverhead %d", rate->packet_overhead);
+ print_uint(PRINT_ANY, "packet_overhead",
+ " packetoverhead %d", rate->packet_overhead);
if (rate->cell_size)
- fprintf(f, " cellsize %u", rate->cell_size);
+ print_uint(PRINT_ANY, "cell_size",
+ " cellsize %u", rate->cell_size);
if (rate->cell_overhead)
- fprintf(f, " celloverhead %d", rate->cell_overhead);
+ print_uint(PRINT_ANY, "cell_overhead",
+ " celloverhead %d", rate->cell_overhead);
}
if (ecn)
- fprintf(f, " ecn ");
+ print_null(PRINT_ANY, "ecn", " ecn", NULL);
if (qopt.gap)
- fprintf(f, " gap %lu", (unsigned long)qopt.gap);
-
+ print_uint(PRINT_ANY, "gap", " gap %u", qopt.gap);
return 0;
}
--
2.18.0
Powered by blists - more mailing lists