diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2020-03-17 14:14:05 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2020-03-17 14:14:27 +0100 |
commit | c76d36a1a2805c49bf5c9ceeedb0d86f6c06e1eb (patch) | |
tree | 2a2fbe70126535af9533cc7bca9fb6bf266baea7 /src/set.c | |
parent | 92705574380f7ffd9f244b4cb69422a85269ab41 (diff) |
set: support for NFTNL_SET_EXPR
This patch adds support for the NFTA_SET_EXPR netlink attribute.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/set.c')
-rw-r--r-- | src/set.c | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -51,6 +51,8 @@ void nftnl_set_free(const struct nftnl_set *s) xfree(s->name); if (s->flags & (1 << NFTNL_SET_USERDATA)) xfree(s->user.data); + if (s->flags & (1 << NFTNL_SET_EXPR)) + nftnl_expr_free(s->expr); list_for_each_entry_safe(elem, tmp, &s->element_list, head) { list_del(&elem->head); @@ -96,6 +98,9 @@ void nftnl_set_unset(struct nftnl_set *s, uint16_t attr) case NFTNL_SET_USERDATA: xfree(s->user.data); break; + case NFTNL_SET_EXPR: + nftnl_expr_free(s->expr); + break; default: return; } @@ -195,6 +200,12 @@ int nftnl_set_set_data(struct nftnl_set *s, uint16_t attr, const void *data, memcpy(s->user.data, data, data_len); s->user.len = data_len; break; + case NFTNL_SET_EXPR: + if (s->flags & (1 << NFTNL_SET_EXPR)) + nftnl_expr_free(s->expr); + + s->expr = (void *)data; + break; } s->flags |= (1 << attr); return 0; @@ -283,6 +294,8 @@ const void *nftnl_set_get_data(const struct nftnl_set *s, uint16_t attr, case NFTNL_SET_USERDATA: *data_len = s->user.len; return s->user.data; + case NFTNL_SET_EXPR: + return s->expr; } return NULL; } @@ -432,6 +445,13 @@ void nftnl_set_nlmsg_build_payload(struct nlmsghdr *nlh, struct nftnl_set *s) mnl_attr_put_u32(nlh, NFTA_SET_GC_INTERVAL, htonl(s->gc_interval)); if (s->flags & (1 << NFTNL_SET_USERDATA)) mnl_attr_put(nlh, NFTA_SET_USERDATA, s->user.len, s->user.data); + if (s->flags & (1 << NFTNL_SET_EXPR)) { + struct nlattr *nest1; + + nest1 = mnl_attr_nest_start(nlh, NFTA_SET_EXPR); + nftnl_expr_build_payload(nlh, s->expr); + mnl_attr_nest_end(nlh, nest1); + } } @@ -635,6 +655,13 @@ int nftnl_set_nlmsg_parse(const struct nlmsghdr *nlh, struct nftnl_set *s) if (ret < 0) return ret; } + if (tb[NFTA_SET_EXPR]) { + s->expr = nftnl_expr_parse(tb[NFTA_SET_EXPR]); + if (!s->expr) + return -1; + + s->flags |= (1 << NFTNL_SET_EXPR); + } s->family = nfg->nfgen_family; s->flags |= (1 << NFTNL_SET_FAMILY); |