summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2024-08-19 21:03:02 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2024-08-21 23:22:47 +0200
commitffb45bd3f730e4f1bb3348f15abbb0ea87fbb1cb (patch)
tree280065287621964342a3682c873a138a295eb6a3
parentdb70959a5ccf2952b218f51c3d529e186a5a43bb (diff)
src: remove DTYPE_F_PREFIX
only ipv4 and ipv6 datatype support this, add datatype_prefix_notation() helper function to report that datatype prefers prefix notation, if possible. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--include/datatype.h3
-rw-r--r--src/datatype.c7
-rw-r--r--src/netlink_delinearize.c2
-rw-r--r--src/segtree.c4
4 files changed, 9 insertions, 7 deletions
diff --git a/include/datatype.h b/include/datatype.h
index d4b4737c..09b84eca 100644
--- a/include/datatype.h
+++ b/include/datatype.h
@@ -124,11 +124,9 @@ struct expr;
* enum datatype_flags
*
* @DTYPE_F_ALLOC: datatype is dynamically allocated
- * @DTYPE_F_PREFIX: preferred representation for ranges is a prefix
*/
enum datatype_flags {
DTYPE_F_ALLOC = (1 << 0),
- DTYPE_F_PREFIX = (1 << 1),
};
struct parse_ctx;
@@ -179,6 +177,7 @@ extern void datatype_set(struct expr *expr, const struct datatype *dtype);
extern void __datatype_set(struct expr *expr, const struct datatype *dtype);
extern void datatype_free(const struct datatype *dtype);
struct datatype *datatype_clone(const struct datatype *orig_dtype);
+bool datatype_prefix_notation(const struct datatype *dtype);
struct parse_ctx {
struct symbol_tables *tbl;
diff --git a/src/datatype.c b/src/datatype.c
index 6bbe9002..9293f38e 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -123,6 +123,11 @@ void datatype_print(const struct expr *expr, struct output_ctx *octx)
expr->dtype->name);
}
+bool datatype_prefix_notation(const struct datatype *dtype)
+{
+ return dtype->type == TYPE_IPADDR || dtype->type == TYPE_IP6ADDR;
+}
+
struct error_record *symbol_parse(struct parse_ctx *ctx, const struct expr *sym,
struct expr **res)
{
@@ -642,7 +647,6 @@ const struct datatype ipaddr_type = {
.basetype = &integer_type,
.print = ipaddr_type_print,
.parse = ipaddr_type_parse,
- .flags = DTYPE_F_PREFIX,
};
static void ip6addr_type_print(const struct expr *expr, struct output_ctx *octx)
@@ -709,7 +713,6 @@ const struct datatype ip6addr_type = {
.basetype = &integer_type,
.print = ip6addr_type_print,
.parse = ip6addr_type_parse,
- .flags = DTYPE_F_PREFIX,
};
static void inet_protocol_type_print(const struct expr *expr,
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
index 82e68999..e3d9cfbb 100644
--- a/src/netlink_delinearize.c
+++ b/src/netlink_delinearize.c
@@ -2536,7 +2536,7 @@ static void relational_binop_postprocess(struct rule_pp_ctx *ctx,
BUG("unknown operation type %d\n", expr->op);
}
expr_free(binop);
- } else if (binop->left->dtype->flags & DTYPE_F_PREFIX &&
+ } else if (datatype_prefix_notation(binop->left->dtype) &&
binop->op == OP_AND && expr->right->etype == EXPR_VALUE &&
expr_mask_is_prefix(binop->right)) {
expr->left = expr_get(binop->left);
diff --git a/src/segtree.c b/src/segtree.c
index 4df96467..2e32a329 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -402,7 +402,7 @@ void concat_range_aggregate(struct expr *set)
}
if (prefix_len < 0 ||
- !(r1->dtype->flags & DTYPE_F_PREFIX)) {
+ !datatype_prefix_notation(r1->dtype)) {
tmp = range_expr_alloc(&r1->location, r1,
r2);
@@ -517,7 +517,7 @@ add_interval(struct expr *set, struct expr *low, struct expr *i)
expr = expr_get(low);
} else if (range_is_prefix(range) && !mpz_cmp_ui(p, 0)) {
- if (i->dtype->flags & DTYPE_F_PREFIX)
+ if (datatype_prefix_notation(i->dtype))
expr = interval_to_prefix(low, i, range);
else if (expr_basetype(i)->type == TYPE_STRING)
expr = interval_to_string(low, i, range);