DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] net/i40e: fix i40e flow director merge
@ 2020-01-21 16:02 Bernard Iremonger
  2020-01-21 16:28 ` Iremonger, Bernard
  2020-01-22 15:20 ` [dpdk-dev] [PATCH v2] " Bernard Iremonger
  0 siblings, 2 replies; 8+ messages in thread
From: Bernard Iremonger @ 2020-01-21 16:02 UTC (permalink / raw)
  To: dev, beilei.xing, qi.z.zhang, ferruh.yigit, rory.sexton; +Cc: Bernard Iremonger

Merge of i40e_fdir.c added checks on cus_pctype->index which are not
necessary and caused flow creation for ESP to fail.
Removed the added lines to fix the issue.

Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over IP")

Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 drivers/net/i40e/i40e_fdir.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index c346073..1d7c392 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -1063,12 +1063,7 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf,
 		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
 		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
 		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV4 ||
-		 ((is_customized_pctype) &&
-		  ((cus_pctype->index == I40E_CUSTOMIZED_GTPC) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3)))) {
+		 is_customized_pctype) {
 		ip = (struct rte_ipv4_hdr *)raw_pkt;
 
 		*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
-- 
2.7.4


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH] net/i40e: fix i40e flow director merge
  2020-01-21 16:02 [dpdk-dev] [PATCH] net/i40e: fix i40e flow director merge Bernard Iremonger
@ 2020-01-21 16:28 ` Iremonger, Bernard
  2020-01-21 16:42   ` Sexton, Rory
  2020-01-22 15:20 ` [dpdk-dev] [PATCH v2] " Bernard Iremonger
  1 sibling, 1 reply; 8+ messages in thread
From: Iremonger, Bernard @ 2020-01-21 16:28 UTC (permalink / raw)
  To: dev, Xing, Beilei, Zhang, Qi Z, Yigit, Ferruh, Sexton, Rory



> -----Original Message-----
> From: Iremonger, Bernard <bernard.iremonger@intel.com>
> Sent: Tuesday, January 21, 2020 4:02 PM
> To: dev@dpdk.org; Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z
> <qi.z.zhang@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Sexton, Rory
> <rory.sexton@intel.com>
> Cc: Iremonger, Bernard <bernard.iremonger@intel.com>
> Subject: [PATCH] net/i40e: fix i40e flow director merge
> 
> Merge of i40e_fdir.c added checks on cus_pctype->index which are not
> necessary and caused flow creation for ESP to fail.
> Removed the added lines to fix the issue.
> 
> Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over IP")
> 
> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
> ---
>  drivers/net/i40e/i40e_fdir.c | 7 +------
>  1 file changed, 1 insertion(+), 6 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index
> c346073..1d7c392 100644
> --- a/drivers/net/i40e/i40e_fdir.c
> +++ b/drivers/net/i40e/i40e_fdir.c
> @@ -1063,12 +1063,7 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf
> *pf,
>  		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
>  		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
>  		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV4 ||
> -		 ((is_customized_pctype) &&
> -		  ((cus_pctype->index == I40E_CUSTOMIZED_GTPC) ||
> -		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) ||
> -		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6) ||
> -		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU) ||
> -		   (cus_pctype->index ==
> I40E_CUSTOMIZED_IPV4_L2TPV3)))) {
> +		 is_customized_pctype) {
>  		ip = (struct rte_ipv4_hdr *)raw_pkt;
> 
>  		*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
> --
> 2.7.4

NAK, causes problems for L2TPV3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH] net/i40e: fix i40e flow director merge
  2020-01-21 16:28 ` Iremonger, Bernard
