]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
netfilter: nf_tables: nat: merge nft_masq protocol specific modules
authorFlorian Westphal <fw@strlen.de>
Thu, 28 Feb 2019 11:02:51 +0000 (12:02 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 1 Mar 2019 13:36:59 +0000 (14:36 +0100)
The family specific masq modules are way too small to warrant
an extra module, just place all of them in nft_masq.

before:
  text    data     bss     dec     hex filename
   1001     832       0    1833     729 nft_masq.ko
    766     896       0    1662     67e nft_masq_ipv4.ko
    764     896       0    1660     67c nft_masq_ipv6.ko

after:
   2010     960       0    2970     b9a nft_masq.ko

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/net/netfilter/nft_masq.h [deleted file]
net/ipv4/netfilter/Kconfig
net/ipv4/netfilter/Makefile
net/ipv4/netfilter/nft_masq_ipv4.c [deleted file]
net/ipv6/netfilter/Kconfig
net/ipv6/netfilter/Makefile
net/ipv6/netfilter/nft_masq_ipv6.c [deleted file]
net/netfilter/Kconfig
net/netfilter/nft_masq.c

diff --git a/include/net/netfilter/nft_masq.h b/include/net/netfilter/nft_masq.h
deleted file mode 100644 (file)
index e51ab38..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _NFT_MASQ_H_
-#define _NFT_MASQ_H_
-
-struct nft_masq {
-       u32                     flags;
-       enum nft_registers      sreg_proto_min:8;
-       enum nft_registers      sreg_proto_max:8;
-};
-
-extern const struct nla_policy nft_masq_policy[];
-
-int nft_masq_init(const struct nft_ctx *ctx,
-                 const struct nft_expr *expr,
-                 const struct nlattr * const tb[]);
-
-int nft_masq_dump(struct sk_buff *skb, const struct nft_expr *expr);
-
-int nft_masq_validate(const struct nft_ctx *ctx, const struct nft_expr *expr,
-                     const struct nft_data **data);
-
-#endif /* _NFT_MASQ_H_ */
index 12cc3f7d7733cf009d0904ddc31c2c96382a9b6f..71c291a86245dde58191251f858eb28b96a991d7 100644 (file)
@@ -106,15 +106,6 @@ config NFT_CHAIN_NAT_IPV4
          packet transformations such as the source, destination address and
          source and destination ports.
 
          packet transformations such as the source, destination address and
          source and destination ports.
 
-config NFT_MASQ_IPV4
-       tristate "IPv4 masquerading support for nf_tables"
-       depends on NF_TABLES_IPV4
-       depends on NFT_MASQ
-       select NF_NAT_MASQUERADE
-       help
-         This is the expression that provides IPv4 masquerading support for
-         nf_tables.
-
 endif # NF_TABLES
 
 config NF_NAT_SNMP_BASIC
 endif # NF_TABLES
 
 config NF_NAT_SNMP_BASIC
index 5558caf92578375c7a09bd9ec0d6b03deeec077d..1ae24d71d3ccf0a345c907ecbb1e4a6e269bf74d 100644 (file)
@@ -28,7 +28,6 @@ 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_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_MASQ_IPV4) += nft_masq_ipv4.o
 obj-$(CONFIG_NFT_DUP_IPV4) += nft_dup_ipv4.o
 
 # flow table support
 obj-$(CONFIG_NFT_DUP_IPV4) += nft_dup_ipv4.o
 
 # flow table support
