From: Eli Britstein Date: Thu, 14 Nov 2019 12:44:40 +0000 (+0200) Subject: tc_util: fix JSON prints for ct-mark and ct-zone X-Git-Tag: v5.4.0~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb3ee8b313f3bc70ba2ec7d69799cd54f7c82036;p=thirdparty%2Fiproute2.git tc_util: fix JSON prints for ct-mark and ct-zone Fix the output of ct-mark and ct-zone (both for matches and actions) to be different in JSON/non-JSON mode. Example: $ tc qdisc add dev eth0 ingress $ tc filter add dev eth0 protocol ip parent ffff: prio 1 flower skip_hw \ ct_zone 5 ct_mark 6/0xf action ct commit zone 7 mark 8/0xf drop Non JSON format remains the same: $ tc filter show dev eth0 parent ffff: $ tc -s filter show dev ens1f0_0 parent ffff: filter protocol ip pref 1 flower chain 0 filter protocol ip pref 1 flower chain 0 handle 0x1 eth_type ipv4 ct_zone 5 ct_mark 6/0xf skip_hw not_in_hw action order 1: ct commit mark 8/0xf zone 7 drop index 1 ref 1 bind 1 installed 108 sec used 108 sec Action statistics: Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 JSON format is changed (partial output): $ tc -p -j filter show dev eth0 parent ffff: Before: "options": { "keys": { "ct_zone": "5", "ct_mark": "6/0xf" ... "actions": [ { "order": 1, "kind": "ct", "action": "commit", "mark": "8/0xf", "zone": "7", ... After: "options": { "keys": { "ct_zone": 5, "ct_mark": 6, "ct_mark_mask": 15 ... "actions": [ { "order": 1, "kind": "ct", "action": "commit", "mark": 8, "mark_mask": 15, "zone": 7, ... Fixes: c8a494314c40 ("tc: Introduce tc ct action") Signed-off-by: Eli Britstein Reviewed-by: Roi Dayan Acked-by: Jiri Pirko Signed-off-by: Stephen Hemminger --- diff --git a/tc/tc_util.c b/tc/tc_util.c index e9f3e5a22..393721e33 100644 --- a/tc/tc_util.c +++ b/tc/tc_util.c @@ -958,45 +958,20 @@ static void print_masked_type(__u32 type_max, void print_masked_u32(const char *name, struct rtattr *attr, struct rtattr *mask_attr, bool newline) { - __u32 value, mask; - SPRINT_BUF(namefrm); - SPRINT_BUF(out); - size_t done; - - if (!attr) - return; - - value = rta_getattr_u32(attr); - mask = mask_attr ? rta_getattr_u32(mask_attr) : UINT32_MAX; - - done = sprintf(out, "%u", value); - if (mask != UINT32_MAX) - sprintf(out + done, "/0x%x", mask); + print_masked_type(UINT32_MAX, rta_getattr_u32, name, attr, mask_attr, + newline); +} - sprintf(namefrm, "%s %s %%s", newline ? "\n " : "", name); - print_string(PRINT_ANY, name, namefrm, out); +static __u32 __rta_getattr_u16_u32(const struct rtattr *attr) +{ + return rta_getattr_u16(attr); } void print_masked_u16(const char *name, struct rtattr *attr, struct rtattr *mask_attr, bool newline) { - __u16 value, mask; - SPRINT_BUF(namefrm); - SPRINT_BUF(out); - size_t done; - - if (!attr) - return; - - value = rta_getattr_u16(attr); - mask = mask_attr ? rta_getattr_u16(mask_attr) : UINT16_MAX; - - done = sprintf(out, "%u", value); - if (mask != UINT16_MAX) - sprintf(out + done, "/0x%x", mask); - - sprintf(namefrm, "%s %s %%s", newline ? "\n " : "", name); - print_string(PRINT_ANY, name, namefrm, out); + print_masked_type(UINT16_MAX, __rta_getattr_u16_u32, name, attr, + mask_attr, newline); } static __u32 __rta_getattr_u8_u32(const struct rtattr *attr)