Dear Jakub,

Thank you for your patch.

Am 10.03.26 um 12:55 schrieb Jakub Ramaseuski:
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.

Do you have a test case, you could document in the commit message?

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  |

Should this be sorted?

                         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.
         */

The diff looks good.

Reviewed-by: Paul Menzel <[email protected]>


Kind regards,

Paul

Reply via email to