@ 2020-01-21 16:42   ` Sexton, Rory
  0 siblings, 0 replies; 8+ messages in thread
From: Sexton, Rory @ 2020-01-21 16:42 UTC (permalink / raw)
  To: Iremonger, Bernard, dev, Xing, Beilei, Zhang, Qi Z, Yigit, Ferruh

Nack - if statement should look like this:
	else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP ||
		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP ||
		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV4 ||
		 ((is_customized_pctype) &&
		  ((cus_pctype->index == I40E_CUSTOMIZED_GTPC) ||
		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) ||
		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6) ||
		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU) ||
		   (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4) ||
		   (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4_UDP) ||
		   (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3)))) {

-----Original Message-----
From: Iremonger, Bernard <bernard.iremonger@intel.com> 
Sent: Tuesday, January 21, 2020 4:29 PM
To: dev@dpdk.org; Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; Sexton, Rory <rory.sexton@intel.com>
Subject: RE: [PATCH] net/i40e: fix i40e flow director merge



> -----Original Message-----
> From: Iremonger, Bernard <bernard.iremonger@intel.com>
> Sent: Tuesday, January 21, 2020 4:02 PM
> To: dev@dpdk.org; Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z 
> <qi.z.zhang@intel.com>; Yigit, Ferruh <ferruh.yigit@intel.com>; 
> Sexton, Rory <rory.sexton@intel.com>
> Cc: Iremonger, Bernard <bernard.iremonger@intel.com>
> Subject: [PATCH] net/i40e: fix i40e flow director merge
> 
> Merge of i40e_fdir.c added checks on cus_pctype->index which are not 
> necessary and caused flow creation for ESP to fail.
> Removed the added lines to fix the issue.
> 
> Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over 
> IP")
> 
> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
> ---
>  drivers/net/i40e/i40e_fdir.c | 7 +------
>  1 file changed, 1 insertion(+), 6 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_fdir.c 
> b/drivers/net/i40e/i40e_fdir.c index
> c346073..1d7c392 100644
> --- a/drivers/net/i40e/i40e_fdir.c
> +++ b/drivers/net/i40e/i40e_fdir.c
> @@ -1063,12 +1063,7 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf 
> *pf,
>  		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
>  		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
>  		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV4 ||
> -		 ((is_customized_pctype) &&
> -		  ((cus_pctype->index == I40E_CUSTOMIZED_GTPC) ||
> -		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) ||
> -		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6) ||
> -		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU) ||
> -		   (cus_pctype->index ==
> I40E_CUSTOMIZED_IPV4_L2TPV3)))) {
> +		 is_customized_pctype) {
>  		ip = (struct rte_ipv4_hdr *)raw_pkt;
> 
>  		*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
> --
> 2.7.4

NAK, causes problems for L2TPV3


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH v2] net/i40e: fix i40e flow director merge
  2020-01-21 16:02 [dpdk-dev] [PATCH] net/i40e: fix i40e flow director merge Bernard Iremonger
  2020-01-21 16:28 ` Iremonger, Bernard