diff --git a/net/ipv4/netfilter/nft_masq_ipv4.c b/net/ipv4/netfilter/nft_masq_ipv4.c
deleted file mode 100644 (file)
index 6847de1..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2014 Arturo Borrero Gonzalez <arturo@debian.org>
- *
- * 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.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/netlink.h>
-#include <linux/netfilter.h>
-#include <linux/netfilter/nf_tables.h>
-#include <net/netfilter/nf_tables.h>
-#include <net/netfilter/nft_masq.h>
-#include <net/netfilter/ipv4/nf_nat_masquerade.h>
-
-static void nft_masq_ipv4_eval(const struct nft_expr *expr,
-                              struct nft_regs *regs,
-                              const struct nft_pktinfo *pkt)
-{
-       struct nft_masq *priv = nft_expr_priv(expr);
-       struct nf_nat_range2 range;
-
-       memset(&range, 0, sizeof(range));
-       range.flags = priv->flags;
-       if (priv->sreg_proto_min) {
-               range.min_proto.all = (__force __be16)nft_reg_load16(
-                       &regs->data[priv->sreg_proto_min]);
-               range.max_proto.all = (__force __be16)nft_reg_load16(
-                       &regs->data[priv->sreg_proto_max]);
-       }
-       regs->verdict.code = nf_nat_masquerade_ipv4(pkt->skb, nft_hook(pkt),
-                                                   &range, nft_out(pkt));
-}
-
-static void
-nft_masq_ipv4_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr)
-{
-       nf_ct_netns_put(ctx->net, NFPROTO_IPV4);
-}
-
-static struct nft_expr_type nft_masq_ipv4_type;
-static const struct nft_expr_ops nft_masq_ipv4_ops = {
-       .type           = &nft_masq_ipv4_type,
-       .size           = NFT_EXPR_SIZE(sizeof(struct nft_masq)),
-       .eval           = nft_masq_ipv4_eval,
-       .init           = nft_masq_init,
-       .destroy        = nft_masq_ipv4_destroy,
-       .dump           = nft_masq_dump,
-       .validate       = nft_masq_validate,
-};
-
-static struct nft_expr_type nft_masq_ipv4_type __read_mostly = {
-       .family         = NFPROTO_IPV4,
-       .name           = "masq",
-       .ops            = &nft_masq_ipv4_ops,
-       .policy         = nft_masq_policy,
-       .maxattr        = NFTA_MASQ_MAX,
-       .owner          = THIS_MODULE,
-};
-
-static int __init nft_masq_ipv4_module_init(void)
-{
-       int ret;
-
-       ret = nft_register_expr(&nft_masq_ipv4_type);
-       if (ret < 0)
-               return ret;
-
-       ret = nf_nat_masquerade_ipv4_register_notifier();
-       if (ret)
-               nft_unregister_expr(&nft_masq_ipv4_type);
-
-       return ret;
-}
-
-static void __exit nft_masq_ipv4_module_exit(void)
-{
-       nft_unregister_expr(&nft_masq_ipv4_type);
-       nf_nat_masquerade_ipv4_unregister_notifier();
-}
-
-module_init(nft_masq_ipv4_module_init);
-module_exit(nft_masq_ipv4_module_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo@debian.org");
-MODULE_ALIAS_NFT_AF_EXPR(AF_INET, "masq");
index 7e7cc411003aa1474f13789b385b00ef1d4c8040..b95351a5cb83e8266613ffdde17688255ef75b49 100644 (file)
@@ -40,15 +40,6 @@ config NFT_CHAIN_NAT_IPV6
          chain type is used to perform Network Address Translation (NAT)
          packet transformations such as the source, destination address and
          source and destination ports.
          chain type is used to perform Network Address Translation (NAT)
          packet transformations such as the source, destination address and
          source and destination ports.
-
-config NFT_MASQ_IPV6
-       tristate "IPv6 masquerade support for nf_tables"
-       depends on NFT_MASQ
-       select NF_NAT_MASQUERADE
-       help
-         This is the expression that provides IPv4 masquerading support for
-         nf_tables.
-
 endif # NF_NAT
 
 config NFT_REJECT_IPV6
 endif # NF_NAT
 
 config NFT_REJECT_IPV6
index 42a80d03245a62eca5ab47539dd9b768fe7e7274..06c1829f8ffc5877768887d62263d2b92fbbdc8f 100644 (file)
@@ -30,7 +30,6 @@ obj-$(CONFIG_NF_DUP_IPV6) += nf_dup_ipv6.o
 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_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_MASQ_IPV6) += nft_masq_ipv6.o
 obj-$(CONFIG_NFT_DUP_IPV6) += nft_dup_ipv6.o
 obj-$(CONFIG_NFT_FIB_IPV6) += nft_fib_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_masq_ipv6.c b/net/ipv6/netfilter/nft_masq_ipv6.c
