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

Reply via email to