diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-11-27 23:27:07 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-12-09 14:50:53 +0100 |
commit | effb75d1f60a46af62fed244a6243bcd4e34a75e (patch) | |
tree | db5b14dde9d3d557b4e3f1d2351202a6c7a6c8f9 /src/set_elem.c | |
parent | f5f62341e21644b42554f84e4893341ac989e833 (diff) |
set_elem: add NFTNL_SET_ELEM_OBJREF attribute
This new attribute allows us to attach stateful objects to elements for
map lookups. This new attribute identifies the object through its name.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/set_elem.c')
-rw-r--r-- | src/set_elem.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/set_elem.c b/src/set_elem.c index 083c597..fa87476 100644 --- a/src/set_elem.c +++ b/src/set_elem.c @@ -50,6 +50,9 @@ void nftnl_set_elem_free(struct nftnl_set_elem *s) if (s->flags & (1 << NFTNL_SET_ELEM_USERDATA)) xfree(s->user.data); + if (s->flags & (1 << NFTNL_SET_ELEM_OBJREF)) + xfree(s->objref); + xfree(s); } EXPORT_SYMBOL_ALIAS(nftnl_set_elem_free, nft_set_elem_free); @@ -82,6 +85,9 @@ void nftnl_set_elem_unset(struct nftnl_set_elem *s, uint16_t attr) case NFTNL_SET_ELEM_EXPR: nftnl_expr_free(s->expr); break; + case NFTNL_SET_ELEM_OBJREF: + xfree(s->objref); + break; default: return; } @@ -129,6 +135,14 @@ int nftnl_set_elem_set(struct nftnl_set_elem *s, uint16_t attr, memcpy(s->user.data, data, data_len); s->user.len = data_len; break; + case NFTNL_SET_ELEM_OBJREF: + if (s->flags & (1 << NFTNL_SET_ELEM_OBJREF)) + xfree(s->objref); + + s->objref = strdup(data); + if (!s->objref) + return -1; + break; } s->flags |= (1 << attr); return -1; @@ -185,6 +199,9 @@ const void *nftnl_set_elem_get(struct nftnl_set_elem *s, uint16_t attr, uint32_t return s->user.data; case NFTNL_SET_ELEM_EXPR: return s->expr; + case NFTNL_SET_ELEM_OBJREF: + *data_len = strlen(s->objref) + 1; + return s->objref; } return NULL; } @@ -271,6 +288,8 @@ void nftnl_set_elem_nlmsg_build_payload(struct nlmsghdr *nlh, } if (e->flags & (1 << NFTNL_SET_ELEM_USERDATA)) mnl_attr_put(nlh, NFTA_SET_ELEM_USERDATA, e->user.len, e->user.data); + if (e->flags & (1 << NFTNL_SET_ELEM_OBJREF)) + mnl_attr_put_strz(nlh, NFTA_SET_ELEM_OBJREF, e->objref); } static void nftnl_set_elem_nlmsg_build_def(struct nlmsghdr *nlh, @@ -423,6 +442,14 @@ static int nftnl_set_elems_parse2(struct nftnl_set *s, const struct nlattr *nest memcpy(e->user.data, udata, e->user.len); e->flags |= (1 << NFTNL_RULE_USERDATA); } + if (tb[NFTA_SET_ELEM_OBJREF]) { + e->objref = strdup(mnl_attr_get_str(tb[NFTA_SET_ELEM_OBJREF])); + if (e->objref == NULL) { + ret = -1; + goto out_set_elem; + } + e->flags |= (1 << NFTNL_SET_ELEM_OBJREF); + } /* Add this new element to this set */ list_add_tail(&e->head, &s->element_list); |