<div data-ntes="ntes_mail_body_root" style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="margin:0;"><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Dear DPDK Development Team and Chelsio Support Team,</span></strong></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">We are writing to report two severe, fundamental issues we've encountered while using Chelsio T5/T6 series NICs (with the<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>PMD) in our high-performance real-time audio streaming application. These problems prevent us from leveraging core DPDK features and require your urgent attention.</span></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Issue #1: Complete Failure to Transmit Zero-Copy (Multi-Segment) Packets</span></strong></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">To achieve the lowest latency, we are using the standard DPDK zero-copy mechanism: attaching an external shared memory buffer (from<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_memzone</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">) containing our audio payload to an mbuf header using<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_pktmbuf_attach_extbuf</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">. This correctly creates a<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">multi-segment mbuf</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>(</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">nb_segs > 1</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">).</span></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">However, we have found that the<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>driver is completely unable to transmit these multi-segment mbufs</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">. Any attempt to send such a packet via<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_eth_tx_burst</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>fails (returns 0 or results in silent packet drops), regardless of whether hardware offloads are enabled or disabled. The<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>PMD's capability report (</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">tx_offload_capa</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">) correctly<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">does not include</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>the<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">RTE_ETH_TX_OFFLOAD_MULTI_SEGS</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>flag.</span></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">This means that for the<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>driver, the standard zero-copy path in DPDK is entirely non-functional.</span></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Issue #2: Incomplete Hardware Checksum Offload</span></strong></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Forced to abandon zero-copy, we implemented a "single-copy" workaround by using<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_memcpy</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>to create a contiguous, single-segment mbuf. While this allows packets to be transmitted, we discovered a second critical issue:<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">the hardware checksum offload functionality is incomplete</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">.</span></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Specifically:</span></p><ol style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">We set the full offload flags on the mbuf:<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">m->ol_flags |= RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_UDP_CKSUM;</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">.</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">We zero out both the IP and UDP checksum fields in their respective headers before transmission.</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Packet captures reveal that only the<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">UDP checksum</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>is correctly calculated and filled in by the hardware. The<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">IP checksum</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>field remains zeroed, causing the packet to be treated as invalid and dropped by the network.</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">For the packet to be transmitted successfully, we are forced to<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">manually calculate the IP checksum in software</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>(</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">ip_h->hdr_checksum = rte_ipv4_cksum(ip_h);</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">) while keeping the UDP checksum field zeroed for hardware offload.</span></p></li></ol><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">This proves that although the<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>PMD reports support for<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">RTE_ETH_TX_OFFLOAD_IPV4_CKSUM</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">, it<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">does not actually perform IP checksum offloading</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>in practice.</span></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">For contrast, we must emphasize that both of the core functionalities we've described—zero-copy (multi-segment mbuf) transmission and full (IP+UDP) hardware checksum offloading—work perfectly on the same testbed when using NICs from Intel (igc/i40e) and onboard Realtek(RTL8125) controllers. This strongly suggests that the issues are specific to the Chelsio cxgbe PMD.</span></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Our Dilemma</span></strong></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">These two issues leave us in an untenable position:</span></p><ul style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">The ideal<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">zero-copy path is completely broken</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">, preventing us from realizing a primary performance benefit of DPDK.</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">The fallback<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">single-copy path is highly inefficient</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">, as it not only incurs the CPU cost of a<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">memcpy</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>but also requires the additional CPU overhead of software IP checksum calculation, largely defeating the purpose of hardware offloads.</span></p></li></ul><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Our Questions</span></strong></p><p style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">We urgently need your help to clarify the following:</span></p><ol style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><ul style="white-space: normal !important; word-break: break-word !important;"><li style="white-space: normal !important; word-break: break-word !important;"></li><li><p><span class="selected">Is this behavior from the </span><code><span class="selected">cxgbe</span></code><span class="selected"> PMD (offloading only UDP checksum) consistent with the design expectations for a PMD in DPDK?</span></p></li><li><p><span class="selected">Does the DPDK framework provide any debugging mechanisms to trace why an explicitly set offload flag (</span><code><span class="selected">RTE_MBUF_F_TX_IP_CKSUM</span></code><span class="selected">) would be ignored by a PMD without reporting an error?</span></p></li></ul></ol><span class="selected" style="white-space: normal; word-break: break-word !important; color: rgb(0, 0, 0); font-family: Arial; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Resolving these issues is critical to the success of our project. Any information or guidance you can provide would be greatly appreciated.</span></p><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Our Environment</span></strong></p><ul style="white-space: normal !important; word-break: break-word !important;"><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">DPDK Version:</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"> 25.07</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">NIC Model:</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Chelsio T520-CR</span></code></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">OS & Kernel:</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"> <font face="monospace" style="white-space: normal !important; word-break: break-word !important;">Tinycore64 16.0 kernel 6.6.63</font></span></p></li></ul><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Thank you for your time and attention to this urgent matter. We look forward to your response.</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Best regards,</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><br style="white-space: normal !important; word-break: break-word !important;"><br style="white-space: normal !important; word-break: break-word !important;"><br style="white-space: normal !important; word-break: break-word !important;"></span></p><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">尊敬的 DPDK 开发团队和 Chelsio 技术支持团队:</span></strong></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">您们好!</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">我们正在开发一个对性能要求极高的实时音频流项目,但目前在使用 Chelsio T5/T6 系列网卡(</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>PMD)时,遇到了两个严重的底层功能障碍,导致 DPDK 的核心优势无法发挥。我们恳请您们的紧急援助。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">【核心问题一:零拷贝(多段 mbuf)数据包完全无法发送】</span></strong></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">为了实现最低延迟,我们采用 DPDK 标准的零拷贝机制:通过<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_pktmbuf_attach_extbuf</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>函数,将外部共享内存(</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_memzone</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">)中的音频数据附加到 mbuf 头部之后。此操作会创建一个</span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">多段 mbuf</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>(</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">nb_segs > 1</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">)。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">然而,我们发现<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>驱动完全无法发送这种多段 mbuf</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">。一旦调用<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_eth_tx_burst</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>发送此类数据包,无论是否开启硬件卸载,发送都会失败(返回值为 0 或导致丢包),数据包无法出现在网络上。</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>PMD 的能力报告(</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">tx_offload_capa</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">)也确实</span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">不包含</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">RTE_ETH_TX_OFFLOAD_MULTI_SEGS</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>标志。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">这表明,对于<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>驱动而言,DPDK 的标准零拷贝机制是完全不可用的。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">【核心问题二:硬件校验和卸载功能不完整】</span></strong></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">为了绕过上述问题,我们被迫采用“单拷贝”的妥协方案:手动<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">rte_memcpy</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>数据到一个大的、连续的单段 mbuf 中。虽然这种方式可以成功发包,但我们发现了第二个严重问题:</span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">硬件卸载功能是残缺的</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">具体表现为:</span></p><ol style="white-space: normal !important; word-break: break-word !important;"><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">我们为 mbuf 设置了完整的卸载标志:</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">m->ol_flags |= RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_UDP_CKSUM;</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">。</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">在发包前,我们将 IP 和 UDP 头部中的校验和字段都清零。</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">抓包分析后发现,只有<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">UDP 校验和</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">被硬件正确计算并填充了。而<span> </span></span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">IP 校验和</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">字段依然是 0,导致该包在网络中被视为无效数据包而被丢弃。</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">我们必须在软件中手动计算 IP 校验和(</span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">ip_h->hdr_checksum = rte_ipv4_cksum(ip_h);</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">),同时保持 UDP 校验和为 0,才能让数据包正确发送并被接收端验证。</span></p></li></ol><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">这证实了<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">cxgbe</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>PMD 虽然声称支持<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">RTE_ETH_TX_OFFLOAD_IPV4_CKSUM</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;">,但在实际工作中</span><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">并未执行 IP 校验和的硬件卸载</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">作为对比,我们需要强调的是:我们描述的这两项核心功能——即零拷贝(多段 mbuf)发送和完整的硬件校验和卸载(IP+UDP),在我们的同一测试平台上,使用 Intel (igc/i40e) 和 Realtek (RTL8125) 的板载网卡时,都完全正常工作。这使我们确信,问题是特定于 Chelsio cxgbe PMD 的。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">【我们的困境】</span></strong></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">这两个问题使我们陷入了绝境:</span></p><ul style="white-space: normal !important; word-break: break-word !important;"><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">理想的零拷贝路径完全不通</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">,导致 DPDK 的核心性能优势无法体现。</span></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">妥协的单拷贝路径效率低下</span></strong><span class="selected" style="white-space: normal !important; word-break: break-word !important;">,不仅引入了<span> </span></span><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">memcpy</span></code><span class="selected" style="white-space: normal !important; word-break: break-word !important;"><span> </span>的 CPU 开销,还必须额外承担 IP 校验和的软件计算开销,使得硬件卸载的价值大打折扣。</span></p></li></ul><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">【我们的问题】</span></strong></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">我们急需您的帮助来澄清以下问题:</span></p><ol style="white-space: normal !important; word-break: break-word !important;"><ul style="white-space: normal !important; word-break: break-word !important;"><li style="white-space: normal !important; word-break: break-word !important;"></li><li><p><code><span class="selected">cxgbe</span></code><span class="selected"> 驱动的这种行为(只卸载 UDP 校验和)是否符合 DPDK 对 PMD 的设计预期?</span></p></li><li><p><span class="selected">DPDK 框架是否有调试机制,可以追踪为何一个明确设置的卸载标志(</span><code><span class="selected">RTE_MBUF_F_TX_IP_CKSUM</span></code><span class="selected">)会被 PMD 忽略且不报告任何错</span></p></li></ul></ol><b style="white-space: normal !important; word-break: break-word !important;"><br style="white-space: normal !important; word-break: break-word !important;"></b><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">解决这些问题对于我们的项目能否成功至关重要。任何能够帮助我们前进的建议或信息,我们将不胜感激。</span></p><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">【我们的环境信息】</span></strong></p><ul style="white-space: normal !important; word-break: break-word !important;"><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">DPDK 版本:25.07</span></strong></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">网卡型号:</span></strong><code style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">Chelsio T520-CR</span></code></p></li><li style="white-space: normal !important; word-break: break-word !important;"><p style="white-space: normal !important; word-break: break-word !important;"><strong style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">操作系统与内核版本:Tinycore64 16.0  kernel 6.6.63</span></strong></p></li></ul><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">感谢您的时间和关注,我们急切地期待您的回复!</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">此致,</span></p><p style="white-space: normal !important; word-break: break-word !important;"><span class="selected" style="white-space: normal !important; word-break: break-word !important;">敬礼!</span></p></span><br></div></div>