]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
json: Do not reduce single-item arrays on output
authorPhil Sutter <phil@nwl.cc>
Tue, 12 Aug 2025 15:31:47 +0000 (17:31 +0200)
committerPhil Sutter <phil@nwl.cc>
Mon, 18 Aug 2025 20:57:26 +0000 (22:57 +0200)
This is a partial revert of commit a740f2036ad0d ("json: Introduce
json_add_array_new()"), keeping the function but eliminating its primary
task which is to replace arrays of size 1 by their only item. While
support for this on input is convenient for users, it means extra casing
in JSON output parsers to cover for it. The minor reduction in output
size does not justify that.

Fixes: a740f2036ad0d ("json: Introduce json_add_array_new()")
Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1806
Signed-off-by: Phil Sutter <phil@nwl.cc>
Reviewed-by: Pablo Neira Ayuso <pablo@netfilter.org>
100 files changed:
src/json.c
tests/py/any/log.t.json.output
tests/py/any/queue.t.json.output
tests/py/inet/fib.t.json
tests/py/inet/fib.t.json.output
tests/py/inet/snat.t.json.output [new file with mode: 0644]
tests/py/inet/synproxy.t.json
tests/py/inet/synproxy.t.json.output
tests/py/ip/masquerade.t.json.output
tests/py/ip/redirect.t.json.output
tests/py/ip/snat.t.json.output
tests/py/ip6/masquerade.t.json.output
tests/py/ip6/redirect.t.json.output
tests/shell/testcases/cache/dumps/0002_interval_0.json-nft
tests/shell/testcases/chains/dumps/netdev_chain_dormant_autoremove.json-nft
tests/shell/testcases/json/dumps/0001set_statements_0.json-nft
tests/shell/testcases/json/single_flag
tests/shell/testcases/listing/dumps/0010sets_0.json-nft
tests/shell/testcases/listing/dumps/0012sets_0.json-nft
tests/shell/testcases/listing/dumps/0022terse_0.json-nft
tests/shell/testcases/maps/dumps/0005interval_map_add_many_elements_0.json-nft
tests/shell/testcases/maps/dumps/0006interval_map_overlap_0.json-nft
tests/shell/testcases/maps/dumps/0008interval_map_delete_0.json-nft
tests/shell/testcases/maps/dumps/0012map_concat_0.json-nft
tests/shell/testcases/maps/dumps/0013map_0.json-nft
tests/shell/testcases/maps/dumps/delete_element.json-nft
tests/shell/testcases/maps/dumps/delete_element_catchall.json-nft
tests/shell/testcases/maps/dumps/map_with_flags_0.json-nft
tests/shell/testcases/maps/dumps/named_ct_objects.json-nft
tests/shell/testcases/maps/dumps/named_limits.json-nft
tests/shell/testcases/maps/dumps/pipapo_double_flush.json-nft
tests/shell/testcases/maps/dumps/typeof_integer_0.json-nft
tests/shell/testcases/maps/dumps/typeof_maps_add_delete.json-nft
tests/shell/testcases/maps/dumps/typeof_maps_update_0.json-nft
tests/shell/testcases/maps/dumps/vmap_timeout.json-nft
tests/shell/testcases/maps/dumps/vmap_unary.json-nft
tests/shell/testcases/nft-f/dumps/0012different_defines_0.json-nft
tests/shell/testcases/nft-f/dumps/0025empty_dynset_0.json-nft
tests/shell/testcases/nft-i/dumps/set_0.json-nft
tests/shell/testcases/optimizations/dumps/merge_vmaps.json-nft
tests/shell/testcases/optimizations/dumps/skip_unsupported.json-nft
tests/shell/testcases/packetpath/dumps/set_lookups.json-nft
tests/shell/testcases/rule_management/dumps/0004replace_0.json-nft
tests/shell/testcases/rule_management/dumps/0011reset_0.json-nft
tests/shell/testcases/sets/dumps/0001named_interval_0.json-nft
tests/shell/testcases/sets/dumps/0002named_interval_automerging_0.json-nft
tests/shell/testcases/sets/dumps/0004named_interval_shadow_0.json-nft
tests/shell/testcases/sets/dumps/0005named_interval_shadow_0.json-nft
tests/shell/testcases/sets/dumps/0008comments_interval_0.json-nft
tests/shell/testcases/sets/dumps/0009comments_timeout_0.json-nft
tests/shell/testcases/sets/dumps/0015rulesetflush_0.json-nft
tests/shell/testcases/sets/dumps/0022type_selective_flush_0.json-nft
tests/shell/testcases/sets/dumps/0024synproxy_0.json-nft
tests/shell/testcases/sets/dumps/0027ipv6_maps_ipv4_0.json-nft
tests/shell/testcases/sets/dumps/0028autoselect_0.json-nft
tests/shell/testcases/sets/dumps/0028delete_handle_0.json-nft
tests/shell/testcases/sets/dumps/0032restore_set_simple_0.json-nft
tests/shell/testcases/sets/dumps/0033add_set_simple_flat_0.json-nft
tests/shell/testcases/sets/dumps/0034get_element_0.json-nft
tests/shell/testcases/sets/dumps/0035add_set_elements_flat_0.json-nft
tests/shell/testcases/sets/dumps/0038meter_list_0.json-nft
tests/shell/testcases/sets/dumps/0039delete_interval_0.json-nft
tests/shell/testcases/sets/dumps/0040get_host_endian_elements_0.json-nft
tests/shell/testcases/sets/dumps/0041interval_0.json-nft
tests/shell/testcases/sets/dumps/0042update_set_0.json-nft
tests/shell/testcases/sets/dumps/0043concatenated_ranges_1.json-nft
tests/shell/testcases/sets/dumps/0044interval_overlap_1.json-nft
tests/shell/testcases/sets/dumps/0046netmap_0.json-nft
tests/shell/testcases/sets/dumps/0049set_define_0.json-nft
tests/shell/testcases/sets/dumps/0051set_interval_counter_0.json-nft
tests/shell/testcases/sets/dumps/0052overlap_0.json-nft
tests/shell/testcases/sets/dumps/0054comments_set_0.json-nft
tests/shell/testcases/sets/dumps/0055tcpflags_0.json-nft
tests/shell/testcases/sets/dumps/0060set_multistmt_1.json-nft
tests/shell/testcases/sets/dumps/0062set_connlimit_0.json-nft
tests/shell/testcases/sets/dumps/0063set_catchall_0.json-nft
tests/shell/testcases/sets/dumps/0064map_catchall_0.json-nft
tests/shell/testcases/sets/dumps/0069interval_merge_0.json-nft
tests/shell/testcases/sets/dumps/0071unclosed_prefix_interval_0.json-nft
tests/shell/testcases/sets/dumps/0073flat_interval_set.json-nft
tests/shell/testcases/sets/dumps/0074nested_interval_set.json-nft
tests/shell/testcases/sets/dumps/concat_interval_0.json-nft
tests/shell/testcases/sets/dumps/concat_nlmsg_overrun.json-nft
tests/shell/testcases/sets/dumps/dynset_missing.json-nft
tests/shell/testcases/sets/dumps/exact_overlap_0.json-nft
tests/shell/testcases/sets/dumps/inner_0.json-nft
tests/shell/testcases/sets/dumps/interval_size.json-nft
tests/shell/testcases/sets/dumps/meter_set_reuse.json-nft
tests/shell/testcases/sets/dumps/range_with_same_start_end.json-nft
tests/shell/testcases/sets/dumps/set_element_timeout_updates.json-nft
tests/shell/testcases/sets/dumps/set_eval_0.json-nft
tests/shell/testcases/sets/dumps/sets_with_ifnames.json-nft
tests/shell/testcases/sets/dumps/typeof_sets_concat.json-nft
tests/shell/testcases/transactions/dumps/0002table_0.json-nft
tests/shell/testcases/transactions/dumps/0037set_0.json-nft
tests/shell/testcases/transactions/dumps/0038set_0.json-nft
tests/shell/testcases/transactions/dumps/0039set_0.json-nft
tests/shell/testcases/transactions/dumps/0047set_0.json-nft
tests/shell/testcases/transactions/dumps/doubled-set.json-nft
tests/shell/testcases/transactions/dumps/table_onoff.json-nft

index 977f55667fc20937fbf57fe7af039e4ff017bd66..4c8b4f347627b761f2c738418ab665183995b0fe 100644 (file)
@@ -62,14 +62,10 @@ static int json_array_extend_new(json_t *array, json_t *other_array)
 
 static void json_add_array_new(json_t *obj, const char *name, json_t *array)
 {
-       if (json_array_size(array) > 1) {
+       if (json_array_size(array))
                json_object_set_new(obj, name, array);
-       } else {
-               if (json_array_size(array))
-                       json_object_set(obj, name,
-                                       json_array_get(array, 0));
+       else
                json_decref(array);
-       }
 }
 
 static json_t *expr_print_json(const struct expr *expr, struct output_ctx *octx)
index 051c448b6fc75ca8bf51bdfae8d7776b3f171c05..bec70a3507b806cd954cf090dad9502cce492223 100644 (file)
@@ -9,7 +9,20 @@
 [
     {
         "log": {
-            "flags": "all"
+            "flags": [
+                "all"
+            ]
+        }
+    }
+]
+
+# log flags all
+[
+    {
+        "log": {
+            "flags": [
+                "all"
+            ]
         }
     }
 ]
index 1104d7602ba95514e535672ea1608ebab85a9afe..ea3722383f113a5eafa2a2a71eff3a999a0406ed 100644 (file)
@@ -7,3 +7,120 @@
     }
 ]
 
