[v4,2/2] net/ice: fix scalar Tx path segment
Checks
Commit Message
The scalar Tx path would send empty buffer that causes the Tx queue to
overflow.
This patch adds the last buffer length judgment in tx_prepare to fix this
issue, rte_errno will be set to EINVAL and returned if the last buffer is
empty.
Fixes: 17c7d0f9d6a4 ("net/ice: support basic Rx/Tx")
Fixes: ccf33dccf7aa ("net/ice: check illegal packet sizes")
Cc: stable@dpdk.org
Signed-off-by: Mingjin Ye <mingjinx.ye@intel.com>
v3:
* delete unused variable.
---
drivers/net/ice/ice_rxtx.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
@@ -3643,6 +3643,22 @@ ice_set_tx_function_flag(struct rte_eth_dev *dev, struct ice_tx_queue *txq)
#define ICE_MIN_TSO_MSS 64
#define ICE_MAX_TSO_MSS 9728
#define ICE_MAX_TSO_FRAME_SIZE 262144
+
+/*Check for emtpy mbuf*/
+static inline uint16_t
+ice_check_emtpy_mbuf(struct rte_mbuf *tx_pkt)
+{
+ struct rte_mbuf *txd = tx_pkt;
+
+ while (txd != NULL) {
+ if (txd->data_len == 0)
+ return -1;
+ txd = txd->next;
+ }
+
+ return 0;
+}
+
uint16_t
ice_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
uint16_t nb_pkts)
@@ -3689,6 +3705,12 @@ ice_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
rte_errno = -ret;
return i;
}
+
+ if (ice_check_emtpy_mbuf(m) != 0) {
+ rte_errno = EINVAL;
+ PMD_DRV_LOG(ERR, "INVALID mbuf: last mbuf data_len=[0]");
+ return i;
+ }
}
return i;
}