From: Fei Qin <fei....@corigine.com> The device doesn't support outer udp csum offload. Add the support for VXLAN inner TSO with noudpcsum.
Signed-off-by: Fei Qin <fei....@corigine.com> Reviewed-by: Chaoyong He <chaoyong...@corigine.com> Reviewed-by: Niklas Söderlund <niklas.soderl...@corigine.com> --- drivers/net/nfp/nfp_common.c | 8 ++++++-- drivers/net/nfp/nfp_ethdev.c | 6 ++++-- drivers/net/nfp/nfp_rxtx.c | 13 +++++++++++++ drivers/net/nfp/nfp_rxtx.h | 15 +++++++++++++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c index 4f21d9978d..ddf5f131dd 100644 --- a/drivers/net/nfp/nfp_common.c +++ b/drivers/net/nfp/nfp_common.c @@ -440,7 +440,8 @@ nfp_check_offloads(struct rte_eth_dev *dev) ctrl |= NFP_NET_CFG_CTRL_TXCSUM; /* LSO offload */ - if (txmode->offloads & RTE_ETH_TX_OFFLOAD_TCP_TSO) { + if (txmode->offloads & RTE_ETH_TX_OFFLOAD_TCP_TSO || + txmode->offloads & RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO) { if (hw->cap & NFP_NET_CFG_CTRL_LSO) ctrl |= NFP_NET_CFG_CTRL_LSO; else @@ -881,8 +882,11 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) RTE_ETH_TX_OFFLOAD_UDP_CKSUM | RTE_ETH_TX_OFFLOAD_TCP_CKSUM; - if (hw->cap & NFP_NET_CFG_CTRL_LSO_ANY) + if (hw->cap & NFP_NET_CFG_CTRL_LSO_ANY) { dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_TCP_TSO; + if (hw->cap & NFP_NET_CFG_CTRL_VXLAN) + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO; + } if (hw->cap & NFP_NET_CFG_CTRL_GATHER) dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS; diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index 31201c0197..a0d12600a3 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -146,8 +146,10 @@ nfp_net_start(struct rte_eth_dev *dev) update |= NFP_NET_CFG_UPDATE_GEN | NFP_NET_CFG_UPDATE_RING; /* Enable vxlan */ - new_ctrl |= NFP_NET_CFG_CTRL_VXLAN; - update |= NFP_NET_CFG_UPDATE_VXLAN; + if (hw->cap & NFP_NET_CFG_CTRL_VXLAN) { + new_ctrl |= NFP_NET_CFG_CTRL_VXLAN; + update |= NFP_NET_CFG_UPDATE_VXLAN; + } if (hw->cap & NFP_NET_CFG_CTRL_RINGCFG) new_ctrl |= NFP_NET_CFG_CTRL_RINGCFG; diff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c index 4a7574fd65..ca146d5cfe 100644 --- a/drivers/net/nfp/nfp_rxtx.c +++ b/drivers/net/nfp/nfp_rxtx.c @@ -1368,6 +1368,13 @@ nfp_net_nfdk_tx_cksum(struct nfp_net_txq *txq, struct rte_mbuf *mb, ol_flags = mb->ol_flags; + /* Set TCP csum offload if TSO enabled. */ + if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) + flags |= NFDK_DESC_TX_L4_CSUM; + + if (ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) + flags |= NFDK_DESC_TX_ENCAP; + /* IPv6 does not need checksum */ if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) flags |= NFDK_DESC_TX_L3_CSUM; @@ -1400,6 +1407,12 @@ nfp_net_nfdk_tx_tso(struct nfp_net_txq *txq, struct rte_mbuf *mb) txd.lso_hdrlen = mb->l2_len + mb->l3_len + mb->l4_len; txd.lso_totsegs = (mb->pkt_len + mb->tso_segsz) / mb->tso_segsz; + if (ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) { + txd.l3_offset += mb->outer_l2_len + mb->outer_l3_len; + txd.l4_offset += mb->outer_l2_len + mb->outer_l3_len; + txd.lso_hdrlen += mb->outer_l2_len + mb->outer_l3_len; + } + return txd.raw; clean_txd: diff --git a/drivers/net/nfp/nfp_rxtx.h b/drivers/net/nfp/nfp_rxtx.h index f9223b8912..c90bd13267 100644 --- a/drivers/net/nfp/nfp_rxtx.h +++ b/drivers/net/nfp/nfp_rxtx.h @@ -122,6 +122,7 @@ struct nfp_meta_parsed { #define NFDK_DESC_TX_TYPE_GATHER 1 #define NFDK_DESC_TX_EOP BIT(14) #define NFDK_DESC_TX_CHAIN_META BIT(3) +#define NFDK_DESC_TX_ENCAP BIT(2) #define NFDK_DESC_TX_L4_CSUM BIT(1) #define NFDK_DESC_TX_L3_CSUM BIT(0) @@ -468,6 +469,13 @@ nfp_net_nfd3_tx_tso(struct nfp_net_txq *txq, txd->l3_offset = mb->l2_len; txd->l4_offset = mb->l2_len + mb->l3_len; txd->lso_hdrlen = mb->l2_len + mb->l3_len + mb->l4_len; + + if (ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) { + txd->l3_offset += mb->outer_l2_len + mb->outer_l3_len; + txd->l4_offset += mb->outer_l2_len + mb->outer_l3_len; + txd->lso_hdrlen += mb->outer_l2_len + mb->outer_l3_len; + } + txd->mss = rte_cpu_to_le_16(mb->tso_segsz); txd->flags = PCIE_DESC_TX_LSO; return; @@ -493,10 +501,17 @@ nfp_net_nfd3_tx_cksum(struct nfp_net_txq *txq, struct nfp_net_nfd3_tx_desc *txd, ol_flags = mb->ol_flags; + /* Set TCP csum offload if TSO enabled. */ + if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) + txd->flags |= PCIE_DESC_TX_TCP_CSUM; + /* IPv6 does not need checksum */ if (ol_flags & RTE_MBUF_F_TX_IP_CKSUM) txd->flags |= PCIE_DESC_TX_IP4_CSUM; + if (ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) + txd->flags |= PCIE_DESC_TX_ENCAP; + switch (ol_flags & RTE_MBUF_F_TX_L4_MASK) { case RTE_MBUF_F_TX_UDP_CKSUM: txd->flags |= PCIE_DESC_TX_UDP_CSUM; -- 2.29.3