@ 2020-01-22 15:20 ` Bernard Iremonger
  2020-01-22 15:48   ` Sexton, Rory
  2020-01-28 13:48   ` [dpdk-dev] [PATCH v3] " Bernard Iremonger
  1 sibling, 2 replies; 8+ messages in thread
From: Bernard Iremonger @ 2020-01-22 15:20 UTC (permalink / raw)
  To: dev, beilei.xing, qi.z.zhang, ferruh.yigit, rory.sexton, declan.doherty
  Cc: Bernard Iremonger

Merge of ESP and L2TP code in i40e_fdir.c added checks on cus_pctype->index
which caused flow creation for ESP to fail.

Added fill_ipv4_function()
Refactored code to have one path for customized and non customized
pctype's.

Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over IP")

Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 drivers/net/i40e/i40e_fdir.c | 139 ++++++++++++++++++++-----------------------
 1 file changed, 64 insertions(+), 75 deletions(-)

diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index c346073..b7a207d 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -1008,6 +1008,36 @@ fill_ip6_head(const struct i40e_fdir_input *fdir_input, unsigned char *raw_pkt,
 }
 
 static inline int
+fill_ip4_head(const struct i40e_fdir_input *fdir_input, unsigned char *raw_pkt,
+		uint8_t next_proto, uint8_t len, uint16_t *ether_type)
+{
+	struct rte_ipv4_hdr *ip4;
+
+	ip4 = (struct rte_ipv4_hdr *)raw_pkt;
+
+	*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
+	ip4->version_ihl = I40E_FDIR_IP_DEFAULT_VERSION_IHL;
+	/* set len to by default */
+	ip4->total_length = rte_cpu_to_be_16(I40E_FDIR_IP_DEFAULT_LEN);
+	ip4->time_to_live = fdir_input->flow.ip4_flow.ttl ?
+		fdir_input->flow.ip4_flow.ttl :
+		I40E_FDIR_IP_DEFAULT_TTL;
+	ip4->type_of_service = fdir_input->flow.ip4_flow.tos;
+	ip4->next_proto_id = fdir_input->flow.ip4_flow.proto ?
+		fdir_input->flow.ip4_flow.proto : next_proto;
+	/**
+	 * The source and destination fields in the transmitted packet
+	 * need to be presented in a reversed order with respect
+	 * to the expected received packets.
+	 */
+	ip4->src_addr = fdir_input->flow.ip4_flow.dst_ip;
+	ip4->dst_addr = fdir_input->flow.ip4_flow.src_ip;
+	len += sizeof(struct rte_ipv4_hdr);
+
+	return len;
+}
+
+static inline int
 i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf,
 				const struct i40e_fdir_input *fdir_input,
 				unsigned char *raw_pkt,
@@ -1017,8 +1047,6 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf,
 	static uint8_t vlan_frame[] = {0x81, 0, 0, 0};
 	uint16_t *ether_type;
 	uint8_t len = 2 * sizeof(struct rte_ether_addr);
-	struct rte_ipv4_hdr *ip;
-	struct rte_ipv6_hdr *ip6;
 	uint8_t pctype = fdir_input->pctype;
 	bool is_customized_pctype = fdir_input->flow_ext.customized_pctype;
 	static const uint8_t next_proto[] = {
@@ -1063,93 +1091,54 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf,
 		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
 		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
 		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV4 ||
-		 ((is_customized_pctype) &&
-		  ((cus_pctype->index == I40E_CUSTOMIZED_GTPC) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3)))) {
-		ip = (struct rte_ipv4_hdr *)raw_pkt;
-
-		*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
-		ip->version_ihl = I40E_FDIR_IP_DEFAULT_VERSION_IHL;
-		/* set len to by default */
-		ip->total_length = rte_cpu_to_be_16(I40E_FDIR_IP_DEFAULT_LEN);
-		ip->time_to_live = fdir_input->flow.ip4_flow.ttl ?
-			fdir_input->flow.ip4_flow.ttl :
-			I40E_FDIR_IP_DEFAULT_TTL;
-		ip->type_of_service = fdir_input->flow.ip4_flow.tos;
-		/**
-		 * The source and destination fields in the transmitted packet
-		 * need to be presented in a reversed order with respect
-		 * to the expected received packets.
-		 */
-		ip->src_addr = fdir_input->flow.ip4_flow.dst_ip;
-		ip->dst_addr = fdir_input->flow.ip4_flow.src_ip;
-
-		if (!is_customized_pctype) {
-			ip->next_proto_id = fdir_input->flow.ip4_flow.proto ?
-				fdir_input->flow.ip4_flow.proto :
-				next_proto[fdir_input->pctype];
-			len += sizeof(struct rte_ipv4_hdr);
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP ||
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP ||
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP ||
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER ||
+		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV6 ||
+		 is_customized_pctype) {
+		if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
+			pctype == I40E_FILTER_PCTYPE_FRAG_IPV4) {
+			len = fill_ip4_head(fdir_input, raw_pkt,
+					next_proto[pctype], len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_GTPC ||
 			 cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4 ||
 			 cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6 ||
 			 cus_pctype->index == I40E_CUSTOMIZED_GTPU) {
-			ip->next_proto_id = IPPROTO_UDP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP,
+					len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3) {
-			ip->next_proto_id = IPPROTO_L2TP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_L2TP,
+					len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4) {
-			ip->next_proto_id = IPPROTO_ESP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_ESP,
+					len, ether_type);
+		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4_UDP) {
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP,
+					len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4_UDP) {
-			ip->next_proto_id = IPPROTO_UDP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP,
+					len, ether_type);
+		} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER ||
+			pctype == I40E_FILTER_PCTYPE_FRAG_IPV6) {
+			len = fill_ip6_head(fdir_input, raw_pkt,
+					next_proto[pctype], len,
+					ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV6)
 			len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_ESP,
 					len, ether_type);
 		else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV6_UDP)
 			len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_UDP,
 					len, ether_type);
-	} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP ||
-		   pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP ||
-		   pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP ||
-		   pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER ||
-		   pctype == I40E_FILTER_PCTYPE_FRAG_IPV6 ||
-		   ((is_customized_pctype) &&
-		    (cus_pctype->index == I40E_CUSTOMIZED_IPV6_L2TPV3))) {
-		ip6 = (struct rte_ipv6_hdr *)raw_pkt;
-
-		*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
-		ip6->vtc_flow =
-			rte_cpu_to_be_32(I40E_FDIR_IPv6_DEFAULT_VTC_FLOW |
-					 (fdir_input->flow.ipv6_flow.tc <<
-					  I40E_FDIR_IPv6_TC_OFFSET));
-		ip6->payload_len =
-			rte_cpu_to_be_16(I40E_FDIR_IPv6_PAYLOAD_LEN);
-		if (!is_customized_pctype)
-			ip6->proto = fdir_input->flow.ipv6_flow.proto ?
-				fdir_input->flow.ipv6_flow.proto :
-				next_proto[fdir_input->pctype];
 		else if (cus_pctype->index == I40E_CUSTOMIZED_IPV6_L2TPV3)
-			ip6->proto = IPPROTO_L2TP;
-		ip6->hop_limits = fdir_input->flow.ipv6_flow.hop_limits ?
-			fdir_input->flow.ipv6_flow.hop_limits :
-			I40E_FDIR_IPv6_DEFAULT_HOP_LIMITS;
-		/**
-		 * The source and destination fields in the transmitted packet
-		 * need to be presented in a reversed order with respect
-		 * to the expected received packets.
-		 */
-		rte_memcpy(&ip6->src_addr,
-			   &fdir_input->flow.ipv6_flow.dst_ip,
-			   IPV6_ADDR_LEN);
-		rte_memcpy(&ip6->dst_addr,
-			   &fdir_input->flow.ipv6_flow.src_ip,
-			   IPV6_ADDR_LEN);
-		len += sizeof(struct rte_ipv6_hdr);
+			len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_L2TP,
+					len, ether_type);
 	} else {
 		PMD_DRV_LOG(ERR, "unknown pctype %u.", fdir_input->pctype);
 		return -1;
-- 
2.7.4


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH v2] net/i40e: fix i40e flow director merge
  2020-01-22 15:20 ` [dpdk-dev] [PATCH v2] " Bernard Iremonger
