summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libnftables/chain.h1
-rw-r--r--include/libnftables/rule.h5
-rw-r--r--include/libnftables/set.h3
-rw-r--r--include/libnftables/table.h1
-rw-r--r--src/chain.c16
-rw-r--r--src/libnftables.map8
-rw-r--r--src/rule.c32
-rw-r--r--src/set.c15
-rw-r--r--src/set_elem.c16
-rw-r--r--src/table.c16
10 files changed, 113 insertions, 0 deletions
diff --git a/include/libnftables/chain.h b/include/libnftables/chain.h
index 3645eaa..313c26a 100644
--- a/include/libnftables/chain.h
+++ b/include/libnftables/chain.h
@@ -63,6 +63,7 @@ struct nft_chain_list;
struct nft_chain_list *nft_chain_list_alloc(void);
void nft_chain_list_free(struct nft_chain_list *list);
+int nft_chain_list_foreach(struct nft_chain_list *chain_list, int (*cb)(struct nft_chain *t, void *data), void *data);
void nft_chain_list_add(struct nft_chain *r, struct nft_chain_list *list);
void nft_chain_list_del(struct nft_chain *r);
diff --git a/include/libnftables/rule.h b/include/libnftables/rule.h
index 9989f19..ce8bd1f 100644
--- a/include/libnftables/rule.h
+++ b/include/libnftables/rule.h
@@ -56,6 +56,10 @@ int nft_rule_snprintf(char *buf, size_t size, struct nft_rule *t, uint32_t type,
struct nlmsghdr *nft_rule_nlmsg_build_hdr(char *buf, uint16_t cmd, uint16_t family, uint16_t type, uint32_t seq);
int nft_rule_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_rule *t);
+int nft_rule_expr_foreach(struct nft_rule *r,
+ int (*cb)(struct nft_rule_expr *e, void *data),
+ void *data);
+
struct nft_rule_expr_iter;
struct nft_rule_expr_iter *nft_rule_expr_iter_create(struct nft_rule *r);
@@ -67,6 +71,7 @@ struct nft_rule_list;
struct nft_rule_list *nft_rule_list_alloc(void);
void nft_rule_list_free(struct nft_rule_list *list);
void nft_rule_list_add(struct nft_rule *r, struct nft_rule_list *list);
+int nft_rule_list_foreach(struct nft_rule_list *rule_list, int (*cb)(struct nft_rule *t, void *data), void *data);
struct nft_rule_list_iter;
diff --git a/include/libnftables/set.h b/include/libnftables/set.h
index d1f6d16..f337f60 100644
--- a/include/libnftables/set.h
+++ b/include/libnftables/set.h
@@ -37,6 +37,7 @@ struct nft_set_list;
struct nft_set_list *nft_set_list_alloc(void);
void nft_set_list_free(struct nft_set_list *list);
void nft_set_list_add(struct nft_set *s, struct nft_set_list *list);
+int nft_set_list_foreach(struct nft_set_list *set_list, int (*cb)(struct nft_set *t, void *data), void *data);
struct nft_set_list_iter;
struct nft_set_list_iter *nft_set_list_iter_create(struct nft_set_list *l);
@@ -80,6 +81,8 @@ int nft_set_elem_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_set_elem *s)
int nft_set_elem_snprintf(char *buf, size_t size, struct nft_set_elem *s, uint32_t type, uint32_t flags);
+int nft_set_elem_foreach(struct nft_set *s, int (*cb)(struct nft_set_elem *e, void *data), void *data);
+
struct nft_set_elems_iter;
struct nft_set_elems_iter *nft_set_elems_iter_create(struct nft_set *s);
struct nft_set_elem *nft_set_elems_iter_cur(struct nft_set_elems_iter *iter);
diff --git a/include/libnftables/table.h b/include/libnftables/table.h
index a999770..8a4778f 100644
--- a/include/libnftables/table.h
+++ b/include/libnftables/table.h
@@ -51,6 +51,7 @@ struct nft_table_list;
struct nft_table_list *nft_table_list_alloc(void);
void nft_table_list_free(struct nft_table_list *list);
+int nft_table_list_foreach(struct nft_table_list *table_list, int (*cb)(struct nft_table *t, void *data), void *data);
void nft_table_list_add(struct nft_table *r, struct nft_table_list *list);
diff --git a/src/chain.c b/src/chain.c
index 1c53daa..62a6ddd 100644
--- a/src/chain.c
+++ b/src/chain.c
@@ -801,6 +801,22 @@ void nft_chain_list_del(struct nft_chain *r)
}
EXPORT_SYMBOL(nft_chain_list_del);
+int nft_chain_list_foreach(struct nft_chain_list *chain_list,
+ int (*cb)(struct nft_chain *r, void *data),
+ void *data)
+{
+ struct nft_chain *cur, *tmp;
+ int ret;
+
+ list_for_each_entry_safe(cur, tmp, &chain_list->list, head) {
+ ret = cb(cur, data);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(nft_chain_list_foreach);
+
struct nft_chain_list_iter {
struct nft_chain_list *list;
struct nft_chain *cur;
diff --git a/src/libnftables.map b/src/libnftables.map
index 2b31d55..6ee7a36 100644
--- a/src/libnftables.map
+++ b/src/libnftables.map
@@ -16,6 +16,7 @@ global:
nft_table_nlmsg_parse;
nft_table_list_alloc;
nft_table_list_free;
+ nft_table_list_foreach;
nft_table_list_add;
nft_table_list_iter_create;
nft_table_list_iter_next;
@@ -43,6 +44,7 @@ global:
nft_chain_list_free;
nft_chain_list_add;
nft_chain_list_del;
+ nft_chain_list_foreach;
nft_chain_list_iter_create;
nft_chain_list_iter_next;
nft_chain_list_iter_destroy;
@@ -66,6 +68,7 @@ global:
nft_rule_nlmsg_parse;
nft_rule_add_expr;
+ nft_rule_expr_foreach;
nft_rule_expr_iter_create;
nft_rule_expr_iter_next;
nft_rule_expr_iter_destroy;
@@ -87,6 +90,7 @@ global:
nft_rule_list_alloc;
nft_rule_list_free;
nft_rule_list_add;
+ nft_rule_list_foreach;
nft_rule_list_iter_create;
nft_rule_list_iter_cur;
nft_rule_list_iter_next;
@@ -109,6 +113,7 @@ global:
nft_set_list_alloc;
nft_set_list_free;
nft_set_list_add;
+ nft_set_list_foreach;
nft_set_list_iter_create;
nft_set_list_iter_cur;
@@ -118,6 +123,7 @@ global:
nft_set_elem_alloc;
nft_set_elem_free;
nft_set_elem_add;
+ nft_set_elem_foreach;
nft_set_elem_attr_unset;
nft_set_elem_attr_set;
nft_set_elem_attr_set_u32;
@@ -133,6 +139,8 @@ global:
nft_set_elems_nlmsg_build_payload;
nft_set_elems_nlmsg_parse;
+ nft_set_elems_foreach;
+
nft_set_elems_iter_create;
nft_set_elems_iter_cur;
nft_set_elems_iter_next;
diff --git a/src/rule.c b/src/rule.c
index 4c1672d..13b5a11 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -742,6 +742,22 @@ int nft_rule_snprintf(char *buf, size_t size, struct nft_rule *r,
}
EXPORT_SYMBOL(nft_rule_snprintf);
+int nft_rule_expr_foreach(struct nft_rule *r,
+ int (*cb)(struct nft_rule_expr *e, void *data),
+ void *data)
+{
+ struct nft_rule_expr *cur, *tmp;
+ int ret;
+
+ list_for_each_entry_safe(cur, tmp, &r->expr_list, head) {
+ ret = cb(cur, data);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(nft_rule_expr_foreach);
+
struct nft_rule_expr_iter {
struct nft_rule *r;
struct nft_rule_expr *cur;
@@ -817,6 +833,22 @@ void nft_rule_list_add(struct nft_rule *r, struct nft_rule_list *list)
}
EXPORT_SYMBOL(nft_rule_list_add);
+int nft_rule_list_foreach(struct nft_rule_list *rule_list,
+ int (*cb)(struct nft_rule *r, void *data),
+ void *data)
+{
+ struct nft_rule *cur, *tmp;
+ int ret;
+
+ list_for_each_entry_safe(cur, tmp, &rule_list->list, head) {
+ ret = cb(cur, data);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(nft_rule_list_foreach);
+
struct nft_rule_list_iter {
struct nft_rule_list *list;
struct nft_rule *cur;
diff --git a/src/set.c b/src/set.c
index 8e8adad..4d16062 100644
--- a/src/set.c
+++ b/src/set.c
@@ -364,6 +364,21 @@ void nft_set_list_add(struct nft_set *s, struct nft_set_list *list)
}
EXPORT_SYMBOL(nft_set_list_add);
+int nft_set_list_foreach(struct nft_set_list *set_list,
+ int (*cb)(struct nft_set *t, void *data), void *data)
+{
+ struct nft_set *cur, *tmp;
+ int ret;
+
+ list_for_each_entry_safe(cur, tmp, &set_list->list, head) {
+ ret = cb(cur, data);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(nft_set_list_foreach);
+
struct nft_set_list_iter {
struct nft_set_list *list;
struct nft_set *cur;
diff --git a/src/set_elem.c b/src/set_elem.c
index dae1f8c..209227f 100644
--- a/src/set_elem.c
+++ b/src/set_elem.c
@@ -396,6 +396,22 @@ int nft_set_elem_snprintf(char *buf, size_t size, struct nft_set_elem *e,
}
EXPORT_SYMBOL(nft_set_elem_snprintf);
+int nft_set_elem_foreach(struct nft_set *s,
+ int (*cb)(struct nft_set_elem *e, void *data),
+ void *data)
+{
+ struct nft_set_elem *elem;
+ int ret;
+
+ list_for_each_entry(elem, &s->element_list, head) {
+ ret = cb(elem, data);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(nft_set_elem_foreach);
+
struct nft_set_elems_iter {
struct list_head *list;
struct nft_set_elem *cur;
diff --git a/src/table.c b/src/table.c
index f21a6ed..3e8d4c9 100644
--- a/src/table.c
+++ b/src/table.c
@@ -409,6 +409,22 @@ void nft_table_list_add(struct nft_table *r, struct nft_table_list *list)
}
EXPORT_SYMBOL(nft_table_list_add);
+int nft_table_list_foreach(struct nft_table_list *table_list,
+ int (*cb)(struct nft_table *t, void *data),
+ void *data)
+{
+ struct nft_table *cur, *tmp;
+ int ret;
+
+ list_for_each_entry_safe(cur, tmp, &table_list->list, head) {
+ ret = cb(cur, data);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(nft_table_list_foreach);
+
struct nft_table_list_iter {
struct nft_table_list *list;
struct nft_table *cur;