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

Reply via email to