From: Kalesh AP <kalesh-anakkur.pura...@broadcom.com>

Currently driver has a check to validate TSO seg_size for 0 which
is to detect corrupted packet. But user can set any value as the
TSO seg_size. Adding a check to validate the minimum TSO seg_size
in the driver.

Driver will drop a packet with TSO seg_size less than 4 when
TSO is requested in the MBUF flags.

Signed-off-by: Kalesh AP <kalesh-anakkur.pura...@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khapa...@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.ko...@broadcom.com>
---
 drivers/net/bnxt/bnxt_txr.c | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c
index c82b11e733..6d7e9962ce 100644
--- a/drivers/net/bnxt/bnxt_txr.c
+++ b/drivers/net/bnxt/bnxt_txr.c
@@ -129,23 +129,26 @@ bnxt_xmit_need_long_bd(struct rte_mbuf *tx_pkt, struct 
bnxt_tx_queue *txq)
  * segments or fragments in those cases.
  */
 static bool
-bnxt_zero_data_len_tso_segsz(struct rte_mbuf *tx_pkt, uint8_t data_len_chk)
+bnxt_zero_data_len_tso_segsz(struct rte_mbuf *tx_pkt, bool data_len_chk, bool 
tso_segsz_check)
 {
-       const char *type_str = "Data len";
-       uint16_t len_to_check = tx_pkt->data_len;
+       const char *type_str;
 
-       if (data_len_chk == 0) {
-               type_str = "TSO Seg size";
-               len_to_check = tx_pkt->tso_segsz;
+       /* Minimum TSO seg_size should be 4 */
+       if (tso_segsz_check && tx_pkt->tso_segsz < 4) {
+               type_str = "Unsupported TSO Seg size";
+               goto dump_pkt;
        }
 
-       if (len_to_check == 0) {
-               PMD_DRV_LOG_LINE(ERR, "Error! Tx pkt %s == 0", type_str);
-               rte_pktmbuf_dump(stdout, tx_pkt, 64);
-               rte_dump_stack();
-               return true;
+       if (data_len_chk && tx_pkt->data_len == 0) {
+               type_str = "Data len == 0";
+               goto dump_pkt;
        }
        return false;
+dump_pkt:
+       PMD_DRV_LOG_LINE(ERR, "Error! Tx pkt %s == 0", type_str);
+       rte_pktmbuf_dump(stdout, tx_pkt, 64);
+       rte_dump_stack();
+       return true;
 }
 
 static bool
@@ -248,7 +251,7 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
        }
 
        /* Check non zero data_len */
-       if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, 1)))
+       if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, true, false)))
                return -EIO;
 
        if (unlikely(txq->bp->ptp_cfg != NULL && txq->bp->ptp_all_rx_tstamp == 
1))
@@ -338,7 +341,7 @@ 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;
-                       if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, 0)))
+                       if (unlikely(bnxt_zero_data_len_tso_segsz(tx_pkt, 
false, true)))
                                return -EIO;
 
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_TCP_UDP_CKSUM) ==
@@ -413,7 +416,7 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
        m_seg = tx_pkt->next;
        while (m_seg) {
                /* Check non zero data_len */
-               if (unlikely(bnxt_zero_data_len_tso_segsz(m_seg, 1)))
+               if (unlikely(bnxt_zero_data_len_tso_segsz(m_seg, true, false)))
                        return -EIO;
                txr->tx_raw_prod = RING_NEXT(txr->tx_raw_prod);
 
-- 
2.39.5 (Apple Git-154)

Reply via email to