All of lore.kernel.org
 help / color / mirror / Atom feed
From: Florian Westphal <fw@strlen.de>
To: <netfilter-devel@vger.kernel.org>
Cc: Florian Westphal <fw@strlen.de>
Subject: [PATCH nft] json: catchall element support
Date: Wed,  2 Jun 2021 20:38:46 +0200	[thread overview]
Message-ID: <20210602183846.60628-1-fw@strlen.de> (raw)

Treat '*' as catchall element, not as a symbol.
Also add missing json test cases for wildcard set support.

Signed-off-by: Florian Westphal <fw@strlen.de>
---
 include/json.h          |  1 +
 src/expression.c        |  1 +
 src/json.c              |  5 +++
 src/parser_json.c       | 11 +-----
 tests/py/ip/sets.t.json | 84 +++++++++++++++++++++++++++++++++++++++++
 5 files changed, 92 insertions(+), 10 deletions(-)

diff --git a/include/json.h b/include/json.h
index dd594bd03e1c..015e3ac780f8 100644
--- a/include/json.h
+++ b/include/json.h
@@ -37,6 +37,7 @@ json_t *concat_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *set_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *set_ref_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *set_elem_expr_json(const struct expr *expr, struct output_ctx *octx);
+json_t *set_elem_catchall_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *prefix_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *list_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *unary_expr_json(const struct expr *expr, struct output_ctx *octx);
diff --git a/src/expression.c b/src/expression.c
index c91333631ad0..c6be000107f2 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -1341,6 +1341,7 @@ static const struct expr_ops set_elem_catchall_expr_ops = {
 	.type		= EXPR_SET_ELEM_CATCHALL,
 	.name		= "catch-all set element",
 	.print		= set_elem_catchall_expr_print,
+	.json		= set_elem_catchall_expr_json,
 };
 
 struct expr *set_elem_catchall_expr_alloc(const struct location *loc)
diff --git a/src/json.c b/src/json.c
index e588ef4c1722..b08c004ae9c9 100644
--- a/src/json.c
+++ b/src/json.c
@@ -889,6 +889,11 @@ static json_t *symbolic_constant_json(const struct symbol_table *tbl,
 		return json_string(s->identifier);
 }
 
+json_t *set_elem_catchall_expr_json(const struct expr *expr, struct output_ctx *octx)
+{
+	return json_string("*");
+}
+
 static json_t *datatype_json(const struct expr *expr, struct output_ctx *octx)
 {
 	const struct datatype *dtype = expr->dtype;
diff --git a/src/parser_json.c b/src/parser_json.c
index 2e791807cce6..e6a0233ab6ce 100644
--- a/src/parser_json.c
+++ b/src/parser_json.c
@@ -315,15 +315,6 @@ static struct expr *json_parse_constant(struct json_ctx *ctx, const char *name)
 	return NULL;
 }
 
-static struct expr *wildcard_expr_alloc(void)
-{
-	struct expr *expr;
-
-	expr = constant_expr_alloc(int_loc, &integer_type,
-				   BYTEORDER_HOST_ENDIAN, 0, NULL);
-	return prefix_expr_alloc(int_loc, expr, 0);
-}
-
 /* this is a combination of symbol_expr, integer_expr, boolean_expr ... */
 static struct expr *json_parse_immediate(struct json_ctx *ctx, json_t *root)
 {
@@ -338,7 +329,7 @@ static struct expr *json_parse_immediate(struct json_ctx *ctx, json_t *root)
 			symtype = SYMBOL_SET;
 			str++;
 		} else if (str[0] == '*' && str[1] == '\0') {
-			return wildcard_expr_alloc();
+			return set_elem_catchall_expr_alloc(int_loc);
 		} else if (is_keyword(str)) {
 			return symbol_expr_alloc(int_loc,
 						 SYMBOL_VALUE, NULL, str);
diff --git a/tests/py/ip/sets.t.json b/tests/py/ip/sets.t.json
index 65d2df873623..d24b3918dc6d 100644
--- a/tests/py/ip/sets.t.json
+++ b/tests/py/ip/sets.t.json
@@ -188,3 +188,87 @@
     }
 ]
 
+# ip saddr @set6 drop
+[
+    {
+        "match": {
+            "left": {
+                "payload": {
+                    "field": "saddr",
+                    "protocol": "ip"
+                }
+            },
+            "op": "==",
+            "right": "@set6"
+        }
+    },
+    {
+        "drop": null
+    }
+]
+
+# ip saddr vmap { 1.1.1.1 : drop, * : accept }
+[
+    {
+        "vmap": {
+            "data": {
+                "set": [
+                    [
+                        "1.1.1.1",
+                        {
+                            "drop": null
+                        }
+                    ],
+                    [
+                        "*",
+                        {
+                            "accept": null
+                        }
+                    ]
+                ]
+            },
+            "key": {
+                "payload": {
+                    "field": "saddr",
+                    "protocol": "ip"
+                }
+            }
+        }
+    }
+]
+
+# meta mark set ip saddr map { 1.1.1.1 : 0x00000001, * : 0x00000002 }
+[
+    {
+        "mangle": {
+            "key": {
+                "meta": {
+                    "key": "mark"
+                }
+            },
+            "value": {
+                "map": {
+                    "data": {
+                        "set": [
+                            [
+                                "1.1.1.1",
+                                1
+                            ],
+                            [
+                                "*",
+                                2
+                            ]
+                        ]
+                    },
+                    "key": {
+                        "payload": {
+                            "field": "saddr",
+                            "protocol": "ip"
+                        }
+                    }
+                }
+            }
+        }
+    }
+]
+
-- 
2.31.1


                 reply	other threads:[~2021-06-02 18:38 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210602183846.60628-1-fw@strlen.de \
    --to=fw@strlen.de \
    --cc=netfilter-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.