On Sat, 9 May 2026 14:47:53 +0800
Xingui Yang <[email protected]> wrote:

> In HIP09 simple BD mode, the driver incorrectly calculates L4_START
> position for tunnel packets. The current implementation only uses
> l2_len + l3_len without considering outer header lengths (outer_l2_len
> and outer_l3_len), causing hardware to calculate checksum from wrong
> offset.
> 
> For a typical NvGRE tunnel packet with structure:
>   Outer Eth(14) + Outer IPv6(40) + NvGRE(8) + Inner Eth(14) +
>   Inner IPv6(40) + TCP(20)
> 
> Expected L4_START: 116 bytes (from packet start to inner TCP header)
> Actual calculation: 62 bytes (missing outer headers)
> 
> This results in incorrect TCP/UDP checksum for all tunnel packets when
> using simple BD mode, including NvGRE, VxLAN, GRE, GENEVE tunnels.
> 
> Fix by adding outer_l2_len and outer_l3_len to L4_START calculation
> when RTE_MBUF_F_TX_TUNNEL_MASK flag is set.
> 
> Fixes: 6393fc0b823c ("net/hns3: simplify hardware checksum offloading")
> Cc: [email protected]
> 
> Signed-off-by: Xingui Yang <[email protected]>
> ---
>  drivers/net/hns3/hns3_rxtx.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
> index 573604b0cd..4d48cbdc11 100644
> --- a/drivers/net/hns3/hns3_rxtx.c
> +++ b/drivers/net/hns3/hns3_rxtx.c
> @@ -3982,6 +3982,7 @@ hns3_handle_simple_bd(struct hns3_tx_queue *txq, struct 
> hns3_desc *desc,
>  {
>  #define HNS3_TCP_CSUM_OFFSET 16
>  #define HNS3_UDP_CSUM_OFFSET 6
> +     uint32_t l4_start;
>  
>       /*
>        * In HIP09, NIC HW support Tx simple BD mode that the HW will
> @@ -4003,9 +4004,13 @@ hns3_handle_simple_bd(struct hns3_tx_queue *txq, 
> struct hns3_desc *desc,
>           ((m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM ||
>            (m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM)) 
> {
>               /* set checksum start and offset, defined in 2 Bytes */
> +             l4_start = m->l2_len + m->l3_len;

Applied to next-net; moved declaration of l4_start into that basic block.

Reply via email to