diff mbox series

ip_tunnel: Use mark in skb by default

Message ID 20180123034624.24037-1-Thomas.Winter@alliedtelesis.co.nz
State Accepted, archived
Delegated to: David Miller
Headers show
Series ip_tunnel: Use mark in skb by default | expand

Commit Message

Thomas Winter Jan. 23, 2018, 3:46 a.m. UTC
This allows marks set by connmark in iptables
to be used for route lookups.

Signed-off-by: Thomas Winter <thomas.winter@alliedtelesis.co.nz>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
---
 net/ipv4/ip_tunnel.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

Comments

David Miller Jan. 24, 2018, 9:31 p.m. UTC | #1
From: Thomas Winter <Thomas.Winter@alliedtelesis.co.nz>
Date: Tue, 23 Jan 2018 16:46:24 +1300

> This allows marks set by connmark in iptables
> to be used for route lookups.
> 
> Signed-off-by: Thomas Winter <thomas.winter@alliedtelesis.co.nz>

Applied to net-next, thanks.
Thomas Winter Feb. 14, 2018, 9:26 p.m. UTC | #2
Hello David Miller,

Would this patch be able to be reverted? We have found in further testing that this produces undesired results.

For example, using some PBR rule that uses conntrack to set the skb->mark and the desired nexthop is a tunnel then the tunnel route selection hits a routing loop as the skb->mark is the mark of the encapsulated traffic and route selected by init_tunnel_flow is via tunnel itself.

Regards,
Thomas Winter
diff mbox series

Patch

diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index 5ddb1cb52bd4..141f5e865731 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -711,9 +711,16 @@  void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
 		}
 	}
 
-	init_tunnel_flow(&fl4, protocol, dst, tnl_params->saddr,
-			 tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
-			 tunnel->fwmark);
+	if (tunnel->fwmark) {
+		init_tunnel_flow(&fl4, protocol, dst, tnl_params->saddr,
+				 tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
+				 tunnel->fwmark);
+	}
+	else {
+		init_tunnel_flow(&fl4, protocol, dst, tnl_params->saddr,
+				 tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
+				 skb->mark);
+	}
 
 	if (ip_tunnel_encap(skb, tunnel, &protocol, &fl4) < 0)
 		goto tx_error;