diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-11-03 13:38:54 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-11-04 19:06:34 +0100 |
commit | c82e6f3766b376ac71416e72a3b3a5c1821c4210 (patch) | |
tree | 29cafacfcd499d837dc846f1403732c857692b2b /src/chain.c | |
parent | dd9eba1ee70ffad0db15d3be5d314221c098494b (diff) |
chain: add support for chain types
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/chain.c')
-rw-r--r-- | src/chain.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/chain.c b/src/chain.c index 3b61d92..db970a7 100644 --- a/src/chain.c +++ b/src/chain.c @@ -27,6 +27,7 @@ struct nft_chain { struct list_head head; char name[NFT_CHAIN_MAXNAMELEN]; + char *type; char *table; uint8_t family; uint32_t policy; @@ -49,6 +50,8 @@ void nft_chain_free(struct nft_chain *c) { if (c->table != NULL) free(c->table); + if (c->type != NULL) + free(c->type); free(c); } @@ -87,6 +90,12 @@ void nft_chain_attr_set(struct nft_chain *c, uint16_t attr, void *data) case NFT_CHAIN_ATTR_NEW_NAME: strncpy(c->new_name, data, NFT_CHAIN_MAXNAMELEN); break; + case NFT_CHAIN_ATTR_TYPE: + if (c->type) + free(c->type); + + c->type = strdup(data); + break; default: return; } @@ -168,6 +177,12 @@ void *nft_chain_attr_get(struct nft_chain *c, uint16_t attr) else return NULL; break; + case NFT_CHAIN_ATTR_TYPE: + if (c->flags & (1 << NFT_CHAIN_ATTR_TYPE)) + return c->type; + else + return NULL; + break; default: return NULL; } @@ -250,6 +265,8 @@ void nft_chain_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nft_chain } if (c->flags & (1 << NFT_CHAIN_ATTR_NEW_NAME)) mnl_attr_put_strz(nlh, NFTA_CHAIN_NEW_NAME, c->new_name); + if (c->flags & (1 << NFT_CHAIN_ATTR_TYPE)) + mnl_attr_put_strz(nlh, NFTA_CHAIN_TYPE, c->type); } EXPORT_SYMBOL(nft_chain_nlmsg_build_payload); @@ -265,6 +282,7 @@ static int nft_chain_parse_attr_cb(const struct nlattr *attr, void *data) case NFTA_CHAIN_NAME: case NFTA_CHAIN_TABLE: case NFTA_CHAIN_NEW_NAME: + case NFTA_CHAIN_TYPE: if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) { perror("mnl_attr_validate"); return MNL_CB_ERROR; @@ -404,6 +422,10 @@ int nft_chain_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_chain *c) NFT_CHAIN_MAXNAMELEN); c->flags |= (1 << NFT_CHAIN_ATTR_NEW_NAME); } + if (tb[NFTA_CHAIN_TYPE]) { + c->type = strdup(mnl_attr_get_str(tb[NFTA_CHAIN_TYPE])); + c->flags |= (1 << NFT_CHAIN_ATTR_TYPE); + } c->family = nfg->nfgen_family; @@ -414,10 +436,10 @@ EXPORT_SYMBOL(nft_chain_nlmsg_parse); int nft_chain_snprintf(char *buf, size_t size, struct nft_chain *c, uint32_t type, uint32_t flags) { - return snprintf(buf, size, "family=%u table=%s chain=%s " + return snprintf(buf, size, "family=%u table=%s chain=%s type=%s " "hook=%u prio=%d policy=%d use=%d " "packets=%lu bytes=%lu\n", - c->family, c->table, c->name, c->hooknum, + c->family, c->table, c->name, c->type, c->hooknum, c->prio, c->policy, c->use, c->packets, c->bytes); } EXPORT_SYMBOL(nft_chain_snprintf); |