+# queue num 4-5 fanout
+[
+    {
+        "queue": {
+            "flags": [
+                "fanout"
+            ],
+            "num": {
+                "range": [
+                    4,
+                    5
+                ]
+            }
+        }
+    }
+]
+
+# queue num 4-5 bypass
+[
+    {
+        "queue": {
+            "flags": [
+                "bypass"
+            ],
+            "num": {
+                "range": [
+                    4,
+                    5
+                ]
+            }
+        }
+    }
+]
+
+# queue flags bypass to numgen inc mod 65536
+[
+    {
+        "queue": {
+            "flags": [
+                "bypass"
+            ],
+            "num": {
+                "numgen": {
+                    "mod": 65536,
+                    "mode": "inc",
+                    "offset": 0
+                }
+            }
+        }
+    }
+]
+
+# queue flags bypass to 65535
+[
+    {
+        "queue": {
+            "flags": [
+                "bypass"
+            ],
+            "num": 65535
+        }
+    }
+]
+
+# queue flags bypass to 1-65535
+[
+    {
+        "queue": {
+            "flags": [
+                "bypass"
+            ],
+            "num": {
+                "range": [
+                    1,
+                    65535
+                ]
+            }
+        }
+    }
+]
+
+# queue flags bypass to oifname map { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
+[
+    {
+        "queue": {
+            "flags": [
+                "bypass"
+            ],
+            "num": {
+                "map": {
+                    "data": {
+                        "set": [
+                            [
+                                "eth0",
+                                0
+                            ],
+                            [
+                                "ppp0",
+                                2
+                            ],
+                            [
+                                "eth1",
+                                2
+                            ]
+                        ]
+                    },
+                    "key": {
+                        "meta": {
+                            "key": "oifname"
+                        }
+                    }
+                }
+            }
+        }
+    }
+]
+
index 14a6249ad9b2accd807c0f023723ee50e3984327..2bfe4f70b839216726c5fb36efb70de90693b182 100644 (file)
         "match": {
             "left": {
                 "fib": {
-                    "flags": [
-                        "daddr"
-                    ],
+                    "flags": "daddr",
                     "result": "check"
                 }
             },
         "match": {
             "left": {
                 "fib": {
-                    "flags": [
-                        "daddr"
-                    ],
+                    "flags": "daddr",
                     "result": "check"
                 }
             },
index e8d016698b93a16c0c6065c4044a8cb067a9f4dc..d3396dd26daf33947ac4dec65bbb2f6dc62349de 100644 (file)
@@ -43,7 +43,9 @@
         "match": {
             "left": {
                 "fib": {
-                    "flags": "daddr",
+                    "flags": [
+                        "daddr"
+                    ],
                     "result": "check"
                 }
             },
@@ -59,7 +61,9 @@
         "match": {
             "left": {
                 "fib": {
-                    "flags": "daddr",
+                    "flags": [
+                        "daddr"
+                    ],
                     "result": "check"
                 }
             },
     }
 ]
 
+# fib daddr check vmap { missing : drop, exists : accept }
+[
+    {
+        "vmap": {
+            "data": {
+                "set": [
+                    [
+                        false,
+                        {
+                            "drop": null
+                        }
+                    ],
+                    [
+                        true,
+                        {
+                            "accept": null
+                        }
+                    ]
+                ]
+            },
+            "key": {
+                "fib": {
+                    "flags": [
+                        "daddr"
+                    ],
+                    "result": "check"
+                }
+            }
+        }
+    }
+]
+
+# meta mark set fib daddr check . ct mark map { exists . 0x00000000 : 0x00000001 }
+[
+    {
+        "mangle": {
+            "key": {
+                "meta": {
+                    "key": "mark"
+                }
+            },
+            "value": {
+                "map": {
+                    "data": {
+                        "set": [
+                            [
+                                {
+                                    "concat": [
+                                        true,
+                                        0
+                                    ]
+                                },
+                                1
+                            ]
+                        ]
+                    },
+                    "key": {
+                        "concat": [
+                            {
+                                "fib": {
+                                    "flags": [
+                                        "daddr"
+                                    ],
+                                    "result": "check"
+                                }
+                            },
+                            {
+                                "ct": {
+                                    "key": "mark"
+                                }
+                            }
+                        ]
+                    }
+                }
+            }
+        }
+    }
+]
+
diff --git a/tests/py/inet/snat.t.json.output b/tests/py/inet/snat.t.json.output
new file mode 100644 (file)
index 0000000..5b95886
--- /dev/null
@@ -0,0 +1,22 @@
+# iifname "foo" masquerade random
+[
+    {
+        "match": {
+            "left": {
+                "meta": {
+                    "key": "iifname"
+                }
+            },
+            "op": "==",
+            "right": "foo"
+        }
+    },
+    {
+        "masquerade": {
+            "flags": [
+                "random"
+            ]
+        }
+    }
+]
+
index 1dd85a6144db6d44925c4319af50399264ab943c..b3cec09496d819e5e09afe8ade0f52ab707ba688 100644 (file)
@@ -19,9 +19,7 @@
 [
     {
         "synproxy": {
-            "flags": [
-                "timestamp"
-            ]
+            "flags": "timestamp"
         }
     }
 ]
@@ -56,9 +54,7 @@
 [
     {
         "synproxy": {
-            "flags": [
-                "sack-perm"
-            ]
+            "flags": "sack-perm"
         }
     }
 ]
index e32cdfb885e1b45854020726a88c4b3d95e69522..a1d81bfec92e318bb341bae17c8eb848ce889194 100644 (file)
@@ -2,7 +2,9 @@
 [
     {
         "synproxy": {
-            "flags": "timestamp"
+            "flags": [
+                "timestamp"
+            ]
         }
     }
 ]
@@ -11,7 +13,9 @@
 [
     {
         "synproxy": {
-            "flags": "sack-perm"
+            "flags": [
+                "sack-perm"
+            ]
         }
     }
 ]
index 58e7e290a1e79b64cc6f1d75e617ed1fcac2ce97..8ca5a426d200a8f1af87f8b469f91cd09b123766 100644 (file)
     }
 ]
 
