From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3109045BAC; Wed, 23 Oct 2024 08:29:04 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6D46840EDF; Wed, 23 Oct 2024 08:28:41 +0200 (CEST) Received: from smtpbgeu2.qq.com (smtpbgeu2.qq.com [18.194.254.142]) by mails.dpdk.org (Postfix) with ESMTP id 35B7C40DD3 for ; Wed, 23 Oct 2024 08:28:27 +0200 (CEST) X-QQ-mid: bizesmtpsz8t1729664904tyyf7qc X-QQ-Originating-IP: q5HmkBw8siforKDt4zcOH9qzBxz3Zylhix4H+XWgPPg= Received: from wxdbg.localdomain.com ( [125.122.84.15]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 23 Oct 2024 14:28:23 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 3555265207022657793 From: Jiawen Wu To: dev@dpdk.org Cc: Jiawen Wu Subject: [PATCH 08/13] net/ngbe: check length of Tx packets Date: Wed, 23 Oct 2024 14:48:31 +0800 Message-Id: <20241023064836.2017879-9-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20241023064836.2017879-1-jiawenwu@trustnetic.com> References: <20241023064836.2017879-1-jiawenwu@trustnetic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtpsz:trustnetic.com:qybglogicsvrgz:qybglogicsvrgz8a-1 X-QQ-XMAILINFO: Nh77ezimFp1ij5EcLLRuS8OBJCInFO2SrqArfS6nWaaiSCmRhpH30B46 usWFH08KCf0s7+j7SHy4wjQn/0rMCRgYAtZ8NdJ5M0SB51mHG4gzrQzCKZH7IDEWx2mHuLS rAlb1At05ebkq6xAJ6OzPfwIFD7Zm+kB5R+M9J+DYOUsi8mvP+o4wolLXvuy63l/rQl3m8Y 4uhgmPQep6K0kif03abvvVWsRqS+IrWu2zHXxzoMO9UgvF5aNMrEiBOVmoTuR+/5xcxQKeb 1/+zxGHz1KFSlNjvvRbZ5X9b0+/6guNMwCL3qZ2eYCscFy9RMEg8u0PwvPz25YtK0KfyluM 7bgDIcjW8PC1OEAsi0PJSG5l3vYui5lGuw5Px224KQ2P3i+pdetvF8IQulL/yZi8ySMpkGw YANTXG8TwHUt+NT6bA09SzDUyPW8mJcOI4DcJ2Qybepnz0yJYtE3Al4Ik4JroTg2lfo2bl8 y/vSblLun9whB34O6L3Vq088UBPuvTxd60b7HfCWsz1/nYAaD2nTWZEc6cy+auTpv1n/hMs +uY+IkEgt1dzwUhR+DM523nCx06E1ccbAcls3JpVzsX4hqLhJ2jxx6d+03xbH7H8mTV02y4 lvH5rbnZUr1MRkZdgu0Nrs4AjhDb1oCMQXQKUkFEngW+bkNlf4VZXziBZ13zvpK4gRygFv6 qhxqUEqVwRuBcF0sFEmc1c7iCksGsjvRxUWf0v2LdlOi5yidKh/aNLs23YFcMNhk8rWD9MH wfhqUxsr8qiDuIZuygA29pn3WO6wn8o1IJTYJYaB4ZrOxhxtDf7QKVdqG+CA5waHhFIJfhI 8wnJ5yqy/nuTRlQzLpcHpWIDAlYmmua4ABmXsBUZcvcM4z5svyOsrorkzI3cr0yT6Ul6qwt hZ4gm9PPwTe962VWJeBk8nJt5GgL5wZg1AYfXKbgZaSpzP1NVjjFi/pADSuvif6clm0C5z4 6u3/v4wrKuvZcnIb+BKtuGjpcoLKDboVf0qPVwqJ+D3+W+Q== X-QQ-XMRINFO: M/715EihBoGSf6IYSX1iLFg= X-QQ-RECHKSPAM: 0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add checking of the Tx packet length to avoid TDM fatal error as far as possible. Set the pkt_len=1518 for invalid packet in simple Tx code path, and drop it directly in featured Tx code path. Althrough the hardware does not support TDM desc check. Signed-off-by: Jiawen Wu --- drivers/net/ngbe/ngbe_rxtx.c | 33 +++++++++++++++++++++++++++ drivers/net/ngbe/ngbe_rxtx_vec_neon.c | 11 ++++++--- drivers/net/ngbe/ngbe_rxtx_vec_sse.c | 11 ++++++--- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/drivers/net/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c index f3eb797d0c..25a314f10a 100644 --- a/drivers/net/ngbe/ngbe_rxtx.c +++ b/drivers/net/ngbe/ngbe_rxtx.c @@ -113,6 +113,8 @@ tx4(volatile struct ngbe_tx_desc *txdp, struct rte_mbuf **pkts) for (i = 0; i < 4; ++i, ++txdp, ++pkts) { buf_dma_addr = rte_mbuf_data_iova(*pkts); pkt_len = (*pkts)->data_len; + if (pkt_len < RTE_ETHER_HDR_LEN) + pkt_len = NGBE_FRAME_SIZE_DFT; /* write data to descriptor */ txdp->qw0 = rte_cpu_to_le_64(buf_dma_addr); @@ -133,6 +135,8 @@ tx1(volatile struct ngbe_tx_desc *txdp, struct rte_mbuf **pkts) buf_dma_addr = rte_mbuf_data_iova(*pkts); pkt_len = (*pkts)->data_len; + if (pkt_len < RTE_ETHER_HDR_LEN) + pkt_len = NGBE_FRAME_SIZE_DFT; /* write data to descriptor */ txdp->qw0 = cpu_to_le64(buf_dma_addr); @@ -555,6 +559,30 @@ ngbe_xmit_cleanup(struct ngbe_tx_queue *txq) return 0; } +static inline bool +ngbe_check_pkt_err(struct rte_mbuf *tx_pkt) +{ + uint32_t total_len = 0, nb_seg = 0; + struct rte_mbuf *mseg; + + mseg = tx_pkt; + do { + if (mseg->data_len == 0) + return true; + total_len += mseg->data_len; + nb_seg++; + mseg = mseg->next; + } while (mseg != NULL); + + if (tx_pkt->pkt_len != total_len || tx_pkt->pkt_len == 0) + return true; + + if (tx_pkt->nb_segs != nb_seg || tx_pkt->nb_segs > 64) + return true; + + return false; +} + uint16_t ngbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) @@ -599,6 +627,11 @@ ngbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) { new_ctx = 0; tx_pkt = *tx_pkts++; + if (ngbe_check_pkt_err(tx_pkt)) { + rte_pktmbuf_free(tx_pkt); + continue; + } + pkt_len = tx_pkt->pkt_len; /* diff --git a/drivers/net/ngbe/ngbe_rxtx_vec_neon.c b/drivers/net/ngbe/ngbe_rxtx_vec_neon.c index dcf12b7070..d870191792 100644 --- a/drivers/net/ngbe/ngbe_rxtx_vec_neon.c +++ b/drivers/net/ngbe/ngbe_rxtx_vec_neon.c @@ -476,9 +476,14 @@ static inline void vtx1(volatile struct ngbe_tx_desc *txdp, struct rte_mbuf *pkt, uint64_t flags) { - uint64x2_t descriptor = { - pkt->buf_iova + pkt->data_off, - (uint64_t)pkt->pkt_len << 45 | flags | pkt->data_len}; + uint16_t pkt_len = pkt->data_len; + uint64x2_t descriptor; + + if (pkt_len < RTE_ETHER_HDR_LEN) + pkt_len = NGBE_FRAME_SIZE_DFT; + + descriptor = {pkt->buf_iova + pkt->data_off, + (uint64_t)pkt_len << 45 | flags | pkt_len}; vst1q_u64((uint64_t *)(uintptr_t)txdp, descriptor); } diff --git a/drivers/net/ngbe/ngbe_rxtx_vec_sse.c b/drivers/net/ngbe/ngbe_rxtx_vec_sse.c index b128bd3a67..19c69cdfa6 100644 --- a/drivers/net/ngbe/ngbe_rxtx_vec_sse.c +++ b/drivers/net/ngbe/ngbe_rxtx_vec_sse.c @@ -563,9 +563,14 @@ static inline void vtx1(volatile struct ngbe_tx_desc *txdp, struct rte_mbuf *pkt, uint64_t flags) { - __m128i descriptor = _mm_set_epi64x((uint64_t)pkt->pkt_len << 45 | - flags | pkt->data_len, - pkt->buf_iova + pkt->data_off); + uint16_t pkt_len = pkt->data_len; + __m128i descriptor; + + if (pkt_len < RTE_ETHER_HDR_LEN) + pkt_len = NGBE_FRAME_SIZE_DFT; + + descriptor = _mm_set_epi64x((uint64_t)pkt_len << 45 | flags | pkt_len, + pkt->buf_iova + pkt->data_off); _mm_store_si128((__m128i *)(uintptr_t)txdp, descriptor); } -- 2.27.0