summaryrefslogtreecommitdiffstats
path: root/src/set.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2014-04-08 12:32:14 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2014-05-19 12:13:50 +0200
commit26298a9ffc2e216fb6d349b398bf903dd08a1b08 (patch)
tree7ca1eae092dcef9ffa51a37844caf863df89a7ad /src/set.c
parent2a288a38da25f5b2f0a4083a5158ba80d6bb8360 (diff)
set: add set ID support
Add the set ID (u32) which allows us to uniquely identify the set in the batch that is sent to kernel-space. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/set.c')
-rw-r--r--src/set.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/set.c b/src/set.c
index 7c15857..57bbcaa 100644
--- a/src/set.c
+++ b/src/set.c
@@ -87,6 +87,7 @@ void nft_set_attr_unset(struct nft_set *s, uint16_t attr)
case NFT_SET_ATTR_DATA_TYPE:
case NFT_SET_ATTR_DATA_LEN:
case NFT_SET_ATTR_FAMILY:
+ case NFT_SET_ATTR_ID:
break;
default:
return;
@@ -144,6 +145,9 @@ void nft_set_attr_set_data(struct nft_set *s, uint16_t attr, const void *data,
case NFT_SET_ATTR_FAMILY:
s->family = *((uint32_t *)data);
break;
+ case NFT_SET_ATTR_ID:
+ s->id = *((uint32_t *)data);
+ break;
}
s->flags |= (1 << attr);
}
@@ -196,6 +200,9 @@ const void *nft_set_attr_get_data(struct nft_set *s, uint16_t attr,
case NFT_SET_ATTR_FAMILY:
*data_len = sizeof(uint32_t);
return &s->family;
+ case NFT_SET_ATTR_ID:
+ *data_len = sizeof(uint32_t);
+ return &s->id;
}
return NULL;
}
@@ -242,6 +249,8 @@ void nft_set_nlmsg_build_payload(struct nlmsghdr *nlh, struct nft_set *s)
mnl_attr_put_u32(nlh, NFTA_SET_DATA_TYPE, htonl(s->data_type));
if (s->flags & (1 << NFT_SET_ATTR_DATA_LEN))
mnl_attr_put_u32(nlh, NFTA_SET_DATA_LEN, htonl(s->data_len));
+ if (s->flags & (1 << NFT_SET_ATTR_ID))
+ mnl_attr_put_u32(nlh, NFTA_SET_ID, htonl(s->id));
}
EXPORT_SYMBOL(nft_set_nlmsg_build_payload);
@@ -266,6 +275,7 @@ static int nft_set_parse_attr_cb(const struct nlattr *attr, void *data)
case NFTA_SET_KEY_LEN:
case NFTA_SET_DATA_TYPE:
case NFTA_SET_DATA_LEN:
+ case NFTA_SET_ID:
if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
perror("mnl_attr_validate");
return MNL_CB_ERROR;
@@ -313,6 +323,10 @@ int nft_set_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_set *s)
s->data_len = ntohl(mnl_attr_get_u32(tb[NFTA_SET_DATA_LEN]));
s->flags |= (1 << NFT_SET_ATTR_DATA_LEN);
}
+ if (tb[NFTA_SET_ID]) {
+ s->id = ntohl(mnl_attr_get_u32(tb[NFTA_SET_ID]));
+ s->flags |= (1 << NFT_SET_ATTR_ID);
+ }
s->family = nfg->nfgen_family;
s->flags |= (1 << NFT_SET_ATTR_FAMILY);