]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: remove DTYPE_F_PREFIX
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 19 Aug 2024 19:03:02 +0000 (21:03 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 21 Aug 2024 21:22:47 +0000 (23:22 +0200)
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
src/datatype.c
src/netlink_delinearize.c
src/segtree.c

index d4b4737cc9ae7f0839a8a3db0920bddaf642103c..09b84eca27a72bd6e68abd4ff2be1b19bd980a82 100644 (file)
@@ -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;
index 6bbe900295f7276cec5efb1950df1648fc25d45c..9293f38ed71390180750f1aa85c7b41d24b5a7a3 100644 (file)
@@ -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,
index 82e68999a432c367d7f1b8d489f233aef5302e04..e3d9cfbbede55df596c5a9a4c17ff36d50d0ecdf 100644 (file)
@@ -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);
index 4df96467c3f591a77ca2dc681abc4ae37961b10d..2e32a3291979f071de6870c3d7a413ceda404edf 100644 (file)
@@ -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);