summaryrefslogtreecommitdiffstats
path: root/src/netlink.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2022-12-09 11:55:50 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2022-12-10 23:54:23 +0100
commit806698764d8b2e353dc191024eefefdc7648617c (patch)
treedec02dd3945c9e12176f7c97bab1504a5ebad5b2 /src/netlink.c
parent039a149425a77b5c1263d7a301f40c08ecbc3085 (diff)
netlink: add function to generate set element key data
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>
Diffstat (limited to 'src/netlink.c')
-rw-r--r--src/netlink.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/netlink.c b/src/netlink.c
index db92f350..15eb890e 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -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)
{