* [RFC iproute2] tc/mqprio: json-ify output
@ 2020-11-27 15:26 Luca Boccassi
2020-11-28 5:21 ` Stephen Hemminger
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Luca Boccassi @ 2020-11-27 15:26 UTC (permalink / raw)
To: netdev; +Cc: stephen, Luca Boccassi
As reported by a Debian user, mqprio output in json mode is
invalid:
{
"kind": "mqprio",
"handle": "8021:",
"dev": "enp1s0f0",
"root": true,
"options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
queues:(0:3) (4:7)
mode:channel
shaper:dcb}
}
json-ify it, while trying to maintain the same formatting
for standard output.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
Signed-off-by: Luca Boccassi <bluca@debian.org>
---
I do not have hardware where I can configure mqprio, so I can't really
test this apart from compiling it. Stephen and David, do you have machines
where you can quickly check that this works as expected? Thanks!
tc/q_mqprio.c | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/tc/q_mqprio.c b/tc/q_mqprio.c
index f26ba8d7..f62ccbc6 100644
--- a/tc/q_mqprio.c
+++ b/tc/q_mqprio.c
@@ -243,13 +243,19 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
qopt = RTA_DATA(opt);
- fprintf(f, " tc %u map ", qopt->num_tc);
+ print_uint(PRINT_ANY, "tc", "tc %u ", qopt->num_tc);
+ open_json_array(PRINT_ANY, is_json_context() ? "map" : "map ");
for (i = 0; i <= TC_PRIO_MAX; i++)
- fprintf(f, "%u ", qopt->prio_tc_map[i]);
- fprintf(f, "\n queues:");
- for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "(%u:%u) ", qopt->offset[i],
- qopt->offset[i] + qopt->count[i] - 1);
+ print_uint(PRINT_ANY, NULL, "%u ", qopt->prio_tc_map[i]);
+ close_json_array(PRINT_ANY, "");
+ open_json_array(PRINT_ANY, is_json_context() ? "queues" : "\n queues:");
+ for (i = 0; i < qopt->num_tc; i++) {
+ open_json_array(PRINT_JSON, "");
+ print_uint(PRINT_ANY, NULL, "(%u:", qopt->offset[i]);
+ print_uint(PRINT_ANY, NULL, "%u) ", qopt->offset[i] + qopt->count[i] - 1);
+ close_json_array(PRINT_JSON, "");
+ }
+ close_json_array(PRINT_ANY, "");
if (len > 0) {
struct rtattr *tb[TCA_MQPRIO_MAX + 1];
@@ -262,18 +268,18 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
__u16 *mode = RTA_DATA(tb[TCA_MQPRIO_MODE]);
if (*mode == TC_MQPRIO_MODE_CHANNEL)
- fprintf(f, "\n mode:channel");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "channel");
} else {
- fprintf(f, "\n mode:dcb");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "dcb");
}
if (tb[TCA_MQPRIO_SHAPER]) {
__u16 *shaper = RTA_DATA(tb[TCA_MQPRIO_SHAPER]);
if (*shaper == TC_MQPRIO_SHAPER_BW_RATE)
- fprintf(f, "\n shaper:bw_rlimit");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "bw_rlimit");
} else {
- fprintf(f, "\n shaper:dcb");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "dcb");
}
if (tb[TCA_MQPRIO_MIN_RATE64]) {
@@ -287,9 +293,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(min++) = rta_getattr_u64(r);
}
- fprintf(f, " min_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "min_rate" : " min_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(min_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(min_rate64[i], b1));
}
if (tb[TCA_MQPRIO_MAX_RATE64]) {
@@ -303,9 +309,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(max++) = rta_getattr_u64(r);
}
- fprintf(f, " max_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "max_rate" : " max_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(max_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(max_rate64[i], b1));
}
}
return 0;
--
2.29.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC iproute2] tc/mqprio: json-ify output
2020-11-27 15:26 [RFC iproute2] tc/mqprio: json-ify output Luca Boccassi
@ 2020-11-28 5:21 ` Stephen Hemminger
2020-11-28 12:17 ` Luca Boccassi
2020-11-28 12:21 ` [PATCH iproute2 v2] " Luca Boccassi
2020-11-28 18:30 ` Luca Boccassi
2 siblings, 1 reply; 12+ messages in thread
From: Stephen Hemminger @ 2020-11-28 5:21 UTC (permalink / raw)
To: Luca Boccassi; +Cc: netdev
On Fri, 27 Nov 2020 15:26:25 +0000
Luca Boccassi <bluca@debian.org> wrote:
> As reported by a Debian user, mqprio output in json mode is
> invalid:
>
> {
> "kind": "mqprio",
> "handle": "8021:",
> "dev": "enp1s0f0",
> "root": true,
> "options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
> queues:(0:3) (4:7)
> mode:channel
> shaper:dcb}
> }
>
> json-ify it, while trying to maintain the same formatting
> for standard output.
>
> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
>
> Signed-off-by: Luca Boccassi <bluca@debian.org>
Did you try feeding that into the python parser?
What is before/after?
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC iproute2] tc/mqprio: json-ify output
2020-11-28 5:21 ` Stephen Hemminger
@ 2020-11-28 12:17 ` Luca Boccassi
2020-11-28 17:34 ` Stephen Hemminger
0 siblings, 1 reply; 12+ messages in thread
From: Luca Boccassi @ 2020-11-28 12:17 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
[-- Attachment #1: Type: text/plain, Size: 1363 bytes --]
On Fri, 2020-11-27 at 21:21 -0800, Stephen Hemminger wrote:
> On Fri, 27 Nov 2020 15:26:25 +0000
> Luca Boccassi <bluca@debian.org> wrote:
>
> > As reported by a Debian user, mqprio output in json mode is
> > invalid:
> >
> > {
> > "kind": "mqprio",
> > "handle": "8021:",
> > "dev": "enp1s0f0",
> > "root": true,
> > "options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
> > queues:(0:3) (4:7)
> > mode:channel
> > shaper:dcb}
> > }
> >
> > json-ify it, while trying to maintain the same formatting
> > for standard output.
> >
> > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
> >
> > Signed-off-by: Luca Boccassi <bluca@debian.org>
>
> Did you try feeding that into the python parser?
> What is before/after?
Uh, which python parser?
The reporter tested the patch, there's a small error. Before is above,
after is:
{
"kind": "mqprio",
"handle": "8001:",
"root": true,
"options": {
"tc": 2,
"map": [ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0 ],
"queues": [
"": [ 0,3 ],
"": [ 4,7 ] ],
"mode": "channel",
"shaper": "dcb"
}
}
Will fix the "queues" to remove the empty name in v2.
--
Kind regards,
Luca Boccassi
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH iproute2 v2] tc/mqprio: json-ify output
2020-11-27 15:26 [RFC iproute2] tc/mqprio: json-ify output Luca Boccassi
2020-11-28 5:21 ` Stephen Hemminger
@ 2020-11-28 12:21 ` Luca Boccassi
2020-11-28 15:24 ` Luca Boccassi
2020-11-28 18:30 ` Luca Boccassi
2 siblings, 1 reply; 12+ messages in thread
From: Luca Boccassi @ 2020-11-28 12:21 UTC (permalink / raw)
To: netdev; +Cc: stephen
As reported by a Debian user, mqprio output in json mode is
invalid:
{
"kind": "mqprio",
"handle": "8021:",
"dev": "enp1s0f0",
"root": true,
"options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
queues:(0:3) (4:7)
mode:channel
shaper:dcb}
}
json-ify it, while trying to maintain the same formatting
for standard output.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
Reported-by: Roméo GINON <romeo.ginon@ilexia.com>
Signed-off-by: Luca Boccassi <bluca@debian.org>
---
v1: I do not have hardware where I can configure mqprio, so I can't really
test this apart from compiling it. Stephen and David, do you have machines
where you can quickly check that this works as expected? Thanks!
v2: the original reporter tested the patch and reported this is the new output:
{
"kind": "mqprio",
"handle": "8001:",
"root": true,
"options": {
"tc": 2,
"map": [ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0 ],
"queues": [
"": [ 0,3 ],
"": [ 4,7 ] ],
"mode": "channel",
"shaper": "dcb"
}
}
Changed in v2 to make the inner queues arrays anonymous
("" -> NULL for open/close_json_array)
Still would appreciate testing from someone else who has hardware
that supports this feature and can enable this, as I am flying blind.
tc/q_mqprio.c | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/tc/q_mqprio.c b/tc/q_mqprio.c
index f26ba8d7..a128fc11 100644
--- a/tc/q_mqprio.c
+++ b/tc/q_mqprio.c
@@ -243,13 +243,19 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
qopt = RTA_DATA(opt);
- fprintf(f, " tc %u map ", qopt->num_tc);
+ print_uint(PRINT_ANY, "tc", "tc %u ", qopt->num_tc);
+ open_json_array(PRINT_ANY, is_json_context() ? "map" : "map ");
for (i = 0; i <= TC_PRIO_MAX; i++)
- fprintf(f, "%u ", qopt->prio_tc_map[i]);
- fprintf(f, "\n queues:");
- for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "(%u:%u) ", qopt->offset[i],
- qopt->offset[i] + qopt->count[i] - 1);
+ print_uint(PRINT_ANY, NULL, "%u ", qopt->prio_tc_map[i]);
+ close_json_array(PRINT_ANY, "");
+ open_json_array(PRINT_ANY, is_json_context() ? "queues" : "\n queues:");
+ for (i = 0; i < qopt->num_tc; i++) {
+ open_json_array(PRINT_JSON, NULL);
+ print_uint(PRINT_ANY, NULL, "(%u:", qopt->offset[i]);
+ print_uint(PRINT_ANY, NULL, "%u) ", qopt->offset[i] + qopt->count[i] - 1);
+ close_json_array(PRINT_JSON, NULL);
+ }
+ close_json_array(PRINT_ANY, "");
if (len > 0) {
struct rtattr *tb[TCA_MQPRIO_MAX + 1];
@@ -262,18 +268,18 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
__u16 *mode = RTA_DATA(tb[TCA_MQPRIO_MODE]);
if (*mode == TC_MQPRIO_MODE_CHANNEL)
- fprintf(f, "\n mode:channel");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "channel");
} else {
- fprintf(f, "\n mode:dcb");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "dcb");
}
if (tb[TCA_MQPRIO_SHAPER]) {
__u16 *shaper = RTA_DATA(tb[TCA_MQPRIO_SHAPER]);
if (*shaper == TC_MQPRIO_SHAPER_BW_RATE)
- fprintf(f, "\n shaper:bw_rlimit");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "bw_rlimit");
} else {
- fprintf(f, "\n shaper:dcb");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "dcb");
}
if (tb[TCA_MQPRIO_MIN_RATE64]) {
@@ -287,9 +293,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(min++) = rta_getattr_u64(r);
}
- fprintf(f, " min_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "min_rate" : " min_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(min_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(min_rate64[i], b1));
}
if (tb[TCA_MQPRIO_MAX_RATE64]) {
@@ -303,9 +309,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(max++) = rta_getattr_u64(r);
}
- fprintf(f, " max_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "max_rate" : " max_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(max_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(max_rate64[i], b1));
}
}
return 0;
--
2.29.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 v2] tc/mqprio: json-ify output
2020-11-28 12:21 ` [PATCH iproute2 v2] " Luca Boccassi
@ 2020-11-28 15:24 ` Luca Boccassi
0 siblings, 0 replies; 12+ messages in thread
From: Luca Boccassi @ 2020-11-28 15:24 UTC (permalink / raw)
To: netdev; +Cc: stephen
[-- Attachment #1: Type: text/plain, Size: 1815 bytes --]
On Sat, 2020-11-28 at 12:21 +0000, Luca Boccassi wrote:
> As reported by a Debian user, mqprio output in json mode is
> invalid:
>
> {
> "kind": "mqprio",
> "handle": "8021:",
> "dev": "enp1s0f0",
> "root": true,
> "options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
> queues:(0:3) (4:7)
> mode:channel
> shaper:dcb}
> }
>
> json-ify it, while trying to maintain the same formatting
> for standard output.
>
> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
>
> Reported-by: Roméo GINON <romeo.ginon@ilexia.com>
> Signed-off-by: Luca Boccassi <bluca@debian.org>
> ---
> v1: I do not have hardware where I can configure mqprio, so I can't
> really
> test this apart from compiling it. Stephen and David, do you have
> machines
> where you can quickly check that this works as expected? Thanks!
>
> v2: the original reporter tested the patch and reported this is the
> new output:
>
> {
> "kind": "mqprio",
> "handle": "8001:",
> "root": true,
> "options": {
> "tc": 2,
> "map": [ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0 ],
> "queues": [
> "": [ 0,3 ],
> "": [ 4,7 ] ],
> "mode": "channel",
> "shaper": "dcb"
> }
> }
>
> Changed in v2 to make the inner queues arrays anonymous
> ("" -> NULL for open/close_json_array)
>
> Still would appreciate testing from someone else who has hardware
> that supports this feature and can enable this, as I am flying blind.
The reporter confirmed the json output is now valid with this patch on
the debian bug report.
--
Kind regards,
Luca Boccassi
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC iproute2] tc/mqprio: json-ify output
2020-11-28 12:17 ` Luca Boccassi
@ 2020-11-28 17:34 ` Stephen Hemminger
2020-11-28 17:59 ` Luca Boccassi
0 siblings, 1 reply; 12+ messages in thread
From: Stephen Hemminger @ 2020-11-28 17:34 UTC (permalink / raw)
To: Luca Boccassi; +Cc: netdev
[-- Attachment #1: Type: text/plain, Size: 1624 bytes --]
On Sat, 28 Nov 2020 12:17:00 +0000
Luca Boccassi <bluca@debian.org> wrote:
> On Fri, 2020-11-27 at 21:21 -0800, Stephen Hemminger wrote:
> > On Fri, 27 Nov 2020 15:26:25 +0000
> > Luca Boccassi <bluca@debian.org> wrote:
> >
> > > As reported by a Debian user, mqprio output in json mode is
> > > invalid:
> > >
> > > {
> > > "kind": "mqprio",
> > > "handle": "8021:",
> > > "dev": "enp1s0f0",
> > > "root": true,
> > > "options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
> > > queues:(0:3) (4:7)
> > > mode:channel
> > > shaper:dcb}
> > > }
> > >
> > > json-ify it, while trying to maintain the same formatting
> > > for standard output.
> > >
> > > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
> > >
> > > Signed-off-by: Luca Boccassi <bluca@debian.org>
> >
> > Did you try feeding that into the python parser?
> > What is before/after?
>
> Uh, which python parser?
>
> The reporter tested the patch, there's a small error. Before is above,
> after is:
>
> {
> "kind": "mqprio",
> "handle": "8001:",
> "root": true,
> "options": {
> "tc": 2,
> "map": [ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0 ],
> "queues": [
> "": [ 0,3 ],
> "": [ 4,7 ] ],
> "mode": "channel",
> "shaper": "dcb"
> }
> }
>
> Will fix the "queues" to remove the empty name in v2.
Try:
$ tc -j qdisc | pythom -m json.tools
The empty tags are non-standard practice can it be done better?
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC iproute2] tc/mqprio: json-ify output
2020-11-28 17:34 ` Stephen Hemminger
@ 2020-11-28 17:59 ` Luca Boccassi
0 siblings, 0 replies; 12+ messages in thread
From: Luca Boccassi @ 2020-11-28 17:59 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
[-- Attachment #1: Type: text/plain, Size: 8663 bytes --]
On Sat, 2020-11-28 at 09:34 -0800, Stephen Hemminger wrote:
> On Sat, 28 Nov 2020 12:17:00 +0000
> Luca Boccassi <bluca@debian.org> wrote:
>
> > On Fri, 2020-11-27 at 21:21 -0800, Stephen Hemminger wrote:
> > > On Fri, 27 Nov 2020 15:26:25 +0000
> > > Luca Boccassi <bluca@debian.org> wrote:
> > >
> > > > As reported by a Debian user, mqprio output in json mode is
> > > > invalid:
> > > >
> > > > {
> > > > "kind": "mqprio",
> > > > "handle": "8021:",
> > > > "dev": "enp1s0f0",
> > > > "root": true,
> > > > "options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
> > > > queues:(0:3) (4:7)
> > > > mode:channel
> > > > shaper:dcb}
> > > > }
> > > >
> > > > json-ify it, while trying to maintain the same formatting
> > > > for standard output.
> > > >
> > > > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
> > > >
> > > > Signed-off-by: Luca Boccassi <bluca@debian.org>
> > >
> > > Did you try feeding that into the python parser?
> > > What is before/after?
> >
> > Uh, which python parser?
> >
> > The reporter tested the patch, there's a small error. Before is
> > above,
> > after is:
> >
> > {
> > "kind": "mqprio",
> > "handle": "8001:",
> > "root": true,
> > "options": {
> > "tc": 2,
> > "map": [ 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0 ],
> > "queues": [
> > "": [ 0,3 ],
> > "": [ 4,7 ] ],
> > "mode": "channel",
> > "shaper": "dcb"
> > }
> > }
> >
> > Will fix the "queues" to remove the empty name in v2.
>
> Try:
> $ tc -j qdisc | pythom -m json.tools
>
> The empty tags are non-standard practice can it be done better?
Yes, v2 that I sent earlier fixed the empty tags. Python's json.tools
is happy.
The test of v2 from the reporter gave this output:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784#27
[{"kind":"mqprio","handle":"8001:","root":true,"options":{"tc":2,"map":[0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0],"queues":[[0,3],[4,7]],"mode":"channel","shaper":"dcb"}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:8","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:7","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:6","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:5","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:4","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:3","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:2","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}},{"kind":"pfifo_fast","handle":"0:","parent":"8001:1","options":{"bands":3,"priomap ":[1,2,2,2,1,2,0,0,1,1,1,1,1,1,1,1],"multiqueue":false}}]
Which when fed to python3 -m json.utils gives:
[
{
"kind": "mqprio",
"handle": "8001:",
"root": true,
"options": {
"tc": 2,
"map": [
0,
0,
0,
1,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"queues": [
[
0,
3
],
[
4,
7
]
],
"mode": "channel",
"shaper": "dcb"
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:8",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:7",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:6",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:5",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:4",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:3",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:2",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
},
{
"kind": "pfifo_fast",
"handle": "0:",
"parent": "8001:1",
"options": {
"bands": 3,
"priomap ": [
1,
2,
2,
2,
1,
2,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1
],
"multiqueue": false
}
}
]
--
Kind regards,
Luca Boccassi
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH iproute2 v2] tc/mqprio: json-ify output
2020-11-27 15:26 [RFC iproute2] tc/mqprio: json-ify output Luca Boccassi
2020-11-28 5:21 ` Stephen Hemminger
2020-11-28 12:21 ` [PATCH iproute2 v2] " Luca Boccassi
@ 2020-11-28 18:30 ` Luca Boccassi
2020-12-02 16:42 ` David Ahern
2020-12-02 17:08 ` [PATCH v3] " luca.boccassi
2 siblings, 2 replies; 12+ messages in thread
From: Luca Boccassi @ 2020-11-28 18:30 UTC (permalink / raw)
To: netdev; +Cc: stephen
As reported by a Debian user, mqprio output in json mode is
invalid:
{
"kind": "mqprio",
"handle": "8021:",
"dev": "enp1s0f0",
"root": true,
"options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
queues:(0:3) (4:7)
mode:channel
shaper:dcb}
}
json-ify it, while trying to maintain the same formatting
for standard output.
New output:
{
"kind": "mqprio",
"handle": "8001:",
"root": true,
"options": {
"tc": 2,
"map": [ 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
"queues": [ [ 0, 3 ], [ 4, 7 ] ],
"mode": "channel",
"shaper": "dcb"
}
}
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
Reported-by: Roméo GINON <romeo.ginon@ilexia.com>
Signed-off-by: Luca Boccassi <bluca@debian.org>
---
v2: the original reporter tested the patch, new output added to commit message.
Fixed empty tag in queues nested arrays.
Output is accepted by python3 -m json.tool
tc/q_mqprio.c | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/tc/q_mqprio.c b/tc/q_mqprio.c
index f26ba8d7..a128fc11 100644
--- a/tc/q_mqprio.c
+++ b/tc/q_mqprio.c
@@ -243,13 +243,19 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
qopt = RTA_DATA(opt);
- fprintf(f, " tc %u map ", qopt->num_tc);
+ print_uint(PRINT_ANY, "tc", "tc %u ", qopt->num_tc);
+ open_json_array(PRINT_ANY, is_json_context() ? "map" : "map ");
for (i = 0; i <= TC_PRIO_MAX; i++)
- fprintf(f, "%u ", qopt->prio_tc_map[i]);
- fprintf(f, "\n queues:");
- for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "(%u:%u) ", qopt->offset[i],
- qopt->offset[i] + qopt->count[i] - 1);
+ print_uint(PRINT_ANY, NULL, "%u ", qopt->prio_tc_map[i]);
+ close_json_array(PRINT_ANY, "");
+ open_json_array(PRINT_ANY, is_json_context() ? "queues" : "\n queues:");
+ for (i = 0; i < qopt->num_tc; i++) {
+ open_json_array(PRINT_JSON, NULL);
+ print_uint(PRINT_ANY, NULL, "(%u:", qopt->offset[i]);
+ print_uint(PRINT_ANY, NULL, "%u) ", qopt->offset[i] + qopt->count[i] - 1);
+ close_json_array(PRINT_JSON, NULL);
+ }
+ close_json_array(PRINT_ANY, "");
if (len > 0) {
struct rtattr *tb[TCA_MQPRIO_MAX + 1];
@@ -262,18 +268,18 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
__u16 *mode = RTA_DATA(tb[TCA_MQPRIO_MODE]);
if (*mode == TC_MQPRIO_MODE_CHANNEL)
- fprintf(f, "\n mode:channel");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "channel");
} else {
- fprintf(f, "\n mode:dcb");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "dcb");
}
if (tb[TCA_MQPRIO_SHAPER]) {
__u16 *shaper = RTA_DATA(tb[TCA_MQPRIO_SHAPER]);
if (*shaper == TC_MQPRIO_SHAPER_BW_RATE)
- fprintf(f, "\n shaper:bw_rlimit");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "bw_rlimit");
} else {
- fprintf(f, "\n shaper:dcb");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "dcb");
}
if (tb[TCA_MQPRIO_MIN_RATE64]) {
@@ -287,9 +293,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(min++) = rta_getattr_u64(r);
}
- fprintf(f, " min_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "min_rate" : " min_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(min_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(min_rate64[i], b1));
}
if (tb[TCA_MQPRIO_MAX_RATE64]) {
@@ -303,9 +309,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(max++) = rta_getattr_u64(r);
}
- fprintf(f, " max_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "max_rate" : " max_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(max_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(max_rate64[i], b1));
}
}
return 0;
--
2.29.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 v2] tc/mqprio: json-ify output
2020-11-28 18:30 ` Luca Boccassi
@ 2020-12-02 16:42 ` David Ahern
2020-12-02 17:09 ` Luca Boccassi
2020-12-02 17:08 ` [PATCH v3] " luca.boccassi
1 sibling, 1 reply; 12+ messages in thread
From: David Ahern @ 2020-12-02 16:42 UTC (permalink / raw)
To: Luca Boccassi, netdev; +Cc: stephen
On 11/28/20 11:30 AM, Luca Boccassi wrote:
> @@ -287,9 +293,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
> return -1;
> *(min++) = rta_getattr_u64(r);
> }
> - fprintf(f, " min_rate:");
> + open_json_array(PRINT_ANY, is_json_context() ? "min_rate" : " min_rate:");
> for (i = 0; i < qopt->num_tc; i++)
> - fprintf(f, "%s ", sprint_rate(min_rate64[i], b1));
> + print_string(PRINT_ANY, NULL, "%s ", sprint_rate(min_rate64[i], b1));
close_json_array?
> }
>
> if (tb[TCA_MQPRIO_MAX_RATE64]) {
> @@ -303,9 +309,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
> return -1;
> *(max++) = rta_getattr_u64(r);
> }
> - fprintf(f, " max_rate:");
> + open_json_array(PRINT_ANY, is_json_context() ? "max_rate" : " max_rate:");
> for (i = 0; i < qopt->num_tc; i++)
> - fprintf(f, "%s ", sprint_rate(max_rate64[i], b1));
> + print_string(PRINT_ANY, NULL, "%s ", sprint_rate(max_rate64[i], b1));
> }
close_json_array?
> }
> return 0;
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3] tc/mqprio: json-ify output
2020-11-28 18:30 ` Luca Boccassi
2020-12-02 16:42 ` David Ahern
@ 2020-12-02 17:08 ` luca.boccassi
2020-12-03 16:40 ` patchwork-bot+netdevbpf
1 sibling, 1 reply; 12+ messages in thread
From: luca.boccassi @ 2020-12-02 17:08 UTC (permalink / raw)
To: netdev; +Cc: stephen, dsahern
From: Luca Boccassi <bluca@debian.org>
As reported by a Debian user, mqprio output in json mode is
invalid:
{
"kind": "mqprio",
"handle": "8021:",
"dev": "enp1s0f0",
"root": true,
"options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
queues:(0:3) (4:7)
mode:channel
shaper:dcb}
}
json-ify it, while trying to maintain the same formatting
for standard output.
New output:
{
"kind": "mqprio",
"handle": "8001:",
"root": true,
"options": {
"tc": 2,
"map": [ 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
"queues": [ [ 0, 3 ], [ 4, 7 ] ],
"mode": "channel",
"shaper": "dcb"
}
}
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972784
Reported-by: Roméo GINON <romeo.ginon@ilexia.com>
Signed-off-by: Luca Boccassi <bluca@debian.org>
---
v2: the original reporter tested the patch, new output added to commit message.
Fixed empty tag in queues nested arrays.
Output is accepted by python3 -m json.tool
v3: add missing close_json_array()
tc/q_mqprio.c | 36 ++++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 14 deletions(-)
diff --git a/tc/q_mqprio.c b/tc/q_mqprio.c
index f26ba8d7..5499f621 100644
--- a/tc/q_mqprio.c
+++ b/tc/q_mqprio.c
@@ -243,13 +243,19 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
qopt = RTA_DATA(opt);
- fprintf(f, " tc %u map ", qopt->num_tc);
+ print_uint(PRINT_ANY, "tc", "tc %u ", qopt->num_tc);
+ open_json_array(PRINT_ANY, is_json_context() ? "map" : "map ");
for (i = 0; i <= TC_PRIO_MAX; i++)
- fprintf(f, "%u ", qopt->prio_tc_map[i]);
- fprintf(f, "\n queues:");
- for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "(%u:%u) ", qopt->offset[i],
- qopt->offset[i] + qopt->count[i] - 1);
+ print_uint(PRINT_ANY, NULL, "%u ", qopt->prio_tc_map[i]);
+ close_json_array(PRINT_ANY, "");
+ open_json_array(PRINT_ANY, is_json_context() ? "queues" : "\n queues:");
+ for (i = 0; i < qopt->num_tc; i++) {
+ open_json_array(PRINT_JSON, NULL);
+ print_uint(PRINT_ANY, NULL, "(%u:", qopt->offset[i]);
+ print_uint(PRINT_ANY, NULL, "%u) ", qopt->offset[i] + qopt->count[i] - 1);
+ close_json_array(PRINT_JSON, NULL);
+ }
+ close_json_array(PRINT_ANY, "");
if (len > 0) {
struct rtattr *tb[TCA_MQPRIO_MAX + 1];
@@ -262,18 +268,18 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
__u16 *mode = RTA_DATA(tb[TCA_MQPRIO_MODE]);
if (*mode == TC_MQPRIO_MODE_CHANNEL)
- fprintf(f, "\n mode:channel");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "channel");
} else {
- fprintf(f, "\n mode:dcb");
+ print_string(PRINT_ANY, "mode", "\n mode:%s", "dcb");
}
if (tb[TCA_MQPRIO_SHAPER]) {
__u16 *shaper = RTA_DATA(tb[TCA_MQPRIO_SHAPER]);
if (*shaper == TC_MQPRIO_SHAPER_BW_RATE)
- fprintf(f, "\n shaper:bw_rlimit");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "bw_rlimit");
} else {
- fprintf(f, "\n shaper:dcb");
+ print_string(PRINT_ANY, "shaper", "\n shaper:%s", "dcb");
}
if (tb[TCA_MQPRIO_MIN_RATE64]) {
@@ -287,9 +293,10 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(min++) = rta_getattr_u64(r);
}
- fprintf(f, " min_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "min_rate" : " min_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(min_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(min_rate64[i], b1));
+ close_json_array(PRINT_ANY, "");
}
if (tb[TCA_MQPRIO_MAX_RATE64]) {
@@ -303,9 +310,10 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
return -1;
*(max++) = rta_getattr_u64(r);
}
- fprintf(f, " max_rate:");
+ open_json_array(PRINT_ANY, is_json_context() ? "max_rate" : " max_rate:");
for (i = 0; i < qopt->num_tc; i++)
- fprintf(f, "%s ", sprint_rate(max_rate64[i], b1));
+ print_string(PRINT_ANY, NULL, "%s ", sprint_rate(max_rate64[i], b1));
+ close_json_array(PRINT_ANY, "");
}
}
return 0;
--
2.27.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 v2] tc/mqprio: json-ify output
2020-12-02 16:42 ` David Ahern
@ 2020-12-02 17:09 ` Luca Boccassi
0 siblings, 0 replies; 12+ messages in thread
From: Luca Boccassi @ 2020-12-02 17:09 UTC (permalink / raw)
To: David Ahern, netdev; +Cc: stephen
[-- Attachment #1: Type: text/plain, Size: 1293 bytes --]
On Wed, 2020-12-02 at 09:42 -0700, David Ahern wrote:
> On 11/28/20 11:30 AM, Luca Boccassi wrote:
> > @@ -287,9 +293,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
> > return -1;
> > *(min++) = rta_getattr_u64(r);
> > }
> > - fprintf(f, " min_rate:");
> > + open_json_array(PRINT_ANY, is_json_context() ? "min_rate" : " min_rate:");
> > for (i = 0; i < qopt->num_tc; i++)
> > - fprintf(f, "%s ", sprint_rate(min_rate64[i], b1));
> > + print_string(PRINT_ANY, NULL, "%s ", sprint_rate(min_rate64[i], b1));
>
> close_json_array?
>
> > }
> >
> > if (tb[TCA_MQPRIO_MAX_RATE64]) {
> > @@ -303,9 +309,9 @@ static int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
> > return -1;
> > *(max++) = rta_getattr_u64(r);
> > }
> > - fprintf(f, " max_rate:");
> > + open_json_array(PRINT_ANY, is_json_context() ? "max_rate" : " max_rate:");
> > for (i = 0; i < qopt->num_tc; i++)
> > - fprintf(f, "%s ", sprint_rate(max_rate64[i], b1));
> > + print_string(PRINT_ANY, NULL, "%s ", sprint_rate(max_rate64[i], b1));
> > }
>
> close_json_array?
>
> > }
> > return 0;
> >
Whops, fixed in v3, thanks.
--
Kind regards,
Luca Boccassi
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3] tc/mqprio: json-ify output
2020-12-02 17:08 ` [PATCH v3] " luca.boccassi
@ 2020-12-03 16:40 ` patchwork-bot+netdevbpf
0 siblings, 0 replies; 12+ messages in thread
From: patchwork-bot+netdevbpf @ 2020-12-03 16:40 UTC (permalink / raw)
To: Luca Boccassi; +Cc: netdev, stephen, dsahern
Hello:
This patch was applied to iproute2/iproute2.git (refs/heads/main):
On Wed, 2 Dec 2020 17:08:45 +0000 you wrote:
> From: Luca Boccassi <bluca@debian.org>
>
> As reported by a Debian user, mqprio output in json mode is
> invalid:
>
> {
> "kind": "mqprio",
> "handle": "8021:",
> "dev": "enp1s0f0",
> "root": true,
> "options": { tc 2 map 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
> queues:(0:3) (4:7)
> mode:channel
> shaper:dcb}
> }
>
> [...]
Here is the summary with links:
- [v3] tc/mqprio: json-ify output
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=755b1c584eee
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2020-12-03 16:41 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-27 15:26 [RFC iproute2] tc/mqprio: json-ify output Luca Boccassi
2020-11-28 5:21 ` Stephen Hemminger
2020-11-28 12:17 ` Luca Boccassi
2020-11-28 17:34 ` Stephen Hemminger
2020-11-28 17:59 ` Luca Boccassi
2020-11-28 12:21 ` [PATCH iproute2 v2] " Luca Boccassi
2020-11-28 15:24 ` Luca Boccassi
2020-11-28 18:30 ` Luca Boccassi
2020-12-02 16:42 ` David Ahern
2020-12-02 17:09 ` Luca Boccassi
2020-12-02 17:08 ` [PATCH v3] " luca.boccassi
2020-12-03 16:40 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).