From fb986b1e4917a3dbceab7f1494d6052fc86bc8a1 Mon Sep 17 00:00:00 2001 From: Donghua Huang Date: Wed, 5 Nov 2025 09:57:50 +0800 Subject: [PATCH] Fix unrelease VLAN resource and L4 protocol retrieval from L3 header Signed-off-by: Donghua Huang (cherry picked from commit 8852493feab0e83b754f26f2741c117f2c3792f2) --- ...VLAN-tag-loss-for-short-tunnel-frame.patch | 102 ++++++++++++++++++ ...L4-protocol-retrieval-from-L3-header.patch | 99 +++++++++++++++++ dpdk.spec | 9 +- 3 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 0112-net-hns3-fix-VLAN-tag-loss-for-short-tunnel-frame.patch create mode 100644 0113-app-testpmd-fix-L4-protocol-retrieval-from-L3-header.patch diff --git a/0112-net-hns3-fix-VLAN-tag-loss-for-short-tunnel-frame.patch b/0112-net-hns3-fix-VLAN-tag-loss-for-short-tunnel-frame.patch new file mode 100644 index 0000000..d6ecfce --- /dev/null +++ b/0112-net-hns3-fix-VLAN-tag-loss-for-short-tunnel-frame.patch @@ -0,0 +1,102 @@ +From 2262fc29485bd863db55e820a194bf1e4be8a87c Mon Sep 17 00:00:00 2001 +From: Xingui Yang +Date: Mon, 29 Sep 2025 19:35:53 +0800 +Subject: [PATCH] net/hns3: fix VLAN tag loss for short tunnel frame + +[ upstream commit 2262fc29485bd863db55e820a194bf1e4be8a87c ] + +When the hardware handles short tunnel frames below 65 bytes, the VLAN tag +will be lost if VLAN insert or QinQ insert is enabled. Therefore, the +packet size of the tunnel frame is padded to 65 bytes to fix this issue. + +Fixes: de620754a109 ("net/hns3: fix sending packets less than 60 bytes") +Cc: stable@dpdk.org + +Signed-off-by: Xingui Yang +Signed-off-by: Donghua Huang +--- + drivers/net/hns3/hns3_ethdev.h | 1 + + drivers/net/hns3/hns3_rxtx.c | 48 +++++++++++++++++++++++----------- + 2 files changed, 34 insertions(+), 15 deletions(-) + +diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h +index f6bb1b5d43..209b042816 100644 +--- a/drivers/net/hns3/hns3_ethdev.h ++++ b/drivers/net/hns3/hns3_ethdev.h +@@ -75,6 +75,7 @@ + #define HNS3_DEFAULT_MTU 1500UL + #define HNS3_DEFAULT_FRAME_LEN (HNS3_DEFAULT_MTU + HNS3_ETH_OVERHEAD) + #define HNS3_HIP08_MIN_TX_PKT_LEN 33 ++#define HNS3_MIN_TUN_PKT_LEN 65 + + #define HNS3_BITS_PER_BYTE 8 + +diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c +index aa7ee6f3e8..df703134be 100644 +--- a/drivers/net/hns3/hns3_rxtx.c ++++ b/drivers/net/hns3/hns3_rxtx.c +@@ -4219,6 +4219,37 @@ hns3_tx_fill_hw_ring(struct hns3_tx_queue *txq, + } + } + ++static bool ++hns3_tx_pktmbuf_append(struct hns3_tx_queue *txq, ++ struct rte_mbuf *tx_pkt) ++{ ++ uint16_t add_len = 0; ++ uint32_t ptype; ++ char *appended; ++ ++ if (unlikely(tx_pkt->ol_flags & (RTE_MBUF_F_TX_VLAN | RTE_MBUF_F_TX_QINQ) && ++ rte_pktmbuf_pkt_len(tx_pkt) < HNS3_MIN_TUN_PKT_LEN)) { ++ ptype = rte_net_get_ptype(tx_pkt, NULL, RTE_PTYPE_L2_MASK | ++ RTE_PTYPE_L3_MASK | RTE_PTYPE_L4_MASK | ++ RTE_PTYPE_TUNNEL_MASK); ++ if (ptype & RTE_PTYPE_TUNNEL_MASK) ++ add_len = HNS3_MIN_TUN_PKT_LEN - rte_pktmbuf_pkt_len(tx_pkt); ++ } else if (unlikely(rte_pktmbuf_pkt_len(tx_pkt) < txq->min_tx_pkt_len)) { ++ add_len = txq->min_tx_pkt_len - rte_pktmbuf_pkt_len(tx_pkt); ++ } ++ ++ if (unlikely(add_len > 0)) { ++ appended = rte_pktmbuf_append(tx_pkt, add_len); ++ if (appended == NULL) { ++ txq->dfx_stats.pkt_padding_fail_cnt++; ++ return false; ++ } ++ memset(appended, 0, add_len); ++ } ++ ++ return true; ++} ++ + uint16_t + hns3_xmit_pkts_simple(void *tx_queue, + struct rte_mbuf **tx_pkts, +@@ -4296,21 +4327,8 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) + * by hardware in Tx direction, driver need to pad it to avoid + * error. + */ +- if (unlikely(rte_pktmbuf_pkt_len(tx_pkt) < +- txq->min_tx_pkt_len)) { +- uint16_t add_len; +- char *appended; +- +- add_len = txq->min_tx_pkt_len - +- rte_pktmbuf_pkt_len(tx_pkt); +- appended = rte_pktmbuf_append(tx_pkt, add_len); +- if (appended == NULL) { +- txq->dfx_stats.pkt_padding_fail_cnt++; +- break; +- } +- +- memset(appended, 0, add_len); +- } ++ if (!hns3_tx_pktmbuf_append(txq, tx_pkt)) ++ break; + + m_seg = tx_pkt; + +-- +2.33.0 + diff --git a/0113-app-testpmd-fix-L4-protocol-retrieval-from-L3-header.patch b/0113-app-testpmd-fix-L4-protocol-retrieval-from-L3-header.patch new file mode 100644 index 0000000..d2a0462 --- /dev/null +++ b/0113-app-testpmd-fix-L4-protocol-retrieval-from-L3-header.patch @@ -0,0 +1,99 @@ +From e3bb7ba260fd3e67a62ad9fd58a3433da9b1bd46 Mon Sep 17 00:00:00 2001 +From: Dengdui Huang +Date: Sat, 30 Aug 2025 09:29:13 +0800 +Subject: [PATCH] app/testpmd: fix L4 protocol retrieval from L3 header + +[ upstream commit 496159613ffc7b6ba592432a1ba4d1a38f6935de ] + +Currently, when retrieving the L4 protocol from the L3 header, +the case of IPv6 with extension headers is not handled correctly. +This patch fixes it. + +Fixes: 76730c7b9b5a ("app/testpmd: use packet type parsing API") +Cc: stable@dpdk.org + +Signed-off-by: Dengdui Huang +Signed-off-by: Donghua Huang +--- + app/test-pmd/csumonly.c | 39 ++++++++++++++++----------------------- + 1 file changed, 16 insertions(+), 23 deletions(-) + +diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c +index 4891cb8..35726f5 100644 +--- a/app/test-pmd/csumonly.c ++++ b/app/test-pmd/csumonly.c +@@ -536,20 +536,8 @@ get_tunnel_ol_flags_by_ptype(uint32_t ptype) + } + } + +-static void +-parse_inner_l4_proto(void *outer_l3_hdr, +- struct testpmd_offload_info *info) +-{ +- struct rte_ipv4_hdr *ipv4_hdr = outer_l3_hdr; +- struct rte_ipv6_hdr *ipv6_hdr = outer_l3_hdr; +- if (info->ethertype == _htons(RTE_ETHER_TYPE_IPV4)) +- info->l4_proto = ipv4_hdr->next_proto_id; +- else +- info->l4_proto = ipv6_hdr->proto; +-} +- + static uint8_t +-parse_l4_proto(const struct rte_mbuf *m, uint32_t off, uint32_t ptype) ++parse_l4_proto(const struct rte_mbuf *m, uint32_t off, uint32_t ptype, bool parse_inner) + { + int frag = 0, ret; + +@@ -568,16 +556,19 @@ parse_l4_proto(const struct rte_mbuf *m, uint32_t off, uint32_t ptype) + if (unlikely(ip6h == NULL)) + return 0; + +- if ((ptype & RTE_PTYPE_INNER_L3_MASK) == +- RTE_PTYPE_INNER_L3_IPV6_EXT) { +- ret = rte_net_skip_ip6_ext(ip6h->proto, m, &off, &frag); +- if (ret < 0) +- return 0; +- return ret; +- } ++ if (!parse_inner && (ptype & RTE_PTYPE_L3_MASK) != RTE_PTYPE_L3_IPV6_EXT) ++ return ip6h->proto; ++ ++ if (parse_inner && (ptype & RTE_PTYPE_INNER_L3_MASK) != RTE_PTYPE_INNER_L3_IPV6_EXT) ++ return ip6h->proto; + +- return ip6h->proto; ++ off += sizeof(struct rte_ipv6_hdr); ++ ret = rte_net_skip_ip6_ext(ip6h->proto, m, &off, &frag); ++ if (ret < 0) ++ return 0; ++ return ret; + } ++ + return 0; + } + +@@ -704,7 +695,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) + info.l4_len = hdr_lens.l4_len; + info.ethertype = get_ethertype_by_ptype(eth_hdr, + ptype & RTE_PTYPE_L3_MASK); +- info.l4_proto = parse_l4_proto(m, info.l2_len, ptype); ++ info.l4_proto = parse_l4_proto(m, info.l2_len, ptype, false); + + l3_hdr = (char *)eth_hdr + info.l2_len; + /* check if it's a supported tunnel */ +@@ -722,9 +713,11 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) + } + /* update l3_hdr and outer_l3_hdr if a tunnel was parsed */ + if (info.is_tunnel) { ++ uint16_t l3_off = info.outer_l2_len + info.outer_l3_len + info.l2_len; ++ + outer_l3_hdr = l3_hdr; + l3_hdr = (char *)l3_hdr + info.outer_l3_len + info.l2_len; +- parse_inner_l4_proto(l3_hdr, &info); ++ info.l4_proto = parse_l4_proto(m, l3_off, ptype, true); + } + /* step 2: depending on user command line configuration, + * recompute checksum either in software or flag the +-- +2.33.0 + diff --git a/dpdk.spec b/dpdk.spec index a709907..f150946 100644 --- a/dpdk.spec +++ b/dpdk.spec @@ -11,7 +11,7 @@ Name: dpdk Version: 23.11 -Release: 36 +Release: 37 URL: http://dpdk.org Source: https://fast.dpdk.org/rel/dpdk-%{version}.tar.xz @@ -144,6 +144,8 @@ Patch6108: 0108-config-arm-adapt-RTE_MAX_NUMA_NODES-to-16.patch Patch6109: 0109-net-hns3-fix-inconsistent-lock.patch Patch6110: 0110-net-hns3-fix-overwrite-mbuf-in-vector-path.patch Patch6111: 0111-net-hns3-fix-unrelease-VLAN-resource-when-init-fail.patch +Patch6112: 0112-net-hns3-fix-VLAN-tag-loss-for-short-tunnel-frame.patch +Patch6113: 0113-app-testpmd-fix-L4-protocol-retrieval-from-L3-header.patch BuildRequires: meson BuildRequires: python3-pyelftools @@ -348,6 +350,11 @@ fi /usr/sbin/depmod %changelog +* Wed Nov 05 2025 huangdonghua - 23.11-37 + Fix unrelease VLAN resource and L4 protocol retrieval from L3 header: + - net/hns3: fix unrelease VLAN resource when init fail + - app/testpmd: fix L4 protocol retrieval from L3 header + * Fri Sep 19 2025 huangdonghua - 23.11-36 Unify locks, fix Rx path and resource release: - net/hns3: fix inconsistent lock -- Gitee