iptables: nft: move priority to chain instead of table
NAT table uses different chain priorities, adapt the existing
code to allow this.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
diff --git a/iptables/nft.c b/iptables/nft.c
index c803ffe..0d07aa5 100644
--- a/iptables/nft.c
+++ b/iptables/nft.c
@@ -82,7 +82,111 @@
return 0;
}
-static int nft_table_builtin_add(struct nft_handle *h, const char *table)
+#define FILTER 0
+#define MANGLE 1
+#define RAW 2
+#define SECURITY 3
+#define TABLES_MAX 4
+
+struct builtin_chain {
+ const char *name;
+ uint32_t prio;
+ uint32_t hook;
+};
+
+static struct builtin_table {
+ const char *name;
+ struct builtin_chain chains[NF_INET_NUMHOOKS];
+} tables[TABLES_MAX] = {
+ [RAW] = {
+ .name = "raw",
+ .chains = {
+ {
+ .name = "PREROUTING",
+ .prio = -300, /* NF_IP_PRI_RAW */
+ .hook = NF_INET_PRE_ROUTING,
+ },
+ {
+ .name = "OUTPUT",
+ .prio = -300, /* NF_IP_PRI_RAW */
+ .hook = NF_INET_LOCAL_OUT,
+ },
+ },
+ },
+ [MANGLE] = {
+ .name = "mangle",
+ .chains = {
+ {
+ .name = "PREROUTING",
+ .prio = -150, /* NF_IP_PRI_MANGLE */
+ .hook = NF_INET_PRE_ROUTING,
+ },
+ {
+ .name = "INPUT",
+ .prio = -150, /* NF_IP_PRI_MANGLE */
+ .hook = NF_INET_LOCAL_IN,
+ },
+ {
+ .name = "FORWARD",
+ .prio = -150, /* NF_IP_PRI_MANGLE */
+ .hook = NF_INET_FORWARD,
+ },
+ {
+ .name = "OUTPUT",
+ .prio = -150, /* NF_IP_PRI_MANGLE */
+ .hook = NF_INET_LOCAL_OUT,
+ },
+ {
+ .name = "POSTROUTING",
+ .prio = -150, /* NF_IP_PRI_MANGLE */
+ .hook = NF_INET_POST_ROUTING,
+ },
+ },
+ },
+ [FILTER] = {
+ .name = "filter",
+ .chains = {
+ {
+ .name = "INPUT",
+ .prio = 0, /* NF_IP_PRI_FILTER */
+ .hook = NF_INET_LOCAL_IN,
+ },
+ {
+ .name = "FORWARD",
+ .prio = 0, /* NF_IP_PRI_FILTER */
+ .hook = NF_INET_FORWARD,
+ },
+ {
+ .name = "OUTPUT",
+ .prio = 0, /* NF_IP_PRI_FILTER */
+ .hook = NF_INET_LOCAL_OUT,
+ },
+ },
+ },
+ [SECURITY] = {
+ .name = "security",
+ .chains = {
+ {
+ .name = "INPUT",
+ .prio = 150, /* NF_IP_PRI_SECURITY */
+ .hook = NF_INET_LOCAL_IN,
+ },
+ {
+ .name = "FORWARD",
+ .prio = 150, /* NF_IP_PRI_SECURITY */
+ .hook = NF_INET_FORWARD,
+ },
+ {
+ .name = "OUTPUT",
+ .prio = 150, /* NF_IP_PRI_SECURITY */
+ .hook = NF_INET_LOCAL_OUT,
+ },
+ },
+ },
+ /* nat already registered by nf_tables */
+};
+
+static int nft_table_builtin_add(struct nft_handle *h, struct builtin_table *_t)
{
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
@@ -93,7 +197,7 @@
if (t == NULL)
return -1;
- nft_table_attr_set(t, NFT_TABLE_ATTR_NAME, (char *)table);
+ nft_table_attr_set(t, NFT_TABLE_ATTR_NAME, (char *)_t->name);
nlh = nft_table_nlmsg_build_hdr(buf, NFT_MSG_NEWTABLE, AF_INET,
NLM_F_ACK|NLM_F_EXCL, h->seq);
@@ -108,101 +212,6 @@
return ret;
}
-#define FILTER 0
-#define MANGLE 1
-#define RAW 2
-#define SECURITY 3
-#define TABLES_MAX 4
-
-struct builtin_chain {
- const char *name;
- uint32_t hook;
-};
-
-static struct builtin_table {
- const char *name;
- uint32_t prio;
- struct builtin_chain chains[NF_INET_NUMHOOKS];
-} tables[TABLES_MAX] = {
- [RAW] = {
- .name = "raw",
- .prio = -300, /* NF_IP_PRI_RAW */
- .chains = {
- {
- .name = "PREROUTING",
- .hook = NF_INET_PRE_ROUTING,
- },
- {
- .name = "OUTPUT",
- .hook = NF_INET_LOCAL_OUT,
- },
- },
- },
- [MANGLE] = {
- .name = "mangle",
- .prio = -150, /* NF_IP_PRI_MANGLE */
- .chains = {
- {
- .name = "PREROUTING",
- .hook = NF_INET_PRE_ROUTING,
- },
- {
- .name = "INPUT",
- .hook = NF_INET_LOCAL_IN,
- },
- {
- .name = "FORWARD",
- .hook = NF_INET_FORWARD,
- },
- {
- .name = "OUTPUT",
- .hook = NF_INET_LOCAL_OUT,
- },
- {
- .name = "POSTROUTING",
- .hook = NF_INET_POST_ROUTING,
- },
- },
- },
- [FILTER] = {
- .name = "filter",
- .prio = 0, /* NF_IP_PRI_FILTER */
- .chains = {
- {
- .name = "INPUT",
- .hook = NF_INET_LOCAL_IN,
- },
- {
- .name = "FORWARD",
- .hook = NF_INET_FORWARD,
- },
- {
- .name = "OUTPUT",
- .hook = NF_INET_LOCAL_OUT,
- },
- },
- },
- [SECURITY] = {
- .name = "security",
- .prio = 150, /* NF_IP_PRI_SECURITY */
- .chains = {
- {
- .name = "INPUT",
- .hook = NF_INET_LOCAL_IN,
- },
- {
- .name = "FORWARD",
- .hook = NF_INET_FORWARD,
- },
- {
- .name = "OUTPUT",
- .hook = NF_INET_LOCAL_OUT,
- },
- },
- },
- /* nat already registered by nf_tables */
-};
-
static struct nft_chain *
nft_chain_builtin_alloc(struct builtin_table *table,
struct builtin_chain *chain, int policy)
@@ -216,7 +225,7 @@
nft_chain_attr_set(c, NFT_CHAIN_ATTR_TABLE, (char *)table->name);
nft_chain_attr_set(c, NFT_CHAIN_ATTR_NAME, (char *)chain->name);
nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_HOOKNUM, chain->hook);
- nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_PRIO, table->prio);
+ nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_PRIO, chain->prio);
nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy);
return c;
@@ -312,7 +321,7 @@
ret = -1;
goto out;
}
- if (nft_table_builtin_add(h, table) < 0) {
+ if (nft_table_builtin_add(h, t) < 0) {
/* Built-in table already initialized, skip. */
if (errno == EEXIST)
goto out;
@@ -394,7 +403,7 @@
_t = nft_table_builtin_find(table);
/* if this built-in table does not exists, create it */
if (_t != NULL)
- nft_table_builtin_add(h, table);
+ nft_table_builtin_add(h, _t);
_c = nft_chain_builtin_find(_t, chain);
if (_c != NULL) {