IPv4 over IPv6 GRE currently fails on E810 with skb_warn_bad_offload, while IPv6 over IPv6 GRE falls back to software segmentation. This happens because the kernel's GSO engine requires the generic HW_CSUM flag to trust the hardware with complex encapsulation offloads.
Add NETIF_F_HW_CSUM to the device's csumo_features to satisfy the network stack and unlock full hardware segmentation for GRE tunnels. To prevent checksum corruption on standard traffic, evaluate the packet in ice_features_check() and dynamically clear the NETIF_F_HW_CSUM bit if it is not a GSO frame. This forces the driver to fall back to safe, protocol-specific checksum features for non-GSO packets while preserving the generic offload for tunnels. Signed-off-by: Jakub Ramaseuski <[email protected]> --- drivers/net/ethernet/intel/ice/ice_main.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index e7308e381e2f..9b4ad03e1a32 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -3565,6 +3565,7 @@ void ice_set_netdev_features(struct net_device *netdev) csumo_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM | + NETIF_F_HW_CSUM | NETIF_F_SCTP_CRC | NETIF_F_IPV6_CSUM; @@ -9789,6 +9790,14 @@ ice_features_check(struct sk_buff *skb, if (skb->ip_summed != CHECKSUM_PARTIAL) return features; + /* Hardware requires strictly-typed Tx descriptors for non-GSO frames. + * Leaving generic NETIF_F_HW_CSUM enabled corrupts checksums, + * causing TCP drops. We strip it here to force safe, + * protocol-specific IPv4/IPv6 offloads instead. + */ + if (!gso) + features &= ~NETIF_F_HW_CSUM; + /* We cannot support GSO if the MSS is going to be less than * 64 bytes. If it is then we need to drop support for GSO. */ -- 2.52.0