+# udp dport 53 masquerade random
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "masquerade": {
+            "flags": [
+                "random"
+            ]
+        }
+    }
+]
+
+# udp dport 53 masquerade persistent
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "masquerade": {
+            "flags": [
+                "persistent"
+            ]
+        }
+    }
+]
+
index 4646c60a81d8909d308b22ed8b4b09cda791c1e8..09f1e48d26c555ee50949ebfac2dac8d61212fa9 100644 (file)
@@ -1,3 +1,49 @@
+# udp dport 53 redirect random
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "random"
+            ]
+        }
+    }
+]
+
+# udp dport 53 redirect persistent
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "persistent"
+            ]
+        }
+    }
+]
+
 # udp dport 53 redirect random,persistent,fully-random
 [
     {
     }
 ]
 
+# tcp dport 9128 redirect to :993 random
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "tcp"
+                }
+            },
+            "op": "==",
+            "right": 9128
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "random"
+            ],
+            "port": 993
+        }
+    }
+]
+
+# tcp dport 9128 redirect to :993 fully-random
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "tcp"
+                }
+            },
+            "op": "==",
+            "right": 9128
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "fully-random"
+            ],
+            "port": 993
+        }
+    }
+]
+
+# tcp dport 9128 redirect to :123 persistent
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "tcp"
+                }
+            },
+            "op": "==",
+            "right": 9128
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "persistent"
+            ],
+            "port": 123
+        }
+    }
+]
+
index 2a99780131d96f7a97b45f89d87ef96c785d318f..19eba25652015137e34a90a3e7edd3afef3ae7fe 100644 (file)
                 }
             },
             "family": "ip",
-            "flags": "netmap",
-            "type_flags": "prefix"
+            "flags": [
+                "netmap"
+            ],
+            "type_flags": [
+                "prefix"
+            ]
         }
     }
 ]
index 31d0cd9a7e4b5c65a63a537e5176615b9e496510..21ed4f63d1dbd4e5a98c67900c8ccc38a13fe60f 100644 (file)
     }
 ]
 
+# udp dport 53 masquerade random
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "masquerade": {
+            "flags": [
+                "random"
+            ]
+        }
+    }
+]
+
+# udp dport 53 masquerade persistent
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "masquerade": {
+            "flags": [
+                "persistent"
+            ]
+        }
+    }
+]
+
index 0174cc7d7b9167d6aaf2c1ed165ffc9d5868d3c5..69c7b03d6c0511a4df0df6e787e16d5d7b1dc113 100644 (file)
     }
 ]
 
+# udp dport 53 redirect random
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "random"
+            ]
+        }
+    }
+]
+
+# udp dport 53 redirect persistent
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "udp"
+                }
+            },
+            "op": "==",
+            "right": 53
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "persistent"
+            ]
+        }
+    }
+]
+
+# tcp dport 9128 redirect to :993 random
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "dport",
+                    "protocol": "tcp"
+                }
+            },
+            "op": "==",
+            "right": 9128
+        }
+    },
+    {
+        "redirect": {
+            "flags": [
+                "random"
+            ],
+            "port": 993
+        }
+    }
+]
+
index 5e2b9b420b6db638eb109b140077e64adbb1cdde..fa15d658dcd5c5a91e3ccc6b759662d39c08b190 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index 9151d42f17d913887d07a7ed3ef7088519f764c4..7f1c76c965954cb1b3c7ca8c9190ac163ed02d87 100644 (file)
@@ -12,7 +12,9 @@
         "family": "netdev",
         "name": "test",
         "handle": 0,
