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

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