USO (UDP Segmentation Offload), also known as UFO (UDP Fragmentation Offload), is a hardware offload rarely seen in DPDK. Its implementation is similar to TSO (TCP Segmentation Offload), so the driver enables USO based on existing TSO support.
Note: USO segments UDP packets, requiring hardware to recalculate both IP and UDP checksums due to length change. Thus, USO implicitly requires IP and UDP checksum offloads, same as TSO. Signed-off-by: Zaiyu Wang <[email protected]> --- drivers/net/ngbe/ngbe_rxtx.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/net/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c index 91e215694c..a1389de9c0 100644 --- a/drivers/net/ngbe/ngbe_rxtx.c +++ b/drivers/net/ngbe/ngbe_rxtx.c @@ -30,6 +30,7 @@ static const u64 NGBE_TX_OFFLOAD_MASK = (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_VLAN | RTE_MBUF_F_TX_L4_MASK | RTE_MBUF_F_TX_TCP_SEG | + RTE_MBUF_F_TX_UDP_SEG | NGBE_TX_IEEE1588_TMST); #define NGBE_TX_OFFLOAD_NOTSUP_MASK \ @@ -317,7 +318,7 @@ ngbe_set_xmit_ctx(struct ngbe_tx_queue *txq, type_tucmd_mlhl |= NGBE_TXD_PTID(tx_offload.ptid); /* check if TCP segmentation required for this packet */ - if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) { + if (ol_flags & (RTE_MBUF_F_TX_TCP_SEG | RTE_MBUF_F_TX_UDP_SEG)) { tx_offload_mask.l2_len |= ~0; tx_offload_mask.l3_len |= ~0; tx_offload_mask.l4_len |= ~0; @@ -427,7 +428,7 @@ tx_desc_cksum_flags_to_olinfo(uint64_t ol_flags) tmp |= NGBE_TXD_CC; tmp |= NGBE_TXD_EIPCS; } - if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) { + if (ol_flags & (RTE_MBUF_F_TX_TCP_SEG | RTE_MBUF_F_TX_UDP_SEG)) { tmp |= NGBE_TXD_CC; /* implies IPv4 cksum */ if (ol_flags & RTE_MBUF_F_TX_IPV4) @@ -447,7 +448,7 @@ tx_desc_ol_flags_to_cmdtype(uint64_t ol_flags) if (ol_flags & RTE_MBUF_F_TX_VLAN) cmdtype |= NGBE_TXD_VLE; - if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) + if (ol_flags & (RTE_MBUF_F_TX_TCP_SEG | RTE_MBUF_F_TX_UDP_SEG)) cmdtype |= NGBE_TXD_TSE; return cmdtype; } @@ -483,6 +484,8 @@ tx_desc_ol_flags_to_ptype(uint64_t oflags) if (oflags & RTE_MBUF_F_TX_TCP_SEG) ptype |= RTE_PTYPE_L4_TCP; + else if (oflags & RTE_MBUF_F_TX_UDP_SEG) + ptype |= RTE_PTYPE_L4_UDP; return ptype; } @@ -764,7 +767,7 @@ ngbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, olinfo_status = 0; if (tx_ol_req) { - if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) { + if (ol_flags & (RTE_MBUF_F_TX_TCP_SEG | RTE_MBUF_F_TX_UDP_SEG)) { /* when TSO is on, paylen in descriptor is the * not the packet len but the tcp payload len */ @@ -1991,7 +1994,7 @@ ngbe_get_tx_port_offloads(struct rte_eth_dev *dev) RTE_ETH_TX_OFFLOAD_TCP_CKSUM | RTE_ETH_TX_OFFLOAD_SCTP_CKSUM | RTE_ETH_TX_OFFLOAD_TCP_TSO | - RTE_ETH_TX_OFFLOAD_UDP_TSO | + RTE_ETH_TX_OFFLOAD_UDP_TSO | RTE_ETH_TX_OFFLOAD_MULTI_SEGS; if (hw->is_pf) -- 2.21.0.windows.1

