From 75b3a238485745de01cf6264703ba6c192d7f721 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Mon, 17 Dec 2018 17:30:06 +0100 Subject: [PATCH] chain: Add lookup functions for chain list and rules in chain Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1658533 Upstream Status: libnftnl commit 1a829ec0c3285 commit 1a829ec0c3285baac712352c3a046a4f76013e70 Author: Phil Sutter Date: Thu Dec 6 17:17:52 2018 +0100 chain: Add lookup functions for chain list and rules in chain For now, these lookup functions simply iterate over the linked list until they find the right entry. In future, they may make use of more optimized data structures behind the curtains. Signed-off-by: Phil Sutter Signed-off-by: Pablo Neira Ayuso --- include/libnftnl/chain.h | 2 ++ src/chain.c | 28 ++++++++++++++++++++++++++++ src/libnftnl.map | 3 +++ 3 files changed, 33 insertions(+) diff --git a/include/libnftnl/chain.h b/include/libnftnl/chain.h index f04f610..64e10e9 100644 --- a/include/libnftnl/chain.h +++ b/include/libnftnl/chain.h @@ -76,6 +76,7 @@ int nftnl_chain_nlmsg_parse(const struct nlmsghdr *nlh, struct nftnl_chain *t); int nftnl_rule_foreach(struct nftnl_chain *c, int (*cb)(struct nftnl_rule *r, void *data), void *data); +struct nftnl_rule *nftnl_rule_lookup_byindex(struct nftnl_chain *c, uint32_t index); struct nftnl_rule_iter; @@ -89,6 +90,7 @@ struct nftnl_chain_list *nftnl_chain_list_alloc(void); void nftnl_chain_list_free(struct nftnl_chain_list *list); int nftnl_chain_list_is_empty(const struct nftnl_chain_list *list); int nftnl_chain_list_foreach(struct nftnl_chain_list *chain_list, int (*cb)(struct nftnl_chain *t, void *data), void *data); +struct nftnl_chain *nftnl_chain_list_lookup_byname(struct nftnl_chain_list *chain_list, const char *chain); void nftnl_chain_list_add(struct nftnl_chain *r, struct nftnl_chain_list *list); void nftnl_chain_list_add_tail(struct nftnl_chain *r, struct nftnl_chain_list *list); diff --git a/src/chain.c b/src/chain.c index c374923..22bb45c 100644 --- a/src/chain.c +++ b/src/chain.c @@ -925,6 +925,20 @@ int nftnl_rule_foreach(struct nftnl_chain *c, return 0; } +EXPORT_SYMBOL(nftnl_rule_lookup_byindex); +struct nftnl_rule * +nftnl_rule_lookup_byindex(struct nftnl_chain *c, uint32_t index) +{ + struct nftnl_rule *r; + + list_for_each_entry(r, &c->rule_list, head) { + if (!index) + return r; + index--; + } + return NULL; +} + struct nftnl_rule_iter { const struct nftnl_chain *c; struct nftnl_rule *cur; @@ -1047,6 +1061,20 @@ int nftnl_chain_list_foreach(struct nftnl_chain_list *chain_list, return 0; } +EXPORT_SYMBOL(nftnl_chain_list_lookup_byname); +struct nftnl_chain * +nftnl_chain_list_lookup_byname(struct nftnl_chain_list *chain_list, + const char *chain) +{ + struct nftnl_chain *c; + + list_for_each_entry(c, &chain_list->list, head) { + if (!strcmp(chain, c->name)) + return c; + } + return NULL; +} + struct nftnl_chain_list_iter { const struct nftnl_chain_list *list; struct nftnl_chain *cur; diff --git a/src/libnftnl.map b/src/libnftnl.map index 96d5b5f..0d3be32 100644 --- a/src/libnftnl.map +++ b/src/libnftnl.map @@ -345,4 +345,7 @@ LIBNFTNL_12 { nftnl_rule_iter_create; nftnl_rule_iter_next; nftnl_rule_iter_destroy; + + nftnl_chain_list_lookup_byname; + nftnl_rule_lookup_byindex; } LIBNFTNL_11; -- 1.8.3.1