]> git.droids-corp.org - dpdk.git/commitdiff
net/bnxt: remove assert for zero data length in Tx
authorSomnath Kotur <somnath.kotur@broadcom.com>
Wed, 15 Jun 2022 14:56:56 +0000 (20:26 +0530)
committerAjit Khaparde <ajit.khaparde@broadcom.com>
Fri, 24 Jun 2022 21:23:11 +0000 (23:23 +0200)
Currently the PMD tries to detect a potential 0 byte DMA by
using RTE_VERIFY.
But since RTE_VERIFY internally calls rte_panic() it is fatal to
the application and some applications want to avoid that.
So return an error from the bnxt xmit handler if such a bad pkt is
encountered by logging an error message, dumping the pkt header and
dump the current stack as well

Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt_txr.c

index 7a7196a237312fd59df33d7838d4aefd16572f4d..67e016775cc3c61e5698d6e601ea68d1ac1e1a22 100644 (file)
@@ -123,6 +123,26 @@ bnxt_xmit_need_long_bd(struct rte_mbuf *tx_pkt, struct bnxt_tx_queue *txq)
        return false;
 }
 
+static bool
+bnxt_zero_data_len_tso_segsz(struct rte_mbuf *tx_pkt, uint8_t data_len_chk)
+{
+       const char *type_str = "Data len";
+       uint16_t len_to_check = tx_pkt->data_len;
+
+       if (data_len_chk == 0) {
+               type_str = "TSO Seg size";
+               len_to_check = tx_pkt->tso_segsz;
+       }
+
+       if (len_to_check == 0) {
+               PMD_DRV_LOG(ERR, "Error! Tx pkt %s == 0\n", type_str);
+               rte_pktmbuf_dump(stdout, tx_pkt, 64);
+               rte_dump_stack();
+               return true;
+       }
+       return false;
+}
+
 static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
                                struct bnxt_tx_queue *txq,
                                uint16_t *coal_pkts,
@@ -179,7 +199,8 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
        }
 
        /* Check non zero data_len */
-       RTE_VERIFY(tx_pkt->data_len);
+       if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, 1)))
+               return -EIO;
 
        prod = RING_IDX(ring, txr->tx_raw_prod);
        tx_buf = &txr->tx_buf_ring[prod];
@@ -256,7 +277,8 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
                         */
                        txbd1->kid_or_ts_low_hdr_size = hdr_size >> 1;
                        txbd1->kid_or_ts_high_mss = tx_pkt->tso_segsz;
-                       RTE_VERIFY(txbd1->kid_or_ts_high_mss);
+                       if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, 0)))
+                               return -EIO;
 
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_TCP_UDP_CKSUM) ==
                           PKT_TX_OIP_IIP_TCP_UDP_CKSUM) {
@@ -330,7 +352,8 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
        m_seg = tx_pkt->next;
        while (m_seg) {
                /* Check non zero data_len */
-               RTE_VERIFY(m_seg->data_len);
+               if (unlikely(bnxt_zero_data_len_tso_segsz(m_seg, 1)))
+                       return -EIO;
                txr->tx_raw_prod = RING_NEXT(txr->tx_raw_prod);
 
                prod = RING_IDX(ring, txr->tx_raw_prod);