app/testpmd: fix IPv4 checksum
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.
--- app/test-pmd/csumonly.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
app/test-pmd/csumonly.c +3 -3
@@ -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
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")Signed-off-by Gregory Etelson <[email protected]>
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@@ -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
PATCH v2 1/1 app/testpmd: fix IPv4 checksum
In reply to Gregory EtelsonUDP 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
---
v2: add Bugzilla ID
--- app/test-pmd/csumonly.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
app/test-pmd/csumonly.c +3 -3
@@ -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
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
Signed-off-by Gregory Etelson <[email protected]>
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@@ -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
AppliedQuoted 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
Signed-off-by Gregory Etelson <[email protected]>Acked-by Ajit Khaparde <[email protected]>
Applied, thanks.