summary refs log tree commit diff
path: root/net/ipv4/esp4_offload.c
diff options
context:
space:
mode:
authorSabrina Dubroca <sd@queasysnail.net>2022-08-25 17:16:51 +0200
committerSteffen Klassert <steffen.klassert@secunet.com>2022-08-29 10:20:58 +0200
commit26dbd66eab8080be51759e48280da04015221e22 (patch)
treeec8ba8141c89f1966ae1eb5f8821fcf567fa2ba0 /net/ipv4/esp4_offload.c
parentebe5555c2f34505cdb1ae5c3de8b24e33740b3e0 (diff)
downloadlinux-26dbd66eab8080be51759e48280da04015221e22.tar.gz
esp: choose the correct inner protocol for GSO on inter address family tunnels
Commit 23c7f8d7989e ("net: Fix esp GSO on inter address family
tunnels.") is incomplete. It passes to skb_eth_gso_segment the
protocol for the outer IP version, instead of the inner IP version, so
we end up calling inet_gso_segment on an inner IPv6 packet and
ipv6_gso_segment on an inner IPv4 packet and the packets are dropped.

This patch completes the fix by selecting the correct protocol based
on the inner mode's family.

Fixes: c35fe4106b92 ("xfrm: Add mode handlers for IPsec on layer 2")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Diffstat (limited to 'net/ipv4/esp4_offload.c')
-rw-r--r--net/ipv4/esp4_offload.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/net/ipv4/esp4_offload.c b/net/ipv4/esp4_offload.c
index 935026f4c807..170152772d33 100644
--- a/net/ipv4/esp4_offload.c
+++ b/net/ipv4/esp4_offload.c
@@ -110,7 +110,10 @@ static struct sk_buff *xfrm4_tunnel_gso_segment(struct xfrm_state *x,
 						struct sk_buff *skb,
 						netdev_features_t features)
 {
-	return skb_eth_gso_segment(skb, features, htons(ETH_P_IP));
+	__be16 type = x->inner_mode.family == AF_INET6 ? htons(ETH_P_IPV6)
+						       : htons(ETH_P_IP);
+
+	return skb_eth_gso_segment(skb, features, type);
 }
 
 static struct sk_buff *xfrm4_transport_gso_segment(struct xfrm_state *x,