]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
netfilter: nf_tables: merge ipv4 and ipv6 nat chain types
authorFlorian Westphal <fw@strlen.de>
Thu, 28 Feb 2019 11:02:52 +0000 (12:02 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 1 Mar 2019 13:36:59 +0000 (14:36 +0100)
Merge the ipv4 and ipv6 nat chain type. This is the last
missing piece which allows to provide inet family support
for nat in a follow patch.

The kconfig knobs for ipv4/ipv6 nat chain are removed, the
nat chain type will be built unconditionally if NFT_NAT
expression is enabled.

Before:
   text    data     bss     dec     hex filename
   1576     896       0    2472     9a8 nft_chain_nat_ipv4.ko
   1697     896       0    2593     a21 nft_chain_nat_ipv6.ko

After:
   text    data     bss     dec     hex filename
   1832     896       0    2728     aa8 nft_chain_nat.ko

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/ipv4/netfilter/Kconfig
net/ipv4/netfilter/Makefile
net/ipv4/netfilter/nft_chain_nat_ipv4.c [deleted file]
net/ipv6/netfilter/Kconfig
net/ipv6/netfilter/Makefile
net/ipv6/netfilter/nft_chain_nat_ipv6.c [deleted file]
net/netfilter/Kconfig
net/netfilter/Makefile
net/netfilter/nft_chain_nat.c [new file with mode: 0644]

index 71c291a86245dde58191251f858eb28b96a991d7..c98391d492006d251c3e8c0f025cbbb370bbcc9f 100644 (file)
@@ -95,19 +95,6 @@ config NF_REJECT_IPV4
        default m if NETFILTER_ADVANCED=n
 
 if NF_NAT
-
-if NF_TABLES
-config NFT_CHAIN_NAT_IPV4
-       depends on NF_TABLES_IPV4
-       tristate "IPv4 nf_tables nat chain support"
-       help
-         This option enables the "nat" chain for IPv4 in nf_tables. This
-         chain type is used to perform Network Address Translation (NAT)
-         packet transformations such as the source, destination address and
-         source and destination ports.
-
-endif # NF_TABLES
-
 config NF_NAT_SNMP_BASIC
        tristate "Basic SNMP-ALG support"
        depends on NF_CONNTRACK_SNMP
index 1ae24d71d3ccf0a345c907ecbb1e4a6e269bf74d..e241f5188ebef0e36237f3144c6b827a8e3eadcb 100644 (file)
@@ -25,7 +25,6 @@ $(obj)/nf_nat_snmp_basic_main.o: $(obj)/nf_nat_snmp_basic.asn1.h
 obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o
 
 obj-$(CONFIG_NFT_CHAIN_ROUTE_IPV4) += nft_chain_route_ipv4.o
-obj-$(CONFIG_NFT_CHAIN_NAT_IPV4) += nft_chain_nat_ipv4.o
 obj-$(CONFIG_NFT_REJECT_IPV4) += nft_reject_ipv4.o
 obj-$(CONFIG_NFT_FIB_IPV4) += nft_fib_ipv4.o
 obj-$(CONFIG_NFT_DUP_IPV4) += nft_dup_ipv4.o
diff --git a/net/ipv4/netfilter/nft_chain_nat_ipv4.c b/net/ipv4/netfilter/nft_chain_nat_ipv4.c
deleted file mode 100644 (file)
index 0d1ad59..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2008-2009 Patrick McHardy <kaber@trash.net>
- * Copyright (c) 2012 Pablo Neira Ayuso <pablo@netfilter.org>
- * Copyright (c) 2012 Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Development of this code funded by Astaro AG (http://www.astaro.com/)
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/skbuff.h>
-#include <linux/ip.h>
-#include <linux/netfilter.h>
-#include <linux/netfilter_ipv4.h>
-#include <linux/netfilter/nf_tables.h>
-#include <net/netfilter/nf_conntrack.h>
-#include <net/netfilter/nf_nat.h>
-#include <net/netfilter/nf_tables.h>
-#include <net/netfilter/nf_tables_ipv4.h>
-#include <net/ip.h>
-
-static unsigned int nft_nat_do_chain(void *priv,
-                                    struct sk_buff *skb,
-                                    const struct nf_hook_state *state)
-{
-       struct nft_pktinfo pkt;
-
-       nft_set_pktinfo(&pkt, skb, state);
-       nft_set_pktinfo_ipv4(&pkt, skb);
-
-       return nft_do_chain(&pkt, priv);
-}
-
-static int nft_nat_ipv4_reg(struct net *net, const struct nf_hook_ops *ops)
-{
-       return nf_nat_ipv4_register_fn(net, ops);
-}
-
-static void nft_nat_ipv4_unreg(struct net *net, const struct nf_hook_ops *ops)
-{
-       nf_nat_ipv4_unregister_fn(net, ops);
-}
-
-static const struct nft_chain_type nft_chain_nat_ipv4 = {
-       .name           = "nat",
-       .type           = NFT_CHAIN_T_NAT,
-       .family         = NFPROTO_IPV4,
-       .owner          = THIS_MODULE,
-       .hook_mask      = (1 << NF_INET_PRE_ROUTING) |
-                         (1 << NF_INET_POST_ROUTING) |
-                         (1 << NF_INET_LOCAL_OUT) |
-                         (1 << NF_INET_LOCAL_IN),
-       .hooks          = {
-               [NF_INET_PRE_ROUTING]   = nft_nat_do_chain,
-               [NF_INET_POST_ROUTING]  = nft_nat_do_chain,
-               [NF_INET_LOCAL_OUT]     = nft_nat_do_chain,
-               [NF_INET_LOCAL_IN]      = nft_nat_do_chain,
-       },
-       .ops_register = nft_nat_ipv4_reg,
-       .ops_unregister = nft_nat_ipv4_unreg,
-};
-
-static int __init nft_chain_nat_init(void)
-{
-       nft_register_chain_type(&nft_chain_nat_ipv4);
-
-       return 0;
-}
-
-static void __exit nft_chain_nat_exit(void)
-{
-       nft_unregister_chain_type(&nft_chain_nat_ipv4);
-}
-
-module_init(nft_chain_nat_init);
-module_exit(nft_chain_nat_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
-MODULE_ALIAS_NFT_CHAIN(AF_INET, "nat");
index b95351a5cb83e8266613ffdde17688255ef75b49..ddc99a1653aa790352f9c1a4b11edcb61abbcd1a 100644 (file)
@@ -31,17 +31,6 @@ config NFT_CHAIN_ROUTE_IPV6
          fields such as the source, destination, flowlabel, hop-limit and
          the packet mark.
 
-if NF_NAT
-
-config NFT_CHAIN_NAT_IPV6
-       tristate "IPv6 nf_tables nat chain support"
-       help
-         This option enables the "nat" chain for IPv6 in nf_tables. This
-         chain type is used to perform Network Address Translation (NAT)
-         packet transformations such as the source, destination address and
-         source and destination ports.
-endif # NF_NAT
-
 config NFT_REJECT_IPV6
        select NF_REJECT_IPV6
        default NFT_REJECT
index 06c1829f8ffc5877768887d62263d2b92fbbdc8f..3853c648ebaaa5fe0c5fad8d3fb36bab5e3a5977 100644 (file)
@@ -28,7 +28,6 @@ obj-$(CONFIG_NF_DUP_IPV6) += nf_dup_ipv6.o
 
 # nf_tables
 obj-$(CONFIG_NFT_CHAIN_ROUTE_IPV6) += nft_chain_route_ipv6.o
-obj-$(CONFIG_NFT_CHAIN_NAT_IPV6) += nft_chain_nat_ipv6.o
 obj-$(CONFIG_NFT_REJECT_IPV6) += nft_reject_ipv6.o
 obj-$(CONFIG_NFT_DUP_IPV6) += nft_dup_ipv6.o
 obj-$(CONFIG_NFT_FIB_IPV6) += nft_fib_ipv6.o
diff --git a/net/ipv6/netfilter/nft_chain_nat_ipv6.c b/net/ipv6/netfilter/nft_chain_nat_ipv6.c
deleted file mode 100644 (file)
index e66bfd0..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2011 Patrick McHardy <kaber@trash.net>
- * Copyright (c) 2012 Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/skbuff.h>
-#include <linux/ip.h>
-#include <linux/netfilter.h>
-#include <linux/netfilter_ipv6.h>
-#include <linux/netfilter/nf_tables.h>
-#include <net/netfilter/nf_conntrack.h>
-#include <net/netfilter/nf_nat.h>
-#include <net/netfilter/nf_tables.h>
-#include <net/netfilter/nf_tables_ipv6.h>
-#include <net/ipv6.h>
-
-static unsigned int nft_nat_do_chain(void *priv,
-                                    struct sk_buff *skb,
-                                    const struct nf_hook_state *state)
-{
-       struct nft_pktinfo pkt;
-
-       nft_set_pktinfo(&pkt, skb, state);
-       nft_set_pktinfo_ipv6(&pkt, skb);
-
-       return nft_do_chain(&pkt, priv);
-}
-
-static int nft_nat_ipv6_reg(struct net *net, const struct nf_hook_ops *ops)
-{
-       return nf_nat_ipv6_register_fn(net, ops);
-}
-
-static void nft_nat_ipv6_unreg(struct net *net, const struct nf_hook_ops *ops)
-{
-       nf_nat_ipv6_unregister_fn(net, ops);
-}
-
-static const struct nft_chain_type nft_chain_nat_ipv6 = {
-       .name           = "nat",
-       .type           = NFT_CHAIN_T_NAT,
-       .family         = NFPROTO_IPV6,
-       .owner          = THIS_MODULE,
-       .hook_mask      = (1 << NF_INET_PRE_ROUTING) |
-                         (1 << NF_INET_POST_ROUTING) |
-                         (1 << NF_INET_LOCAL_OUT) |
-                         (1 << NF_INET_LOCAL_IN),
-       .hooks          = {
-               [NF_INET_PRE_ROUTING]   = nft_nat_do_chain,
-               [NF_INET_POST_ROUTING]  = nft_nat_do_chain,
-               [NF_INET_LOCAL_OUT]     = nft_nat_do_chain,
-               [NF_INET_LOCAL_IN]      = nft_nat_do_chain,
-       },
-       .ops_register           = nft_nat_ipv6_reg,
-       .ops_unregister         = nft_nat_ipv6_unreg,
-};
-
-static int __init nft_chain_nat_ipv6_init(void)
-{
-       nft_register_chain_type(&nft_chain_nat_ipv6);
-
-       return 0;
-}
-
-static void __exit nft_chain_nat_ipv6_exit(void)
-{
-       nft_unregister_chain_type(&nft_chain_nat_ipv6);
-}
-
-module_init(nft_chain_nat_ipv6_init);
-module_exit(nft_chain_nat_ipv6_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>");
-MODULE_ALIAS_NFT_CHAIN(AF_INET6, "nat");
index 537f23a8ed5288cffd1d2d6d053f951956552897..d43ffb09939bd3641b213b826a3e0229bcdbb550 100644 (file)
@@ -550,6 +550,7 @@ config NFT_REDIR
 config NFT_NAT
        depends on NF_CONNTRACK
        select NF_NAT
+       depends on NF_TABLES_IPV4 || NF_TABLES_IPV6
        tristate "Netfilter nf_tables nat module"
        help
          This option adds the "nat" expression that you can use to perform
index c7910706f8dd9268e05a65670bae1067428debaa..4894a85cdd0b02c94cfd8b3b0c8ca60c3257d537 100644 (file)
@@ -110,6 +110,8 @@ obj-$(CONFIG_NFT_OSF)               += nft_osf.o
 obj-$(CONFIG_NFT_TPROXY)       += nft_tproxy.o
 obj-$(CONFIG_NFT_XFRM)         += nft_xfrm.o
 
+obj-$(CONFIG_NFT_NAT)          += nft_chain_nat.o
+
 # nf_tables netdev
 obj-$(CONFIG_NFT_DUP_NETDEV)   += nft_dup_netdev.o
 obj-$(CONFIG_NFT_FWD_NETDEV)   += nft_fwd_netdev.o
diff --git a/net/netfilter/nft_chain_nat.c b/net/netfilter/nft_chain_nat.c
new file mode 100644 (file)
index 0000000..ee48520
--- /dev/null
@@ -0,0 +1,108 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/netfilter/nf_tables.h>
+#include <net/netfilter/nf_nat.h>
+#include <net/netfilter/nf_tables.h>
+#include <net/netfilter/nf_tables_ipv4.h>
+#include <net/netfilter/nf_tables_ipv6.h>
+
+static unsigned int nft_nat_do_chain(void *priv, struct sk_buff *skb,
+                                    const struct nf_hook_state *state)
+{
+       struct nft_pktinfo pkt;
+
+       nft_set_pktinfo(&pkt, skb, state);
+
+       switch (state->pf) {
+#ifdef CONFIG_NF_TABLES_IPV4
+       case NFPROTO_IPV4:
+               nft_set_pktinfo_ipv4(&pkt, skb);
+               break;
+#endif
+#ifdef CONFIG_NF_TABLES_IPV6
+       case NFPROTO_IPV6:
+               nft_set_pktinfo_ipv6(&pkt, skb);
+               break;
+#endif
+       default:
+               break;
+       }
+
+       return nft_do_chain(&pkt, priv);
+}
+
+#ifdef CONFIG_NF_TABLES_IPV4
+static const struct nft_chain_type nft_chain_nat_ipv4 = {
+       .name           = "nat",
+       .type           = NFT_CHAIN_T_NAT,
+       .family         = NFPROTO_IPV4,
+       .owner          = THIS_MODULE,
+       .hook_mask      = (1 << NF_INET_PRE_ROUTING) |
+                         (1 << NF_INET_POST_ROUTING) |
+                         (1 << NF_INET_LOCAL_OUT) |
+                         (1 << NF_INET_LOCAL_IN),
+       .hooks          = {
+               [NF_INET_PRE_ROUTING]   = nft_nat_do_chain,
+               [NF_INET_POST_ROUTING]  = nft_nat_do_chain,
+               [NF_INET_LOCAL_OUT]     = nft_nat_do_chain,
+               [NF_INET_LOCAL_IN]      = nft_nat_do_chain,
+       },
+       .ops_register = nf_nat_ipv4_register_fn,
+       .ops_unregister = nf_nat_ipv4_unregister_fn,
+};
+#endif
+
+#ifdef CONFIG_NF_TABLES_IPV6
+static const struct nft_chain_type nft_chain_nat_ipv6 = {
+       .name           = "nat",
+       .type           = NFT_CHAIN_T_NAT,
+       .family         = NFPROTO_IPV6,
+       .owner          = THIS_MODULE,
+       .hook_mask      = (1 << NF_INET_PRE_ROUTING) |
+                         (1 << NF_INET_POST_ROUTING) |
+                         (1 << NF_INET_LOCAL_OUT) |
+                         (1 << NF_INET_LOCAL_IN),
+       .hooks          = {
+               [NF_INET_PRE_ROUTING]   = nft_nat_do_chain,
+               [NF_INET_POST_ROUTING]  = nft_nat_do_chain,
+               [NF_INET_LOCAL_OUT]     = nft_nat_do_chain,
+               [NF_INET_LOCAL_IN]      = nft_nat_do_chain,
+       },
+       .ops_register           = nf_nat_ipv6_register_fn,
+       .ops_unregister         = nf_nat_ipv6_unregister_fn,
+};
+#endif
+
+static int __init nft_chain_nat_init(void)
+{
+#ifdef CONFIG_NF_TABLES_IPV6
+       nft_register_chain_type(&nft_chain_nat_ipv6);
+#endif
+#ifdef CONFIG_NF_TABLES_IPV4
+       nft_register_chain_type(&nft_chain_nat_ipv4);
+#endif
+
+       return 0;
+}
+
+static void __exit nft_chain_nat_exit(void)
+{
+#ifdef CONFIG_NF_TABLES_IPV4
+       nft_unregister_chain_type(&nft_chain_nat_ipv4);
+#endif
+#ifdef CONFIG_NF_TABLES_IPV6
+       nft_unregister_chain_type(&nft_chain_nat_ipv6);
+#endif
+}
+
+module_init(nft_chain_nat_init);
+module_exit(nft_chain_nat_exit);
+
+MODULE_LICENSE("GPL");
+#ifdef CONFIG_NF_TABLES_IPV4
+MODULE_ALIAS_NFT_CHAIN(AF_INET, "nat");
+#endif
+#ifdef CONFIG_NF_TABLES_IPV6
+MODULE_ALIAS_NFT_CHAIN(AF_INET6, "nat");
+#endif