netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Pablo Neira Ayuso <pablo@netfilter.org>
To: netfilter-devel@vger.kernel.org
Cc: fw@strlen.de
Subject: [PATCH nft,v2 2/3] segtree: incomplete output in get element command with maps
Date: Thu,  6 Mar 2025 19:28:11 +0100	[thread overview]
Message-ID: <20250306182812.330871-2-pablo@netfilter.org> (raw)
In-Reply-To: <20250306182812.330871-1-pablo@netfilter.org>

get element command displays an incomplete range:

 # nft get element x y { 1.1.1.2 }

Before:

 table ip x {
        map y {
                type ipv4_addr : mark
                flags interval,timeout
                elements = { 1.1.1.1 counter packets 0 bytes 0 timeout 10m expires 1m24s160ms : 0x00000014 }
        }
 }

Note that it displays 1.1.1.1, instead of 1.1.1.1-1.1.1.10.

After this fix:

 table ip x {
        map y {
                type ipv4_addr : mark
                flags interval,timeout
                elements = { 1.1.1.1-1.1.1.10 counter packets 0 bytes 0 timeout 10m expires 1m24s160ms : 0x00000014 }
        }
 }

Fixes: a43cc8d53096 ("src: support for get element command")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
v2: new in this series

 src/segtree.c | 39 ++++++++++++++++++++-------------------
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/src/segtree.c b/src/segtree.c
index bce38eef293c..e785fc25b5a2 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -110,19 +110,34 @@ struct expr *get_set_intervals(const struct set *set, const struct expr *init)
 	return new_init;
 }
 
+static struct expr *expr_value(struct expr *expr)
+{
+	switch (expr->etype) {
+	case EXPR_MAPPING:
+		return expr->left->key;
+	case EXPR_SET_ELEM:
+		return expr->key;
+	case EXPR_VALUE:
+		return expr;
+	default:
+		BUG("invalid expression type %s\n", expr_name(expr));
+	}
+}
+
 static struct expr *get_set_interval_find(const struct set *cache_set,
 					  struct expr *left,
 					  struct expr *right)
 {
 	const struct set *set = cache_set;
 	struct expr *range = NULL;
-	struct expr *i;
+	struct expr *i, *key;
 	mpz_t val;
 
 	mpz_init2(val, set->key->len);
 
 	list_for_each_entry(i, &set->init->expressions, list) {
-		switch (i->key->etype) {
+		key = expr_value(i);
+		switch (key->etype) {
 		case EXPR_VALUE:
 			if (expr_basetype(i->key)->type != TYPE_STRING)
 				break;
@@ -131,14 +146,14 @@ static struct expr *get_set_interval_find(const struct set *cache_set,
 		case EXPR_PREFIX:
 		case EXPR_RANGE:
 			range_expr_value_low(val, i);
-			if (left && mpz_cmp(left->key->value, val))
+			if (left && mpz_cmp(expr_value(left)->value, val))
 				break;
 
 			range_expr_value_high(val, i);
-			if (right && mpz_cmp(right->key->value, val))
+			if (right && mpz_cmp(expr_value(right)->value, val))
 				break;
 
-			range = expr_clone(i->key);
+			range = expr_clone(i);
 			goto out;
 		default:
 			break;
@@ -150,20 +165,6 @@ out:
 	return range;
 }
 
-static struct expr *expr_value(struct expr *expr)
-{
-	switch (expr->etype) {
-	case EXPR_MAPPING:
-		return expr->left->key;
-	case EXPR_SET_ELEM:
-		return expr->key;
-	case EXPR_VALUE:
-		return expr;
-	default:
-		BUG("invalid expression type %s\n", expr_name(expr));
-	}
-}
-
 static struct expr *__expr_to_set_elem(struct expr *low, struct expr *expr)
 {
 	struct expr *elem = set_elem_expr_alloc(&low->location, expr);
-- 
2.30.2


  reply	other threads:[~2025-03-06 18:28 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-06 18:28 [PATCH nft,v2 1/3] src: fix reset element support for interval set type Pablo Neira Ayuso
2025-03-06 18:28 ` Pablo Neira Ayuso [this message]
2025-03-06 18:28 ` [PATCH nft,v2 3/3] tests: extend reset test case to cover interval set and map type Pablo Neira Ayuso
2025-03-07 11:16 ` [PATCH nft,v2 1/3] src: fix reset element support for interval set type Florian Westphal
2025-03-07 12:57   ` Pablo Neira Ayuso

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=20250306182812.330871-2-pablo@netfilter.org \
    --to=pablo@netfilter.org \
    --cc=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).