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>
                                                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,
 
                                                struct sk_buff *skb,
                                                netdev_features_t features)
 {
-       return skb_eth_gso_segment(skb, features, htons(ETH_P_IPV6));
+       __be16 type = x->inner_mode.family == AF_INET ? htons(ETH_P_IP)
+                                                     : htons(ETH_P_IPV6);
+
+       return skb_eth_gso_segment(skb, features, type);
 }
 
 static struct sk_buff *xfrm6_transport_gso_segment(struct xfrm_state *x,