Skip to contentSkip to conversation

net/mlx5: zero encap UDP csum for IPv4 too

PATCH In review Bing Zhao 3 participants 3 messages Nov 13, 2023 – Nov 14, 2023 Network drivers

lore
Share & tools
lore

Bing Zhao

author
#0 lore raw

PATCH 1/1 net/mlx5: zero encap UDP csum for IPv4 too

From: Eli Britstein <[email protected]>

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")
---
 drivers/net/mlx5/mlx5_flow_dv.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)
drivers/net/mlx5/mlx5_flow_dv.c +15 -11
index 9753af2cb1..115d730317 100644
@@ -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;
Signature · 1 line
2.34.1
Acked-by on v1 1/1
#1 lore raw

Hi,

Quoted 14 lines

-----Original Message-----
From: Bing Zhao <[email protected]>
Sent: Monday, November 13, 2023 3:30 PM
To: Matan Azrad <[email protected]>; Slava Ovsiienko <[email protected]>; Raslan Darawsheh <[email protected]>; Suanming Mou <[email protected]>; Ori Kam <[email protected]>
Cc: [email protected]; Eli Britstein <[email protected]>; [email protected]
Subject: [PATCH] net/mlx5: zero encap UDP csum for IPv4 too

From: Eli Britstein <[email protected]>

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

Quoted 7 lines

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")
Quoted 60 lines
---
 drivers/net/mlx5/mlx5_flow_dv.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)
drivers/net/mlx5/mlx5_flow_dv.c +15 -11
index 9753af2cb1..115d730317 100644
@@ -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);
drivers/net/mlx5/mlx5_flow_dv.c +0 -1
 	udp->dgram_cksum = 0;
 
 	return 0;
--

2.34.1

#2 lore raw
In reply to Bing Zhao

Hi,

Quoted 14 lines

-----Original Message-----
From: Bing Zhao <[email protected]>
Sent: Monday, November 13, 2023 9:30 AM
To: Matan Azrad <[email protected]>; Slava Ovsiienko <[email protected]>; Raslan Darawsheh <[email protected]>; Suanming Mou <[email protected]>; Ori Kam <[email protected]>
Cc: [email protected]; Eli Britstein <[email protected]>; [email protected]
Subject: [PATCH] net/mlx5: zero encap UDP csum for IPv4 too

From: Eli Britstein <[email protected]>

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

Quoted 8 lines

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

---

Patch applied to next-net-mlx,

Kindest regards
Raslan Darawsheh