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/txgbe/txgbe_rxtx.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c
index f51c6193a9..77ec9f1e39 100644
--- a/drivers/net/txgbe/txgbe_rxtx.c
+++ b/drivers/net/txgbe/txgbe_rxtx.c
@@ -58,6 +58,7 @@ static const u64 TXGBE_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 |
                RTE_MBUF_F_TX_TUNNEL_MASK |
                RTE_MBUF_F_TX_OUTER_IP_CKSUM |
                RTE_MBUF_F_TX_OUTER_UDP_CKSUM |
@@ -366,7 +367,7 @@ txgbe_set_xmit_ctx(struct txgbe_tx_queue *txq,
        type_tucmd_mlhl |= TXGBE_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;
@@ -516,7 +517,7 @@ tx_desc_cksum_flags_to_olinfo(uint64_t ol_flags)
                tmp |= TXGBE_TXD_CC;
                tmp |= TXGBE_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 |= TXGBE_TXD_CC;
                /* implies IPv4 cksum */
                if (ol_flags & RTE_MBUF_F_TX_IPV4)
@@ -536,7 +537,7 @@ tx_desc_ol_flags_to_cmdtype(uint64_t ol_flags)
 
        if (ol_flags & RTE_MBUF_F_TX_VLAN)
                cmdtype |= TXGBE_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 |= TXGBE_TXD_TSE;
        if (ol_flags & RTE_MBUF_F_TX_MACSEC)
                cmdtype |= TXGBE_TXD_LINKSEC;
@@ -586,6 +587,8 @@ tx_desc_ol_flags_to_ptype(uint64_t oflags)
 
        if (oflags & RTE_MBUF_F_TX_TCP_SEG)
                ptype |= (tun ? RTE_PTYPE_INNER_L4_TCP : RTE_PTYPE_L4_TCP);
+       else if (oflags & RTE_MBUF_F_TX_UDP_SEG)
+               ptype |= (tun ? RTE_PTYPE_INNER_L4_UDP : RTE_PTYPE_L4_UDP);
 
        /* Tunnel */
        switch (oflags & RTE_MBUF_F_TX_TUNNEL_MASK) {
@@ -1071,7 +1074,7 @@ txgbe_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
                                 */
@@ -2395,7 +2398,7 @@ txgbe_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_UDP_TNL_TSO  |
                RTE_ETH_TX_OFFLOAD_IP_TNL_TSO   |
                RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO        |
-- 
2.21.0.windows.1

Reply via email to