From 26298a9ffc2e216fb6d349b398bf903dd08a1b08 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 8 Apr 2014 12:32:14 +0200 Subject: 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 --- src/expr/lookup.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/expr/lookup.c') diff --git a/src/expr/lookup.c b/src/expr/lookup.c index 50282a8..1df65db 100644 --- a/src/expr/lookup.c +++ b/src/expr/lookup.c @@ -31,6 +31,7 @@ struct nft_expr_lookup { enum nft_registers sreg; enum nft_registers dreg; char set_name[IFNAMSIZ]; + uint32_t set_id; }; static int @@ -50,6 +51,9 @@ nft_rule_expr_lookup_set(struct nft_rule_expr *e, uint16_t type, snprintf(lookup->set_name, sizeof(lookup->set_name), "%s", (const char *)data); break; + case NFT_EXPR_LOOKUP_SET_ID: + lookup->set_id = *((uint32_t *)data); + break; default: return -1; } @@ -71,6 +75,8 @@ nft_rule_expr_lookup_get(const struct nft_rule_expr *e, uint16_t type, return &lookup->dreg; case NFT_EXPR_LOOKUP_SET: return lookup->set_name; + case NFT_EXPR_LOOKUP_SET_ID: + return &lookup->set_id; } return NULL; } @@ -86,6 +92,7 @@ static int nft_rule_expr_lookup_cb(const struct nlattr *attr, void *data) switch(type) { case NFTA_LOOKUP_SREG: case NFTA_LOOKUP_DREG: + case NFTA_LOOKUP_SET_ID: if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) { perror("mnl_attr_validate"); return MNL_CB_ERROR; @@ -114,6 +121,10 @@ nft_rule_expr_lookup_build(struct nlmsghdr *nlh, struct nft_rule_expr *e) mnl_attr_put_u32(nlh, NFTA_LOOKUP_DREG, htonl(lookup->dreg)); if (e->flags & (1 << NFT_EXPR_LOOKUP_SET)) mnl_attr_put_strz(nlh, NFTA_LOOKUP_SET, lookup->set_name); + if (e->flags & (1 << NFT_EXPR_LOOKUP_SET_ID)) { + mnl_attr_put_u32(nlh, NFTA_LOOKUP_SET_ID, + htonl(lookup->set_id)); + } } static int @@ -138,6 +149,11 @@ nft_rule_expr_lookup_parse(struct nft_rule_expr *e, struct nlattr *attr) strcpy(lookup->set_name, mnl_attr_get_str(tb[NFTA_LOOKUP_SET])); e->flags |= (1 << NFT_EXPR_LOOKUP_SET); } + if (tb[NFTA_LOOKUP_SET_ID]) { + lookup->set_id = + ntohl(mnl_attr_get_u32(tb[NFTA_LOOKUP_SET_ID])); + e->flags |= (1 << NFT_EXPR_LOOKUP_SET_ID); + } return ret; } -- cgit v1.2.3