summaryrefslogtreecommitdiffstats
path: root/src/netlink.c
diff options
context:
space:
mode:
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)
{