Blame SOURCES/0029-segtree-Fix-get-element-command-with-prefixes.patch

3e48d9
From 3a2016f539e46183965bada40946e259c33158d9 Mon Sep 17 00:00:00 2001
3e48d9
From: Phil Sutter <psutter@redhat.com>
3e48d9
Date: Tue, 30 Jun 2020 16:20:23 +0200
3e48d9
Subject: [PATCH] segtree: Fix get element command with prefixes
3e48d9
3e48d9
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1832235
3e48d9
Upstream Status: nftables commit 506fb113f7ca4
3e48d9
3e48d9
commit 506fb113f7ca4fbb3d6da09ef6f9dc2b31f54a1f
3e48d9
Author: Phil Sutter <phil@nwl.cc>
3e48d9
Date:   Thu Apr 30 14:02:44 2020 +0200
3e48d9
3e48d9
    segtree: Fix get element command with prefixes
3e48d9
3e48d9
    Code wasn't aware of prefix elements in interval sets. With previous
3e48d9
    changes in place, they merely need to be accepted in
3e48d9
    get_set_interval_find() - value comparison and expression duplication is
3e48d9
    identical to ranges.
3e48d9
3e48d9
    Extend sets/0034get_element_0 test to cover prefixes as well. While
3e48d9
    being at it, also cover concatenated ranges.
3e48d9
3e48d9
    Signed-off-by: Phil Sutter <phil@nwl.cc>
3e48d9
---
3e48d9
 src/segtree.c                                |  1 +
252916
 tests/shell/testcases/sets/0034get_element_0 | 62 ++++++++++++++------
3e48d9
 2 files changed, 45 insertions(+), 18 deletions(-)
