diff options
author | Florian Westphal <fw@strlen.de> | 2022-04-09 15:58:28 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2022-04-13 13:43:35 +0200 |
commit | 2fb4d7ead460ec4fb00bd317d93a5e076f825b39 (patch) | |
tree | fb50ec5e275ba6148a30ff93152ec5a77674251f /src/expression.c | |
parent | 403936c1ffa34bc597d7ee0792154fc6c6b483f2 (diff) |
src: make interval sets work with string datatypes
Allows to interface names in interval sets:
table inet filter {
set s {
type ifname
flags interval
elements = { eth*, foo }
}
Concatenations are not yet supported, also, listing is broken,
those strings will not be printed back because the values will remain
in big-endian order. Followup patch will extend segtree to translate
this back to host byte order.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/expression.c')
-rw-r--r-- | src/expression.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/expression.c b/src/expression.c index deb649e1..5d879b53 100644 --- a/src/expression.c +++ b/src/expression.c @@ -1442,7 +1442,11 @@ void range_expr_value_low(mpz_t rop, const struct expr *expr) { switch (expr->etype) { case EXPR_VALUE: - return mpz_set(rop, expr->value); + mpz_set(rop, expr->value); + if (expr->byteorder == BYTEORDER_HOST_ENDIAN && + expr_basetype(expr)->type == TYPE_STRING) + mpz_switch_byteorder(rop, expr->len / BITS_PER_BYTE); + return; case EXPR_PREFIX: return range_expr_value_low(rop, expr->prefix); case EXPR_RANGE: @@ -1462,7 +1466,7 @@ void range_expr_value_high(mpz_t rop, const struct expr *expr) switch (expr->etype) { case EXPR_VALUE: - return mpz_set(rop, expr->value); + return range_expr_value_low(rop, expr); case EXPR_PREFIX: range_expr_value_low(rop, expr->prefix); assert(expr->len >= expr->prefix_len); |