[v2] app/testpmd: fix IPv4 checksum

Message ID 20210802181316.7676-1-getelson@nvidia.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series [v2] app/testpmd: fix IPv4 checksum |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/github-robot success github build: passed
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-abi-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS

Commit Message

Gregory Etelson Aug. 2, 2021, 6:13 p.m. UTC
  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.

Fixes: b2a9e4a855d0 ("app/testpmd: fix Tx checksum calculation for tunnel")
Bugzilla ID: 768

Signed-off-by: Gregory Etelson <getelson@nvidia.com>
---
v2: add Bugzilla ID
---
 app/test-pmd/csumonly.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
  

Comments

Ajit Khaparde Aug. 3, 2021, 1:33 a.m. UTC | #1
On Mon, Aug 2, 2021 at 11:13 AM Gregory Etelson <getelson@nvidia.com> wrote:
>
> 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.
>
> Fixes: b2a9e4a855d0 ("app/testpmd: fix Tx checksum calculation for tunnel")
> Bugzilla ID: 768
>
> Signed-off-by: Gregory Etelson <getelson@nvidia.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>

> ---
> v2: add Bugzilla ID
> ---
>  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.32.0
>
  
Thomas Monjalon Aug. 4, 2021, 9:38 a.m. UTC | #2
> > 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.
> >
> > Fixes: b2a9e4a855d0 ("app/testpmd: fix Tx checksum calculation for tunnel")
> > Bugzilla ID: 768
> >
> > Signed-off-by: Gregory Etelson <getelson@nvidia.com>
> Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>

Applied, thanks.
  

Patch

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 */