@ 2020-01-22 15:48   ` Sexton, Rory
  2020-01-28 13:48   ` [dpdk-dev] [PATCH v3] " Bernard Iremonger
  1 sibling, 0 replies; 8+ messages in thread
From: Sexton, Rory @ 2020-01-22 15:48 UTC (permalink / raw)
  To: Iremonger, Bernard, dev, Xing, Beilei, Zhang, Qi Z, Yigit,
	Ferruh, Doherty, Declan

Acked-by: Rory Sexton <rory.sexton@intel.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH v3] net/i40e: fix i40e flow director merge
  2020-01-22 15:20 ` [dpdk-dev] [PATCH v2] " Bernard Iremonger
  2020-01-22 15:48   ` Sexton, Rory
@ 2020-01-28 13:48   ` Bernard Iremonger
  2020-01-29 10:10     ` Sexton, Rory
  1 sibling, 1 reply; 8+ messages in thread
From: Bernard Iremonger @ 2020-01-28 13:48 UTC (permalink / raw)
  To: dev, beilei.xing, qi.z.zhang, ferruh.yigit, rory.sexton, declan.doherty
  Cc: Bernard Iremonger

Merge of ESP and L2TP code in i40e_fdir.c added checks on cus_pctype->index
which caused flow creation for ESP to fail.

