108 lines
3.4 KiB
Diff
108 lines
3.4 KiB
Diff
From 75b3a238485745de01cf6264703ba6c192d7f721 Mon Sep 17 00:00:00 2001
|
|
From: Phil Sutter <psutter@redhat.com>
|
|
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 <phil@nwl.cc>
|
|
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 <phil@nwl.cc>
|
|
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
---
|
|
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
|
|
|