-        "flags": "dormant"
+        "flags": [
+          "dormant"
+        ]
       }
     },
     {
index ecc7eade91a60818c02134f40e8766e1c012661f..91db43e29ea9fc920646a8765a343be5b086d7e2 100644 (file)
@@ -34,7 +34,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index f0a608ad84120b5f410ca8f3296d4787ade6b79c..1d70f249a5716e20773e96977d7c3d5ff82a27cd 100755 (executable)
@@ -47,10 +47,10 @@ JSON_TABLE_1='{"nftables": [{"table": {"family": "ip", "name": "t", "handle": 0,
 JSON_TABLE_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_TABLE_1")
 
 STD_TABLE_2=$(sed 's/\(flags dormant\)/\1,persist/' <<< "$STD_TABLE_1")
-JSON_TABLE_2=$(sed 's/\("flags":\) \("dormant"\)/\1 [\2, "persist"]/' <<< "$JSON_TABLE_1")
+JSON_TABLE_2=$(sed 's/\("dormant"\)/\1, "persist"/' <<< "$JSON_TABLE_1_EQUIV")
 
-back_n_forth "$STD_TABLE_1" "$JSON_TABLE_1"
-json_equiv "$JSON_TABLE_1_EQUIV" "$JSON_TABLE_1"
+back_n_forth "$STD_TABLE_1" "$JSON_TABLE_1_EQUIV"
+json_equiv "$JSON_TABLE_1" "$JSON_TABLE_1_EQUIV"
 back_n_forth "$STD_TABLE_2" "$JSON_TABLE_2"
 
 #
@@ -67,10 +67,10 @@ JSON_SET_1='{"nftables": [{"table": {"family": "ip", "name": "t", "handle": 0}},
 JSON_SET_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_SET_1")
 
 STD_SET_2=$(sed 's/\(flags interval\)/\1,timeout/' <<< "$STD_SET_1")
-JSON_SET_2=$(sed 's/\("flags":\) \("interval"\)/\1 [\2, "timeout"]/' <<< "$JSON_SET_1")
+JSON_SET_2=$(sed 's/\("interval"\)/\1, "timeout"/' <<< "$JSON_SET_1_EQUIV")
 
-back_n_forth "$STD_SET_1" "$JSON_SET_1"
-json_equiv "$JSON_SET_1_EQUIV" "$JSON_SET_1"
+back_n_forth "$STD_SET_1" "$JSON_SET_1_EQUIV"
+json_equiv "$JSON_SET_1" "$JSON_SET_1_EQUIV"
 back_n_forth "$STD_SET_2" "$JSON_SET_2"
 
 #
@@ -86,10 +86,10 @@ JSON_FIB_1='{"nftables": [{"table": {"family": "ip", "name": "t", "handle": 0}},
 JSON_FIB_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_FIB_1")
 
 STD_FIB_2=$(sed 's/\(fib saddr\)/\1 . iif/' <<< "$STD_FIB_1")
-JSON_FIB_2=$(sed 's/\("flags":\) \("saddr"\)/\1 [\2, "iif"]/' <<< "$JSON_FIB_1")
+JSON_FIB_2=$(sed 's/\("saddr"\)/\1, "iif"/' <<< "$JSON_FIB_1_EQUIV")
 
-back_n_forth "$STD_FIB_1" "$JSON_FIB_1"
-json_equiv "$JSON_FIB_1_EQUIV" "$JSON_FIB_1"
+back_n_forth "$STD_FIB_1" "$JSON_FIB_1_EQUIV"
+json_equiv "$JSON_FIB_1" "$JSON_FIB_1_EQUIV"
 back_n_forth "$STD_FIB_2" "$JSON_FIB_2"
 
 #
@@ -105,10 +105,10 @@ JSON_NAT_1='{"nftables": [{"table": {"family": "ip", "name": "t", "handle": 0}},
 JSON_NAT_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_NAT_1")
 
 STD_NAT_2=$(sed 's/\(persistent\)/random,\1/' <<< "$STD_NAT_1")
-JSON_NAT_2=$(sed 's/\("flags":\) \("persistent"\)/\1 ["random", \2]/' <<< "$JSON_NAT_1")
+JSON_NAT_2=$(sed 's/\("persistent"\)/"random", \1/' <<< "$JSON_NAT_1_EQUIV")
 
-back_n_forth "$STD_NAT_1" "$JSON_NAT_1"
-json_equiv "$JSON_NAT_1_EQUIV" "$JSON_NAT_1"
+back_n_forth "$STD_NAT_1" "$JSON_NAT_1_EQUIV"
+json_equiv "$JSON_NAT_1" "$JSON_NAT_1_EQUIV"
 back_n_forth "$STD_NAT_2" "$JSON_NAT_2"
 
 #
@@ -124,10 +124,10 @@ JSON_LOG_1='{"nftables": [{"table": {"family": "ip", "name": "t", "handle": 0}},
 JSON_LOG_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_LOG_1")
 
 STD_LOG_2=$(sed 's/\(tcp sequence\)/\1,options/' <<< "$STD_LOG_1")
-JSON_LOG_2=$(sed 's/\("flags":\) \("tcp sequence"\)/\1 [\2, "tcp options"]/' <<< "$JSON_LOG_1")
+JSON_LOG_2=$(sed 's/\("tcp sequence"\)/\1, "tcp options"/' <<< "$JSON_LOG_1_EQUIV")
 
-back_n_forth "$STD_LOG_1" "$JSON_LOG_1"
-json_equiv "$JSON_LOG_1_EQUIV" "$JSON_LOG_1"
+back_n_forth "$STD_LOG_1" "$JSON_LOG_1_EQUIV"
+json_equiv "$JSON_LOG_1" "$JSON_LOG_1_EQUIV"
 back_n_forth "$STD_LOG_2" "$JSON_LOG_2"
 
 #
@@ -143,10 +143,10 @@ JSON_SYNPROXY_1='{"nftables": [{"table": {"family": "ip", "name": "t", "handle":
 JSON_SYNPROXY_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_SYNPROXY_1")
 
 STD_SYNPROXY_2=$(sed 's/\(sack-perm\)/timestamp \1/' <<< "$STD_SYNPROXY_1")
-JSON_SYNPROXY_2=$(sed 's/\("flags":\) \("sack-perm"\)/\1 ["timestamp", \2]/' <<< "$JSON_SYNPROXY_1")
+JSON_SYNPROXY_2=$(sed 's/\("sack-perm"\)/"timestamp", \1/' <<< "$JSON_SYNPROXY_1_EQUIV")
 
-back_n_forth "$STD_SYNPROXY_1" "$JSON_SYNPROXY_1"
-json_equiv "$JSON_SYNPROXY_1_EQUIV" "$JSON_SYNPROXY_1"
+back_n_forth "$STD_SYNPROXY_1" "$JSON_SYNPROXY_1_EQUIV"
+json_equiv "$JSON_SYNPROXY_1" "$JSON_SYNPROXY_1_EQUIV"
 back_n_forth "$STD_SYNPROXY_2" "$JSON_SYNPROXY_2"
 
 #
@@ -164,10 +164,10 @@ JSON_SYNPROXY_OBJ_1='{"nftables": [{"table": {"family": "ip", "name": "t", "hand
 JSON_SYNPROXY_OBJ_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_SYNPROXY_OBJ_1")
 
 STD_SYNPROXY_OBJ_2=$(sed 's/ \(sack-perm\)/timestamp \1/' <<< "$STD_SYNPROXY_OBJ_1")
-JSON_SYNPROXY_OBJ_2=$(sed 's/\("flags":\) \("sack-perm"\)/\1 ["timestamp", \2]/' <<< "$JSON_SYNPROXY_OBJ_1")
+JSON_SYNPROXY_OBJ_2=$(sed 's/\("sack-perm"\)/"timestamp", \1/' <<< "$JSON_SYNPROXY_OBJ_1_EQUIV")
 
-back_n_forth "$STD_SYNPROXY_OBJ_1" "$JSON_SYNPROXY_OBJ_1"
-json_equiv "$JSON_SYNPROXY_OBJ_1_EQUIV" "$JSON_SYNPROXY_OBJ_1"
+back_n_forth "$STD_SYNPROXY_OBJ_1" "$JSON_SYNPROXY_OBJ_1_EQUIV"
+json_equiv "$JSON_SYNPROXY_OBJ_1" "$JSON_SYNPROXY_OBJ_1_EQUIV"
 back_n_forth "$STD_SYNPROXY_OBJ_2" "$JSON_SYNPROXY_OBJ_2"
 
 #
@@ -183,8 +183,8 @@ JSON_QUEUE_1='{"nftables": [{"table": {"family": "ip", "name": "t", "handle": 0}
 JSON_QUEUE_1_EQUIV=$(sed 's/\("flags":\) \([^}]*\)/\1 [\2]/' <<< "$JSON_QUEUE_1")
 
 STD_QUEUE_2=$(sed 's/\(bypass\)/\1,fanout/' <<< "$STD_QUEUE_1")
-JSON_QUEUE_2=$(sed 's/\("flags":\) \("bypass"\)/\1 [\2, "fanout"]/' <<< "$JSON_QUEUE_1")
+JSON_QUEUE_2=$(sed 's/\("bypass"\)/\1, "fanout"/' <<< "$JSON_QUEUE_1_EQUIV")
 
-back_n_forth "$STD_QUEUE_1" "$JSON_QUEUE_1"
-json_equiv "$JSON_QUEUE_1_EQUIV" "$JSON_QUEUE_1"
+back_n_forth "$STD_QUEUE_1" "$JSON_QUEUE_1_EQUIV"
+json_equiv "$JSON_QUEUE_1" "$JSON_QUEUE_1_EQUIV"
 back_n_forth "$STD_QUEUE_2" "$JSON_QUEUE_2"
index 6aa99b4e16d246e4e82f7690fc1d7ce6b3a42361..efca892e3667bd92f414f13f1e9fd6c55ea721f8 100644 (file)
@@ -62,7 +62,9 @@
         "table": "test_arp",
         "type": "inet_service",
         "handle": 0,
-        "flags": "constant"
+        "flags": [
+          "constant"
+        ]
       }
     },
     {
         "table": "filter",
         "type": "inet_service",
         "handle": 0,
-        "flags": "constant"
+        "flags": [
+          "constant"
+        ]
       }
     },
     {
index 6aa99b4e16d246e4e82f7690fc1d7ce6b3a42361..efca892e3667bd92f414f13f1e9fd6c55ea721f8 100644 (file)
@@ -62,7 +62,9 @@
         "table": "test_arp",
         "type": "inet_service",
         "handle": 0,
-        "flags": "constant"
+        "flags": [
+          "constant"
+        ]
       }
     },
     {
         "table": "filter",
         "type": "inet_service",
         "handle": 0,
-        "flags": "constant"
+        "flags": [
+          "constant"
+        ]
       }
     },
     {
index 1a33d6888033b482e548d3a8fe0895c6a208738a..bd6383dac5e375cf573c5d89c4ab2bb3e2f1181b 100644 (file)
@@ -33,7 +33,9 @@
         "table": "filter",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           "10.10.10.10",
           "10.10.11.11"
index f9ac5bce9315b7415b0d31c92da0d24eaad4f340..d1a46295005339fbe77184c7ab662d54631a374b 100644 (file)
@@ -22,7 +22,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "ipv4_addr",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index d6b32d0f8204c4abb17b7faa0435f78dcd2187c6..1e983219ae0d42776805a61c9769aab851755983 100644 (file)
@@ -22,7 +22,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "ipv4_addr",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 09cb6c8578ffb676285f7cc64f28261faaef722f..bd3c6cc7ebf557ba098b4e05a86a3786468ceb70 100644 (file)
@@ -34,7 +34,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "mark",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             "127.0.0.2",
index 85384c5329614738489590357cadaaa0a12d57e5..88bf4984dbde72b85c8c506fcb34a1a91c740178 100644 (file)
@@ -50,7 +50,9 @@
         },
         "handle": 0,
         "map": "verdict",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 2c8d21b43f20ebf1bddf3324d357bf8c0ebdca6f..e91a269d8e6e669f19698cc6574928dcb71341bf 100644 (file)