3e48d9
3e48d9
diff --git a/src/segtree.c b/src/segtree.c
3e48d9
index 6e1f696..073c6ec 100644
3e48d9
--- a/src/segtree.c
3e48d9
+++ b/src/segtree.c
3e48d9
@@ -689,6 +689,7 @@ static struct expr *get_set_interval_find(const struct table *table,
3e48d9
 
3e48d9
 	list_for_each_entry(i, &set->init->expressions, list) {
3e48d9
 		switch (i->key->etype) {
3e48d9
+		case EXPR_PREFIX:
3e48d9
 		case EXPR_RANGE:
3e48d9
 			range_expr_value_low(val, i);
3e48d9
 			if (left && mpz_cmp(left->key->value, val))
3e48d9
diff --git a/tests/shell/testcases/sets/0034get_element_0 b/tests/shell/testcases/sets/0034get_element_0
3e48d9
index e23dbda..3343529 100755
3e48d9
--- a/tests/shell/testcases/sets/0034get_element_0
3e48d9
+++ b/tests/shell/testcases/sets/0034get_element_0
3e48d9
@@ -2,43 +2,69 @@
3e48d9
 
3e48d9
 RC=0
3e48d9
 
3e48d9
-check() { # (elems, expected)
3e48d9
-	out=$($NFT get element ip t s "{ $1 }")
3e48d9
+check() { # (set, elems, expected)
3e48d9
+	out=$($NFT get element ip t $1 "{ $2 }")
3e48d9
 	out=$(grep "elements =" <<< "$out")
3e48d9
 	out="${out#* \{ }"
3e48d9
 	out="${out% \}}"
3e48d9
-	[[ "$out" == "$2" ]] && return
3e48d9
-	echo "ERROR: asked for '$1', expecting '$2' but got '$out'"
3e48d9
+	[[ "$out" == "$3" ]] && return
3e48d9
+	echo "ERROR: asked for '$2' in set $1, expecting '$3' but got '$out'"
3e48d9
 	((RC++))
3e48d9
 }
3e48d9
 
3e48d9
 RULESET="add table ip t
3e48d9
 add set ip t s { type inet_service; flags interval; }
3e48d9
 add element ip t s { 10, 20-30, 40, 50-60 }
3e48d9
+add set ip t ips { type ipv4_addr; flags interval; }
3e48d9
+add element ip t ips { 10.0.0.1, 10.0.0.5-10.0.0.8 }
3e48d9
+add element ip t ips { 10.0.0.128/25, 10.0.1.0/24, 10.0.2.3-10.0.2.12 }
3e48d9
+add set ip t cs { type ipv4_addr . inet_service; flags interval; }
3e48d9
+add element ip t cs { 10.0.0.1 . 22, 10.1.0.0/16 . 1-1024 }
3e48d9
+add element ip t cs { 10.2.0.1-10.2.0.8 . 1024-65535 }
3e48d9
 "
3e48d9
 
3e48d9
 $NFT -f - <<< "$RULESET"
3e48d9
 
3e48d9
 # simple cases, (non-)existing values and ranges
3e48d9
-check 10 10
3e48d9
-check 11 ""
3e48d9
-check 20-30 20-30
3e48d9
-check 15-18 ""
3e48d9
+check s 10 10
3e48d9
+check s 11 ""
3e48d9
+check s 20-30 20-30
3e48d9
+check s 15-18 ""
3e48d9
 
3e48d9
 # multiple single elements, ranges smaller than present
3e48d9
-check "10, 40" "10, 40"
3e48d9
-check "22-24, 26-28" "20-30, 20-30"
3e48d9
-check 21-29 20-30
3e48d9
+check s "10, 40" "10, 40"
3e48d9
+check s "22-24, 26-28" "20-30, 20-30"
3e48d9
+check s 21-29 20-30
3e48d9
 
3e48d9
 # mixed single elements and ranges
3e48d9
-check "10, 20" "10, 20-30"
3e48d9
-check "10, 22" "10, 20-30"
3e48d9
-check "10, 22-24" "10, 20-30"
3e48d9
+check s "10, 20" "10, 20-30"
3e48d9
+check s "10, 22" "10, 20-30"
3e48d9
+check s "10, 22-24" "10, 20-30"
3e48d9
 
3e48d9
 # non-existing ranges matching elements
3e48d9
-check 10-40 ""
3e48d9
-check 10-20 ""
3e48d9
-check 10-25 ""
3e48d9
-check 25-55 ""
3e48d9
+check s 10-40 ""
3e48d9
+check s 10-20 ""
3e48d9
+check s 10-25 ""
3e48d9
+check s 25-55 ""
3e48d9
+
3e48d9
+# playing with IPs, ranges and prefixes
3e48d9
+check ips 10.0.0.1 10.0.0.1
3e48d9
+check ips 10.0.0.2 ""
3e48d9
+check ips 10.0.1.0/24 10.0.1.0/24
3e48d9
+check ips 10.0.1.2/31 10.0.1.0/24
3e48d9
+check ips 10.0.1.0 10.0.1.0/24
3e48d9
+check ips 10.0.1.3 10.0.1.0/24
3e48d9
+check ips 10.0.1.255 10.0.1.0/24
3e48d9
+check ips 10.0.2.3-10.0.2.12 10.0.2.3-10.0.2.12
3e48d9
+check ips 10.0.2.10 10.0.2.3-10.0.2.12
3e48d9
+check ips 10.0.2.12 10.0.2.3-10.0.2.12
3e48d9
+
3e48d9
+# test concatenated ranges, i.e. Pi, Pa and Po
3e48d9
+check cs "10.0.0.1 . 22" "10.0.0.1 . 22"
3e48d9
+check cs "10.0.0.1 . 23" ""
3e48d9
+check cs "10.0.0.2 . 22" ""
3e48d9
+check cs "10.1.0.1 . 42" "10.1.0.0/16 . 1-1024"
3e48d9
+check cs "10.1.1.0/24 . 10-20" "10.1.0.0/16 . 1-1024"
3e48d9
+check cs "10.2.0.3 . 20000" "10.2.0.1-10.2.0.8 . 1024-65535"
3e48d9
 
3e48d9
 exit $RC
3e48d9
-- 
252916
2.31.1
3e48d9