From 20503ffb5cbbe75e03b34f0386d24badfd9cb299 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 13 Jan 2021 16:27:50 +0100 Subject: dynset: add NFTNL_EXPR_DYNSET_FLAGS This patch adds support for the dynset flags. Signed-off-by: Pablo Neira Ayuso --- include/libnftnl/expr.h | 1 + src/expr/dynset.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/libnftnl/expr.h b/include/libnftnl/expr.h index 13c55e7..8e90a6a 100644 --- a/include/libnftnl/expr.h +++ b/include/libnftnl/expr.h @@ -174,6 +174,7 @@ enum { NFTNL_EXPR_DYNSET_SET_ID, NFTNL_EXPR_DYNSET_EXPR, NFTNL_EXPR_DYNSET_EXPRESSIONS, + NFTNL_EXPR_DYNSET_FLAGS, }; enum { diff --git a/src/expr/dynset.c b/src/expr/dynset.c index f349a17..a9b11f2 100644 --- a/src/expr/dynset.c +++ b/src/expr/dynset.c @@ -29,6 +29,7 @@ struct nftnl_expr_dynset { struct list_head expr_list; char *set_name; uint32_t set_id; + uint32_t dynset_flags; }; static int @@ -66,6 +67,9 @@ nftnl_expr_dynset_set(struct nftnl_expr *e, uint16_t type, expr = (void *)data; list_add(&expr->head, &dynset->expr_list); break; + case NFTNL_EXPR_DYNSET_FLAGS: + memcpy(&dynset->dynset_flags, data, sizeof(dynset->dynset_flags)); + break; default: return -1; } @@ -102,6 +106,9 @@ nftnl_expr_dynset_get(const struct nftnl_expr *e, uint16_t type, list_for_each_entry(expr, &dynset->expr_list, head) break; return expr; + case NFTNL_EXPR_DYNSET_FLAGS: + *data_len = sizeof(dynset->dynset_flags); + return &dynset->dynset_flags; } return NULL; } @@ -119,6 +126,7 @@ static int nftnl_expr_dynset_cb(const struct nlattr *attr, void *data) case NFTA_DYNSET_SREG_DATA: case NFTA_DYNSET_SET_ID: case NFTA_DYNSET_OP: + case NFTA_DYNSET_FLAGS: if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) abi_breakage(); break; @@ -182,6 +190,9 @@ nftnl_expr_dynset_build(struct nlmsghdr *nlh, const struct nftnl_expr *e) mnl_attr_nest_end(nlh, nest1); } } + if (e->flags & (1 << NFTNL_EXPR_DYNSET_FLAGS)) + mnl_attr_put_u32(nlh, NFTA_DYNSET_FLAGS, + htonl(dynset->dynset_flags)); } EXPORT_SYMBOL(nftnl_expr_add_expr); @@ -270,6 +281,10 @@ nftnl_expr_dynset_parse(struct nftnl_expr *e, struct nlattr *attr) } e->flags |= (1 << NFTNL_EXPR_DYNSET_EXPRESSIONS); } + if (tb[NFTA_DYNSET_FLAGS]) { + dynset->dynset_flags = ntohl(mnl_attr_get_u32(tb[NFTA_DYNSET_FLAGS])); + e->flags |= (1 << NFTNL_EXPR_DYNSET_FLAGS); + } return ret; out_dynset_expr: -- cgit v1.2.3