* [PATCH 1/2] net/hns3: fix VLAN tag loss for short tunnel frame
2025-09-29 11:35 [PATCH 0/2] bugfix for hns3 Xingui Yang
@ 2025-09-29 11:35 ` Xingui Yang
2025-09-29 11:35 ` [PATCH 2/2] net/hns3: print invalid MAC address from firmware Xingui Yang
2025-09-29 23:57 ` [PATCH 0/2] bugfix for hns3 Stephen Hemminger
2 siblings, 0 replies; 4+ messages in thread
From: Xingui Yang @ 2025-09-29 11:35 UTC (permalink / raw)
To: dev
Cc: stephen, david.marchand, liuyonglong, kangfenglong, fengchengwen,
lihuisong
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 <yangxingui@huawei.com>
---
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] net/hns3: print invalid MAC address from firmware
2025-09-29 11:35 [PATCH 0/2] bugfix for hns3 Xingui Yang
2025-09-29 11:35 ` [PATCH 1/2] net/hns3: fix VLAN tag loss for short tunnel frame Xingui Yang
@ 2025-09-29 11:35 ` Xingui Yang
2025-09-29 23:57 ` [PATCH 0/2] bugfix for hns3 Stephen Hemminger
2 siblings, 0 replies; 4+ messages in thread
From: Xingui Yang @ 2025-09-29 11:35 UTC (permalink / raw)
To: dev
Cc: stephen, david.marchand, liuyonglong, kangfenglong, fengchengwen,
lihuisong
The default MAC address from the firmware is usually valid. Print the
default MAC address when it's invalid to locate the problem.
Signed-off-by: Xingui Yang <yangxingui@huawei.com>
---
drivers/net/hns3/hns3_common.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c
index 6709d7a70b..28d7e94ffb 100644
--- a/drivers/net/hns3/hns3_common.c
+++ b/drivers/net/hns3/hns3_common.c
@@ -723,12 +723,12 @@ hns3_init_mac_addrs(struct rte_eth_dev *dev)
eth_addr = (struct rte_ether_addr *)hw->mac.mac_addr;
if (!hns->is_vf) {
if (!rte_is_valid_assigned_ether_addr(eth_addr)) {
+ hns3_warn(hw, "MAC address " RTE_ETHER_ADDR_PRT_FMT " from firmware is invalid",
+ RTE_ETHER_ADDR_BYTES(eth_addr));
rte_eth_random_addr(hw->mac.mac_addr);
hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE,
(struct rte_ether_addr *)hw->mac.mac_addr);
- hns3_warn(hw, "default mac_addr from firmware is an invalid "
- "unicast address, using random MAC address %s",
- mac_str);
+ hns3_warn(hw, "using random MAC address %s", mac_str);
}
} else {
/*
--
2.33.0
^ permalink raw reply [flat|nested] 4+ messages in thread