From bb6312484af93a83a9ec8716f3887a43566a775a Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Sat, 28 Sep 2024 00:55:34 +0200 Subject: json: Support typeof in set and map types Implement this as a special "type" property value which is an object with sole property "typeof". The latter's value is the JSON representation of the expression in set->key, so for concatenated typeofs it is a concat expression. All this is a bit clumsy right now but it works and it should be possible to tear it down a bit for more user-friendliness in a compatible way by either replacing the concat expression by the array it contains or even the whole "typeof" object - the parser would just assume any object (or objects in an array) in the "type" property value are expressions to extract a type from. Signed-off-by: Phil Sutter --- .../testcases/maps/dumps/0012map_concat_0.json-nft | 21 +++++++-- .../maps/dumps/0017_map_variable_0.json-nft | 18 ++++++- .../testcases/maps/dumps/named_limits.json-nft | 55 ++++++++++++++++++---- .../maps/dumps/typeof_maps_add_delete.json-nft | 9 +++- .../maps/dumps/typeof_maps_update_0.json-nft | 9 +++- .../testcases/maps/dumps/vmap_timeout.json-nft | 22 +++++++-- .../packetpath/dumps/set_lookups.json-nft | 42 +++++++++++++---- .../sets/dumps/0048set_counters_0.json-nft | 9 +++- tests/shell/testcases/sets/dumps/inner_0.json-nft | 34 +++++++++++-- .../dumps/set_element_timeout_updates.json-nft | 9 +++- 10 files changed, 193 insertions(+), 35 deletions(-) (limited to 'tests/shell/testcases') diff --git a/tests/shell/testcases/maps/dumps/0012map_concat_0.json-nft b/tests/shell/testcases/maps/dumps/0012map_concat_0.json-nft index 00052236..88bf4984 100644 --- a/tests/shell/testcases/maps/dumps/0012map_concat_0.json-nft +++ b/tests/shell/testcases/maps/dumps/0012map_concat_0.json-nft @@ -31,10 +31,23 @@ "family": "ip", "name": "w", "table": "x", - "type": [ - "ipv4_addr", - "mark" - ], + "type": { + "typeof": { + "concat": [ + { + "payload": { + "protocol": "ip", + "field": "saddr" + } + }, + { + "meta": { + "key": "mark" + } + } + ] + } + }, "handle": 0, "map": "verdict", "flags": [ diff --git a/tests/shell/testcases/maps/dumps/0017_map_variable_0.json-nft b/tests/shell/testcases/maps/dumps/0017_map_variable_0.json-nft index 725498cd..8eacf612 100644 --- a/tests/shell/testcases/maps/dumps/0017_map_variable_0.json-nft +++ b/tests/shell/testcases/maps/dumps/0017_map_variable_0.json-nft @@ -19,7 +19,14 @@ "family": "ip", "name": "y", "table": "x", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip", + "field": "saddr" + } + } + }, "handle": 0, "map": "mark", "elem": [ @@ -39,7 +46,14 @@ "family": "ip", "name": "z", "table": "x", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip", + "field": "saddr" + } + } + }, "handle": 0, "map": "mark", "elem": [ diff --git a/tests/shell/testcases/maps/dumps/named_limits.json-nft b/tests/shell/testcases/maps/dumps/named_limits.json-nft index 7fa12981..3c6845ac 100644 --- a/tests/shell/testcases/maps/dumps/named_limits.json-nft +++ b/tests/shell/testcases/maps/dumps/named_limits.json-nft @@ -75,7 +75,14 @@ "family": "inet", "name": "tarpit4", "table": "filter", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip", + "field": "saddr" + } + } + }, "handle": 0, "size": 10000, "flags": [ @@ -90,7 +97,14 @@ "family": "inet", "name": "tarpit6", "table": "filter", - "type": "ipv6_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip6", + "field": "saddr" + } + } + }, "handle": 0, "size": 10000, "flags": [ @@ -105,11 +119,29 @@ "family": "inet", "name": "addr4limit", "table": "filter", - "type": [ - "inet_proto", - "ipv4_addr", - "inet_service" - ], + "type": { + "typeof": { + "concat": [ + { + "meta": { + "key": "l4proto" + } + }, + { + "payload": { + "protocol": "ip", + "field": "saddr" + } + }, + { + "payload": { + "protocol": "tcp", + "field": "sport" + } + } + ] + } + }, "handle": 0, "map": "limit", "flags": [ @@ -244,7 +276,14 @@ "family": "inet", "name": "saddr6limit", "table": "filter", - "type": "ipv6_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip6", + "field": "saddr" + } + } + }, "handle": 0, "map": "limit", "flags": [ diff --git a/tests/shell/testcases/maps/dumps/typeof_maps_add_delete.json-nft b/tests/shell/testcases/maps/dumps/typeof_maps_add_delete.json-nft index b3204a28..effe02dc 100644 --- a/tests/shell/testcases/maps/dumps/typeof_maps_add_delete.json-nft +++ b/tests/shell/testcases/maps/dumps/typeof_maps_add_delete.json-nft @@ -39,7 +39,14 @@ "family": "ip", "name": "dynmark", "table": "dynset", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip", + "field": "daddr" + } + } + }, "handle": 0, "map": "mark", "size": 64, diff --git a/tests/shell/testcases/maps/dumps/typeof_maps_update_0.json-nft b/tests/shell/testcases/maps/dumps/typeof_maps_update_0.json-nft index 1d50477d..73151466 100644 --- a/tests/shell/testcases/maps/dumps/typeof_maps_update_0.json-nft +++ b/tests/shell/testcases/maps/dumps/typeof_maps_update_0.json-nft @@ -50,7 +50,14 @@ "family": "ip", "name": "sticky-set-svc-153CN2XYVUHRQ7UB", "table": "kube-nfproxy-v4", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip", + "field": "daddr" + } + } + }, "handle": 0, "map": "mark", "size": 65535, diff --git a/tests/shell/testcases/maps/dumps/vmap_timeout.json-nft b/tests/shell/testcases/maps/dumps/vmap_timeout.json-nft index 1c3aa590..71e9a9ee 100644 --- a/tests/shell/testcases/maps/dumps/vmap_timeout.json-nft +++ b/tests/shell/testcases/maps/dumps/vmap_timeout.json-nft @@ -87,10 +87,24 @@ "family": "inet", "name": "portaddrmap", "table": "filter", - "type": [ - "ipv4_addr", - "inet_service" - ], + "type": { + "typeof": { + "concat": [ + { + "payload": { + "protocol": "ip", + "field": "daddr" + } + }, + { + "payload": { + "protocol": "th", + "field": "dport" + } + } + ] + } + }, "handle": 0, "map": "verdict", "flags": [ diff --git a/tests/shell/testcases/packetpath/dumps/set_lookups.json-nft b/tests/shell/testcases/packetpath/dumps/set_lookups.json-nft index 24363f90..bcf6914e 100644 --- a/tests/shell/testcases/packetpath/dumps/set_lookups.json-nft +++ b/tests/shell/testcases/packetpath/dumps/set_lookups.json-nft @@ -60,10 +60,23 @@ "family": "ip", "name": "s2", "table": "t", - "type": [ - "ipv4_addr", - "iface_index" - ], + "type": { + "typeof": { + "concat": [ + { + "payload": { + "protocol": "ip", + "field": "saddr" + } + }, + { + "meta": { + "key": "iif" + } + } + ] + } + }, "handle": 0, "elem": [ { @@ -113,10 +126,23 @@ "family": "ip", "name": "nomatch", "table": "t", - "type": [ - "ipv4_addr", - "iface_index" - ], + "type": { + "typeof": { + "concat": [ + { + "payload": { + "protocol": "ip", + "field": "saddr" + } + }, + { + "meta": { + "key": "iif" + } + } + ] + } + }, "handle": 0, "elem": [ { diff --git a/tests/shell/testcases/sets/dumps/0048set_counters_0.json-nft b/tests/shell/testcases/sets/dumps/0048set_counters_0.json-nft index 62a6a177..4be4112b 100644 --- a/tests/shell/testcases/sets/dumps/0048set_counters_0.json-nft +++ b/tests/shell/testcases/sets/dumps/0048set_counters_0.json-nft @@ -31,7 +31,14 @@ "family": "ip", "name": "y", "table": "x", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip", + "field": "saddr" + } + } + }, "handle": 0, "elem": [ { diff --git a/tests/shell/testcases/sets/dumps/inner_0.json-nft b/tests/shell/testcases/sets/dumps/inner_0.json-nft index 8d84e1cc..e5dc198f 100644 --- a/tests/shell/testcases/sets/dumps/inner_0.json-nft +++ b/tests/shell/testcases/sets/dumps/inner_0.json-nft @@ -27,10 +27,26 @@ "family": "netdev", "name": "x", "table": "x", - "type": [ - "ipv4_addr", - "ipv4_addr" - ], + "type": { + "typeof": { + "concat": [ + { + "payload": { + "tunnel": "vxlan", + "protocol": "ip", + "field": "saddr" + } + }, + { + "payload": { + "tunnel": "vxlan", + "protocol": "ip", + "field": "daddr" + } + } + ] + } + }, "handle": 0, "elem": [ { @@ -47,7 +63,15 @@ "family": "netdev", "name": "y", "table": "x", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "tunnel": "vxlan", + "protocol": "ip", + "field": "saddr" + } + } + }, "handle": 0, "size": 65535, "flags": [ diff --git a/tests/shell/testcases/sets/dumps/set_element_timeout_updates.json-nft b/tests/shell/testcases/sets/dumps/set_element_timeout_updates.json-nft index aa908297..d92d8d7a 100644 --- a/tests/shell/testcases/sets/dumps/set_element_timeout_updates.json-nft +++ b/tests/shell/testcases/sets/dumps/set_element_timeout_updates.json-nft @@ -31,7 +31,14 @@ "family": "ip", "name": "s", "table": "t", - "type": "ipv4_addr", + "type": { + "typeof": { + "payload": { + "protocol": "ip", + "field": "saddr" + } + } + }, "handle": 0, "flags": [ "timeout" -- cgit v1.2.3