This patch adds a simplied iterator interface.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
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);
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);
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;
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);
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);
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);
}
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;
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;
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;
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;
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;
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;
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;
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;
}
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;
}
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;
}
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;
}
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;
}
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;