Skip to contentSkip to conversation

app/testpmd: fix IPv4 checksum

PATCH Superseded Gregory Etelson 3 participants 5 messages Aug 2, 2021 – Aug 4, 2021

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

Fixes b2a9e4a855d0 ("app/testpmd: fix Tx checksum calculation for tunnel")
---
 app/test-pmd/csumonly.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
app/test-pmd/csumonly.c +3 -3
index bd5ad64a57..607c889359 100644
@@ -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 */
Signature · 1 line
2.32.0
#1 lore raw
Quoted 9 lines · Gregory Etelson

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.

Quoted 6 lines

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")

I think this fixes Bug 768?

If yes, please add the tag "Bugzilla ID: 768" to the commit.

Quoted 38 lines
---
 app/test-pmd/csumonly.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
app/test-pmd/csumonly.c +3 -4
index bd5ad64a57..607c889359 100644
@@ -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

#2 lore raw

PATCH v2 1/1 app/testpmd: fix IPv4 checksum

In reply to Gregory Etelson

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

---
v2: add Bugzilla ID

---
 app/test-pmd/csumonly.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
app/test-pmd/csumonly.c +3 -3
index bd5ad64a57..607c889359 100644
@@ -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 */
Signature · 1 line
2.32.0
Acked-by on v2 1/1
#3 lore raw
Quoted 9 lines · Gregory Etelson

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.

Quoted 7 lines

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

Quoted 40 lines

---
v2: add Bugzilla ID

---
 app/test-pmd/csumonly.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
app/test-pmd/csumonly.c +3 -4
index bd5ad64a57..607c889359 100644
@@ -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

#4 lore raw
Quoted 8 lines
Quoted 8 lines

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.

Quoted 8 lines
Quoted 7 lines

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

Applied, thanks.