Added fill_ipv4_function()
Refactored code to have one path for customized and non customized
pctype's.

Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over IP")

Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 drivers/net/i40e/i40e_fdir.c | 139 ++++++++++++++++++++-----------------------
 1 file changed, 64 insertions(+), 75 deletions(-)

diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index c346073..931f259 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -1008,6 +1008,36 @@ fill_ip6_head(const struct i40e_fdir_input *fdir_input, unsigned char *raw_pkt,
 }
 
 static inline int
+fill_ip4_head(const struct i40e_fdir_input *fdir_input, unsigned char *raw_pkt,
+		uint8_t next_proto, uint8_t len, uint16_t *ether_type)
+{
+	struct rte_ipv4_hdr *ip4;
+
+	ip4 = (struct rte_ipv4_hdr *)raw_pkt;
+
+	*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
+	ip4->version_ihl = I40E_FDIR_IP_DEFAULT_VERSION_IHL;
+	/* set len to by default */
+	ip4->total_length = rte_cpu_to_be_16(I40E_FDIR_IP_DEFAULT_LEN);
+	ip4->time_to_live = fdir_input->flow.ip4_flow.ttl ?
+		fdir_input->flow.ip4_flow.ttl :
+		I40E_FDIR_IP_DEFAULT_TTL;
+	ip4->type_of_service = fdir_input->flow.ip4_flow.tos;
+	ip4->next_proto_id = fdir_input->flow.ip4_flow.proto ?
+		fdir_input->flow.ip4_flow.proto : next_proto;
+	/**
+	 * The source and destination fields in the transmitted packet
+	 * need to be presented in a reversed order with respect
+	 * to the expected received packets.
+	 */
+	ip4->src_addr = fdir_input->flow.ip4_flow.dst_ip;
+	ip4->dst_addr = fdir_input->flow.ip4_flow.src_ip;
+	len += sizeof(struct rte_ipv4_hdr);
+
+	return len;
+}
+
+static inline int
 i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf,
 				const struct i40e_fdir_input *fdir_input,
 				unsigned char *raw_pkt,
@@ -1017,8 +1047,6 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf,
 	static uint8_t vlan_frame[] = {0x81, 0, 0, 0};
 	uint16_t *ether_type;
 	uint8_t len = 2 * sizeof(struct rte_ether_addr);