deleted file mode 100644 (file)
index e06c82e..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2014 Arturo Borrero Gonzalez <arturo@debian.org>
- *
- * 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.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/netlink.h>
-#include <linux/netfilter.h>
-#include <linux/netfilter/nf_tables.h>
-#include <net/netfilter/nf_tables.h>
-#include <net/netfilter/nf_nat.h>
-#include <net/netfilter/nft_masq.h>
-#include <net/netfilter/ipv6/nf_nat_masquerade.h>
-
-static void nft_masq_ipv6_eval(const struct nft_expr *expr,
-                              struct nft_regs *regs,
-                              const struct nft_pktinfo *pkt)
-{
-       struct nft_masq *priv = nft_expr_priv(expr);
-       struct nf_nat_range2 range;
-
-       memset(&range, 0, sizeof(range));
-       range.flags = priv->flags;
-       if (priv->sreg_proto_min) {
-               range.min_proto.all = (__force __be16)nft_reg_load16(
-                       &regs->data[priv->sreg_proto_min]);
-               range.max_proto.all = (__force __be16)nft_reg_load16(
-                       &regs->data[priv->sreg_proto_max]);
-       }
-       regs->verdict.code = nf_nat_masquerade_ipv6(pkt->skb, &range,
-                                                   nft_out(pkt));
-}
-
-static void
-nft_masq_ipv6_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr)
-{
-       nf_ct_netns_put(ctx->net, NFPROTO_IPV6);
-}
-
-static struct nft_expr_type nft_masq_ipv6_type;
-static const struct nft_expr_ops nft_masq_ipv6_ops = {
-       .type           = &nft_masq_ipv6_type,
-       .size           = NFT_EXPR_SIZE(sizeof(struct nft_masq)),
-       .eval           = nft_masq_ipv6_eval,
-       .init           = nft_masq_init,
-       .destroy        = nft_masq_ipv6_destroy,
-       .dump           = nft_masq_dump,
-       .validate       = nft_masq_validate,
-};
-
-static struct nft_expr_type nft_masq_ipv6_type __read_mostly = {
-       .family         = NFPROTO_IPV6,
-       .name           = "masq",
-       .ops            = &nft_masq_ipv6_ops,
-       .policy         = nft_masq_policy,
-       .maxattr        = NFTA_MASQ_MAX,
-       .owner          = THIS_MODULE,
-};
-
-static int __init nft_masq_ipv6_module_init(void)
-{
-       int ret;
-
-       ret = nft_register_expr(&nft_masq_ipv6_type);
-       if (ret < 0)
-               return ret;
-
-       ret = nf_nat_masquerade_ipv6_register_notifier();
-       if (ret)
-               nft_unregister_expr(&nft_masq_ipv6_type);
-
-       return ret;
-}
-
-static void __exit nft_masq_ipv6_module_exit(void)
-{
-       nft_unregister_expr(&nft_masq_ipv6_type);
-       nf_nat_masquerade_ipv6_unregister_notifier();
-}
-
-module_init(nft_masq_ipv6_module_init);
-module_exit(nft_masq_ipv6_module_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo@debian.org>");
-MODULE_ALIAS_NFT_AF_EXPR(AF_INET6, "masq");
index 73857f9fdb2576d98e8ca9e4ba69cf2ed232c709..537f23a8ed5288cffd1d2d6d053f951956552897 100644 (file)
@@ -532,6 +532,7 @@ config NFT_LIMIT
 config NFT_MASQ
        depends on NF_CONNTRACK
        depends on NF_NAT
 config NFT_MASQ
        depends on NF_CONNTRACK
        depends on NF_NAT
+       select NF_NAT_MASQUERADE
        tristate "Netfilter nf_tables masquerade support"
        help
          This option adds the "masquerade" expression that you can use
        tristate "Netfilter nf_tables masquerade support"
        help
          This option adds the "masquerade" expression that you can use
index 9d8655bc1bea6cde7c029477b4a974499dba4d82..bee156eaa4008202c9fc4ebc1548e98dbd881d43 100644 (file)
 #include <linux/netfilter/nf_tables.h>
 #include <net/netfilter/nf_tables.h>
 #include <net/netfilter/nf_nat.h>
 #include <linux/netfilter/nf_tables.h>
 #include <net/netfilter/nf_tables.h>
 #include <net/netfilter/nf_nat.h>
-#include <net/netfilter/nft_masq.h>
+#include <net/netfilter/ipv4/nf_nat_masquerade.h>
+#include <net/netfilter/ipv6/nf_nat_masquerade.h>
 
 
-const struct nla_policy nft_masq_policy[NFTA_MASQ_MAX + 1] = {
+struct nft_masq {
+       u32                     flags;
+       enum nft_registers      sreg_proto_min:8;
+       enum nft_registers      sreg_proto_max:8;
+};
+
+static const struct nla_policy nft_masq_policy[NFTA_MASQ_MAX + 1] = {
        [NFTA_MASQ_FLAGS]               = { .type = NLA_U32 },
        [NFTA_MASQ_REG_PROTO_MIN]       = { .type = NLA_U32 },
        [NFTA_MASQ_REG_PROTO_MAX]       = { .type = NLA_U32 },
 };
        [NFTA_MASQ_FLAGS]               = { .type = NLA_U32 },
        [NFTA_MASQ_REG_PROTO_MIN]       = { .type = NLA_U32 },
        [NFTA_MASQ_REG_PROTO_MAX]       = { .type = NLA_U32 },
 };
-EXPORT_SYMBOL_GPL(nft_masq_policy);
 
 
-int nft_masq_validate(const struct nft_ctx *ctx,
-                     const struct nft_expr *expr,
-                     const struct nft_data **data)
+static int nft_masq_validate(const struct nft_ctx *ctx,
+                            const struct nft_expr *expr,
+                            const struct nft_data **data)
 {
        int err;
 
 {
        int err;
 
@@ -36,11 +42,10 @@ int nft_masq_validate(const struct nft_ctx *ctx,
        return nft_chain_validate_hooks(ctx->chain,
                                        (1 << NF_INET_POST_ROUTING));
 }
        return nft_chain_validate_hooks(ctx->chain,
                                        (1 << NF_INET_POST_ROUTING));
 }
-EXPORT_SYMBOL_GPL(nft_masq_validate);
 
 
-int nft_masq_init(const struct nft_ctx *ctx,
-                 const struct nft_expr *expr,
-                 const struct nlattr * const tb[])
+static int nft_masq_init(const struct nft_ctx *ctx,
+                        const struct nft_expr *expr,
+                        const struct nlattr * const tb[])
 {
        u32 plen = FIELD_SIZEOF(struct nf_nat_range, min_addr.all);
        struct nft_masq *priv = nft_expr_priv(expr);
 {
        u32 plen = FIELD_SIZEOF(struct nf_nat_range, min_addr.all);
        struct nft_masq *priv = nft_expr_priv(expr);
@@ -75,9 +80,8 @@ int nft_masq_init(const struct nft_ctx *ctx,
 
        return nf_ct_netns_get(ctx->net, ctx->family);
 }
 
        return nf_ct_netns_get(ctx->net, ctx->family);
 }
-EXPORT_SYMBOL_GPL(nft_masq_init);
 
 
-int nft_masq_dump(struct sk_buff *skb, const struct nft_expr *expr)
+static int nft_masq_dump(struct sk_buff *skb, const struct nft_expr *expr)
 {
        const struct nft_masq *priv = nft_expr_priv(expr);
 
 {
        const struct nft_masq *priv = nft_expr_priv(expr);
 
@@ -98,7 +102,157 @@ int nft_masq_dump(struct sk_buff *skb, const struct nft_expr *expr)
 nla_put_failure:
        return -1;
 }
 nla_put_failure:
        return -1;
 }
-EXPORT_SYMBOL_GPL(nft_masq_dump);
+
+static void nft_masq_ipv4_eval(const struct nft_expr *expr,
+                              struct nft_regs *regs,
+                              const struct nft_pktinfo *pkt)
+{
+       struct nft_masq *priv = nft_expr_priv(expr);
+       struct nf_nat_range2 range;
+
+       memset(&range, 0, sizeof(range));
+       range.flags = priv->flags;
+       if (priv->sreg_proto_min) {
+               range.min_proto.all = (__force __be16)nft_reg_load16(
+                       &regs->data[priv->sreg_proto_min]);
+               range.max_proto.all = (__force __be16)nft_reg_load16(
+                       &regs->data[priv->sreg_proto_max]);
+       }
+       regs->verdict.code = nf_nat_masquerade_ipv4(pkt->skb, nft_hook(pkt),
+                                                   &range, nft_out(pkt));
+}
+
+static void
+nft_masq_ipv4_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr)
+{
+       nf_ct_netns_put(ctx->net, NFPROTO_IPV4);
+}
+
+static struct nft_expr_type nft_masq_ipv4_type;
+static const struct nft_expr_ops nft_masq_ipv4_ops = {
+       .type           = &nft_masq_ipv4_type,
+       .size           = NFT_EXPR_SIZE(sizeof(struct nft_masq)),
+       .eval           = nft_masq_ipv4_eval,
+       .init           = nft_masq_init,
+       .destroy        = nft_masq_ipv4_destroy,
+       .dump           = nft_masq_dump,
+       .validate       = nft_masq_validate,
+};
+
+static struct nft_expr_type nft_masq_ipv4_type __read_mostly = {
+       .family         = NFPROTO_IPV4,
+       .name           = "masq",
+       .ops            = &nft_masq_ipv4_ops,
+       .policy         = nft_masq_policy,
+       .maxattr        = NFTA_MASQ_MAX,
+       .owner          = THIS_MODULE,
+};
+
+#ifdef CONFIG_NF_TABLES_IPV6
+static void nft_masq_ipv6_eval(const struct nft_expr *expr,
+                              struct nft_regs *regs,
+                              const struct nft_pktinfo *pkt)
+{
+       struct nft_masq *priv = nft_expr_priv(expr);
+       struct nf_nat_range2 range;
+
+       memset(&range, 0, sizeof(range));
+       range.flags = priv->flags;
+       if (priv->sreg_proto_min) {
+               range.min_proto.all = (__force __be16)nft_reg_load16(
+                       &regs->data[priv->sreg_proto_min]);
+               range.max_proto.all = (__force __be16)nft_reg_load16(
+                       &regs->data[priv->sreg_proto_max]);
+       }
+       regs->verdict.code = nf_nat_masquerade_ipv6(pkt->skb, &range,
+                                                   nft_out(pkt));
+}
+
+static void
+nft_masq_ipv6_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr)
+{
+       nf_ct_netns_put(ctx->net, NFPROTO_IPV6);
+}
+
+static struct nft_expr_type nft_masq_ipv6_type;
+static const struct nft_expr_ops nft_masq_ipv6_ops = {
+       .type           = &nft_masq_ipv6_type,
+       .size           = NFT_EXPR_SIZE(sizeof(struct nft_masq)),
+       .eval           = nft_masq_ipv6_eval,
+       .init           = nft_masq_init,
+       .destroy        = nft_masq_ipv6_destroy,
+       .dump           = nft_masq_dump,
+       .validate       = nft_masq_validate,
+};
+
+static struct nft_expr_type nft_masq_ipv6_type __read_mostly = {
+       .family         = NFPROTO_IPV6,
+       .name           = "masq",
+       .ops            = &nft_masq_ipv6_ops,
+       .policy         = nft_masq_policy,
+       .maxattr        = NFTA_MASQ_MAX,
+       .owner          = THIS_MODULE,
+};
+
+static int __init nft_masq_module_init_ipv6(void)
+{
+       int ret = nft_register_expr(&nft_masq_ipv6_type);
+
+       if (ret)
+               return ret;
+
+       ret = nf_nat_masquerade_ipv6_register_notifier();
+       if (ret < 0)
+               nft_unregister_expr(&nft_masq_ipv6_type);
+
+       return ret;
+}
+
+static void nft_masq_module_exit_ipv6(void)
+{
+       nft_unregister_expr(&nft_masq_ipv6_type);
+       nf_nat_masquerade_ipv6_unregister_notifier();
+}
+#else
+static inline int nft_masq_module_init_ipv6(void) { return 0; }
+static inline void nft_masq_module_exit_ipv6(void) {}
+#endif
+
+static int __init nft_masq_module_init(void)
+{
+       int ret;
+
+       ret = nft_masq_module_init_ipv6();
+       if (ret < 0)
+               return ret;
+
+       ret = nft_register_expr(&nft_masq_ipv4_type);
+       if (ret < 0) {
+               nft_masq_module_exit_ipv6();
+               return ret;
+       }
+
+       ret = nf_nat_masquerade_ipv4_register_notifier();
+       if (ret < 0) {
+               nft_masq_module_exit_ipv6();
+               nft_unregister_expr(&nft_masq_ipv4_type);
+               return ret;
+       }
+
+       return ret;
+}
+
+static void __exit nft_masq_module_exit(void)
+{
+       nft_masq_module_exit_ipv6();
+       nft_unregister_expr(&nft_masq_ipv4_type);
+       nf_nat_masquerade_ipv4_unregister_notifier();
+}
+
+module_init(nft_masq_module_init);
+module_exit(nft_masq_module_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo@debian.org>");
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo@debian.org>");
+MODULE_ALIAS_NFT_AF_EXPR(AF_INET6, "masq");
+MODULE_ALIAS_NFT_AF_EXPR(AF_INET, "masq");