@@ -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;
@@ -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,
@@ -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);
@@ -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);
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> --- include/datatype.h | 3 +-- src/datatype.c | 7 +++++-- src/netlink_delinearize.c | 2 +- src/segtree.c | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-)