net/mlx5e: don't assume psp tx skbs are ipv6 csum handling

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: e5a1861a29 ("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>
This commit is contained in:
Daniel Zahka 2026-01-26 11:38:17 -08:00 committed by Jakub Kicinski
parent 2b73e75438
commit a62f7d62d2

View 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;