]> git.droids-corp.org - dpdk.git/commitdiff
net/iavf: fix segmentation offload buffer size
authorRadu Nicolau <radu.nicolau@intel.com>
Tue, 15 Feb 2022 15:50:23 +0000 (15:50 +0000)
committerQi Zhang <qi.z.zhang@intel.com>
Sun, 20 Feb 2022 13:38:10 +0000 (14:38 +0100)
This fix commit ff8b8bcd2ebe, which resulted in incorrect buffer size
being computed for non IPses TSO packets.

Fixes: ff8b8bcd2ebe ("net/iavf: fix segmentation offload condition")
Cc: stable@dpdk.org
Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/iavf/iavf_rxtx.c

index 41244055e51bcd582f9e338b3e0cc3a557efa338..ca54c70dd0dc58b7ad3f6f87265c1d3bc73588b1 100644 (file)
@@ -2463,9 +2463,10 @@ iavf_fill_data_desc(volatile struct iavf_tx_desc *desc,
        desc->buffer_addr = rte_mbuf_data_iova(m);
 
        /* calculate data buffer size less set header lengths */
-       if (m->ol_flags & (RTE_MBUF_F_TX_TCP_SEG | RTE_MBUF_F_TX_UDP_SEG)) {
-               if (m->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK)
-                       hdrlen += m->outer_l3_len;
+       if ((m->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) &&
+                       (m->ol_flags & (RTE_MBUF_F_TX_TCP_SEG |
+                                       RTE_MBUF_F_TX_UDP_SEG))) {
+               hdrlen += m->outer_l3_len;
                if (m->ol_flags & RTE_MBUF_F_TX_L4_MASK)
                        hdrlen += m->l3_len + m->l4_len;
                else
@@ -2473,6 +2474,14 @@ iavf_fill_data_desc(volatile struct iavf_tx_desc *desc,
                if (m->ol_flags & RTE_MBUF_F_TX_SEC_OFFLOAD)
                        hdrlen += ipseclen;
                bufsz = hdrlen + tlen;
+       } else if ((m->ol_flags & RTE_MBUF_F_TX_SEC_OFFLOAD) &&
+                       (m->ol_flags & (RTE_MBUF_F_TX_TCP_SEG |
+                                       RTE_MBUF_F_TX_UDP_SEG))) {
+               hdrlen += m->outer_l3_len + m->l3_len + ipseclen;
+               if (m->ol_flags & RTE_MBUF_F_TX_L4_MASK)
+                       hdrlen += m->l4_len;
+               bufsz = hdrlen + tlen;
+
        } else {
                bufsz = m->data_len;
        }