]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
expression: remove elem_flags from EXPR_SET_ELEM to shrink struct expr size
authorPablo Neira Ayuso <pablo@netfilter.org>
Sun, 8 Dec 2024 20:46:13 +0000 (21:46 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 2 Jan 2025 18:58:11 +0000 (19:58 +0100)
Move NFTNL_SET_ELEM_F_INTERVAL_OPEN flag to the existing flags field in
struct expr.

This saves 4 bytes in struct expr, shrinking it to 128 bytes according to
pahole. This reworks:

6089630f54ce ("segtree: Introduce flag for half-open range elements")

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

index da2f693e72d37bc317d57b463c6edf5a8c32c6dc..877887ff1978f47953a9f59e402bc864da4d0fb9 100644 (file)
@@ -215,6 +215,7 @@ enum expr_flags {
        EXPR_F_INTERVAL         = 0x20,
        EXPR_F_KERNEL           = 0x40,
        EXPR_F_REMOVE           = 0x80,
+       EXPR_F_INTERVAL_OPEN    = 0x100,
 };
 
 #include <payload.h>
@@ -301,7 +302,6 @@ struct expr {
                        uint64_t                expiration;
                        const char              *comment;
                        struct list_head        stmt_list;
-                       uint32_t                elem_flags;
                };
                struct {
                        /* EXPR_UNARY */
index a58ec5b26397712b515cf80571d16cb8f2ce1188..12cccbdab752f18071aa7edb5b64fa5651fdcfe6 100644 (file)
@@ -738,7 +738,7 @@ int set_to_intervals(const struct set *set, struct expr *init, bool add)
                        }
                        newelem->flags |= EXPR_F_INTERVAL_END;
                } else {
-                       flags = NFTNL_SET_ELEM_F_INTERVAL_OPEN;
+                       flags = EXPR_F_INTERVAL_OPEN;
                }
 
                expr = constant_expr_alloc(&elem->key->location, set->key->dtype,
@@ -750,7 +750,7 @@ int set_to_intervals(const struct set *set, struct expr *init, bool add)
 
                expr_free(elem->key);
                elem->key = expr;
-               i->elem_flags |= flags;
+               i->flags |= flags;
                init->size++;
                list_move_tail(&i->list, &intervals);
 
index a787db8cbf5a322d079baab42c8f5a41115e3f23..d70bf2957dd3299ac89e355939f684d9fd919399 100644 (file)
@@ -376,7 +376,7 @@ static bool set_elem_is_open_interval(struct expr *elem)
 {
        switch (elem->etype) {
        case EXPR_SET_ELEM:
-               return elem->elem_flags & NFTNL_SET_ELEM_F_INTERVAL_OPEN;
+               return elem->flags & EXPR_F_INTERVAL_OPEN;
        case EXPR_MAPPING:
                return set_elem_is_open_interval(elem->left);
        default:
index 36140fb63d6fd397458fcf22887a0ec78a4acab9..8e6e2066fe2a9a9fc38ba191bb4850b37f55a946 100644 (file)
@@ -180,7 +180,7 @@ struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *set,
                                                netlink_gen_stmt_stateful(stmt));
                }
        }
-       if (elem->comment || expr->elem_flags) {
+       if (elem->comment || expr->flags & EXPR_F_INTERVAL_OPEN) {
                udbuf = nftnl_udata_buf_alloc(NFT_USERDATA_MAXLEN);
                if (!udbuf)
                        memory_allocation_error();
@@ -190,9 +190,9 @@ struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *set,
                                          elem->comment))
                        memory_allocation_error();
        }
-       if (expr->elem_flags) {
+       if (expr->flags & EXPR_F_INTERVAL_OPEN) {
                if (!nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_ELEM_FLAGS,
-                                        expr->elem_flags))
+                                        NFTNL_SET_ELEM_F_INTERVAL_OPEN))
                        memory_allocation_error();
        }
        if (udbuf) {
@@ -1372,9 +1372,14 @@ static void set_elem_parse_udata(struct nftnl_set_elem *nlse,
        if (ud[NFTNL_UDATA_SET_ELEM_COMMENT])
                expr->comment =
                        xstrdup(nftnl_udata_get(ud[NFTNL_UDATA_SET_ELEM_COMMENT]));
-       if (ud[NFTNL_UDATA_SET_ELEM_FLAGS])
-               expr->elem_flags =
+       if (ud[NFTNL_UDATA_SET_ELEM_FLAGS]) {
+               uint32_t elem_flags;
+
+               elem_flags =
                        nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_ELEM_FLAGS]);
+               if (elem_flags & NFTNL_SET_ELEM_F_INTERVAL_OPEN)
+                       expr->flags |= EXPR_F_INTERVAL_OPEN;
+       }
 }
 
 int netlink_delinearize_setelem(struct nftnl_set_elem *nlse,