diff options
Diffstat (limited to 'src')
-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); |