Blame SOURCES/0002-chain-Support-per-chain-rules-list.patch

ef9e95
From 8fcb95ed6dcd47c94a924b4018177d8a833d6983 Mon Sep 17 00:00:00 2001
ef9e95
From: Phil Sutter <psutter@redhat.com>
ef9e95
Date: Mon, 17 Dec 2018 17:30:06 +0100
ef9e95
Subject: [PATCH] chain: Support per chain rules list
ef9e95
ef9e95
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1658533
ef9e95
Upstream Status: libnftnl commit e33798478176f
ef9e95
ef9e95
commit e33798478176f97edf2649cd61444e0375fdc12b
ef9e95
Author: Phil Sutter <phil@nwl.cc>
ef9e95
Date:   Thu Dec 6 17:17:51 2018 +0100
ef9e95
ef9e95
    chain: Support per chain rules list
ef9e95
ef9e95
    The implementation basically copies expr_list in struct nftnl_rule.
ef9e95
ef9e95
    Signed-off-by: Phil Sutter <phil@nwl.cc>
ef9e95
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
ef9e95
---
ef9e95
 include/internal.h       |   1 +
ef9e95
 include/libnftnl/chain.h |  15 +++++++
ef9e95
 include/rule.h           |  26 ++++++++++++
ef9e95
 src/chain.c              | 104 ++++++++++++++++++++++++++++++++++++++++++++++-
ef9e95
 src/libnftnl.map         |  10 +++++
ef9e95
 src/rule.c               |  22 ----------
ef9e95
 6 files changed, 155 insertions(+), 23 deletions(-)
ef9e95
 create mode 100644 include/rule.h
ef9e95
ef9e95
diff --git a/include/internal.h b/include/internal.h
ef9e95
index 7e97c4a..323f825 100644
ef9e95
--- a/include/internal.h
ef9e95
+++ b/include/internal.h
ef9e95
@@ -13,5 +13,6 @@
ef9e95
 #include "expr.h"
ef9e95
 #include "expr_ops.h"
ef9e95
 #include "buffer.h"
ef9e95
+#include "rule.h"
ef9e95
 
ef9e95
 #endif /* _LIBNFTNL_INTERNAL_H_ */
ef9e95
diff --git a/include/libnftnl/chain.h b/include/libnftnl/chain.h
ef9e95
index 237683e..f04f610 100644
ef9e95
--- a/include/libnftnl/chain.h
ef9e95
+++ b/include/libnftnl/chain.h
ef9e95
@@ -13,6 +13,7 @@ extern "C" {
ef9e95
 #endif
ef9e95
 
ef9e95
 struct nftnl_chain;
ef9e95
+struct nftnl_rule;
ef9e95
 
ef9e95
 struct nftnl_chain *nftnl_chain_alloc(void);
ef9e95
 void nftnl_chain_free(const struct nftnl_chain *);
ef9e95
@@ -54,6 +55,10 @@ uint32_t nftnl_chain_get_u32(const struct nftnl_chain *c, uint16_t attr);
ef9e95
 int32_t nftnl_chain_get_s32(const struct nftnl_chain *c, uint16_t attr);
ef9e95
 uint64_t nftnl_chain_get_u64(const struct nftnl_chain *c, uint16_t attr);
ef9e95
 
ef9e95
+void nftnl_chain_rule_add(struct nftnl_rule *rule, struct nftnl_chain *c);
ef9e95
+void nftnl_chain_rule_add_tail(struct nftnl_rule *rule, struct nftnl_chain *c);
ef9e95
+void nftnl_chain_rule_insert_at(struct nftnl_rule *rule, struct nftnl_rule *pos);
ef9e95
+
ef9e95
 struct nlmsghdr;
ef9e95
 
ef9e95
 void nftnl_chain_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nftnl_chain *t);
