Patch "xfrm: fix xfrm child route lookup for packet offload" has been added to the 6.6-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

    xfrm: fix xfrm child route lookup for packet offload

to the 6.6-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:
     xfrm-fix-xfrm-child-route-lookup-for-packet-offload.patch
and it can be found in the queue-6.6 subdirectory.

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



commit 243e98ede3c6a3e7efe128876e0201e39271bea1
Author: Mike Yu <yumike@xxxxxxxxxx>
Date:   Mon Mar 4 12:24:08 2024 +0000

    xfrm: fix xfrm child route lookup for packet offload
    
    [ Upstream commit d4872d70fc6feabfc8e897edad993a81096ade9f ]
    
    In current code, xfrm_bundle_create() always uses the matched
    SA's family type to look up a xfrm child route for the skb.
    The route returned by xfrm_dst_lookup() will eventually be
    used in xfrm_output_resume() (skb_dst(skb)->ops->local_out()).
    
    If packet offload is used, the above behavior can lead to
    calling ip_local_out() for an IPv6 packet or calling
    ip6_local_out() for an IPv4 packet, which is likely to fail.
    
    This change fixes the behavior by checking if the matched SA
    has packet offload enabled. If not, keep the same behavior;
    if yes, use the matched SP's family type for the lookup.
    
    Test: verified IPv6-in-IPv4 packets on Android device with
          IPsec packet offload enabled
    Signed-off-by: Mike Yu <yumike@xxxxxxxxxx>
    Signed-off-by: Steffen Klassert <steffen.klassert@xxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index d24b4d4f620ea..97d69ec54ff9c 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -2679,7 +2679,9 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
 			if (xfrm[i]->props.smark.v || xfrm[i]->props.smark.m)
 				mark = xfrm_smark_get(fl->flowi_mark, xfrm[i]);
 
-			family = xfrm[i]->props.family;
+			if (xfrm[i]->xso.type != XFRM_DEV_OFFLOAD_PACKET)
+				family = xfrm[i]->props.family;
+
 			oif = fl->flowi_oif ? : fl->flowi_l3mdev;
 			dst = xfrm_dst_lookup(xfrm[i], tos, oif,
 					      &saddr, &daddr, family, mark);




[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