summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libnftables/set.h1
-rw-r--r--src/set_elem.c21
2 files changed, 22 insertions, 0 deletions
diff --git a/include/libnftables/set.h b/include/libnftables/set.h
index 211c065..d1f6d16 100644
--- a/include/libnftables/set.h
+++ b/include/libnftables/set.h
@@ -53,6 +53,7 @@ enum {
NFT_SET_ELEM_ATTR_KEY,
NFT_SET_ELEM_ATTR_VERDICT,
NFT_SET_ELEM_ATTR_CHAIN,
+ NFT_SET_ELEM_ATTR_DATA,
};
struct nft_set_elem;
diff --git a/src/set_elem.c b/src/set_elem.c
index fb03d71..dae1f8c 100644
--- a/src/set_elem.c
+++ b/src/set_elem.c
@@ -58,6 +58,7 @@ void nft_set_elem_attr_unset(struct nft_set_elem *s, uint16_t attr)
case NFT_SET_ELEM_ATTR_FLAGS:
case NFT_SET_ELEM_ATTR_KEY: /* NFTA_SET_ELEM_KEY */
case NFT_SET_ELEM_ATTR_VERDICT: /* NFTA_SET_ELEM_DATA */
+ case NFT_SET_ELEM_ATTR_DATA: /* NFTA_SET_ELEM_DATA */
break;
default:
return;
@@ -87,6 +88,10 @@ void nft_set_elem_attr_set(struct nft_set_elem *s, uint16_t attr,
s->data.chain = strdup(data);
break;
+ case NFT_SET_ELEM_ATTR_DATA: /* NFTA_SET_ELEM_DATA */
+ memcpy(s->data.val, data, data_len);
+ s->data.len = data_len;
+ break;
default:
return;
}
@@ -121,6 +126,12 @@ void *nft_set_elem_attr_get(struct nft_set_elem *s, uint16_t attr, size_t *data_
if (s->flags & (1 << NFT_SET_ELEM_ATTR_CHAIN))
return &s->data.chain;
break;
+ case NFT_SET_ELEM_ATTR_DATA: /* NFTA_SET_ELEM_DATA */
+ if (s->flags & (1 << NFT_SET_ELEM_ATTR_DATA)) {
+ *data_len = s->data.len;
+ return &s->data.val;
+ }
+ break;
default:
break;
}
@@ -189,6 +200,13 @@ void nft_set_elem_nlmsg_build_payload(struct nlmsghdr *nlh,
mnl_attr_nest_end(nlh, nest1);
mnl_attr_nest_end(nlh, nest2);
}
+ if (e->flags & (1 << NFT_SET_ELEM_ATTR_DATA)) {
+ struct nlattr *nest1;
+
+ nest1 = mnl_attr_nest_start(nlh, NFTA_SET_ELEM_DATA);
+ mnl_attr_put(nlh, NFTA_DATA_VALUE, e->data.len, e->data.val);
+ mnl_attr_nest_end(nlh, nest1);
+ }
}
void nft_set_elems_nlmsg_build_payload(struct nlmsghdr *nlh, struct nft_set *s)
@@ -271,6 +289,9 @@ static int nft_set_elems_parse2(struct nft_set *s, const struct nlattr *nest)
case DATA_CHAIN:
s->flags |= (1 << NFT_SET_ELEM_ATTR_CHAIN);
break;
+ case DATA_VALUE:
+ s->flags |= (1 << NFT_SET_ELEM_ATTR_DATA);
+ break;
}
}
if (ret < 0)