]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
tc_util: fix JSON prints for ct-mark and ct-zone
authorEli Britstein <elibr@mellanox.com>
Thu, 14 Nov 2019 12:44:40 +0000 (14:44 +0200)
committerStephen Hemminger <stephen@networkplumber.org>
Tue, 19 Nov 2019 19:36:05 +0000 (11:36 -0800)
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 <elibr@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
tc/tc_util.c

index e9f3e5a227f9882aa2060dd20377019dc598287b..393721e33bf0e533dbe33775be3885e229423453 100644 (file)
@@ -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)