[PATCH nft 2/4] segtree: add expr_to_intervals()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Refactor code to add the new expr_to_intervals(). This function takes
the list of set element expressions and convert them to a list of
half-closed intervals.

This is useful for different purposes, such as interval overlap
and conflicts detection.

Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>
---
 src/segtree.c | 34 ++++++++++++++++++++++++++--------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/src/segtree.c b/src/segtree.c
index f544704..c8d63b8 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -299,20 +299,20 @@ static bool interval_conflict(const struct elementary_interval *e1,
 		return false;
 }
 
-static int set_to_segtree(struct list_head *msgs, struct expr *set,
-			  struct seg_tree *tree)
+static unsigned int expr_to_intervals(const struct expr *set,
+				      unsigned int keylen,
+				      struct elementary_interval **intervals)
 {
-	struct elementary_interval *intervals[set->size];
 	struct elementary_interval *ei;
 	struct expr *i, *next;
 	unsigned int n;
 	mpz_t low, high;
 
-	mpz_init2(low, tree->keylen);
-	mpz_init2(high, tree->keylen);
+	mpz_init2(low, keylen);
+	mpz_init2(high, keylen);
 
 	/*
-	 * Convert elements to intervals and sort by priority.
+	 * Convert elements to intervals
 	 */
 	n = 0;
 	list_for_each_entry_safe(i, next, &set->expressions, list) {
@@ -320,10 +320,30 @@ static int set_to_segtree(struct list_head *msgs, struct expr *set,
 		range_expr_value_high(high, i);
 		ei = ei_alloc(low, high, i, 0);
 		intervals[n++] = ei;
+	}
+	mpz_clear(high);
+	mpz_clear(low);
+
+	return n;
+}
+
+static int set_to_segtree(struct list_head *msgs, struct expr *set,
+			  struct seg_tree *tree)
+{
+	struct elementary_interval *intervals[set->size];
+	struct expr *i, *next;
+	unsigned int n;
+
+	n = expr_to_intervals(set, tree->keylen, intervals);
 
+	list_for_each_entry_safe(i, next, &set->expressions, list) {
 		list_del(&i->list);
 		expr_free(i);
 	}
+
+	/*
+	 * Sort intervals by priority.
+	 */
 	qsort(intervals, n, sizeof(intervals[0]), interval_cmp);
 
 	/*
@@ -340,8 +360,6 @@ static int set_to_segtree(struct list_head *msgs, struct expr *set,
 		ei_insert(tree, intervals[n]);
 	}
 
-	mpz_clear(high);
-	mpz_clear(low);
 	return 0;
 }
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux