144 lines
4.0 KiB
Diff
144 lines
4.0 KiB
Diff
|
|
From ada50f84bf5a1475549f3f372834812e7cd8d675 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Florian Westphal <fw@strlen.de>
|
||
|
|
Date: Sat, 9 Apr 2022 15:58:26 +0200
|
||
|
|
Subject: segtree: split prefix and range creation to a helper function
|
||
|
|
|
||
|
|
No functional change intended.
|
||
|
|
|
||
|
|
Conflict: NA
|
||
|
|
Reference: https://git.netfilter.org/nftables/patch/src/segtree.c?id=ada50f84bf5a1475549f3f372834812e7cd8d675
|
||
|
|
|
||
|
|
Signed-off-by: Florian Westphal <fw@strlen.de>
|
||
|
|
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
||
|
|
---
|
||
|
|
src/segtree.c | 95 ++++++++++++++++++++++++++++++++---------------------------
|
||
|
|
1 file changed, 52 insertions(+), 43 deletions(-)
|
||
|
|
|
||
|
|
(limited to 'src/segtree.c')
|
||
|
|
|
||
|
|
diff --git a/src/segtree.c b/src/segtree.c
|
||
|
|
index a61ea3d2..188cafed 100644
|
||
|
|
--- a/src/segtree.c
|
||
|
|
+++ b/src/segtree.c
|
||
|
|
@@ -773,6 +773,22 @@ out:
|
||
|
|
return range;
|
||
|
|
}
|
||
|
|
|
||
|
|
+static struct expr *__expr_to_set_elem(struct expr *low, struct expr *expr)
|
||
|
|
+{
|
||
|
|
+ struct expr *elem = set_elem_expr_alloc(&low->location, expr);
|
||
|
|
+
|
||
|
|
+ if (low->etype == EXPR_MAPPING) {
|
||
|
|
+ interval_expr_copy(elem, low->left);
|
||
|
|
+
|
||
|
|
+ elem = mapping_expr_alloc(&low->location, elem,
|
||
|
|
+ expr_clone(low->right));
|
||
|
|
+ } else {
|
||
|
|
+ interval_expr_copy(elem, low);
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return elem;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
int get_set_decompose(struct set *cache_set, struct set *set)
|
||
|
|
{
|
||
|
|
struct expr *i, *next, *range;
|
||
|
|
@@ -980,6 +996,38 @@ next:
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+static struct expr *interval_to_prefix(struct expr *low, struct expr *i, const mpz_t range)
|
||
|
|
+{
|
||
|
|
+ unsigned int prefix_len;
|
||
|
|
+ struct expr *prefix;
|
||
|
|
+
|
||
|
|
+ prefix_len = expr_value(i)->len - mpz_scan0(range, 0);
|
||
|
|
+ prefix = prefix_expr_alloc(&low->location,
|
||
|
|
+ expr_clone(expr_value(low)),
|
||
|
|
+ prefix_len);
|
||
|
|
+ prefix->len = expr_value(i)->len;
|
||
|
|
+
|
||
|
|
+ return __expr_to_set_elem(low, prefix);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+static struct expr *interval_to_range(struct expr *low, struct expr *i, mpz_t range)
|
||
|
|
+{
|
||
|
|
+ struct expr *tmp;
|
||
|
|
+
|
||
|
|
+ tmp = constant_expr_alloc(&low->location, low->dtype,
|
||
|
|
+ low->byteorder, expr_value(low)->len,
|
||
|
|
+ NULL);
|
||
|
|
+
|
||
|
|
+ mpz_add(range, range, expr_value(low)->value);
|
||
|
|
+ mpz_set(tmp->value, range);
|
||
|
|
+
|
||
|
|
+ tmp = range_expr_alloc(&low->location,
|
||
|
|
+ expr_clone(expr_value(low)),
|
||
|
|
+ tmp);
|
||
|
|
+
|
||
|
|
+ return __expr_to_set_elem(low, tmp);
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
void interval_map_decompose(struct expr *set)
|
||
|
|
{
|
||
|
|
struct expr *i, *next, *low = NULL, *end, *catchall = NULL, *key;
|
||
|
|
@@ -1065,52 +1113,13 @@ void interval_map_decompose(struct expr *set)
|
||
|
|
else if ((!range_is_prefix(range) ||
|
||
|
|
!(i->dtype->flags & DTYPE_F_PREFIX)) ||
|
||
|
|
mpz_cmp_ui(p, 0)) {
|
||
|
|
- struct expr *tmp;
|
||
|
|
-
|
||
|
|
- tmp = constant_expr_alloc(&low->location, low->dtype,
|
||
|
|
- low->byteorder, expr_value(low)->len,
|
||
|
|
- NULL);
|
||
|
|
-
|
||
|
|
- mpz_add(range, range, expr_value(low)->value);
|
||
|
|
- mpz_set(tmp->value, range);
|
||
|
|
+ struct expr *expr = interval_to_range(low, i, range);
|
||
|
|
|
||
|
|
- tmp = range_expr_alloc(&low->location,
|
||
|
|
- expr_clone(expr_value(low)),
|
||
|
|
- tmp);
|
||
|
|
- tmp = set_elem_expr_alloc(&low->location, tmp);
|
||
|
|
-
|
||
|
|
- if (low->etype == EXPR_MAPPING) {
|
||
|
|
- interval_expr_copy(tmp, low->left);
|
||
|
|
-
|
||
|
|
- tmp = mapping_expr_alloc(&tmp->location, tmp,
|
||
|
|
- expr_clone(low->right));
|
||
|
|
- } else {
|
||
|
|
- interval_expr_copy(tmp, low);
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- compound_expr_add(set, tmp);
|
||
|
|
+ compound_expr_add(set, expr);
|
||
|
|
} else {
|
||
|
|
- struct expr *prefix;
|
||
|
|
- unsigned int prefix_len;
|
||
|
|
-
|
||
|
|
- prefix_len = expr_value(i)->len - mpz_scan0(range, 0);
|
||
|
|
- prefix = prefix_expr_alloc(&low->location,
|
||
|
|
- expr_clone(expr_value(low)),
|
||
|
|
- prefix_len);
|
||
|
|
- prefix->len = expr_value(i)->len;
|
||
|
|
-
|
||
|
|
- prefix = set_elem_expr_alloc(&low->location, prefix);
|
||
|
|
-
|
||
|
|
- if (low->etype == EXPR_MAPPING) {
|
||
|
|
- interval_expr_copy(prefix, low->left);
|
||
|
|
-
|
||
|
|
- prefix = mapping_expr_alloc(&low->location, prefix,
|
||
|
|
- expr_clone(low->right));
|
||
|
|
- } else {
|
||
|
|
- interval_expr_copy(prefix, low);
|
||
|
|
- }
|
||
|
|
+ struct expr *expr = interval_to_prefix(low, i, range);
|
||
|
|
|
||
|
|
- compound_expr_add(set, prefix);
|
||
|
|
+ compound_expr_add(set, expr);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (i->flags & EXPR_F_INTERVAL_END) {
|
||
|
|
--
|
||
|
|
cgit v1.2.3
|