@@ -38,7 +38,9 @@
         ],
         "handle": 0,
         "map": "verdict",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 69a0d3a25b7c945bffc9affb78986bc41ece84ad..3b7c5f240e245858cd3a400c97a685f805819252 100644 (file)
@@ -40,7 +40,9 @@
         },
         "handle": 0,
         "map": "classid",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 65053f2c5013688b7673683c87d0a6a259075b5f..48b183f172025e5f9576e1489f0deae779e33914 100644 (file)
@@ -40,7 +40,9 @@
         },
         "handle": 0,
         "map": "classid",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             "*",
index 94ec5f751ba57494f0dd3663c1b49e051b88f021..97b7e94e59fa414be50b15fd98f112e7dab20a7a 100644 (file)
@@ -22,7 +22,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "ipv4_addr",
-        "flags": "timeout"
+        "flags": [
+          "timeout"
+        ]
       }
     }
   ]
index 5258d87cf6f5f16335a50ee0766218c4379d183e..c0f270e372b2462b451c4298e57f4832566e1cf7 100644 (file)
         },
         "handle": 0,
         "map": "ct expectation",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
         },
         "handle": 0,
         "map": "ct helper",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 07e289291539247bdacc5e24f0f9973555162d97..3c6845ac43b421cfe270a2684d420444f4a1abac 100644 (file)
         },
         "handle": 0,
         "map": "limit",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
         },
         "handle": 0,
         "map": "limit",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index dc793a65f16dda540af429e3fcd571bfdb488629..ef8c3930f8153a82a68776d30138d9d0ad3e4ee4 100644 (file)
