From: Kirill Tkhai <ktk...@virtuozzo.com>

Allow conntracks to be allocated in case of these
rules are inserted.

https://jira.sw.ru/browse/PSBM-51050

Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
Reviewed-by: Andrei Vagin <ava...@virtuozzo.com>

vz8 rebase notes:
=================
(cherry picked from vz7 commit 60931ce1ffcf ("net: Mark conntrack users
in nftables"))

Modules which require conntrack call:
nf_ct_netns_get(struct net *net, u8 nfproto) in struct xt_entry
.checkentry callback.

$ grep -Inr 'nf_ct_netns_get' net/netfilter net/ipv4/netfilter 
net/ipv6/netfilter
is useful to find all modules

Added:
net/netfilter/nft_connlimit.c
net/netfilter/nft_masq.c
net/netfilter/nft_redir.c

VZ 8 rebase part https://jira.sw.ru/browse/PSBM-127783

Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalit...@virtuozzo.com>

Ported vz8 commit a334320a31e2 ("net: Mark conntrack users in nftables").
Repeated the above procedure to ensure coverage.
Added:
  net/netfilter/nft_flow_offload.c
  net/netfilter/nft_synproxy.c

Signed-off-by: Nikita Yushchenko <nikita.yushche...@virtuozzo.com>
---
 net/netfilter/nft_connlimit.c    | 7 ++++++-
 net/netfilter/nft_ct.c           | 2 ++
 net/netfilter/nft_flow_offload.c | 6 +++++-
 net/netfilter/nft_masq.c         | 6 +++++-
 net/netfilter/nft_nat.c          | 6 +++++-
 net/netfilter/nft_redir.c        | 6 +++++-
 net/netfilter/nft_synproxy.c     | 1 +
 7 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/net/netfilter/nft_connlimit.c b/net/netfilter/nft_connlimit.c
index 7d0761fad37e..fba41b4927ca 100644
--- a/net/netfilter/nft_connlimit.c
+++ b/net/netfilter/nft_connlimit.c
@@ -62,6 +62,7 @@ static int nft_connlimit_do_init(const struct nft_ctx *ctx,
 {
        bool invert = false;
        u32 flags, limit;
+       int err;
 
        if (!tb[NFTA_CONNLIMIT_COUNT])
                return -EINVAL;
@@ -80,7 +81,11 @@ static int nft_connlimit_do_init(const struct nft_ctx *ctx,
        priv->limit     = limit;
        priv->invert    = invert;
 
-       return nf_ct_netns_get(ctx->net, ctx->family);
+       err = nf_ct_netns_get(ctx->net, ctx->family);
+       if (err == 0)
+               allow_conntrack_allocation(ctx->net);
+
+       return err;
 }
 
 static void nft_connlimit_do_destroy(const struct nft_ctx *ctx,
diff --git a/net/netfilter/nft_ct.c b/net/netfilter/nft_ct.c
index 337e22d8b40b..7fac1b0bfcf5 100644
--- a/net/netfilter/nft_ct.c
+++ b/net/netfilter/nft_ct.c
@@ -512,6 +512,8 @@ static int nft_ct_get_init(const struct nft_ctx *ctx,
            priv->key == NFT_CT_AVGPKT)
                nf_ct_set_acct(ctx->net, true);
 
+       allow_conntrack_allocation(ctx->net);
+
        return 0;
 }
 
diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c
index 0af34ad41479..11a70415e23d 100644
--- a/net/netfilter/nft_flow_offload.c
+++ b/net/netfilter/nft_flow_offload.c
@@ -366,6 +366,7 @@ static int nft_flow_offload_init(const struct nft_ctx *ctx,
        struct nft_flow_offload *priv = nft_expr_priv(expr);
        u8 genmask = nft_genmask_next(ctx->net);
        struct nft_flowtable *flowtable;
+       int ret;
 
        if (!tb[NFTA_FLOW_TABLE_NAME])
                return -EINVAL;
@@ -378,7 +379,10 @@ static int nft_flow_offload_init(const struct nft_ctx *ctx,
        priv->flowtable = flowtable;
        flowtable->use++;
 
-       return nf_ct_netns_get(ctx->net, ctx->family);
+       ret = nf_ct_netns_get(ctx->net, ctx->family);
+       if (ret == 0)
+               allow_conntrack_allocation(ctx->net);
+       return ret;
 }
 
 static void nft_flow_offload_deactivate(const struct nft_ctx *ctx,
diff --git a/net/netfilter/nft_masq.c b/net/netfilter/nft_masq.c
index 9953e8053753..93c97d2e1b4d 100644
--- a/net/netfilter/nft_masq.c
+++ b/net/netfilter/nft_masq.c
@@ -70,7 +70,11 @@ static int nft_masq_init(const struct nft_ctx *ctx,
                }
        }
 
-       return nf_ct_netns_get(ctx->net, ctx->family);
+       err = nf_ct_netns_get(ctx->net, ctx->family);
+       if (err == 0)
+               allow_conntrack_allocation(ctx->net);
+
+       return err;
 }
 
 static int nft_masq_dump(struct sk_buff *skb, const struct nft_expr *expr)
diff --git a/net/netfilter/nft_nat.c b/net/netfilter/nft_nat.c
index be1595d6979d..1681f331673b 100644
--- a/net/netfilter/nft_nat.c
+++ b/net/netfilter/nft_nat.c
@@ -252,7 +252,11 @@ static int nft_nat_init(const struct nft_ctx *ctx, const 
struct nft_expr *expr,
                        return -EOPNOTSUPP;
        }
 
-       return nf_ct_netns_get(ctx->net, family);
+       err = nf_ct_netns_get(ctx->net, family);
+       if (err == 0)
+               allow_conntrack_allocation(ctx->net);
+
+       return err;
 }
 
 static int nft_nat_dump(struct sk_buff *skb, const struct nft_expr *expr)
diff --git a/net/netfilter/nft_redir.c b/net/netfilter/nft_redir.c
index ba09890dddb5..16bf92fcf211 100644
--- a/net/netfilter/nft_redir.c
+++ b/net/netfilter/nft_redir.c
@@ -72,7 +72,11 @@ static int nft_redir_init(const struct nft_ctx *ctx,
                        return -EINVAL;
        }
 
-       return nf_ct_netns_get(ctx->net, ctx->family);
+       err = nf_ct_netns_get(ctx->net, ctx->family);
+       if (err == 0)
+               allow_conntrack_allocation(ctx->net);
+
+       return err;
 }
 
 static int nft_redir_dump(struct sk_buff *skb, const struct nft_expr *expr)
diff --git a/net/netfilter/nft_synproxy.c b/net/netfilter/nft_synproxy.c
index a0109fa1e92d..96e2b0aaf59f 100644
--- a/net/netfilter/nft_synproxy.c
+++ b/net/netfilter/nft_synproxy.c
@@ -196,6 +196,7 @@ static int nft_synproxy_do_init(const struct nft_ctx *ctx,
                break;
        }
 
+       allow_conntrack_allocation(ctx->net);
        return 0;
 
 nf_ct_failure:
-- 
2.30.2

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to