]> www.infradead.org Git - nvme.git/commitdiff
net/mlx5e: Fix UDP GSO for encapsulated packets
authorGal Pressman <gal@nvidia.com>
Wed, 22 May 2024 19:26:59 +0000 (22:26 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 May 2024 12:27:08 +0000 (13:27 +0100)
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: 689adf0d4892 ("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>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c

index caa34b9c161e5188a9ac1607a01e8c390d95d568..33e32584b07f57e631a5ee801caacb0b4298af1d 100644 (file)
@@ -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 {
index 099bf10788899018ab0fa0236c0cbeff39a43941..b09e9abd39f37ffa309bd71fb018c6fadaaf48dd 100644 (file)
@@ -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 {