@@ -33,7 +33,9 @@
         ],
         "handle": 0,
         "map": "verdict",
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     }
   ]
index 8dea5c170a8478368c179b7267f8bae92208704d..1df729b40a74ff18fcd9cd666f8328f47af57c68 100644 (file)
@@ -48,7 +48,9 @@
         },
         "handle": 0,
         "map": "verdict",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 8b18a78d6982f808060f033b62f6e05b0ba76a2d..effe02dcf8364e3956874329dc312ecb763cf709 100644 (file)
@@ -50,7 +50,9 @@
         "handle": 0,
         "map": "mark",
         "size": 64,
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "timeout": 300,
         "stmt": [
           {
index b79237d0838db5ff2382ad21ba7c3078637f7bcc..731514663b1aa625a051505188b8b9e905095cfd 100644 (file)
@@ -39,7 +39,9 @@
         "handle": 0,
         "map": "mark",
         "size": 65535,
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "timeout": 360
       }
     },
@@ -59,7 +61,9 @@
         "handle": 0,
         "map": "mark",
         "size": 65535,
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "timeout": 60
       }
     },
index 2d7d8cc2306cd1a1c56bec03e6f8c6ec9a74e4e3..71e9a9ee9f21bec64ec506e7a910d8b20ebaad2c 100644 (file)
@@ -66,7 +66,9 @@
         "type": "inet_service",
         "handle": 0,
         "map": "verdict",
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "gc-interval": 10,
         "elem": [
           [
         },
         "handle": 0,
         "map": "verdict",
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "gc-interval": 10,
         "elem": [
           [
index 08583f9bc30323d8d5105fbc536ce72ee41b1cee..df0a07d9773bf7ba6c88b04452ae623d25e0550b 100644 (file)
@@ -51,7 +51,9 @@
         },
         "handle": 0,
         "map": "verdict",
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     },
     {
index 1b2e342047f4b9c8b4871259a1eefa9505d9485e..0e7ea228501b4ea932b20df33e58bd3b31f12902 100644 (file)
           {
             "queue": {
               "num": 0,
-              "flags": "bypass"
+              "flags": [
+                "bypass"
+              ]
             }
           }
         ]
                   }
                 }
               },
-              "flags": "bypass"
+              "flags": [
+                "bypass"
+              ]
             }
           }
         ]
index 63d6764172ff6d7a4bd7eafa54820aa22c4276e9..0cde23b00000af30e0dee357b15265ce89371633 100644 (file)
@@ -27,7 +27,9 @@
           "inet_service"
         ],
         "handle": 0,
-        "flags": "dynamic",
+        "flags": [
+          "dynamic"
+        ],
         "elem": [
           {
             "elem": {
@@ -62,7 +64,9 @@
           "inet_service"
         ],
         "handle": 0,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
@@ -78,7 +82,9 @@
           "inet_service"
         ],
         "handle": 0,
-        "flags": "dynamic",
+        "flags": [
+          "dynamic"
+        ],
         "elem": [
           {
             "elem": {
index 61e4b99e40775265fe3ac95e6a0a532ced1de469..da3456eff1871a2fa5dab27d0c42823c4bc2ab5b 100644 (file)
@@ -21,7 +21,9 @@
         "table": "foo",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           "10.1.1.1",
           "10.1.1.2"
index f058d6f1db069f99387877e1dddf64c47ab0eb96..e87f1c4c082eb3423b9dac11957904f967b3cafa 100644 (file)
@@ -46,7 +46,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index bf5a8cec5363041ac6ea47a83bdf84e2e24647f0..d6347b1eeed6e73c52dcb15b148b5edbc7db8e34 100644 (file)
@@ -29,7 +29,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index 23f4b17fc53c3271a2c86ccabc45710a219581d0..bcf6914e95cb90b73e9d6d1c8db8e7659218b9d8 100644 (file)
@@ -36,7 +36,9 @@
           "iface_index"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "concat": [
         "table": "t",
         "type": "iface_index",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           "lo"
         ]
index 811cb73804f5d847602bce660826d701600fce5f..767e80f14ff262e38acc30526eb58354d3aa03fc 100644 (file)
@@ -38,7 +38,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     },
     {
index e57dee799b4f345d6f84f9409f4c81285d530744..bc242467e22a7c30bbc29d00c09d385c15367ef9 100644 (file)
@@ -38,7 +38,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic",
+        "flags": [
+          "dynamic"
+        ],
         "elem": [
           {
             "elem": {
index 9200154a6ed85c9d1fd63edd896fee36379986e0..b9c66a21aa0849ab9fb2b698f79cb1532ab536a5 100644 (file)
@@ -29,7 +29,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "range": [
@@ -53,7 +55,9 @@
         "table": "t",
         "type": "ipv6_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
@@ -77,7 +81,9 @@
         "table": "t",
         "type": "inet_proto",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "range": [
         "table": "t",
         "type": "inet_service",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "range": [
index b083ecb52bb529e9b8dcd7cae9d6306db487533a..4c0be67000a023d4ff49870da9ea010af8a64788 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index c79d9ba8518af7faa929f08cc4e3aeb369034eec..c55858fa9c9b93cec5b7edc59bf5e8a9c5a6bb90 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv6_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index 464661e62ae14da2efe9b633f81ac606bacc64c1..a75681f36cb8e117fd5cdc2e9477c6fe96aa871a 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv6_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index e7152413d4bb9c508238641b938e31126f6e4040..c6f5aa68837cee4a79a10293c1c8c9833e8af14b 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "elem": {
index a67a06707106d5e141826e9b2c292a7f43d1b541..2418b39a76a060f520e66afea862c21a80b1d5c7 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "elem": [
           {
             "elem": {
index 86d7eb6a4b6b1bda92dc14fd3fa959f1c37bca17..6268e216aa03c53d60fdb613a600f70a9150bb2f 100644 (file)
@@ -36,7 +36,9 @@
         "table": "filter",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index dcb62eb739d5643477bc1f83ef0f20ff024654c1..c617139235c239598fbfa2cb8a145aab023029b6 100644 (file)
@@ -49,7 +49,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 1024,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index dd71bb394442df482f792d453db46cac1bd3688b..0af613333592d63b33f222efdf4dcf9e8aadc1cb 100644 (file)
@@ -58,7 +58,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "synproxy",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 75d8b46d86a109b12ef4617d3a016fb81d4bbdf8..b9251ffa589001316abc48e20c9d370d66abb793 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv6_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index 05fc072c3ca7fd9e730e939e87a6ae3eff214257..5968b2e0c11f061a90facf148ff5849170a1542f 100644 (file)
@@ -34,7 +34,9 @@
         "type": "inet_proto",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
@@ -45,7 +47,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
@@ -56,7 +60,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 1024,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index 9e5f708df3a74e1e9f84679a50062c7ea8dcedb6..96314141bc0848a559ca668712e2a3f9c4e9a624 100644 (file)
@@ -30,7 +30,9 @@
         "table": "test-ip",
         "type": "inet_service",
         "handle": 0,
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "timeout": 10845
       }
     },
index 7a723150c1a35d3e30fb96a9c5da97429c5f30f1..4d194bff1b164847b634ba40a5a6eee4fd3d5f84 100644 (file)
@@ -25,7 +25,9 @@
           "ipv4_addr"
         ],
         "handle": 0,
-        "flags": "timeout"
+        "flags": [
+          "timeout"
+        ]
       }
     },
     {
@@ -38,7 +40,9 @@
           "inet_service"
         ],
         "handle": 0,
-        "flags": "timeout"
+        "flags": [
+          "timeout"
+        ]
       }
     }
   ]
index 5697652859078bca04dac13b6b9f1cc76840b878..16684438c37f2f444d8101834b9192ef90ac98de 100644 (file)
@@ -25,7 +25,9 @@
           "ipv4_addr"
         ],
         "handle": 0,
-        "flags": "timeout"
+        "flags": [
+          "timeout"
+        ]
       }
     },
     {
@@ -38,7 +40,9 @@
           "inet_service"
         ],
         "handle": 0,
-        "flags": "timeout"
+        "flags": [
+          "timeout"
+        ]
       }
     }
   ]
