net/mlx5: zero encap UDP csum for IPv4 too

Message ID 20231113072941.6914-1-bingz@nvidia.com (mailing list archive)
State Accepted, archived
Delegated to: Raslan Darawsheh
Headers
Series net/mlx5: zero encap UDP csum for IPv4 too |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/loongarch-compilation success Compilation OK
ci/loongarch-unit-testing success Unit Testing PASS
ci/github-robot: build success github build: passed
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-compile-amd64-testing success Testing PASS
ci/iol-unit-amd64-testing success Testing PASS
ci/iol-unit-arm64-testing success Testing PASS
ci/iol-compile-arm64-testing success Testing PASS
ci/iol-sample-apps-testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS

Commit Message

Bing Zhao Nov. 13, 2023, 7:29 a.m. UTC
  From: Eli Britstein <elibr@nvidia.com>

A zero UDP csum indicates it should not be validated by the receiver.
The HW may not calculate UDP csum after encap.

The cited commit made sure the UDP csum is zero for UDP over IPv6,
mistakenly not handling UDP over IPv4. Fix it.

Fixes: bf1d7d9a033a ("net/mlx5: zero out UDP checksum in encapsulation")
Cc: stable@dpdk.org

Signed-off-by: Eli Britstein <elibr@nvidia.com>
---
 drivers/net/mlx5/mlx5_flow_dv.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)
  

Comments

Suanming Mou Nov. 13, 2023, 8:01 a.m. UTC | #1
Hi,

> -----Original Message-----
> From: Bing Zhao <bingz@nvidia.com>
> Sent: Monday, November 13, 2023 3:30 PM
> To: Matan Azrad <matan@nvidia.com>; Slava Ovsiienko
> <viacheslavo@nvidia.com>; Raslan Darawsheh <rasland@nvidia.com>; Suanming
> Mou <suanmingm@nvidia.com>; Ori Kam <orika@nvidia.com>
> Cc: dev@dpdk.org; Eli Britstein <elibr@nvidia.com>; stable@dpdk.org
> Subject: [PATCH] net/mlx5: zero encap UDP csum for IPv4 too
> 
> From: Eli Britstein <elibr@nvidia.com>
> 
> A zero UDP csum indicates it should not be validated by the receiver.
> The HW may not calculate UDP csum after encap.
> 
> The cited commit made sure the UDP csum is zero for UDP over IPv6, mistakenly
> not handling UDP over IPv4. Fix it.
> 
> Fixes: bf1d7d9a033a ("net/mlx5: zero out UDP checksum in encapsulation")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Eli Britstein <elibr@nvidia.com>

Acked-by: Suanming Mou <suanmingm@nvidia.com>

