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 42DC845C2A; Mon, 4 Nov 2024 03:08:33 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1C9B340B94; Mon, 4 Nov 2024 03:07:27 +0100 (CET) Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) by mails.dpdk.org (Postfix) with ESMTP id 1DED940E0A for ; Mon, 4 Nov 2024 03:07:24 +0100 (CET) X-QQ-mid: bizesmtp91t1730686025t2s1kh09 X-QQ-Originating-IP: CjhOnQJGEw8Un9ThHz6QuVAemQDW6pQ+DoBHtFiytqk= Received: from wxdbg.localdomain.com ( [60.186.23.108]) by bizesmtp.qq.com (ESMTP) with id ; Mon, 04 Nov 2024 10:07:04 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 480921539816169209 From: Jiawen Wu To: dev@dpdk.org Cc: Jiawen Wu Subject: [PATCH v3 06/13] net/txgbe: check length of Tx packets Date: Mon, 4 Nov 2024 10:30:00 +0800 Message-Id: <20241104023007.782475-7-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20241104023007.782475-1-jiawenwu@trustnetic.com> References: <20241028023147.60157-1-jiawenwu@trustnetic.com> <20241104023007.782475-1-jiawenwu@trustnetic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:trustnetic.com:qybglogicsvrgz:qybglogicsvrgz8a-1 X-QQ-XMAILINFO: MYcyYH/A/+tCJCme9xpGNsTOqfGQ86mFOLimXtBXuvLg/3NL0NqyGeW4 CKjsiNX+R9Wq/msGRE2v7JvSn3lWMIxvb/sGpAOnAKs0NkA2AUFhpd7DPsgJMB3fRgcBO2a gWpLGR6J/EUQhSjS6rBG01Bmv0Eh9s+yqfZ6ozGbUrTTtntjdpWX1fcCwv62IKHKv16cw/Y QQlm2e2dJRVO0EYyvlLANn/FFxSqSwaT+L66eK7ZdeQ219vxCBEzNqtc2zm9dOXb8evbhYd PNsSONyLwuhQJ1Hw2nhe3UxwBRDCLsw9DENFb3gJp+BwWDRUK1YgOpRpKa9rS0vP9/mZr+S LKwg+o5zD61dl/BDi3XQfLyY9C9Esn4JNRjMw2aqKiBuIutYf/xNUsFZWJ38Zthw9HCgqMI Aa2eI/0+7+socJDumieUM+3h1cpNRSzbH0zcVBkye4uDweiuBOy3K+EKGAX9dhvGRStZ/1S U+oLVoA8vRew8DMIUqUNK8vVZqOFU8jmq7wjNQRp34zwFPGVVA1s1QvS2kSB7+HryUmAW/T A93ECOx4ceRhkrR9ptmhWyY+hneljcKk3LTuTK12lRve4uzn0yjPqf+Oij5eD0SNLXAdmkU AVqRvWocNPUCXTy12PiAsg1CaWmYAITljsYk4bsnRIWjGFfqPRC0BAUwIKXSE6u+c3n6Sh0 1gD2NGu04BbwHl0StwITZeK9Q6ymSyHvXp/HzKkin8Eoxn3GwsxutKoeMtXLoojI4E/x40C ZqzhAkJn1n0EPS3U06sQ/e2fth9Oqy1L/yG5htUrVrrQgByXEs+IHQ1+IT7gkZ80lksE6cc +pBM4tZ98AqIKDmWZNpcZrZa44uEGaWhkrYHsOau2lDAANgB1clYQbrYPl137rZHciAedPt f0cBlnAkFRYHnCjbYXaknoW/PMJktxJNcbqFzm3fcGFVqRUmFNzGX3XVvAUEZMLHnAlyuf7 FNY+ew2rBGzLnJcDCaxnoXgt+ng46PPvJfLEw44h+F004xLOGUoA2bgXc6ngj4053538= X-QQ-XMRINFO: MPJ6Tf5t3I/ycC2BItcBVIA= 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. Signed-off-by: Jiawen Wu --- drivers/net/txgbe/txgbe_rxtx.c | 33 +++++++++++++++++++++++++ drivers/net/txgbe/txgbe_rxtx_vec_neon.c | 10 +++++--- drivers/net/txgbe/txgbe_rxtx_vec_sse.c | 11 ++++++--- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c index 2d2b437643..06acbd0881 100644 --- a/drivers/net/txgbe/txgbe_rxtx.c +++ b/drivers/net/txgbe/txgbe_rxtx.c @@ -160,6 +160,8 @@ tx4(volatile struct txgbe_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 = TXGBE_FRAME_SIZE_DFT; /* write data to descriptor */ txdp->qw0 = rte_cpu_to_le_64(buf_dma_addr); @@ -180,6 +182,8 @@ tx1(volatile struct txgbe_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 = TXGBE_FRAME_SIZE_DFT; /* write data to descriptor */ txdp->qw0 = cpu_to_le64(buf_dma_addr); @@ -813,6 +817,30 @@ txgbe_parse_tun_ptid(struct rte_mbuf *tx_pkt, uint8_t tun_len) return ptid; } +static inline bool +txgbe_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 txgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) @@ -864,6 +892,11 @@ txgbe_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 (txgbe_check_pkt_err(tx_pkt)) { + rte_pktmbuf_free(tx_pkt); + continue; + } + pkt_len = tx_pkt->pkt_len; /* diff --git a/drivers/net/txgbe/txgbe_rxtx_vec_neon.c b/drivers/net/txgbe/txgbe_rxtx_vec_neon.c index a96baf9b1d..d4d647fab5 100644 --- a/drivers/net/txgbe/txgbe_rxtx_vec_neon.c +++ b/drivers/net/txgbe/txgbe_rxtx_vec_neon.c @@ -476,9 +476,13 @@ static inline void vtx1(volatile struct txgbe_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; + + if (pkt_len < RTE_ETHER_HDR_LEN) + pkt_len = TXGBE_FRAME_SIZE_DFT; + + uint64x2_t 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/txgbe/txgbe_rxtx_vec_sse.c b/drivers/net/txgbe/txgbe_rxtx_vec_sse.c index 1a3f2ce3cd..8ecce33471 100644 --- a/drivers/net/txgbe/txgbe_rxtx_vec_sse.c +++ b/drivers/net/txgbe/txgbe_rxtx_vec_sse.c @@ -607,9 +607,14 @@ static inline void vtx1(volatile struct txgbe_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 = TXGBE_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