index 4f5ba0aaac57889531da61b9f34cf53631d26be8..bfc0e4a0f5886ec4db7a82e477e267dfb756eec1 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "inet_service",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           10,
           {
@@ -47,7 +49,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           "10.0.0.1",
           {
@@ -87,7 +91,9 @@
           "inet_service"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "concat": [
index f9fe4e6f113ea526a1708f5cb46612762a418936..e4c77147b88f66d57193f8721ff1e3f6cd487227 100644 (file)
@@ -21,7 +21,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     }
   ]
index 6f6555d224371751cbaa17e4a4febff50d3a3c79..5b13f59a72615f2e45ccabae03199211d3947c71 100644 (file)
@@ -44,7 +44,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 128,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index afa819584e5b31df94b0b07034c38210d9d193ce..d6e46aad20a5084dcdaee5dcfe9b4777e1abb4f6 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "range": [
index 486ca453281e433a745c15b54b04d75817f9e686..4b6cf03c4596137ee8ed0dfbe2eb06e71969b444 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "mark",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "range": [
index c59a65ae29fd878729c89cb916e652ee20e01357..14a393305a3f3ffa4bd610ce3ce0c2a7e0b8657e 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           "192.168.2.196"
         ]
index 3f98e120d19bd2fb368aa5fee0e4ae886c861bc7..bc1d4cc2284d8eff274d4951c497bd0a405665aa 100644 (file)
@@ -39,7 +39,9 @@
         "type": "ether_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index 5ce063d7e43045a9a007d099882fcf6926192401..92b59c861de1043a1718b37bbbd7908c0febc3da 100644 (file)
@@ -24,7 +24,9 @@
           "ipv6_addr"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "concat": [
           "ipv4_addr"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "concat": [
index 8f82990af70d6b79ddf9b94c20f31ffa2286d40a..f4aae383524ffce3e413200a0430bf1e366edaf7 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "inet_service",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           25,
           30,
index 55f1a2ad28c76659e6874eae467b7672f808b2cd..2b67252d6ec40503c41938f9ada913e308323241 100644 (file)
                   }
                 }
               },
-              "flags": "netmap",
-              "type_flags": "prefix"
+              "flags": [
+                "netmap"
+              ],
+              "type_flags": [
+                "prefix"
+              ]
             }
           }
         ]
                   }
                 }
               },
-              "flags": "netmap",
-              "type_flags": "prefix"
+              "flags": [
+                "netmap"
+              ],
+              "type_flags": [
+                "prefix"
+              ]
             }
           }
         ]