-	struct rte_ipv4_hdr *ip;
-	struct rte_ipv6_hdr *ip6;
 	uint8_t pctype = fdir_input->pctype;
 	bool is_customized_pctype = fdir_input->flow_ext.customized_pctype;
 	static const uint8_t next_proto[] = {
@@ -1063,93 +1091,54 @@ i40e_flow_fdir_fill_eth_ip_head(struct i40e_pf *pf,
 		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
 		 pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
 		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV4 ||
-		 ((is_customized_pctype) &&
-		  ((cus_pctype->index == I40E_CUSTOMIZED_GTPC) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_GTPU) ||
-		   (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3)))) {
-		ip = (struct rte_ipv4_hdr *)raw_pkt;
-
-		*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
-		ip->version_ihl = I40E_FDIR_IP_DEFAULT_VERSION_IHL;
-		/* set len to by default */
-		ip->total_length = rte_cpu_to_be_16(I40E_FDIR_IP_DEFAULT_LEN);
-		ip->time_to_live = fdir_input->flow.ip4_flow.ttl ?
-			fdir_input->flow.ip4_flow.ttl :
-			I40E_FDIR_IP_DEFAULT_TTL;
-		ip->type_of_service = fdir_input->flow.ip4_flow.tos;
-		/**
-		 * The source and destination fields in the transmitted packet
-		 * need to be presented in a reversed order with respect
-		 * to the expected received packets.
-		 */
-		ip->src_addr = fdir_input->flow.ip4_flow.dst_ip;
-		ip->dst_addr = fdir_input->flow.ip4_flow.src_ip;
-
-		if (!is_customized_pctype) {
-			ip->next_proto_id = fdir_input->flow.ip4_flow.proto ?
-				fdir_input->flow.ip4_flow.proto :
-				next_proto[fdir_input->pctype];
-			len += sizeof(struct rte_ipv4_hdr);
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP ||
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP ||
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP ||
+		 pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER ||
+		 pctype == I40E_FILTER_PCTYPE_FRAG_IPV6 ||
+		 is_customized_pctype) {
+		if (pctype == I40E_FILTER_PCTYPE_NONF_IPV4_TCP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV4_UDP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER ||
+			pctype == I40E_FILTER_PCTYPE_FRAG_IPV4) {
+			len = fill_ip4_head(fdir_input, raw_pkt,
+					next_proto[pctype], len, ether_type);
+		} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP ||
+			pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER ||
+			pctype == I40E_FILTER_PCTYPE_FRAG_IPV6) {
+			len = fill_ip6_head(fdir_input, raw_pkt,
+					next_proto[pctype], len,
+					ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_GTPC ||
 			 cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV4 ||
 			 cus_pctype->index == I40E_CUSTOMIZED_GTPU_IPV6 ||
 			 cus_pctype->index == I40E_CUSTOMIZED_GTPU) {
-			ip->next_proto_id = IPPROTO_UDP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP,
+					len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_IPV4_L2TPV3) {
-			ip->next_proto_id = IPPROTO_L2TP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_L2TP,
+					len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4) {
-			ip->next_proto_id = IPPROTO_ESP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_ESP,
+					len, ether_type);
+		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4_UDP) {
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP,
+					len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV4_UDP) {
-			ip->next_proto_id = IPPROTO_UDP;
-			len += sizeof(struct rte_ipv4_hdr);
+			len = fill_ip4_head(fdir_input, raw_pkt, IPPROTO_UDP,
+					len, ether_type);
 		} else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV6)
 			len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_ESP,
 					len, ether_type);
 		else if (cus_pctype->index == I40E_CUSTOMIZED_ESP_IPV6_UDP)
 			len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_UDP,
 					len, ether_type);
