]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5e: don't assume psp tx skbs are ipv6 csum handling
authorDaniel Zahka <daniel.zahka@gmail.com>
Mon, 26 Jan 2026 19:38:17 +0000 (11:38 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 29 Jan 2026 04:07:40 +0000 (20:07 -0800)
mlx5e_psp_handle_tx_skb() assumes skbs are ipv6 when doing a partial
TCP checksum with tso. Make correctly mlx5e_psp_handle_tx_skb() handle
ipv4 packets.

Fixes: e5a1861a298e ("net/mlx5e: Implement PSP Tx data path")
Signed-off-by: Daniel Zahka <daniel.zahka@gmail.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com>
Link: https://patch.msgid.link/20260126-dzahka-fix-tx-csum-partial-v2-1-0a905590ea5f@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp_rxtx.c

index c17ea0fcd8efe40f63decc205e65f5c6789132a8..ef7f5338540fdf3c0d94b545fd518e07bf92336b 100644 (file)
@@ -177,8 +177,6 @@ bool mlx5e_psp_handle_tx_skb(struct net_device *netdev,
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
        struct net *net = sock_net(skb->sk);
-       const struct ipv6hdr *ip6;
-       struct tcphdr *th;
 
        if (!mlx5e_psp_set_state(priv, skb, psp_st))
                return true;
@@ -190,11 +188,18 @@ bool mlx5e_psp_handle_tx_skb(struct net_device *netdev,
                return false;
        }
        if (skb_is_gso(skb)) {
-               ip6 = ipv6_hdr(skb);
-               th = inner_tcp_hdr(skb);
+               int len = skb_shinfo(skb)->gso_size + inner_tcp_hdrlen(skb);
+               struct tcphdr *th = inner_tcp_hdr(skb);
 
-               th->check = ~tcp_v6_check(skb_shinfo(skb)->gso_size + inner_tcp_hdrlen(skb), &ip6->saddr,
-                                         &ip6->daddr, 0);
+               if (skb->protocol == htons(ETH_P_IP)) {
+                       const struct iphdr *ip = ip_hdr(skb);
+
+                       th->check = ~tcp_v4_check(len, ip->saddr, ip->daddr, 0);
+               } else {
+                       const struct ipv6hdr *ip6 = ipv6_hdr(skb);
+
+                       th->check = ~tcp_v6_check(len, &ip6->saddr, &ip6->daddr, 0);
+               }
        }
 
        return true;