]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: add EXPR_F_KERNEL to identify expression in the kernel
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Apr 2022 02:01:09 +0000 (04:01 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Apr 2022 11:43:46 +0000 (13:43 +0200)
This allows to identify the set elements that reside in the kernel.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/expression.h
src/netlink.c
src/segtree.c

index 78f788b3c377cbf770046e19414834314a004952..ce32e1f3d20ccdcbc438035eec5eb0cc370f0fbc 100644 (file)
@@ -192,6 +192,7 @@ const struct expr_ops *expr_ops_by_type(enum expr_types etype);
  * @EXPR_F_INTERVAL_END:       set member ends an open interval
  * @EXPR_F_BOOLEAN:            expression is boolean (set by relational expr on LHS)
  * @EXPR_F_INTERVAL:           expression describes a interval
+ * @EXPR_F_KERNEL:             expression resides in the kernel
  */
 enum expr_flags {
        EXPR_F_CONSTANT         = 0x1,
@@ -200,6 +201,7 @@ enum expr_flags {
        EXPR_F_INTERVAL_END     = 0x8,
        EXPR_F_BOOLEAN          = 0x10,
        EXPR_F_INTERVAL         = 0x20,
+       EXPR_F_KERNEL           = 0x40,
 };
 
 #include <payload.h>
index 775c6f5170e21f476d31b94d71e288f64eecb1e7..24a9ad9852f3ce6f4c3b8782f9d24ee8c203f9e2 100644 (file)
@@ -1286,6 +1286,7 @@ key_end:
        }
 
        expr = set_elem_expr_alloc(&netlink_location, key);
+       expr->flags |= EXPR_F_KERNEL;
 
        if (nftnl_set_elem_is_set(nlse, NFTNL_SET_ELEM_TIMEOUT))
                expr->timeout    = nftnl_set_elem_get_u64(nlse, NFTNL_SET_ELEM_TIMEOUT);
index 3ccf5ee129fc6de139e979e3f9c3194cf64d8004..6f7231755927f5545c4e1fe83d55392801f77d1f 100644 (file)
@@ -826,6 +826,7 @@ static struct expr *__expr_to_set_elem(struct expr *low, struct expr *expr)
        } else {
                interval_expr_copy(elem, low);
        }
+       elem->flags |= EXPR_F_KERNEL;
 
        return elem;
 }
@@ -1192,7 +1193,7 @@ void interval_map_decompose(struct expr *set)
                if (!mpz_cmp_ui(range, 0)) {
                        if (expr_basetype(low)->type == TYPE_STRING)
                                mpz_switch_byteorder(expr_value(low)->value, low->len / BITS_PER_BYTE);
-
+                       low->flags |= EXPR_F_KERNEL;
                        compound_expr_add(set, expr_get(low));
                } else if (range_is_prefix(range) && !mpz_cmp_ui(p, 0)) {
                        struct expr *expr;
@@ -1239,6 +1240,8 @@ void interval_map_decompose(struct expr *set)
                } else {
                        interval_expr_copy(i, low);
                }
+               i->flags |= EXPR_F_KERNEL;
+
                expr_free(low);
        }