@@ -577,8 +577,6 @@ static uint64_t
process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
uint64_t tx_offloads, int tso_enabled, struct rte_mbuf *m)
{
- struct rte_ipv4_hdr *ipv4_hdr = outer_l3_hdr;
- struct rte_ipv6_hdr *ipv6_hdr = outer_l3_hdr;
struct rte_udp_hdr *udp_hdr;
uint64_t ol_flags = 0;
@@ -588,6 +586,8 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
if (tx_offloads & RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM) {
ol_flags |= RTE_MBUF_F_TX_OUTER_IP_CKSUM;
} else {
+ struct rte_ipv4_hdr *ipv4_hdr = outer_l3_hdr;
+
ipv4_hdr->hdr_checksum = 0;
ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr);
}
@@ -608,13 +608,6 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info,
/* Skip SW outer UDP checksum generation if HW supports it */
if (tx_offloads & RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM) {
- if (info->outer_ethertype == _htons(RTE_ETHER_TYPE_IPV4))
- udp_hdr->dgram_cksum
- = rte_ipv4_phdr_cksum(ipv4_hdr, ol_flags);
- else
- udp_hdr->dgram_cksum
- = rte_ipv6_phdr_cksum(ipv6_hdr, ol_flags);
-
ol_flags |= RTE_MBUF_F_TX_OUTER_UDP_CKSUM;
return ol_flags;
}
@@ -3616,58 +3616,6 @@ hns3_pkt_need_linearized(struct rte_mbuf *tx_pkts, uint32_t bd_num,
return false;
}
-static bool
-hns3_outer_ipv4_cksum_prepared(struct rte_mbuf *m, uint64_t ol_flags,
- uint32_t *l4_proto)
-{
- struct rte_ipv4_hdr *ipv4_hdr;
- ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *,
- m->outer_l2_len);
- if (ol_flags & RTE_MBUF_F_TX_OUTER_IP_CKSUM)
- ipv4_hdr->hdr_checksum = 0;
- if (ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) {
- struct rte_udp_hdr *udp_hdr;
- /*
- * If OUTER_UDP_CKSUM is support, HW can calculate the pseudo
- * header for TSO packets
- */
- if (ol_flags & RTE_MBUF_F_TX_TCP_SEG)
- return true;
- udp_hdr = rte_pktmbuf_mtod_offset(m, struct rte_udp_hdr *,
- m->outer_l2_len + m->outer_l3_len);
- udp_hdr->dgram_cksum = rte_ipv4_phdr_cksum(ipv4_hdr, ol_flags);
-
- return true;
- }
- *l4_proto = ipv4_hdr->next_proto_id;
- return false;
-}
-
-static bool
-hns3_outer_ipv6_cksum_prepared(struct rte_mbuf *m, uint64_t ol_flags,
- uint32_t *l4_proto)
-{
- struct rte_ipv6_hdr *ipv6_hdr;
- ipv6_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv6_hdr *,
- m->outer_l2_len);
- if (ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) {
- struct rte_udp_hdr *udp_hdr;
- /*
- * If OUTER_UDP_CKSUM is support, HW can calculate the pseudo
- * header for TSO packets
- */
- if (ol_flags & RTE_MBUF_F_TX_TCP_SEG)
- return true;
- udp_hdr = rte_pktmbuf_mtod_offset(m, struct rte_udp_hdr *,
- m->outer_l2_len + m->outer_l3_len);
- udp_hdr->dgram_cksum = rte_ipv6_phdr_cksum(ipv6_hdr, ol_flags);
-
- return true;
- }
- *l4_proto = ipv6_hdr->proto;
- return false;
-}
-
static void
hns3_outer_header_cksum_prepare(struct rte_mbuf *m)
{
@@ -3675,29 +3623,38 @@ hns3_outer_header_cksum_prepare(struct rte_mbuf *m)
uint32_t paylen, hdr_len, l4_proto;
struct rte_udp_hdr *udp_hdr;
- if (!(ol_flags & (RTE_MBUF_F_TX_OUTER_IPV4 | RTE_MBUF_F_TX_OUTER_IPV6)))
+ if (!(ol_flags & (RTE_MBUF_F_TX_OUTER_IPV4 | RTE_MBUF_F_TX_OUTER_IPV6)) &&
+ ((ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) ||
+ !(ol_flags & RTE_MBUF_F_TX_TCP_SEG)))
return;
if (ol_flags & RTE_MBUF_F_TX_OUTER_IPV4) {
- if (hns3_outer_ipv4_cksum_prepared(m, ol_flags, &l4_proto))
- return;
+ struct rte_ipv4_hdr *ipv4_hdr;
+
+ ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *,
+ m->outer_l2_len);
+ l4_proto = ipv4_hdr->next_proto_id;
} else {
- if (hns3_outer_ipv6_cksum_prepared(m, ol_flags, &l4_proto))
- return;
+ struct rte_ipv6_hdr *ipv6_hdr;
+
+ ipv6_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv6_hdr *,
+ m->outer_l2_len);
+ l4_proto = ipv6_hdr->proto;
}
+ if (l4_proto != IPPROTO_UDP)
+ return;
+
/* driver should ensure the outer udp cksum is 0 for TUNNEL TSO */
- if (l4_proto == IPPROTO_UDP && (ol_flags & RTE_MBUF_F_TX_TCP_SEG)) {
- hdr_len = m->l2_len + m->l3_len + m->l4_len;
- hdr_len += m->outer_l2_len + m->outer_l3_len;
- paylen = m->pkt_len - hdr_len;
- if (paylen <= m->tso_segsz)
- return;
- udp_hdr = rte_pktmbuf_mtod_offset(m, struct rte_udp_hdr *,
- m->outer_l2_len +
- m->outer_l3_len);
- udp_hdr->dgram_cksum = 0;
- }
+ hdr_len = m->l2_len + m->l3_len + m->l4_len;
+ hdr_len += m->outer_l2_len + m->outer_l3_len;
+ paylen = m->pkt_len - hdr_len;
+ if (paylen <= m->tso_segsz)
+ return;
+ udp_hdr = rte_pktmbuf_mtod_offset(m, struct rte_udp_hdr *,
+ m->outer_l2_len +
+ m->outer_l3_len);
+ udp_hdr->dgram_cksum = 0;
}
static int
@@ -121,7 +121,8 @@ rte_net_intel_cksum_flags_prepare(struct rte_mbuf *m, uint64_t ol_flags)
* no offloads are requested.
*/
if (!(ol_flags & (RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_L4_MASK | RTE_MBUF_F_TX_TCP_SEG |
- RTE_MBUF_F_TX_UDP_SEG | RTE_MBUF_F_TX_OUTER_IP_CKSUM)))
+ RTE_MBUF_F_TX_UDP_SEG | RTE_MBUF_F_TX_OUTER_IP_CKSUM |
+ RTE_MBUF_F_TX_OUTER_UDP_CKSUM)))
return 0;
if (ol_flags & (RTE_MBUF_F_TX_OUTER_IPV4 | RTE_MBUF_F_TX_OUTER_IPV6)) {
@@ -135,6 +136,21 @@ rte_net_intel_cksum_flags_prepare(struct rte_mbuf *m, uint64_t ol_flags)
struct rte_ipv4_hdr *, m->outer_l2_len);
ipv4_hdr->hdr_checksum = 0;
}
+ if (ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) {
+ if (ol_flags & RTE_MBUF_F_TX_OUTER_IPV4) {
+ ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *,
+ m->outer_l2_len);
+ udp_hdr = (struct rte_udp_hdr *)((char *)ipv4_hdr +
+ m->outer_l3_len);
+ udp_hdr->dgram_cksum = rte_ipv4_phdr_cksum(ipv4_hdr, m->ol_flags);
+ } else {
+ ipv6_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv6_hdr *,
+ m->outer_l2_len);
+ udp_hdr = rte_pktmbuf_mtod_offset(m, struct rte_udp_hdr *,
+ m->outer_l2_len + m->outer_l3_len);
+ udp_hdr->dgram_cksum = rte_ipv6_phdr_cksum(ipv6_hdr, m->ol_flags);
+ }
+ }
}
/*