ef9e95
@@ -68,6 +73,16 @@ int nftnl_chain_fprintf(FILE *fp, const struct nftnl_chain *c, uint32_t type, ui
ef9e95
 #define nftnl_chain_nlmsg_build_hdr	nftnl_nlmsg_build_hdr
ef9e95
 int nftnl_chain_nlmsg_parse(const struct nlmsghdr *nlh, struct nftnl_chain *t);
ef9e95
 
ef9e95
+int nftnl_rule_foreach(struct nftnl_chain *c,
ef9e95
+			  int (*cb)(struct nftnl_rule *r, void *data),
ef9e95
+			  void *data);
ef9e95
+
ef9e95
+struct nftnl_rule_iter;
ef9e95
+
ef9e95
+struct nftnl_rule_iter *nftnl_rule_iter_create(const struct nftnl_chain *c);
ef9e95
+struct nftnl_rule *nftnl_rule_iter_next(struct nftnl_rule_iter *iter);
ef9e95
+void nftnl_rule_iter_destroy(struct nftnl_rule_iter *iter);
ef9e95
+
ef9e95
 struct nftnl_chain_list;
ef9e95
 
ef9e95
 struct nftnl_chain_list *nftnl_chain_list_alloc(void);
ef9e95
diff --git a/include/rule.h b/include/rule.h
ef9e95
new file mode 100644
ef9e95
index 0000000..5edcb6c
ef9e95
--- /dev/null
ef9e95
+++ b/include/rule.h
ef9e95
@@ -0,0 +1,26 @@
ef9e95
+#ifndef _LIBNFTNL_RULE_INTERNAL_H_
ef9e95
+#define _LIBNFTNL_RULE_INTERNAL_H_
ef9e95
+
ef9e95
+struct nftnl_rule {
ef9e95
+	struct list_head head;
ef9e95
+
ef9e95
+	uint32_t	flags;
ef9e95
+	uint32_t	family;
ef9e95
+	const char	*table;
ef9e95
+	const char	*chain;
ef9e95
+	uint64_t	handle;
ef9e95
+	uint64_t	position;
ef9e95
+	uint32_t	id;
ef9e95
+	struct {
ef9e95
+			void		*data;
ef9e95
+			uint32_t	len;
ef9e95
+	} user;
ef9e95
+	struct {
ef9e95
+			uint32_t	flags;
ef9e95
+			uint32_t	proto;
ef9e95
+	} compat;
ef9e95
+
ef9e95
+	struct list_head expr_list;
ef9e95
+};
ef9e95
+
ef9e95
+#endif
ef9e95
diff --git a/src/chain.c b/src/chain.c
ef9e95
index eff5186..c374923 100644
ef9e95
--- a/src/chain.c
ef9e95
+++ b/src/chain.c
ef9e95
@@ -27,6 +27,7 @@
ef9e95
 #include <linux/netfilter_arp.h>
ef9e95
 
ef9e95
 #include <libnftnl/chain.h>
ef9e95
+#include <libnftnl/rule.h>
ef9e95
 #include <buffer.h>
ef9e95
 
ef9e95
 struct nftnl_chain {
ef9e95
@@ -45,6 +46,8 @@ struct nftnl_chain {
ef9e95
 	uint64_t	bytes;
ef9e95
 	uint64_t	handle;
ef9e95
 	uint32_t	flags;
ef9e95
+
ef9e95
+	struct list_head rule_list;
ef9e95
 };
ef9e95
 
ef9e95
 static const char *nftnl_hooknum2str(int family, int hooknum)
ef9e95
@@ -90,12 +93,25 @@ static const char *nftnl_hooknum2str(int family, int hooknum)
ef9e95
 EXPORT_SYMBOL(nftnl_chain_alloc);
ef9e95
 struct nftnl_chain *nftnl_chain_alloc(void)
ef9e95
 {
ef9e95
-	return calloc(1, sizeof(struct nftnl_chain));
ef9e95
+	struct nftnl_chain *c;
ef9e95
+
ef9e95
+	c = calloc(1, sizeof(struct nftnl_chain));
ef9e95
+	if (c == NULL)
ef9e95
+		return NULL;
ef9e95
+
ef9e95
+	INIT_LIST_HEAD(&c->rule_list);
ef9e95
+
ef9e95
+	return c;
ef9e95
 }
ef9e95
 
ef9e95
 EXPORT_SYMBOL(nftnl_chain_free);
ef9e95
 void nftnl_chain_free(const struct nftnl_chain *c)
ef9e95
 {
ef9e95
+	struct nftnl_rule *r, *tmp;
ef9e95
+
ef9e95
+	list_for_each_entry_safe(r, tmp, &c->rule_list, head)
ef9e95
+		nftnl_rule_free(r);
ef9e95
+
ef9e95
 	if (c->flags & (1 << NFTNL_CHAIN_NAME))
ef9e95
 		xfree(c->name);
ef9e95
 	if (c->flags & (1 << NFTNL_CHAIN_TABLE))
ef9e95
@@ -406,6 +422,24 @@ void nftnl_chain_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nftnl_ch
ef9e95
 		mnl_attr_put_strz(nlh, NFTA_CHAIN_TYPE, c->type);
ef9e95
 }
ef9e95
 
ef9e95
+EXPORT_SYMBOL(nftnl_chain_rule_add);
ef9e95
+void nftnl_chain_rule_add(struct nftnl_rule *rule, struct nftnl_chain *c)
ef9e95
+{
ef9e95
+	list_add(&rule->head, &c->rule_list);
ef9e95
+}
ef9e95
+
ef9e95
+EXPORT_SYMBOL(nftnl_chain_rule_add_tail);
ef9e95
+void nftnl_chain_rule_add_tail(struct nftnl_rule *rule, struct nftnl_chain *c)
ef9e95
+{
ef9e95
+	list_add_tail(&rule->head, &c->rule_list);
ef9e95
+}
ef9e95
+
ef9e95
+EXPORT_SYMBOL(nftnl_chain_rule_insert_at);
ef9e95
+void nftnl_chain_rule_insert_at(struct nftnl_rule *rule, struct nftnl_rule *pos)
ef9e95
+{
ef9e95
+	list_add(&rule->head, &pos->head);
ef9e95
+}
ef9e95
+
ef9e95
 static int nftnl_chain_parse_attr_cb(const struct nlattr *attr, void *data)
ef9e95
 {
ef9e95
 	const struct nlattr **tb = data;
ef9e95
@@ -875,6 +909,74 @@ int nftnl_chain_fprintf(FILE *fp, const struct nftnl_chain *c, uint32_t type,
ef9e95
 			   nftnl_chain_do_snprintf);
ef9e95
 }
ef9e95
 
ef9e95
+EXPORT_SYMBOL(nftnl_rule_foreach);
ef9e95
+int nftnl_rule_foreach(struct nftnl_chain *c,
ef9e95
+                          int (*cb)(struct nftnl_rule *r, void *data),
ef9e95
+                          void *data)
ef9e95
+{
ef9e95
+       struct nftnl_rule *cur, *tmp;
ef9e95
+       int ret;
ef9e95
+
ef9e95
+       list_for_each_entry_safe(cur, tmp, &c->rule_list, head) {
ef9e95
+               ret = cb(cur, data);
ef9e95
+               if (ret < 0)
ef9e95
+                       return ret;
ef9e95
+       }
ef9e95
+       return 0;
ef9e95
+}
ef9e95
+
ef9e95
+struct nftnl_rule_iter {
ef9e95
+	const struct nftnl_chain	*c;
ef9e95
+	struct nftnl_rule		*cur;
ef9e95
+};
ef9e95
+
ef9e95
+static void nftnl_rule_iter_init(const struct nftnl_chain *c,
ef9e95
+				 struct nftnl_rule_iter *iter)
ef9e95
+{
ef9e95
+	iter->c = c;
ef9e95
+	if (list_empty(&c->rule_list))
ef9e95
+		iter->cur = NULL;
ef9e95
+	else
ef9e95
+		iter->cur = list_entry(c->rule_list.next, struct nftnl_rule,
ef9e95
+				       head);
ef9e95
+}
ef9e95
+
ef9e95
+EXPORT_SYMBOL(nftnl_rule_iter_create);
ef9e95
+struct nftnl_rule_iter *nftnl_rule_iter_create(const struct nftnl_chain *c)
ef9e95
+{
ef9e95
+	struct nftnl_rule_iter *iter;
ef9e95
+
ef9e95
+	iter = calloc(1, sizeof(struct nftnl_rule_iter));
ef9e95
+	if (iter == NULL)
ef9e95
+		return NULL;
ef9e95
+
ef9e95
+	nftnl_rule_iter_init(c, iter);
ef9e95
+
ef9e95
+	return iter;
ef9e95
+}
ef9e95
+
ef9e95
+EXPORT_SYMBOL(nftnl_rule_iter_next);
ef9e95
+struct nftnl_rule *nftnl_rule_iter_next(struct nftnl_rule_iter *iter)
ef9e95
+{
ef9e95
+	struct nftnl_rule *rule = iter->cur;
ef9e95
+
ef9e95
+	if (rule == NULL)
ef9e95
+		return NULL;
ef9e95
+
ef9e95
+	/* get next rule, if any */
ef9e95
+	iter->cur = list_entry(iter->cur->head.next, struct nftnl_rule, head);
ef9e95
+	if (&iter->cur->head == iter->c->rule_list.next)
ef9e95
+		return NULL;
ef9e95
+
ef9e95
+	return rule;
ef9e95
+}
ef9e95
+
ef9e95
+EXPORT_SYMBOL(nftnl_rule_iter_destroy);
ef9e95
+void nftnl_rule_iter_destroy(struct nftnl_rule_iter *iter)
ef9e95
+{
ef9e95
+	xfree(iter);
ef9e95
+}
ef9e95
+
ef9e95
 struct nftnl_chain_list {
ef9e95
 	struct list_head list;
ef9e95
 };
ef9e95
diff --git a/src/libnftnl.map b/src/libnftnl.map
ef9e95
index 89414f2..96d5b5f 100644
ef9e95
--- a/src/libnftnl.map
ef9e95
+++ b/src/libnftnl.map
ef9e95
@@ -336,3 +336,13 @@ global:
ef9e95
 
ef9e95
 local: *;
ef9e95
 };
ef9e95
+
ef9e95
+LIBNFTNL_12 {
ef9e95
+  nftnl_chain_rule_add;
ef9e95
+  nftnl_chain_rule_add_tail;
ef9e95
+  nftnl_chain_rule_insert_at;
ef9e95
+  nftnl_rule_foreach;
ef9e95
+  nftnl_rule_iter_create;
ef9e95
+  nftnl_rule_iter_next;
ef9e95
+  nftnl_rule_iter_destroy;
ef9e95
+} LIBNFTNL_11;
ef9e95
diff --git a/src/rule.c b/src/rule.c
ef9e95
index 2c70420..6a43d3e 100644
ef9e95
--- a/src/rule.c
ef9e95
+++ b/src/rule.c
ef9e95
@@ -30,28 +30,6 @@
ef9e95
 #include <libnftnl/set.h>
ef9e95
 #include <libnftnl/expr.h>
ef9e95
 
ef9e95
-struct nftnl_rule {
ef9e95
-	struct list_head head;
ef9e95
-
ef9e95
-	uint32_t	flags;
ef9e95
-	uint32_t	family;
ef9e95
-	const char	*table;
ef9e95
-	const char	*chain;
ef9e95
-	uint64_t	handle;
ef9e95
-	uint64_t	position;
ef9e95
-	uint32_t	id;
ef9e95
-	struct {
ef9e95
-			void		*data;
ef9e95
-			uint32_t	len;
ef9e95
-	} user;
ef9e95
-	struct {
ef9e95
-			uint32_t	flags;
ef9e95
-			uint32_t	proto;
ef9e95
-	} compat;
ef9e95
-
ef9e95
-	struct list_head expr_list;
ef9e95
-};
ef9e95
-
ef9e95
 EXPORT_SYMBOL(nftnl_rule_alloc);
ef9e95
 struct nftnl_rule *nftnl_rule_alloc(void)
ef9e95
 {
ef9e95
-- 
ef9e95
1.8.3.1
ef9e95