> ---
>  drivers/net/mlx5/mlx5_flow_dv.c | 26 +++++++++++++++-----------
>  1 file changed, 15 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
> index 9753af2cb1..115d730317 100644
> --- a/drivers/net/mlx5/mlx5_flow_dv.c
> +++ b/drivers/net/mlx5/mlx5_flow_dv.c
> @@ -4713,6 +4713,7 @@ flow_dv_zero_encap_udp_csum(void *data, struct
> rte_flow_error *error)  {
>  	struct rte_ether_hdr *eth = NULL;
>  	struct rte_vlan_hdr *vlan = NULL;
> +	struct rte_ipv4_hdr *ipv4 = NULL;
>  	struct rte_ipv6_hdr *ipv6 = NULL;
>  	struct rte_udp_hdr *udp = NULL;
>  	char *next_hdr;
> @@ -4729,24 +4730,27 @@ flow_dv_zero_encap_udp_csum(void *data, struct
> rte_flow_error *error)
>  		next_hdr += sizeof(struct rte_vlan_hdr);
>  	}
> 
> -	/* HW calculates IPv4 csum. no need to proceed */
> -	if (proto == RTE_ETHER_TYPE_IPV4)
> -		return 0;
> -
>  	/* non IPv4/IPv6 header. not supported */
> -	if (proto != RTE_ETHER_TYPE_IPV6) {
> +	if (proto != RTE_ETHER_TYPE_IPV4 && proto != RTE_ETHER_TYPE_IPV6)
> {
>  		return rte_flow_error_set(error, ENOTSUP,
>  					  RTE_FLOW_ERROR_TYPE_ACTION,
>  					  NULL, "Cannot offload non
> IPv4/IPv6");
>  	}
> 
> -	ipv6 = (struct rte_ipv6_hdr *)next_hdr;
> -
> -	/* ignore non UDP */
> -	if (ipv6->proto != IPPROTO_UDP)
> -		return 0;
> +	if (proto == RTE_ETHER_TYPE_IPV4) {
> +		ipv4 = (struct rte_ipv4_hdr *)next_hdr;
> +		/* ignore non UDP */
> +		if (ipv4->next_proto_id != IPPROTO_UDP)
> +			return 0;
> +		udp = (struct rte_udp_hdr *)(ipv4 + 1);
> +	} else {
> +		ipv6 = (struct rte_ipv6_hdr *)next_hdr;
> +		/* ignore non UDP */
> +		if (ipv6->proto != IPPROTO_UDP)
> +			return 0;
> +		udp = (struct rte_udp_hdr *)(ipv6 + 1);
> +	}
> 
> -	udp = (struct rte_udp_hdr *)(ipv6 + 1);
>  	udp->dgram_cksum = 0;
> 
>  	return 0;
> --
> 2.34.1
  
Raslan Darawsheh Nov. 14, 2023, 8:14 a.m. UTC | #2
Hi,

> -----Original Message-----
> From: Bing Zhao <bingz@nvidia.com>
> Sent: Monday, November 13, 2023 9:30 AM
> To: Matan Azrad <matan@nvidia.com>; Slava Ovsiienko
> <viacheslavo@nvidia.com>; Raslan Darawsheh <rasland@nvidia.com>;
> Suanming Mou <suanmingm@nvidia.com>; Ori Kam <orika@nvidia.com>
> Cc: dev@dpdk.org; Eli Britstein <elibr@nvidia.com>; stable@dpdk.org
> Subject: [PATCH] net/mlx5: zero encap UDP csum for IPv4 too
> 
> From: Eli Britstein <elibr@nvidia.com>
> 
> A zero UDP csum indicates it should not be validated by the receiver.
> The HW may not calculate UDP csum after encap.
> 
> The cited commit made sure the UDP csum is zero for UDP over IPv6,
> mistakenly not handling UDP over IPv4. Fix it.
> 
> Fixes: bf1d7d9a033a ("net/mlx5: zero out UDP checksum in encapsulation")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Eli Britstein <elibr@nvidia.com>
> ---

Patch applied to next-net-mlx,

Kindest regards
Raslan Darawsheh
  

Patch

diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 9753af2cb1..115d730317 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -4713,6 +4713,7 @@  flow_dv_zero_encap_udp_csum(void *data, struct rte_flow_error *error)
 {
 	struct rte_ether_hdr *eth = NULL;
 	struct rte_vlan_hdr *vlan = NULL;
+	struct rte_ipv4_hdr *ipv4 = NULL;
 	struct rte_ipv6_hdr *ipv6 = NULL;
 	struct rte_udp_hdr *udp = NULL;
 	char *next_hdr;
@@ -4729,24 +4730,27 @@  flow_dv_zero_encap_udp_csum(void *data, struct rte_flow_error *error)
 		next_hdr += sizeof(struct rte_vlan_hdr);
 	}
 
-	/* HW calculates IPv4 csum. no need to proceed */
-	if (proto == RTE_ETHER_TYPE_IPV4)
-		return 0;
-
 	/* non IPv4/IPv6 header. not supported */
-	if (proto != RTE_ETHER_TYPE_IPV6) {
+	if (proto != RTE_ETHER_TYPE_IPV4 && proto != RTE_ETHER_TYPE_IPV6) {
 		return rte_flow_error_set(error, ENOTSUP,
 					  RTE_FLOW_ERROR_TYPE_ACTION,
 					  NULL, "Cannot offload non IPv4/IPv6");
 	}
 
-	ipv6 = (struct rte_ipv6_hdr *)next_hdr;
-
-	/* ignore non UDP */
-	if (ipv6->proto != IPPROTO_UDP)
-		return 0;
+	if (proto == RTE_ETHER_TYPE_IPV4) {
+		ipv4 = (struct rte_ipv4_hdr *)next_hdr;
+		/* ignore non UDP */
+		if (ipv4->next_proto_id != IPPROTO_UDP)
+			return 0;
+		udp = (struct rte_udp_hdr *)(ipv4 + 1);
+	} else {
+		ipv6 = (struct rte_ipv6_hdr *)next_hdr;
+		/* ignore non UDP */
+		if (ipv6->proto != IPPROTO_UDP)
+			return 0;
+		udp = (struct rte_udp_hdr *)(ipv6 + 1);
+	}
 
-	udp = (struct rte_udp_hdr *)(ipv6 + 1);
 	udp->dgram_cksum = 0;
 
 	return 0;