]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
netlink: add function to generate set element key data
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 9 Dec 2022 10:55:50 +0000 (11:55 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 10 Dec 2022 22:54:23 +0000 (23:54 +0100)
Add netlink_gen_key(), it is just like __netlink_gen_data() with no
EXPR_VERDICT case, which should not ever happen for set element keys.

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

index db92f35065034052eea63c7bd9f4c8753a93c515..15eb890e422aa4cbd3b213be1e518deeb04c97b7 100644 (file)
@@ -96,7 +96,8 @@ struct nftnl_expr *alloc_nft_expr(const char *name)
 
        return nle;
 }
-
+static void netlink_gen_key(const struct expr *expr,
+                           struct nft_data_linearize *data);
 static void __netlink_gen_data(const struct expr *expr,
                               struct nft_data_linearize *data, bool expand);
 
@@ -136,19 +137,19 @@ struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *set,
                if (set->set_flags & NFT_SET_INTERVAL &&
                    key->etype == EXPR_CONCAT && key->field_count > 1) {
                        key->flags |= EXPR_F_INTERVAL;
-                       __netlink_gen_data(key, &nld, false);
+                       netlink_gen_key(key, &nld);
                        key->flags &= ~EXPR_F_INTERVAL;
 
                        nftnl_set_elem_set(nlse, NFTNL_SET_ELEM_KEY, &nld.value, nld.len);
 
                        key->flags |= EXPR_F_INTERVAL_END;
-                       __netlink_gen_data(key, &nld, false);
+                       netlink_gen_key(key, &nld);
                        key->flags &= ~EXPR_F_INTERVAL_END;
 
                        nftnl_set_elem_set(nlse, NFTNL_SET_ELEM_KEY_END,
                                           &nld.value, nld.len);
                } else {
-                       __netlink_gen_data(key, &nld, false);
+                       netlink_gen_key(key, &nld);
                        nftnl_set_elem_set(nlse, NFTNL_SET_ELEM_KEY, &nld.value, nld.len);
                }
                break;
@@ -430,6 +431,23 @@ static void netlink_gen_prefix(const struct expr *expr,
        nld->len = len;
 }
 
+static void netlink_gen_key(const struct expr *expr,
+                           struct nft_data_linearize *data)
+{
+       switch (expr->etype) {
+       case EXPR_VALUE:
+               return netlink_gen_constant_data(expr, data);
+       case EXPR_CONCAT:
+               return netlink_gen_concat_data(expr, data, false);
+       case EXPR_RANGE:
+               return netlink_gen_range(expr, data);
+       case EXPR_PREFIX:
+               return netlink_gen_prefix(expr, data);
+       default:
+               BUG("invalid data expression type %s\n", expr_name(expr));
+       }
+}
+
 static void __netlink_gen_data(const struct expr *expr,
                               struct nft_data_linearize *data, bool expand)
 {