Blame SOURCES/0027-segtree-Merge-get_set_interval_find-and-get_set_inte.patch

3e48d9
From 40cdcccf0fc6f4d0d4c2248d4bd9bf3193a922e9 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: Merge get_set_interval_find() and
3e48d9
 get_set_interval_end()
3e48d9
3e48d9
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1832235
3e48d9
Upstream Status: nftables commit f21e73d6700b8
3e48d9
3e48d9
commit f21e73d6700b873eb1a295f43bbad9caaca577e2
3e48d9
Author: Phil Sutter <phil@nwl.cc>
3e48d9
Date:   Thu Apr 30 13:57:35 2020 +0200
3e48d9
3e48d9
    segtree: Merge get_set_interval_find() and get_set_interval_end()
3e48d9
3e48d9
    Both functions were very similar already. Under the assumption that they
3e48d9
    will always either see a range (or start of) that matches exactly or not
3e48d9
    at all, reduce complexity and make get_set_interval_find() accept NULL
3e48d9
    (left or) right values. This way it becomes a full replacement for
3e48d9
    get_set_interval_end().
3e48d9
3e48d9
    Signed-off-by: Phil Sutter <phil@nwl.cc>
3e48d9
---
252916
 src/segtree.c | 63 +++++++++++++--------------------------------------
3e48d9
 1 file changed, 16 insertions(+), 47 deletions(-)
3e48d9
3e48d9
diff --git a/src/segtree.c b/src/segtree.c
3e48d9
index dc4db6b..6e1f696 100644
3e48d9
--- a/src/segtree.c
3e48d9
+++ b/src/segtree.c
3e48d9
@@ -681,63 +681,31 @@ static struct expr *get_set_interval_find(const struct table *table,
3e48d9
 {
3e48d9
 	struct expr *range = NULL;
3e48d9
 	struct set *set;
3e48d9
-	mpz_t low, high;
3e48d9
 	struct expr *i;
3e48d9
+	mpz_t val;
3e48d9
 
3e48d9
 	set = set_lookup(table, set_name);
3e48d9
-	mpz_init2(low, set->key->len);
3e48d9
-	mpz_init2(high, set->key->len);
3e48d9
+	mpz_init2(val, set->key->len);
3e48d9
 
3e48d9
 	list_for_each_entry(i, &set->init->expressions, list) {
3e48d9
 		switch (i->key->etype) {
3e48d9
 		case EXPR_RANGE:
3e48d9
-			range_expr_value_low(low, i);
3e48d9
-			range_expr_value_high(high, i);
3e48d9
-			if (mpz_cmp(left->key->value, low) >= 0 &&
3e48d9
-			    mpz_cmp(right->key->value, high) <= 0) {
3e48d9
-				range = expr_clone(i->key);
3e48d9
-				goto out;
3e48d9
-			}
3e48d9
-			break;
3e48d9
-		default:
3e48d9
-			break;
3e48d9
-		}
3e48d9
-	}
3e48d9
-out:
3e48d9
-	mpz_clear(low);
3e48d9
-	mpz_clear(high);
3e48d9
-
3e48d9
-	return range;
3e48d9
-}
3e48d9
-
3e48d9
-static struct expr *get_set_interval_end(const struct table *table,
3e48d9
-					 const char *set_name,
3e48d9
-					 struct expr *left)
3e48d9
-{
3e48d9
-	struct expr *i, *range = NULL;
3e48d9
-	struct set *set;
3e48d9
-	mpz_t low, high;
3e48d9
+			range_expr_value_low(val, i);
3e48d9
+			if (left && mpz_cmp(left->key->value, val))
3e48d9
+				break;
3e48d9
 
3e48d9
-	set = set_lookup(table, set_name);
3e48d9
-	mpz_init2(low, set->key->len);
3e48d9
-	mpz_init2(high, set->key->len);
3e48d9
+			range_expr_value_high(val, i);
3e48d9
+			if (right && mpz_cmp(right->key->value, val))
3e48d9
+				break;
3e48d9
 
3e48d9
-	list_for_each_entry(i, &set->init->expressions, list) {
3e48d9
-		switch (i->key->etype) {
3e48d9
-		case EXPR_RANGE:
3e48d9
-			range_expr_value_low(low, i);
3e48d9
-			if (mpz_cmp(low, left->key->value) == 0) {
3e48d9
-				range = expr_clone(i->key);
3e48d9
-				goto out;
3e48d9
-			}
3e48d9
-			break;
3e48d9
+			range = expr_clone(i->key);
3e48d9
+			goto out;
3e48d9
 		default:
3e48d9
 			break;
3e48d9
 		}
3e48d9
 	}
3e48d9
 out:
3e48d9
-	mpz_clear(low);
3e48d9
-	mpz_clear(high);
3e48d9
+	mpz_clear(val);
3e48d9
 
3e48d9
 	return range;
3e48d9
 }
3e48d9
@@ -767,9 +735,9 @@ int get_set_decompose(struct table *table, struct set *set)
3e48d9
 			left = NULL;
3e48d9
 		} else {
3e48d9
 			if (left) {
3e48d9
-				range = get_set_interval_end(table,
3e48d9
-							     set->handle.set.name,
3e48d9
-							     left);
3e48d9
+				range = get_set_interval_find(table,
3e48d9
+							      set->handle.set.name,
3e48d9
+							      left, NULL);
3e48d9
 				if (range)
3e48d9
 					compound_expr_add(new_init, range);
3e48d9
 				else
3e48d9
@@ -780,7 +748,8 @@ int get_set_decompose(struct table *table, struct set *set)
3e48d9
 		}
3e48d9
 	}
3e48d9
 	if (left) {
3e48d9
-		range = get_set_interval_end(table, set->handle.set.name, left);
3e48d9
+		range = get_set_interval_find(table, set->handle.set.name,
3e48d9
+					      left, NULL);
3e48d9
 		if (range)
3e48d9
 			compound_expr_add(new_init, range);
3e48d9
 		else
3e48d9
-- 
252916
2.31.1
3e48d9