Patch "vxlan: do not modify the shared tunnel info when PMTU triggers an ICMP reply" has been added to the 5.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    vxlan: do not modify the shared tunnel info when PMTU triggers an ICMP reply

to the 5.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     vxlan-do-not-modify-the-shared-tunnel-info-when-pmtu.patch
and it can be found in the queue-5.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f90c5aafbcc6145350160c1ed5ba7f83339660cf
Author: Antoine Tenart <atenart@xxxxxxxxxx>
Date:   Thu Mar 25 16:35:32 2021 +0100

    vxlan: do not modify the shared tunnel info when PMTU triggers an ICMP reply
    
    [ Upstream commit 30a93d2b7d5a7cbb53ac19c9364a256d1aa6c08a ]
    
    When the interface is part of a bridge or an Open vSwitch port and a
    packet exceed a PMTU estimate, an ICMP reply is sent to the sender. When
    using the external mode (collect metadata) the source and destination
    addresses are reversed, so that Open vSwitch can match the packet
    against an existing (reverse) flow.
    
    But inverting the source and destination addresses in the shared
    ip_tunnel_info will make following packets of the flow to use a wrong
    destination address (packets will be tunnelled to itself), if the flow
    isn't updated. Which happens with Open vSwitch, until the flow times
    out.
    
    Fixes this by uncloning the skb's ip_tunnel_info before inverting its
    source and destination addresses, so that the modification will only be
    made for the PTMU packet, not the following ones.
    
    Fixes: fc68c99577cc ("vxlan: Support for PMTU discovery on directly bridged links")
    Tested-by: Eelco Chaudron <echaudro@xxxxxxxxxx>
    Reviewed-by: Eelco Chaudron <echaudro@xxxxxxxxxx>
    Signed-off-by: Antoine Tenart <atenart@xxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 0842371eca3d..4adfa6a01198 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -2725,12 +2725,17 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
 			goto tx_error;
 		} else if (err) {
 			if (info) {
+				struct ip_tunnel_info *unclone;
 				struct in_addr src, dst;
 
+				unclone = skb_tunnel_info_unclone(skb);
+				if (unlikely(!unclone))
+					goto tx_error;
+
 				src = remote_ip.sin.sin_addr;
 				dst = local_ip.sin.sin_addr;
-				info->key.u.ipv4.src = src.s_addr;
-				info->key.u.ipv4.dst = dst.s_addr;
+				unclone->key.u.ipv4.src = src.s_addr;
+				unclone->key.u.ipv4.dst = dst.s_addr;
 			}
 			vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);
 			dst_release(ndst);
@@ -2781,12 +2786,17 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
 			goto tx_error;
 		} else if (err) {
 			if (info) {
+				struct ip_tunnel_info *unclone;
 				struct in6_addr src, dst;
 
+				unclone = skb_tunnel_info_unclone(skb);
+				if (unlikely(!unclone))
+					goto tx_error;
+
 				src = remote_ip.sin6.sin6_addr;
 				dst = local_ip.sin6.sin6_addr;
-				info->key.u.ipv6.src = src;
-				info->key.u.ipv6.dst = dst;
+				unclone->key.u.ipv6.src = src;
+				unclone->key.u.ipv6.dst = dst;
 			}
 
 			vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux