Skip to content

Commit

Permalink
net/sched: act_ct: handle DNAT tuple collision
Browse files Browse the repository at this point in the history
[ Upstream commit 13c62f5 ]

This this the counterpart of 8aa7b52 ("openvswitch: handle DNAT
tuple collision") for act_ct. From that commit changelog:

"""
With multiple DNAT rules it's possible that after destination
translation the resulting tuples collide.

...

Netfilter handles this case by allocating a null binding for SNAT at
egress by default.  Perform the same operation in openvswitch for DNAT
if no explicit SNAT is requested by the user and allocate a null binding
for SNAT for packets in the "original" direction.
"""

Fixes: 95219af ("act_ct: support asymmetric conntrack")
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
marceloleitner authored and gregkh committed Jun 23, 2021
1 parent 69a54b4 commit 7c7dd4e
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions net/sched/act_ct.c
Expand Up @@ -904,14 +904,19 @@ static int tcf_ct_act_nat(struct sk_buff *skb,
}

err = ct_nat_execute(skb, ct, ctinfo, range, maniptype);
if (err == NF_ACCEPT &&
ct->status & IPS_SRC_NAT && ct->status & IPS_DST_NAT) {
if (maniptype == NF_NAT_MANIP_SRC)
maniptype = NF_NAT_MANIP_DST;
else
maniptype = NF_NAT_MANIP_SRC;

err = ct_nat_execute(skb, ct, ctinfo, range, maniptype);
if (err == NF_ACCEPT && ct->status & IPS_DST_NAT) {
if (ct->status & IPS_SRC_NAT) {
if (maniptype == NF_NAT_MANIP_SRC)
maniptype = NF_NAT_MANIP_DST;
else
maniptype = NF_NAT_MANIP_SRC;

err = ct_nat_execute(skb, ct, ctinfo, range,
maniptype);
} else if (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL) {
err = ct_nat_execute(skb, ct, ctinfo, NULL,
NF_NAT_MANIP_SRC);
}
}
return err;
#else
Expand Down

0 comments on commit 7c7dd4e

Please sign in to comment.