From: Pablo Neira Ayuso <pablo@netfilter.org>
To: netfilter-devel@vger.kernel.org
Subject: [PATCH nft 2/4] segtree: add expr_to_intervals()
Date: Sat, 23 Apr 2016 18:08:38 +0200 [thread overview]
Message-ID: <1461427720-4939-3-git-send-email-pablo@netfilter.org> (raw)
In-Reply-To: <1461427720-4939-1-git-send-email-pablo@netfilter.org>
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@netfilter.org>
---
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
next prev parent reply other threads:[~2016-04-23 16:08 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-23 16:08 [PATCH nft 0/4] Interval overlap detection for named sets Pablo Neira Ayuso
2016-04-23 16:08 ` [PATCH nft 1/4] segtree: set expr->len for prefix expression from interval_map_decompose() Pablo Neira Ayuso
2016-04-23 16:08 ` Pablo Neira Ayuso [this message]
2016-04-23 16:08 ` [PATCH nft 3/4] segtree: rename set expression set_to_segtree() Pablo Neira Ayuso
2016-04-23 16:08 ` [PATCH nft 4/4] segtree: add interval overlap detection for dynamic updates Pablo Neira Ayuso
2016-04-25 10:38 ` [PATCH nft 0/4] Interval overlap detection for named sets Patrick McHardy
2016-04-25 11:57 ` Pablo Neira Ayuso
2016-04-25 16:59 ` Patrick McHardy
2016-04-25 21:32 ` Pablo Neira Ayuso
2016-04-25 21:49 ` Patrick McHardy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1461427720-4939-3-git-send-email-pablo@netfilter.org \
--to=pablo@netfilter.org \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).