On 6/15/2022 3:56 PM, Kalesh A P wrote:
CAUTION: This message has originated from an External Source. Please use proper
judgment and caution when opening attachments, clicking links, or responding to
this email.
From: Somnath Kotur <somnath.ko...@broadcom.com>
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.ko...@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khapa...@broadcom.com>
---
drivers/net/bnxt/bnxt_txr.c | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c
index 7a7196a..67e0167 100644
--- a/drivers/net/bnxt/bnxt_txr.c
+++ b/drivers/net/bnxt/bnxt_txr.c
@@ -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;
Some PMDs does the similar verification in the 'rte_eth_tx_prepare()'
API (tx_pkt_prepare() dev_ops), this helps to separate the checks and Tx
data path code, do you want to do the same?