mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 11:33:28 +02:00
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:
parent
2b73e75438
commit
a62f7d62d2
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user