* [PATCH iproute2 v4 0/2] add json support on tc u32
@ 2022-01-18 2:42 Wen Liang
2022-01-18 2:42 ` [PATCH iproute2 v4 1/2] tc: u32: add support for json output Wen Liang
2022-01-18 2:42 ` [PATCH iproute2 v4 2/2] tc: u32: add json support in `print_raw`, `print_ipv4`, `print_ipv6` Wen Liang
0 siblings, 2 replies; 6+ messages in thread
From: Wen Liang @ 2022-01-18 2:42 UTC (permalink / raw)
To: netdev; +Cc: stephen, dsahern, aclaudi
From: Wen Liang <wenliang@redhat.com>
This adds support for json output on tc u32.
- The first patch is replacing with proper json functions in `u32_print_opt()`
- The second patch is fixing the json support in u32 `print_raw()`, `print_ipv4()`
and `print_ipv6()`
The patches were tested with jq parser.
Wen Liang (2):
tc: u32: add support for json output
tc: u32: add json support in `print_raw`, `print_ipv4`, `print_ipv6`
tc/f_u32.c | 197 ++++++++++++++++++++++++++++++++---------------------
1 file changed, 119 insertions(+), 78 deletions(-)
--
2.26.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH iproute2 v4 1/2] tc: u32: add support for json output
2022-01-18 2:42 [PATCH iproute2 v4 0/2] add json support on tc u32 Wen Liang
@ 2022-01-18 2:42 ` Wen Liang
2022-01-18 4:30 ` Stephen Hemminger
2022-01-18 20:04 ` David Ahern
2022-01-18 2:42 ` [PATCH iproute2 v4 2/2] tc: u32: add json support in `print_raw`, `print_ipv4`, `print_ipv6` Wen Liang
1 sibling, 2 replies; 6+ messages in thread
From: Wen Liang @ 2022-01-18 2:42 UTC (permalink / raw)
To: netdev; +Cc: stephen, dsahern, aclaudi
Currently u32 filter output does not support json. This commit uses
proper json functions to add support for it.
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
---
tc/f_u32.c | 78 +++++++++++++++++++++++++++++-------------------------
1 file changed, 42 insertions(+), 36 deletions(-)
diff --git a/tc/f_u32.c b/tc/f_u32.c
index a5747f67..03dbe774 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -1213,11 +1213,11 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
if (handle) {
SPRINT_BUF(b1);
- fprintf(f, "fh %s ", sprint_u32_handle(handle, b1));
+ print_string(PRINT_ANY, "fh", "fh %s ", sprint_u32_handle(handle, b1));
}
if (TC_U32_NODE(handle))
- fprintf(f, "order %d ", TC_U32_NODE(handle));
+ print_int(PRINT_ANY, "order", "order %d ", TC_U32_NODE(handle));
if (tb[TCA_U32_SEL]) {
if (RTA_PAYLOAD(tb[TCA_U32_SEL]) < sizeof(*sel))
@@ -1227,15 +1227,14 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
}
if (tb[TCA_U32_DIVISOR]) {
- fprintf(f, "ht divisor %d ",
- rta_getattr_u32(tb[TCA_U32_DIVISOR]));
+ __u32 htdivisor = rta_getattr_u32(tb[TCA_U32_DIVISOR]);
+ print_int(PRINT_ANY, "ht_divisor", "ht divisor %d ", htdivisor);
} else if (tb[TCA_U32_HASH]) {
__u32 htid = rta_getattr_u32(tb[TCA_U32_HASH]);
-
- fprintf(f, "key ht %x bkt %x ", TC_U32_USERHTID(htid),
- TC_U32_HASH(htid));
+ print_hex(PRINT_ANY, "key_ht", "key ht %x ", TC_U32_USERHTID(htid));
+ print_hex(PRINT_ANY, "bkt", "bkt %x ", TC_U32_HASH(htid));
} else {
- fprintf(f, "??? ");
+ fprintf(stderr, "divisor and hash missing ");
}
if (tb[TCA_U32_CLASSID]) {
SPRINT_BUF(b1);
@@ -1244,27 +1243,26 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
sprint_tc_classid(rta_getattr_u32(tb[TCA_U32_CLASSID]),
b1));
} else if (sel && sel->flags & TC_U32_TERMINAL) {
- fprintf(f, "terminal flowid ??? ");
+ fprintf(stderr, "terminal flowid ???");
}
if (tb[TCA_U32_LINK]) {
SPRINT_BUF(b1);
- fprintf(f, "link %s ",
- sprint_u32_handle(rta_getattr_u32(tb[TCA_U32_LINK]),
- b1));
+ char *link = sprint_u32_handle(rta_getattr_u32(tb[TCA_U32_LINK]),b1);
+ print_string(PRINT_ANY, "link", "link %s ", link);
}
if (tb[TCA_U32_FLAGS]) {
__u32 flags = rta_getattr_u32(tb[TCA_U32_FLAGS]);
if (flags & TCA_CLS_FLAGS_SKIP_HW)
- fprintf(f, "skip_hw ");
+ print_bool(PRINT_ANY, "skip_hw", "skip_hw ", true);
if (flags & TCA_CLS_FLAGS_SKIP_SW)
- fprintf(f, "skip_sw ");
+ print_bool(PRINT_ANY, "skip_sw", "skip_sw ", true);
if (flags & TCA_CLS_FLAGS_IN_HW)
- fprintf(f, "in_hw ");
+ print_bool(PRINT_ANY, "in_hw", "in_hw ", true);
else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
- fprintf(f, "not_in_hw ");
+ print_bool(PRINT_ANY, "not_in_hw", "not_in_hw ", true);
}
if (tb[TCA_U32_PCNT]) {
@@ -1275,10 +1273,10 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
pf = RTA_DATA(tb[TCA_U32_PCNT]);
}
- if (sel && show_stats && NULL != pf)
- fprintf(f, " (rule hit %llu success %llu)",
- (unsigned long long) pf->rcnt,
- (unsigned long long) pf->rhit);
+ if (sel && show_stats && NULL != pf) {
+ print_u64(PRINT_ANY, "rule_hit", "(rule hit %llu ", pf->rcnt);
+ print_u64(PRINT_ANY, "success", "success %llu)", pf->rhit);
+ }
if (tb[TCA_U32_MARK]) {
struct tc_u32_mark *mark = RTA_DATA(tb[TCA_U32_MARK]);
@@ -1286,8 +1284,10 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
if (RTA_PAYLOAD(tb[TCA_U32_MARK]) < sizeof(*mark)) {
fprintf(f, "\n Invalid mark (kernel&iproute2 mismatch)\n");
} else {
- fprintf(f, "\n mark 0x%04x 0x%04x (success %d)",
- mark->val, mark->mask, mark->success);
+ print_nl();
+ print_0xhex(PRINT_ANY, "fwmark_value", " mark 0x%04x ", mark->val);
+ print_0xhex(PRINT_ANY, "fwmark_mask", "0x%04x ", mark->mask);
+ print_int(PRINT_ANY, "fwmark_success", "(success %d)", mark->success);
}
}
@@ -1298,38 +1298,44 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
for (i = 0; i < sel->nkeys; i++) {
show_keys(f, sel->keys + i);
if (show_stats && NULL != pf)
- fprintf(f, " (success %llu ) ",
- (unsigned long long) pf->kcnts[i]);
+ print_u64(PRINT_ANY, "success", " (success %llu ) ",
+ pf->kcnts[i]);
}
}
if (sel->flags & (TC_U32_VAROFFSET | TC_U32_OFFSET)) {
- fprintf(f, "\n offset ");
- if (sel->flags & TC_U32_VAROFFSET)
- fprintf(f, "%04x>>%d at %d ",
- ntohs(sel->offmask),
- sel->offshift, sel->offoff);
+ print_nl();
+ print_string(PRINT_ANY, NULL, "%s", " offset ");
+ if (sel->flags & TC_U32_VAROFFSET) {
+ print_hex(PRINT_ANY, "offset_mask", "%04x", ntohs(sel->offmask));
+ print_int(PRINT_ANY, "offset_shift", ">>%d ", sel->offshift);
+ print_int(PRINT_ANY, "offset_off", "at %d ", sel->offoff);
+ }
if (sel->off)
- fprintf(f, "plus %d ", sel->off);
+ print_int(PRINT_ANY, "plus", "plus %d ", sel->off);
}
if (sel->flags & TC_U32_EAT)
- fprintf(f, " eat ");
+ print_string(PRINT_ANY, NULL, "%s", " eat ");
if (sel->hmask) {
- fprintf(f, "\n hash mask %08x at %d ",
- (unsigned int)htonl(sel->hmask), sel->hoff);
+ print_nl();
+ unsigned int hmask = (unsigned int)htonl(sel->hmask);
+ print_hex(PRINT_ANY, "hash_mask", " hash mask %08x ", hmask);
+ print_int(PRINT_ANY, "hash_off", "at %d ", sel->hoff);
}
}
if (tb[TCA_U32_POLICE]) {
- fprintf(f, "\n");
+ print_nl();
tc_print_police(f, tb[TCA_U32_POLICE]);
}
if (tb[TCA_U32_INDEV]) {
struct rtattr *idev = tb[TCA_U32_INDEV];
-
- fprintf(f, "\n input dev %s\n", rta_getattr_str(idev));
+ print_nl();
+ print_string(PRINT_ANY, "input_dev", " input dev %s",
+ rta_getattr_str(idev));
+ print_nl();
}
if (tb[TCA_U32_ACT])
--
2.26.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH iproute2 v4 2/2] tc: u32: add json support in `print_raw`, `print_ipv4`, `print_ipv6`
2022-01-18 2:42 [PATCH iproute2 v4 0/2] add json support on tc u32 Wen Liang
2022-01-18 2:42 ` [PATCH iproute2 v4 1/2] tc: u32: add support for json output Wen Liang
@ 2022-01-18 2:42 ` Wen Liang
2022-01-18 4:32 ` Stephen Hemminger
1 sibling, 1 reply; 6+ messages in thread
From: Wen Liang @ 2022-01-18 2:42 UTC (permalink / raw)
To: netdev; +Cc: stephen, dsahern, aclaudi
Signed-off-by: Wen Liang <liangwen12year@gmail.com>
---
tc/f_u32.c | 119 ++++++++++++++++++++++++++++++++++-------------------
1 file changed, 77 insertions(+), 42 deletions(-)
diff --git a/tc/f_u32.c b/tc/f_u32.c
index 03dbe774..93c8a840 100644
--- a/tc/f_u32.c
+++ b/tc/f_u32.c
@@ -824,23 +824,27 @@ static void print_ipv4(FILE *f, const struct tc_u32_key *key)
{
char abuf[256];
+ open_json_object("match");
switch (key->off) {
case 0:
switch (ntohl(key->mask)) {
case 0x0f000000:
- fprintf(f, "\n match IP ihl %u",
- ntohl(key->val) >> 24);
+ print_nl();
+ print_uint(PRINT_ANY, "ip_ihl", " match IP ihl %u",
+ ntohl(key->val) >> 24);
return;
case 0x00ff0000:
- fprintf(f, "\n match IP dsfield %#x",
- ntohl(key->val) >> 16);
+ print_nl();
+ print_0xhex(PRINT_ANY, "ip_dsfield", " match IP dsfield %#x",
+ ntohl(key->val) >> 16);
return;
}
break;
case 8:
if (ntohl(key->mask) == 0x00ff0000) {
- fprintf(f, "\n match IP protocol %d",
- ntohl(key->val) >> 16);
+ print_nl();
+ print_int(PRINT_ANY, "ip_protocol", " match IP protocol %d",
+ ntohl(key->val) >> 16);
return;
}
break;
@@ -849,11 +853,20 @@ static void print_ipv4(FILE *f, const struct tc_u32_key *key)
int bits = mask2bits(key->mask);
if (bits >= 0) {
- fprintf(f, "\n %s %s/%d",
- key->off == 12 ? "match IP src" : "match IP dst",
- inet_ntop(AF_INET, &key->val,
- abuf, sizeof(abuf)),
- bits);
+ const char *addr;
+ if (key->off == 12) {
+ print_nl();
+ print_null(PRINT_FP, NULL, " match IP src ", NULL);
+ open_json_object("src");
+ } else {
+ print_nl();
+ print_null(PRINT_FP, NULL, " match IP dst ", NULL);
+ open_json_object("dst");
+ }
+ addr = inet_ntop(AF_INET, &key->val, abuf, sizeof(abuf));
+ print_string(PRINT_ANY, "address", "%s", addr);
+ print_int(PRINT_ANY, "prefixlen", "/%d", bits);
+ close_json_object();
return;
}
}
@@ -862,45 +875,52 @@ static void print_ipv4(FILE *f, const struct tc_u32_key *key)
case 20:
switch (ntohl(key->mask)) {
case 0x0000ffff:
- fprintf(f, "\n match dport %u",
- ntohl(key->val) & 0xffff);
+ print_uint(PRINT_ANY, "dport", "match dport %u",
+ ntohl(key->val) & 0xffff);
return;
case 0xffff0000:
- fprintf(f, "\n match sport %u",
- ntohl(key->val) >> 16);
+ print_nl();
+ print_uint(PRINT_ANY, "sport", " match sport %u",
+ ntohl(key->val) >> 16);
return;
case 0xffffffff:
- fprintf(f, "\n match dport %u, match sport %u",
- ntohl(key->val) & 0xffff,
- ntohl(key->val) >> 16);
-
+ print_nl();
+ print_uint(PRINT_ANY, "dport", " match dport %u, ",
+ ntohl(key->val) & 0xffff);
+ print_uint(PRINT_ANY, "sport", "match sport %u",
+ ntohl(key->val) >> 16);
return;
}
/* XXX: Default print_raw */
}
+ close_json_object();
}
static void print_ipv6(FILE *f, const struct tc_u32_key *key)
{
char abuf[256];
+ open_json_object("match");
switch (key->off) {
case 0:
switch (ntohl(key->mask)) {
case 0x0f000000:
- fprintf(f, "\n match IP ihl %u",
- ntohl(key->val) >> 24);
+ print_nl();
+ print_uint(PRINT_ANY, "ip_ihl", " match IP ihl %u",
+ ntohl(key->val) >> 24);
return;
case 0x00ff0000:
- fprintf(f, "\n match IP dsfield %#x",
- ntohl(key->val) >> 16);
+ print_nl();
+ print_0xhex(PRINT_ANY, "ip_dsfield", " match IP dsfield %#x",
+ ntohl(key->val) >> 16);
return;
}
break;
case 8:
if (ntohl(key->mask) == 0x00ff0000) {
- fprintf(f, "\n match IP protocol %d",
- ntohl(key->val) >> 16);
+ print_nl();
+ print_int(PRINT_ANY, "ip_protocol", " match IP protocol %d",
+ ntohl(key->val) >> 16);
return;
}
break;
@@ -909,11 +929,20 @@ static void print_ipv6(FILE *f, const struct tc_u32_key *key)
int bits = mask2bits(key->mask);
if (bits >= 0) {
- fprintf(f, "\n %s %s/%d",
- key->off == 12 ? "match IP src" : "match IP dst",
- inet_ntop(AF_INET, &key->val,
- abuf, sizeof(abuf)),
- bits);
+ const char *addr;
+ if (key->off == 12) {
+ print_nl();
+ print_null(PRINT_FP, NULL, " match IP src ", NULL);
+ open_json_object("src");
+ } else {
+ print_nl();
+ print_null(PRINT_FP, NULL, " match IP dst ", NULL);
+ open_json_object("dst");
+ }
+ addr = inet_ntop(AF_INET, &key->val, abuf, sizeof(abuf));
+ print_string(PRINT_ANY, "address", "%s", addr);
+ print_int(PRINT_ANY, "prefixlen", "/%d", bits);
+ close_json_object();
return;
}
}
@@ -922,31 +951,37 @@ static void print_ipv6(FILE *f, const struct tc_u32_key *key)
case 20:
switch (ntohl(key->mask)) {
case 0x0000ffff:
- fprintf(f, "\n match sport %u",
- ntohl(key->val) & 0xffff);
+ print_nl();
+ print_uint(PRINT_ANY, "sport", " match sport %u",
+ ntohl(key->val) & 0xffff);
return;
case 0xffff0000:
- fprintf(f, "\n match dport %u",
- ntohl(key->val) >> 16);
+ print_uint(PRINT_ANY, "dport", "match dport %u",
+ ntohl(key->val) >> 16);
return;
case 0xffffffff:
- fprintf(f, "\n match sport %u, match dport %u",
- ntohl(key->val) & 0xffff,
- ntohl(key->val) >> 16);
+ print_nl();
+ print_uint(PRINT_ANY, "sport", " match sport %u, ",
+ ntohl(key->val) & 0xffff);
+ print_uint(PRINT_ANY, "dport", "match dport %u",
+ ntohl(key->val) >> 16);
return;
}
/* XXX: Default print_raw */
}
+ close_json_object();
}
static void print_raw(FILE *f, const struct tc_u32_key *key)
{
- fprintf(f, "\n match %08x/%08x at %s%d",
- (unsigned int)ntohl(key->val),
- (unsigned int)ntohl(key->mask),
- key->offmask ? "nexthdr+" : "",
- key->off);
+ open_json_object("match");
+ print_nl();
+ print_hex(PRINT_ANY, "value", " match %08x", (unsigned int)ntohl(key->val));
+ print_hex(PRINT_ANY, "mask", "/%08x ", (unsigned int)ntohl(key->mask));
+ print_string(PRINT_ANY, "offmask", "at %s", key->offmask ? "nexthdr+" : "");
+ print_int(PRINT_ANY, "off", "%d", key->off);
+ close_json_object();
}
static const struct {
--
2.26.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH iproute2 v4 1/2] tc: u32: add support for json output
2022-01-18 2:42 ` [PATCH iproute2 v4 1/2] tc: u32: add support for json output Wen Liang
@ 2022-01-18 4:30 ` Stephen Hemminger
2022-01-18 20:04 ` David Ahern
1 sibling, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2022-01-18 4:30 UTC (permalink / raw)
To: Wen Liang; +Cc: netdev, dsahern, aclaudi
On Mon, 17 Jan 2022 21:42:20 -0500
Wen Liang <liangwen12year@gmail.com> wrote:
> Currently u32 filter output does not support json. This commit uses
> proper json functions to add support for it.
>
> Signed-off-by: Wen Liang <liangwen12year@gmail.com>
Minor warnings from checkpatch, please fix:
WARNING: Missing a blank line after declarations
#88: FILE: tc/f_u32.c:1231:
+ __u32 htdivisor = rta_getattr_u32(tb[TCA_U32_DIVISOR]);
+ print_int(PRINT_ANY, "ht_divisor", "ht divisor %d ", htdivisor);
ERROR: space required after that ',' (ctx:VxV)
#114: FILE: tc/f_u32.c:1250:
+ char *link = sprint_u32_handle(rta_getattr_u32(tb[TCA_U32_LINK]),b1);
^
WARNING: Missing a blank line after declarations
#115: FILE: tc/f_u32.c:1251:
+ char *link = sprint_u32_handle(rta_getattr_u32(tb[TCA_U32_LINK]),b1);
+ print_string(PRINT_ANY, "link", "link %s ", link);
WARNING: Missing a blank line after declarations
#202: FILE: tc/f_u32.c:1323:
+ unsigned int hmask = (unsigned int)htonl(sel->hmask);
+ print_hex(PRINT_ANY, "hash_mask", " hash mask %08x ", hmask);
total: 1 errors, 3 warnings, 151 lines checked
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH iproute2 v4 2/2] tc: u32: add json support in `print_raw`, `print_ipv4`, `print_ipv6`
2022-01-18 2:42 ` [PATCH iproute2 v4 2/2] tc: u32: add json support in `print_raw`, `print_ipv4`, `print_ipv6` Wen Liang
@ 2022-01-18 4:32 ` Stephen Hemminger
0 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2022-01-18 4:32 UTC (permalink / raw)
To: Wen Liang; +Cc: netdev, dsahern, aclaudi
On Mon, 17 Jan 2022 21:42:21 -0500
Wen Liang <liangwen12year@gmail.com> wrote:
> Signed-off-by: Wen Liang <liangwen12year@gmail.com>
More checkpatch warnings, please fix.
WARNING: Missing commit description - Add an appropriate one
WARNING: suspect code indent for conditional statements (24, 33)
#100: FILE: tc/f_u32.c:855:
if (bits >= 0) {
+ const char *addr;
WARNING: Statements should start on a tabstop
#106: FILE: tc/f_u32.c:856:
+ const char *addr;
WARNING: Statements should start on a tabstop
#107: FILE: tc/f_u32.c:857:
+ if (key->off == 12) {
WARNING: Missing a blank line after declarations
#107: FILE: tc/f_u32.c:857:
+ const char *addr;
+ if (key->off == 12) {
WARNING: suspect code indent for conditional statements (33, 39)
#107: FILE: tc/f_u32.c:857:
+ if (key->off == 12) {
+ print_nl();
WARNING: Statements should start on a tabstop
#111: FILE: tc/f_u32.c:861:
+ } else {
WARNING: suspect code indent for conditional statements (33, 39)
#111: FILE: tc/f_u32.c:861:
+ } else {
+ print_nl();
WARNING: Statements should start on a tabstop
#115: FILE: tc/f_u32.c:865:
+ }
WARNING: Missing a blank line after declarations
#200: FILE: tc/f_u32.c:933:
+ const char *addr;
+ if (key->off == 12) {
WARNING: suspect code indent for conditional statements (32, 38)
#200: FILE: tc/f_u32.c:933:
+ if (key->off == 12) {
+ print_nl();
ERROR: code indent should use tabs where possible
#201: FILE: tc/f_u32.c:934:
+^I^I^I print_nl();$
WARNING: suspect code indent for conditional statements (32, 38)
#204: FILE: tc/f_u32.c:937:
+ } else {
+ print_nl();
ERROR: code indent should use tabs where possible
#205: FILE: tc/f_u32.c:938:
+^I^I^I print_nl();$
total: 2 errors, 12 warnings, 198 lines checked
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH iproute2 v4 1/2] tc: u32: add support for json output
2022-01-18 2:42 ` [PATCH iproute2 v4 1/2] tc: u32: add support for json output Wen Liang
2022-01-18 4:30 ` Stephen Hemminger
@ 2022-01-18 20:04 ` David Ahern
1 sibling, 0 replies; 6+ messages in thread
From: David Ahern @ 2022-01-18 20:04 UTC (permalink / raw)
To: Wen Liang, netdev; +Cc: stephen, aclaudi
On 1/17/22 7:42 PM, Wen Liang wrote:
> diff --git a/tc/f_u32.c b/tc/f_u32.c
> index a5747f67..03dbe774 100644
> --- a/tc/f_u32.c
> +++ b/tc/f_u32.c
> @@ -1213,11 +1213,11 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
>
> if (handle) {
> SPRINT_BUF(b1);
> - fprintf(f, "fh %s ", sprint_u32_handle(handle, b1));
> + print_string(PRINT_ANY, "fh", "fh %s ", sprint_u32_handle(handle, b1));
sprint_u32_handle adds a space after the raw check. I think that space
can be removed.
Also, seems like raw and json should be incompatible.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-01-18 20:04 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-18 2:42 [PATCH iproute2 v4 0/2] add json support on tc u32 Wen Liang
2022-01-18 2:42 ` [PATCH iproute2 v4 1/2] tc: u32: add support for json output Wen Liang
2022-01-18 4:30 ` Stephen Hemminger
2022-01-18 20:04 ` David Ahern
2022-01-18 2:42 ` [PATCH iproute2 v4 2/2] tc: u32: add json support in `print_raw`, `print_ipv4`, `print_ipv6` Wen Liang
2022-01-18 4:32 ` Stephen Hemminger
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.