-	} else if (pctype == I40E_FILTER_PCTYPE_NONF_IPV6_TCP ||
-		   pctype == I40E_FILTER_PCTYPE_NONF_IPV6_UDP ||
-		   pctype == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP ||
-		   pctype == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER ||
-		   pctype == I40E_FILTER_PCTYPE_FRAG_IPV6 ||
-		   ((is_customized_pctype) &&
-		    (cus_pctype->index == I40E_CUSTOMIZED_IPV6_L2TPV3))) {
-		ip6 = (struct rte_ipv6_hdr *)raw_pkt;
-
-		*ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
-		ip6->vtc_flow =
-			rte_cpu_to_be_32(I40E_FDIR_IPv6_DEFAULT_VTC_FLOW |
-					 (fdir_input->flow.ipv6_flow.tc <<
-					  I40E_FDIR_IPv6_TC_OFFSET));
-		ip6->payload_len =
-			rte_cpu_to_be_16(I40E_FDIR_IPv6_PAYLOAD_LEN);
-		if (!is_customized_pctype)
-			ip6->proto = fdir_input->flow.ipv6_flow.proto ?
-				fdir_input->flow.ipv6_flow.proto :
-				next_proto[fdir_input->pctype];
 		else if (cus_pctype->index == I40E_CUSTOMIZED_IPV6_L2TPV3)
-			ip6->proto = IPPROTO_L2TP;
-		ip6->hop_limits = fdir_input->flow.ipv6_flow.hop_limits ?
-			fdir_input->flow.ipv6_flow.hop_limits :
-			I40E_FDIR_IPv6_DEFAULT_HOP_LIMITS;
-		/**
-		 * The source and destination fields in the transmitted packet
-		 * need to be presented in a reversed order with respect
-		 * to the expected received packets.
-		 */
-		rte_memcpy(&ip6->src_addr,
-			   &fdir_input->flow.ipv6_flow.dst_ip,
-			   IPV6_ADDR_LEN);
-		rte_memcpy(&ip6->dst_addr,
-			   &fdir_input->flow.ipv6_flow.src_ip,
-			   IPV6_ADDR_LEN);
-		len += sizeof(struct rte_ipv6_hdr);
+			len = fill_ip6_head(fdir_input, raw_pkt, IPPROTO_L2TP,
+					len, ether_type);
 	} else {
 		PMD_DRV_LOG(ERR, "unknown pctype %u.", fdir_input->pctype);
 		return -1;
-- 
2.7.4


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH v3] net/i40e: fix i40e flow director merge
  2020-01-28 13:48   ` [dpdk-dev] [PATCH v3] " Bernard Iremonger
@ 2020-01-29 10:10     ` Sexton, Rory
  2020-02-10  9:19       ` Ye Xiaolong
  0 siblings, 1 reply; 8+ messages in thread
From: Sexton, Rory @ 2020-01-29 10:10 UTC (permalink / raw)
  To: Iremonger, Bernard, dev, Xing, Beilei, Zhang, Qi Z, Yigit,
	Ferruh, Doherty, Declan

> 
> Subject: [PATCH v3] net/i40e: fix i40e flow director merge
> 
> Merge of ESP and L2TP code in i40e_fdir.c added checks on cus_pctype->index which caused flow creation for ESP to fail.
> 
> Added fill_ipv4_function()
> Refactored code to have one path for customized and non customized pctype's.
> 
> Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over IP")
> 
> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
> 

Acked-by: Rory Sexton <rory.sexton@intel.com>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH v3] net/i40e: fix i40e flow director merge
  2020-01-29 10:10     ` Sexton, Rory
@ 2020-02-10  9:19       ` Ye Xiaolong
  0 siblings, 0 replies; 8+ messages in thread
From: Ye Xiaolong @ 2020-02-10  9:19 UTC (permalink / raw)
  To: Sexton, Rory
  Cc: Iremonger, Bernard, dev, Xing, Beilei, Zhang, Qi Z, Yigit,
	Ferruh, Doherty, Declan

On 01/29, Sexton, Rory wrote:
>> 
>> Subject: [PATCH v3] net/i40e: fix i40e flow director merge
>> 
>> Merge of ESP and L2TP code in i40e_fdir.c added checks on cus_pctype->index which caused flow creation for ESP to fail.
>> 
>> Added fill_ipv4_function()
>> Refactored code to have one path for customized and non customized pctype's.
>> 
>> Fixes: c5f8365bc85d ("net/i40e: support flow director for L2TPv3 over IP")
>> 
>> Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
>> 
>
>Acked-by: Rory Sexton <rory.sexton@intel.com>

Applied to dpdk-next-net-intel, Thanks.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-02-10  9:20 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-21 16:02 [dpdk-dev] [PATCH] net/i40e: fix i40e flow director merge Bernard Iremonger
2020-01-21 16:28 ` Iremonger, Bernard
2020-01-21 16:42   ` Sexton, Rory
2020-01-22 15:20 ` [dpdk-dev] [PATCH v2] " Bernard Iremonger
2020-01-22 15:48   ` Sexton, Rory
2020-01-28 13:48   ` [dpdk-dev] [PATCH v3] " Bernard Iremonger
2020-01-29 10:10     ` Sexton, Rory
2020-02-10  9:19       ` Ye Xiaolong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).