index 98ccafd463cc4dded493e3ac9e29bdfbaaef812e..f8495bab8b0f3d9a0bd44fa7cb40a2a9dbc5db66 100644 (file)
@@ -33,7 +33,9 @@
         "table": "filter",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "auto-merge": true,
         "elem": [
           "1.1.1.1"
index 96cb397f0c5840d62502c1052b5116d0ad006054..b468b5f9044cade46b73d6b768d58c78ffc6eeee 100644 (file)
@@ -33,7 +33,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "elem": {
index 1ea8ede677aa35cfdbf4ba5e48a92a8981a26de5..96d5fbccd7d4099d27624c0f1cdc534cb1d1edf2 100644 (file)
@@ -21,7 +21,9 @@
         "table": "filter",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "auto-merge": true,
         "elem": [
           "10.10.10.10",
index a729392270c01404e9f7cfe7288bf2aacf1a07fa..3fd6d37e181033fe82b0bda5499ee67b5ddc9239 100644 (file)
@@ -22,7 +22,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "comment": "test",
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     },
     {
@@ -34,7 +36,9 @@
         "handle": 0,
         "comment": "another test",
         "map": "ipv4_addr",
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     }
   ]
index 0232ad6f28e3b996b534bae7ea5b5d81cb10d158..e37139f334466102cc2016e8c576131a6e3066c4 100644 (file)
@@ -21,7 +21,9 @@
         "table": "test",
         "type": "tcp_flag",
         "handle": 0,
-        "flags": "constant",
+        "flags": [
+          "constant"
+        ],
         "elem": [
           {
             "|": [
index 99805e553da0e26192891f851096b221e011121a..6098dc563141f29b44091901c52653552ff5a7b7 100644 (file)
@@ -34,7 +34,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic",
+        "flags": [
+          "dynamic"
+        ],
         "elem": [
           {
             "elem": {
index 7a948b1da0cffc33313774c0a2a0a609339ca680..c5e60e36c89ea75cb8ca31e621d165b8ae45e66f 100644 (file)
@@ -22,7 +22,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
@@ -33,7 +35,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic",
+        "flags": [
+          "dynamic"
+        ],
         "stmt": [
           {
             "ct count": {
index fcfe9830f36006af3850522e2057732eac1b14ca..3006f75a8fcc6a38863261fda18cd6b9486d8839 100644 (file)
@@ -55,7 +55,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "elem": {
index b7496ac853f109a4ddfb4cb8e865fe477a833277..64dd26670528be2c18c808484e7df59d54189396 100644 (file)
@@ -50,7 +50,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "ipv4_addr",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 7868cb33591609fc5546d8783458b4d1f648a430..d7b32f8cc0e2492390dd2cf60d8267bc9584f8be 100644 (file)
@@ -21,7 +21,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "auto-merge": true,
         "elem": [
           {
index 588c2b1b6689c92d69025074f29779331beff17f..6b579a2e09fffc6cc2ff01bacf8aa9e80ea751fa 100644 (file)
@@ -29,7 +29,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
@@ -53,7 +55,9 @@
         "table": "t",
         "type": "ipv6_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index e4649a7d0c22eb99db9e8b7e6f2f00cc507a1c2c..e2fb6214238fa77878b8ec12177ecdc1417b55db 100644 (file)
@@ -32,7 +32,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "counter",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index e4649a7d0c22eb99db9e8b7e6f2f00cc507a1c2c..e2fb6214238fa77878b8ec12177ecdc1417b55db 100644 (file)
@@ -32,7 +32,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "counter",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             {
index 3283f26958f71f45e4efde206b0cd5fcba600d30..d65065e4f0947a4eee012c5c46dd6b01676c7f01 100644 (file)
@@ -25,7 +25,9 @@
           "inet_service"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "stmt": [
           {
             "counter": null
@@ -43,7 +45,9 @@
           "mark"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "concat": [
index 2a8d233e81d26f30c2bccdb409fda7545a163cf0..db9f547b45c876ecc46858d4ca7655227a359876 100644 (file)
@@ -25,7 +25,9 @@
           "ipv4_addr"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "elem": {
index 9de5b821f79e7421d68e89cf98d7d0d5a8f18def..ad8a7cc0564a8c9635b9d8246ce28a0661a78164 100644 (file)
@@ -34,7 +34,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index 7bba69d54556a8ab58501c26ad51f256d28e9036..958d1e5cf6caf55b2e628c7b4156ff78febad67b 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index 581d534012e447987b501492676033536f3581c1..e5dc198f436be28f371eb80956f927d00ad4763b 100644 (file)
@@ -74,7 +74,9 @@
         },
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index 96fc54fc811c60366862a3bc2716f0149d6ebefc..3ae54e08153781aa463b00c73d1abd32cef04acd 100644 (file)
@@ -29,7 +29,9 @@
         },
         "handle": 0,
         "size": 1,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "auto-merge": true,
         "elem": [
           {
@@ -56,7 +58,9 @@
         },
         "handle": 0,
         "size": 1,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           "0.0.0.0"
         ]
index 9210c90b158d41ff97eb99b5be0ed47c5a088b12..ab4ac06184d03750f4a557ed93de76f3662d8acb 100644 (file)
@@ -33,7 +33,9 @@
         ],
         "handle": 0,
         "size": 65535,
-        "flags": "dynamic"
+        "flags": [
+          "dynamic"
+        ]
       }
     },
     {
index e1daa8f86529fed6dec54d36c24901dfa69203bb..c4682475917e569fd895b9230d4bef9ec950f282 100644 (file)
@@ -21,7 +21,9 @@
         "table": "t",
         "type": "inet_service",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           10,
           30,
index acb2f1f4944acb9f00d4e167d0227840a36cb52c..d92d8d7a549408796d50a2c48eb82844cb9c7e54 100644 (file)
@@ -40,7 +40,9 @@
           }
         },
         "handle": 0,
-        "flags": "timeout",
+        "flags": [
+          "timeout"
+        ],
         "timeout": 60
       }
     }
index 6f4f4c61600b227912fc250e73056f763b0e076b..6f692381b6f7c6ca4df2ace436b8cff935f5a8bf 100644 (file)
@@ -33,7 +33,9 @@
         "table": "nat",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     },
     {
index 77ca50868f26ffb59e0a2e957cb5e3b44d744b04..ac4284293c32ab492b7aab112c8b23eda5cbe564 100644 (file)
@@ -71,7 +71,9 @@
         "table": "testifsets",
         "type": "ifname",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           "abcdef*",
           "othername",
           "ifname"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "concat": [
         "type": "ifname",
         "handle": 0,
         "map": "verdict",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             "abcdef*",
index ffb97f77288f49f9054984d4f9694c891064aae6..144cd743ac7c90eb0cc683a23a1ed576b4d8146e 100644 (file)
         },
         "handle": 0,
         "size": 16,
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     },
     {
index b1fefc31e1f0a4b86af2a0d71b36a20881fe148d..70960a94204a31da76158337db66691e4f4692e8 100644 (file)
@@ -12,7 +12,9 @@
         "family": "ip",
         "name": "x",
         "handle": 0,
-        "flags": "dormant"
+        "flags": [
+          "dormant"
+        ]
       }
     },
     {
index f9fe4e6f113ea526a1708f5cb46612762a418936..e4c77147b88f66d57193f8721ff1e3f6cd487227 100644 (file)
@@ -21,7 +21,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval"
+        "flags": [
+          "interval"
+        ]
       }
     }
   ]
index 5f97d09e82c6ca58abe4ffa024574bb26d67e73f..0a36f4a809a0dd522a5353aedd4cdb4af4846c02 100644 (file)
@@ -21,7 +21,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index 5f97d09e82c6ca58abe4ffa024574bb26d67e73f..0a36f4a809a0dd522a5353aedd4cdb4af4846c02 100644 (file)
@@ -21,7 +21,9 @@
         "table": "x",
         "type": "ipv4_addr",
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "prefix": {
index fb6348f229b575d6534c30229310c4d0f8c7419c..a7e677b2e702c15789f158276a1317f83c14eb7b 100644 (file)
@@ -22,7 +22,9 @@
         "type": "ipv4_addr",
         "handle": 0,
         "map": "classid",
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           [
             "10.1.26.2",
index 1b9af211945ec91daefe2b795a89ce1d515e1660..2dced1240528f2ddbf0467b14e67c405c831c7d3 100644 (file)
@@ -24,7 +24,9 @@
           "ifname"
         ],
         "handle": 0,
-        "flags": "interval",
+        "flags": [
+          "interval"
+        ],
         "elem": [
           {
             "concat": [
index a7583e8c4efc4778200a1e894fadb9b52f7b2770..9b48ca4744a6500f1431049112786aafb160317f 100644 (file)
@@ -12,7 +12,9 @@
         "family": "ip",
         "name": "t",
         "handle": 0,
-        "flags": "dormant"
+        "flags": [
+          "dormant"
+        ]
       }
     },
     {