Commit a62f7d62 authored by Daniel Zahka's avatar Daniel Zahka Committed by Jakub Kicinski
Browse files

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: e5a1861a ("net/mlx5e: Implement PSP Tx data path")
Signed-off-by: default avatarDaniel Zahka <daniel.zahka@gmail.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarCosmin Ratiu <cratiu@nvidia.com>
Link: https://patch.msgid.link/20260126-dzahka-fix-tx-csum-partial-v2-1-0a905590ea5f@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 2b73e754
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -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;