From de73c8ac50681a0b9221407a100a2c578f7e6ad3 Mon Sep 17 00:00:00 2001 From: Gregory Etelson Date: Mon, 2 Aug 2021 21:13:16 +0300 Subject: [PATCH] app/testpmd: fix IPv4 checksum UDP protocol reserves 0 checksum value for special purposes. Other protocols, like IPv4, TCP and SCTP must calculate checksum value in software or offload checksum calculation to hardware. If IPv4 TX checksum offload was off and header checksum was set to 0, testpmd csum engine did not calculate checksum value for IPv4, TCP and SCTP. The patch always calculates IPv4, TCP and SCTP TX checksums if it is not offloaded. Bugzilla ID: 768 Fixes: b2a9e4a855d0 ("app/testpmd: fix Tx checksum calculation for tunnel") Cc: stable@dpdk.org Signed-off-by: Gregory Etelson Acked-by: Ajit Khaparde --- app/test-pmd/csumonly.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index bd5ad64a57..607c889359 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -487,7 +487,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, } else { if (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) { ol_flags |= PKT_TX_IP_CKSUM; - } else if (ipv4_hdr->hdr_checksum != 0) { + } else { ipv4_hdr->hdr_checksum = 0; ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr); @@ -519,7 +519,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, ol_flags |= PKT_TX_TCP_SEG; else if (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) { ol_flags |= PKT_TX_TCP_CKSUM; - } else if (tcp_hdr->cksum != 0) { + } else { tcp_hdr->cksum = 0; tcp_hdr->cksum = get_udptcp_checksum(l3_hdr, tcp_hdr, @@ -535,7 +535,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, if ((tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) && ((ipv4_hdr->total_length & 0x3) == 0)) { ol_flags |= PKT_TX_SCTP_CKSUM; - } else if (sctp_hdr->cksum != 0) { + } else { sctp_hdr->cksum = 0; /* XXX implement CRC32c, example available in * RFC3309 */ -- 2.20.1