Skip to content

Commit

Permalink
net/txgbe: fix GRE tunnel packet checksum
Browse files Browse the repository at this point in the history
[ upstream commit 5bbaf75ed6df2605a8cf780057211f2592add80d ]

Fix transmit context descriptor for GRE tunnel packet to make the
hardware compute the checksum successfully.

Fixes: e5ece1f ("net/txgbe: fix VXLAN-GPE packet checksum")

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
  • Loading branch information
Jiawen Wu authored and kevintraynor committed Oct 31, 2023
1 parent 2a45502 commit 289d492
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 27 deletions.
16 changes: 0 additions & 16 deletions drivers/net/txgbe/txgbe_ptypes.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,6 @@ txgbe_encode_ptype_tunnel(u32 ptype)
ptid |= TXGBE_PTID_TUN_EI;
break;
case RTE_PTYPE_TUNNEL_GRE:
ptid |= TXGBE_PTID_TUN_EIG;
break;
case RTE_PTYPE_TUNNEL_VXLAN:
case RTE_PTYPE_TUNNEL_VXLAN_GPE:
case RTE_PTYPE_TUNNEL_NVGRE:
Expand All @@ -332,20 +330,6 @@ txgbe_encode_ptype_tunnel(u32 ptype)
return ptid;
}

switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
case RTE_PTYPE_INNER_L2_ETHER:
ptid |= TXGBE_PTID_TUN_EIGM;
break;
case RTE_PTYPE_INNER_L2_ETHER_VLAN:
ptid |= TXGBE_PTID_TUN_EIGMV;
break;
case RTE_PTYPE_INNER_L2_ETHER_QINQ:
ptid |= TXGBE_PTID_TUN_EIGMV;
break;
default:
break;
}

switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
case RTE_PTYPE_INNER_L3_IPV4:
case RTE_PTYPE_INNER_L3_IPV4_EXT:
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/txgbe/txgbe_ptypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -348,4 +348,9 @@ struct txgbe_nvgrehdr {
__be32 tni;
};

struct txgbe_grehdr {
__be16 flags;
__be16 proto;
};

#endif /* _TXGBE_PTYPE_H_ */
23 changes: 12 additions & 11 deletions drivers/net/txgbe/txgbe_rxtx.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,6 @@ tx_desc_ol_flags_to_ptype(uint64_t oflags)
ptype |= RTE_PTYPE_L2_ETHER |
RTE_PTYPE_L3_IPV4 |
RTE_PTYPE_TUNNEL_GRE;
ptype |= RTE_PTYPE_INNER_L2_ETHER;
break;
case RTE_MBUF_F_TX_TUNNEL_GENEVE:
ptype |= RTE_PTYPE_L2_ETHER |
Expand Down Expand Up @@ -705,22 +704,24 @@ txgbe_get_tun_len(struct rte_mbuf *mbuf)
static inline uint8_t
txgbe_parse_tun_ptid(struct rte_mbuf *tx_pkt)
{
uint64_t l2_none, l2_mac, l2_mac_vlan;
uint64_t l2_vxlan, l2_vxlan_mac, l2_vxlan_mac_vlan;
uint64_t l2_gre, l2_gre_mac, l2_gre_mac_vlan;
uint8_t ptid = 0;

if ((tx_pkt->ol_flags & (RTE_MBUF_F_TX_TUNNEL_VXLAN |
RTE_MBUF_F_TX_TUNNEL_VXLAN_GPE)) == 0)
return ptid;
l2_vxlan = sizeof(struct txgbe_udphdr) + sizeof(struct txgbe_vxlanhdr);
l2_vxlan_mac = l2_vxlan + sizeof(struct rte_ether_hdr);
l2_vxlan_mac_vlan = l2_vxlan_mac + sizeof(struct rte_vlan_hdr);

l2_none = sizeof(struct txgbe_udphdr) + sizeof(struct txgbe_vxlanhdr);
l2_mac = l2_none + sizeof(struct rte_ether_hdr);
l2_mac_vlan = l2_mac + sizeof(struct rte_vlan_hdr);
l2_gre = sizeof(struct txgbe_grehdr);
l2_gre_mac = l2_gre + sizeof(struct rte_ether_hdr);
l2_gre_mac_vlan = l2_gre_mac + sizeof(struct rte_vlan_hdr);

if (tx_pkt->l2_len == l2_none)
if (tx_pkt->l2_len == l2_vxlan || tx_pkt->l2_len == l2_gre)
ptid = TXGBE_PTID_TUN_EIG;
else if (tx_pkt->l2_len == l2_mac)
else if (tx_pkt->l2_len == l2_vxlan_mac || tx_pkt->l2_len == l2_gre_mac)
ptid = TXGBE_PTID_TUN_EIGM;
else if (tx_pkt->l2_len == l2_mac_vlan)
else if (tx_pkt->l2_len == l2_vxlan_mac_vlan ||
tx_pkt->l2_len == l2_gre_mac_vlan)
ptid = TXGBE_PTID_TUN_EIGMV;

return ptid;
Expand Down

0 comments on commit 289d492

Please sign in to comment.