The non-standard RTE_MBUF_F_TX_TUNNEL_UDP tunnel type (UDP encapsulation carrying either VXLAN or GENEVE) is not handled: txgbe_set_xmit_ctx() falls into the "unknown tunnel type" case and txgbe_get_tun_len() cannot compute the tunnel length, so tunneled packets are sent with a wrong descriptor or dropped.
Handle RTE_MBUF_F_TX_TUNNEL_UDP by parsing the UDP destination port (6081 -> GENEVE, otherwise VXLAN) to select the inner tunnel type, so the correct tunnel length and packet type are reported. Cc: [email protected] Signed-off-by: Zaiyu Wang <[email protected]> --- drivers/net/txgbe/txgbe_rxtx.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c index a295666f9d..cd958b4aab 100644 --- a/drivers/net/txgbe/txgbe_rxtx.c +++ b/drivers/net/txgbe/txgbe_rxtx.c @@ -419,6 +419,7 @@ txgbe_set_xmit_ctx(struct txgbe_tx_queue *txq, break; case RTE_MBUF_F_TX_TUNNEL_VXLAN: case RTE_MBUF_F_TX_TUNNEL_VXLAN_GPE: + case RTE_MBUF_F_TX_TUNNEL_UDP: case RTE_MBUF_F_TX_TUNNEL_GENEVE: tunnel_seed |= TXGBE_TXD_ETYPE_UDP; break; @@ -593,6 +594,7 @@ tx_desc_ol_flags_to_ptype(uint64_t oflags) switch (oflags & RTE_MBUF_F_TX_TUNNEL_MASK) { case RTE_MBUF_F_TX_TUNNEL_VXLAN: case RTE_MBUF_F_TX_TUNNEL_VXLAN_GPE: + case RTE_MBUF_F_TX_TUNNEL_UDP: ptype |= RTE_PTYPE_TUNNEL_GRENAT; break; case RTE_MBUF_F_TX_TUNNEL_GRE: @@ -713,8 +715,21 @@ txgbe_get_tun_len(struct rte_mbuf *mbuf) const struct txgbe_genevehdr *gh; const struct txgbe_grehdr *grh; struct txgbe_grehdr grehdr; + struct txgbe_udphdr udphdr; + const struct txgbe_udphdr *uh; uint8_t tun_len; + /* Check for UDP tunneling */ + if ((mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) == RTE_MBUF_F_TX_TUNNEL_UDP) { + mbuf->ol_flags &= ~RTE_MBUF_F_TX_TUNNEL_UDP; + uh = rte_pktmbuf_read(mbuf, mbuf->outer_l2_len + mbuf->outer_l3_len, + sizeof(udphdr), &udphdr); + if (uh->dest == rte_cpu_to_be_16(6081)) + mbuf->ol_flags |= RTE_MBUF_F_TX_TUNNEL_GENEVE; + else + mbuf->ol_flags |= RTE_MBUF_F_TX_TUNNEL_VXLAN; + } + switch (mbuf->ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK) { case RTE_MBUF_F_TX_TUNNEL_IPIP: tun_len = 0; -- 2.55.0.windows.2

