]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
chain: Add lookup functions for chain list and rules in chain
authorPhil Sutter <phil@nwl.cc>
Thu, 6 Dec 2018 16:17:52 +0000 (17:17 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 7 Dec 2018 09:49:27 +0000 (10:49 +0100)
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 <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/libnftnl/chain.h
src/chain.c
src/libnftnl.map

index f04f61056cc7cc0e4d78983d1d7a97171764de19..64e10e91aaefea297c7904d834261e51674edb8f 100644 (file)
@@ -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);
index c8b7f9ba126187b8565834fc448172104009ca11..8668fb7d1494d8bcfa352b59055893bb05dc8f33 100644 (file)
@@ -734,6 +734,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;
@@ -856,6 +870,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;
index 96d5b5f1cec49a21559c8cb4e6f601da50337b0a..0d3be32263eee3ae1bf18c3edc20a22bf3770f07 100644 (file)
@@ -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;