net/mlx5e: Fix UDP GSO for encapsulated packets
[ Upstream commit 83fea49f2711fc90c0d115b0ed04046b45155b65 ]
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: 689adf0d48
("net/mlx5e: Add UDP GSO support")
Reported-by: Jason Baron <jbaron@akamai.com>
Closes: https://lore.kernel.org/netdev/c42961cb-50b9-4a9a-bd43-87fe48d88d29@akamai.com/
Signed-off-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Boris Pismenny <borisp@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
33933f006d
commit
de1a0a2d9d
|
@ -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 {
|
||||
|
|
|
@ -153,7 +153,11 @@ mlx5e_tx_get_gso_ihs(struct mlx5e_txqsq *sq, struct sk_buff *skb, int *hopbyhop)
|
|||
|
||||
*hopbyhop = 0;
|
||||
if (skb->encapsulation) {
|
||||
ihs = skb_inner_tcp_all_headers(skb);
|
||||
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;
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue