Commit 83fea49f authored by Gal Pressman's avatar Gal Pressman Committed by David S. Miller
Browse files

net/mlx5e: Fix UDP GSO for encapsulated packets



When the skb is encapsulated, adjust the inner UDP header instead of the
outer one, and account for UDP header (instead of TCP) in the inline
header size calculation.

Fixes: 689adf0d ("net/mlx5e: Add UDP GSO support")
Reported-by: default avatarJason Baron <jbaron@akamai.com>
Closes: https://lore.kernel.org/netdev/c42961cb-50b9-4a9a-bd43-87fe48d88d29@akamai.com/


Signed-off-by: default avatarGal Pressman <gal@nvidia.com>
Reviewed-by: default avatarDragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: default avatarBoris Pismenny <borisp@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5c74195d
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -102,8 +102,14 @@ static inline void
mlx5e_udp_gso_handle_tx_skb(struct sk_buff *skb)
{
	int payload_len = skb_shinfo(skb)->gso_size + sizeof(struct udphdr);
	struct udphdr *udphdr;

	udp_hdr(skb)->len = htons(payload_len);
	if (skb->encapsulation)
		udphdr = (struct udphdr *)skb_inner_transport_header(skb);
	else
		udphdr = udp_hdr(skb);

	udphdr->len = htons(payload_len);
}

struct mlx5e_accel_tx_state {
+5 −1
Original line number Diff line number Diff line
@@ -153,6 +153,10 @@ mlx5e_tx_get_gso_ihs(struct mlx5e_txqsq *sq, struct sk_buff *skb, int *hopbyhop)

	*hopbyhop = 0;
	if (skb->encapsulation) {
		if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)
			ihs = skb_inner_transport_offset(skb) +
			      sizeof(struct udphdr);
		else
			ihs = skb_inner_tcp_all_headers(skb);
		stats->tso_inner_packets++;
		stats->tso_inner_bytes += skb->len - ihs;