[PATCH] net/nfp: add support of UDP fragmentation offload
Chaoyong He
chaoyong.he at corigine.com
Sat Feb 17 02:54:10 CET 2024
Add the support of UDP fragmentation offload feature.
Signed-off-by: Chaoyong He <chaoyong.he at corigine.com>
Reviewed-by: Long Wu <long.wu at corigine.com>
Reviewed-by: Peng Zhang <peng.zhang at corigine.com>
---
drivers/common/nfp/nfp_common_ctrl.h | 1 +
drivers/net/nfp/nfd3/nfp_nfd3_dp.c | 7 ++++++-
drivers/net/nfp/nfdk/nfp_nfdk_dp.c | 8 +++++---
drivers/net/nfp/nfp_net_common.c | 8 ++++++--
4 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/drivers/common/nfp/nfp_common_ctrl.h b/drivers/common/nfp/nfp_common_ctrl.h
index d65fcd17cb..93722bc350 100644
--- a/drivers/common/nfp/nfp_common_ctrl.h
+++ b/drivers/common/nfp/nfp_common_ctrl.h
@@ -226,6 +226,7 @@ struct nfp_net_fw_ver {
#define NFP_NET_CFG_CTRL_MULTI_PF (0x1 << 5)
#define NFP_NET_CFG_CTRL_FLOW_STEER (0x1 << 8) /**< Flow Steering */
#define NFP_NET_CFG_CTRL_IN_ORDER (0x1 << 11) /**< Virtio in-order flag */
+#define NFP_NET_CFG_CTRL_USO (0x1 << 16) /**< UDP segmentation offload */
#define NFP_NET_CFG_CAP_WORD1 0x00a4
diff --git a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c
index fbc2dbedf4..ee120f55ab 100644
--- a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c
+++ b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c
@@ -34,7 +34,8 @@ nfp_net_nfd3_tx_tso(struct nfp_net_txq *txq,
goto clean_txd;
ol_flags = mb->ol_flags;
- if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) == 0)
+ if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) == 0 &&
+ (ol_flags & RTE_MBUF_F_TX_UDP_SEG) == 0)
goto clean_txd;
txd->l3_offset = mb->l2_len;
@@ -78,6 +79,10 @@ nfp_net_nfd3_tx_cksum(struct nfp_net_txq *txq,
if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) != 0)
txd->flags |= NFD3_DESC_TX_TCP_CSUM;
+ /* Set UDP csum offload if UFO enabled. */
+ if ((ol_flags & RTE_MBUF_F_TX_UDP_SEG) != 0)
+ txd->flags |= NFD3_DESC_TX_UDP_CSUM;
+
/* IPv6 does not need checksum */
if ((ol_flags & RTE_MBUF_F_TX_IP_CKSUM) != 0)
txd->flags |= NFD3_DESC_TX_IP4_CSUM;
diff --git a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c
index 72efbffb42..a1c6ecdfe5 100644
--- a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c
+++ b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c
@@ -28,8 +28,9 @@ nfp_net_nfdk_tx_cksum(struct nfp_net_txq *txq,
ol_flags = mb->ol_flags;
- /* Set TCP csum offload if TSO enabled. */
- if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) != 0)
+ /* Set L4 csum offload if TSO/UFO enabled. */
+ if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) != 0 ||
+ (ol_flags & RTE_MBUF_F_TX_UDP_SEG) != 0)
flags |= NFDK_DESC_TX_L4_CSUM;
if ((ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) != 0)
@@ -61,7 +62,8 @@ nfp_net_nfdk_tx_tso(struct nfp_net_txq *txq,
return txd.raw;
ol_flags = mb->ol_flags;
- if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) == 0)
+ if ((ol_flags & RTE_MBUF_F_TX_TCP_SEG) == 0 &&
+ (ol_flags & RTE_MBUF_F_TX_UDP_SEG) == 0)
return txd.raw;
txd.l3_offset = mb->l2_len;
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 72c9a41b00..99c319eb2d 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -312,7 +312,7 @@ nfp_net_log_device_information(const struct nfp_net_hw *hw)
hw->ver.major, hw->ver.minor, hw->max_mtu);
PMD_INIT_LOG(INFO, "CAP: %#x", cap);
- PMD_INIT_LOG(INFO, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ PMD_INIT_LOG(INFO, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
cap & NFP_NET_CFG_CTRL_ENABLE ? "ENABLE " : "",
cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "",
cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "",
@@ -340,7 +340,8 @@ nfp_net_log_device_information(const struct nfp_net_hw *hw)
cap & NFP_NET_CFG_CTRL_LSO2 ? "TSOv2 " : "",
cap & NFP_NET_CFG_CTRL_RSS2 ? "RSSv2 " : "",
cap & NFP_NET_CFG_CTRL_CSUM_COMPLETE ? "CSUM " : "",
- cap & NFP_NET_CFG_CTRL_LIVE_ADDR ? "LIVE_ADDR " : "");
+ cap & NFP_NET_CFG_CTRL_LIVE_ADDR ? "LIVE_ADDR " : "",
+ cap & NFP_NET_CFG_CTRL_USO ? "USO" : "");
PMD_INIT_LOG(INFO, "CAP_WORD1: %#x", cap_ext);
PMD_INIT_LOG(INFO, "%s%s%s%s%s%s%s",
@@ -537,6 +538,7 @@ nfp_check_offloads(struct rte_eth_dev *dev)
/* LSO offload */
if ((tx_offload & RTE_ETH_TX_OFFLOAD_TCP_TSO) != 0 ||
+ (tx_offload & RTE_ETH_TX_OFFLOAD_UDP_TSO) != 0 ||
(tx_offload & RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO) != 0) {
if ((cap & NFP_NET_CFG_CTRL_LSO) != 0)
ctrl |= NFP_NET_CFG_CTRL_LSO;
@@ -1214,6 +1216,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
if ((cap & NFP_NET_CFG_CTRL_LSO_ANY) != 0) {
dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_TCP_TSO;
+ if ((cap & NFP_NET_CFG_CTRL_USO) != 0)
+ dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_UDP_TSO;
if ((cap & NFP_NET_CFG_CTRL_VXLAN) != 0)
dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO;
}
--
2.39.1
More information about the dev
mailing list