[dpdk-dev,v2,2/2] net/i40e: support PPPoE and L2TP ptype parser

Message ID 1513758164-39610-3-git-send-email-beilei.xing@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Helin Zhang
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Xing, Beilei Dec. 20, 2017, 8:22 a.m. UTC
  This patch adds support for PPPoE and L2TP packet
types parser.

Signed-off-by: Beilei Xing <beilei.xing@intel.com>
---
 drivers/net/i40e/i40e_ethdev.c | 83 ++++++++++++++++++++++++++++++------------
 1 file changed, 60 insertions(+), 23 deletions(-)
  

Comments

Qi Zhang Jan. 4, 2018, 8:43 a.m. UTC | #1
> -----Original Message-----
> From: Xing, Beilei
> Sent: Wednesday, December 20, 2017 4:23 PM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: dev@dpdk.org; Wu, Jingjing <jingjing.wu@intel.com>; Chilikin, Andrey
> <andrey.chilikin@intel.com>
> Subject: [PATCH v2 2/2] net/i40e: support PPPoE and L2TP ptype parser
> 
> This patch adds support for PPPoE and L2TP packet types parser.

The code is ok for me. 
It's better to add more explanation that the naming rule for protocol type has also been changed
For example:  O|IPV4 = IPV4 + !inner_ip

Regards
Qi
> 
> Signed-off-by: Beilei Xing <beilei.xing@intel.com>
> ---
>  drivers/net/i40e/i40e_ethdev.c | 83
> ++++++++++++++++++++++++++++++------------
>  1 file changed, 60 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
> index 811cc9f..c6f7ce7 100644
> --- a/drivers/net/i40e/i40e_ethdev.c
> +++ b/drivers/net/i40e/i40e_ethdev.c
> @@ -11078,7 +11078,7 @@ i40e_update_customized_ptype(struct
> rte_eth_dev *dev, uint8_t *pkg,
>  	uint8_t proto_id;
>  	char name[RTE_PMD_I40E_DDP_NAME_SIZE];
>  	uint32_t i, j, n;
> -	bool inner_ip;
> +	bool in_tunnel;
>  	int ret;
> 
>  	/* get information about new ptype num */ @@ -11123,7 +11123,7 @@
> i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
>  	for (i = 0; i < ptype_num; i++) {
>  		ptype_mapping[i].hw_ptype = ptype[i].ptype_id;
>  		ptype_mapping[i].sw_ptype = 0;
> -		inner_ip = false;
> +		in_tunnel = false;
>  		for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) {
>  			proto_id = ptype[i].protocols[j];
>  			if (proto_id == RTE_PMD_I40E_PROTO_UNUSED) @@ -11133,54
> +11133,91 @@ i40e_update_customized_ptype(struct rte_eth_dev *dev,
> uint8_t *pkg,
>  					continue;
>  				memset(name, 0, sizeof(name));
>  				strcpy(name, proto[n].name);
> -				if (!strncmp(name, "IPV4", 4) && !inner_ip) {
> +				if (!strncmp(name, "PPPOE", 5))
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_L2_ETHER_PPPOE;
> +				else if (!strncmp(name, "OIPV4", 5)) {
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
> -					inner_ip = true;
> -				} else if (!strncmp(name, "IPV4FRAG", 8) &&
> -					   inner_ip) {
> +					in_tunnel = true;
> +				} else if (!strncmp(name, "IPV4", 4) &&
> +					   !in_tunnel)
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
> +				else if (!strncmp(name, "IPV4FRAG", 8) &&
> +					 in_tunnel) {
>  					ptype_mapping[i].sw_ptype |=
>  					    RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_INNER_L4_FRAG;
>  				} else if (!strncmp(name, "IPV4", 4) &&
> -					   inner_ip)
> +					   in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
>  					    RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
> -				else if (!strncmp(name, "IPV6", 4) &&
> -					 !inner_ip) {
> +				else if (!strncmp(name, "OIPV6", 5)) {
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
> +					in_tunnel = true;
> +				} else if (!strncmp(name, "IPV6", 4) &&
> +					   !in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
> -					inner_ip = true;
> -				} else if (!strncmp(name, "IPV6FRAG", 8) &&
> -					   inner_ip) {
> +				else if (!strncmp(name, "IPV6FRAG", 8) &&
> +					 in_tunnel) {
>  					ptype_mapping[i].sw_ptype |=
>  					    RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN;
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_INNER_L4_FRAG;
>  				} else if (!strncmp(name, "IPV6", 4) &&
> -					   inner_ip)
> +					   in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
>  					    RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN;
> -				else if (!strncmp(name, "GTPC", 4))
> +				else if (!strncmp(name, "UDP", 3) && !in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
> -						RTE_PTYPE_TUNNEL_GTPC;
> -				else if (!strncmp(name, "GTPU", 4))
> -					ptype_mapping[i].sw_ptype |=
> -						RTE_PTYPE_TUNNEL_GTPU;
> -				else if (!strncmp(name, "UDP", 3))
> +						RTE_PTYPE_L4_UDP;
> +				else if (!strncmp(name, "UDP", 3) && in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_INNER_L4_UDP;
> -				else if (!strncmp(name, "TCP", 3))
> +				else if (!strncmp(name, "TCP", 3) && !in_tunnel)
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_L4_TCP;
> +				else if (!strncmp(name, "TCP", 3) && in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_INNER_L4_TCP;
> -				else if (!strncmp(name, "SCTP", 4))
> +				else if (!strncmp(name, "SCTP", 4) &&
> +					 !in_tunnel)
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_L4_SCTP;
> +				else if (!strncmp(name, "SCTP", 4) && in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_INNER_L4_SCTP;
> -				else if (!strncmp(name, "ICMP", 4) ||
> -					 !strncmp(name, "ICMPV6", 6))
> +				else if ((!strncmp(name, "ICMP", 4) ||
> +					  !strncmp(name, "ICMPV6", 6)) &&
> +					 !in_tunnel)
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_L4_ICMP;
> +				else if ((!strncmp(name, "ICMP", 4) ||
> +					  !strncmp(name, "ICMPV6", 6)) &&
> +					 in_tunnel)
>  					ptype_mapping[i].sw_ptype |=
>  						RTE_PTYPE_INNER_L4_ICMP;
> +				else if (!strncmp(name, "GTPC", 4)) {
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_TUNNEL_GTPC;
> +					in_tunnel = true;
> +				} else if (!strncmp(name, "GTPU", 4)) {
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_TUNNEL_GTPU;
> +					in_tunnel = true;
> +				} else if (!strncmp(name, "GRENAT", 6)) {
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_TUNNEL_GRENAT;
> +					in_tunnel = true;
> +				} else if (!strncmp(name, "L2TPv2CTL", 9)) {
> +					ptype_mapping[i].sw_ptype |=
> +						RTE_PTYPE_TUNNEL_L2TP;
> +					in_tunnel = true;
> +				}
> 
>  				break;
>  			}
> --
> 2.5.5
  

Patch

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 811cc9f..c6f7ce7 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -11078,7 +11078,7 @@  i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
 	uint8_t proto_id;
 	char name[RTE_PMD_I40E_DDP_NAME_SIZE];
 	uint32_t i, j, n;
-	bool inner_ip;
+	bool in_tunnel;
 	int ret;
 
 	/* get information about new ptype num */
@@ -11123,7 +11123,7 @@  i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
 	for (i = 0; i < ptype_num; i++) {
 		ptype_mapping[i].hw_ptype = ptype[i].ptype_id;
 		ptype_mapping[i].sw_ptype = 0;
-		inner_ip = false;
+		in_tunnel = false;
 		for (j = 0; j < RTE_PMD_I40E_PROTO_NUM; j++) {
 			proto_id = ptype[i].protocols[j];
 			if (proto_id == RTE_PMD_I40E_PROTO_UNUSED)
@@ -11133,54 +11133,91 @@  i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
 					continue;
 				memset(name, 0, sizeof(name));
 				strcpy(name, proto[n].name);
-				if (!strncmp(name, "IPV4", 4) && !inner_ip) {
+				if (!strncmp(name, "PPPOE", 5))
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_L2_ETHER_PPPOE;
+				else if (!strncmp(name, "OIPV4", 5)) {
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
-					inner_ip = true;
-				} else if (!strncmp(name, "IPV4FRAG", 8) &&
-					   inner_ip) {
+					in_tunnel = true;
+				} else if (!strncmp(name, "IPV4", 4) &&
+					   !in_tunnel)
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
+				else if (!strncmp(name, "IPV4FRAG", 8) &&
+					 in_tunnel) {
 					ptype_mapping[i].sw_ptype |=
 					    RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_INNER_L4_FRAG;
 				} else if (!strncmp(name, "IPV4", 4) &&
-					   inner_ip)
+					   in_tunnel)
 					ptype_mapping[i].sw_ptype |=
 					    RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
-				else if (!strncmp(name, "IPV6", 4) &&
-					 !inner_ip) {
+				else if (!strncmp(name, "OIPV6", 5)) {
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+					in_tunnel = true;
+				} else if (!strncmp(name, "IPV6", 4) &&
+					   !in_tunnel)
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
-					inner_ip = true;
-				} else if (!strncmp(name, "IPV6FRAG", 8) &&
-					   inner_ip) {
+				else if (!strncmp(name, "IPV6FRAG", 8) &&
+					 in_tunnel) {
 					ptype_mapping[i].sw_ptype |=
 					    RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN;
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_INNER_L4_FRAG;
 				} else if (!strncmp(name, "IPV6", 4) &&
-					   inner_ip)
+					   in_tunnel)
 					ptype_mapping[i].sw_ptype |=
 					    RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN;
-				else if (!strncmp(name, "GTPC", 4))
+				else if (!strncmp(name, "UDP", 3) && !in_tunnel)
 					ptype_mapping[i].sw_ptype |=
-						RTE_PTYPE_TUNNEL_GTPC;
-				else if (!strncmp(name, "GTPU", 4))
-					ptype_mapping[i].sw_ptype |=
-						RTE_PTYPE_TUNNEL_GTPU;
-				else if (!strncmp(name, "UDP", 3))
+						RTE_PTYPE_L4_UDP;
+				else if (!strncmp(name, "UDP", 3) && in_tunnel)
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_INNER_L4_UDP;
-				else if (!strncmp(name, "TCP", 3))
+				else if (!strncmp(name, "TCP", 3) && !in_tunnel)
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_L4_TCP;
+				else if (!strncmp(name, "TCP", 3) && in_tunnel)
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_INNER_L4_TCP;
-				else if (!strncmp(name, "SCTP", 4))
+				else if (!strncmp(name, "SCTP", 4) &&
+					 !in_tunnel)
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_L4_SCTP;
+				else if (!strncmp(name, "SCTP", 4) && in_tunnel)
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_INNER_L4_SCTP;
-				else if (!strncmp(name, "ICMP", 4) ||
-					 !strncmp(name, "ICMPV6", 6))
+				else if ((!strncmp(name, "ICMP", 4) ||
+					  !strncmp(name, "ICMPV6", 6)) &&
+					 !in_tunnel)
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_L4_ICMP;
+				else if ((!strncmp(name, "ICMP", 4) ||
+					  !strncmp(name, "ICMPV6", 6)) &&
+					 in_tunnel)
 					ptype_mapping[i].sw_ptype |=
 						RTE_PTYPE_INNER_L4_ICMP;
+				else if (!strncmp(name, "GTPC", 4)) {
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_TUNNEL_GTPC;
+					in_tunnel = true;
+				} else if (!strncmp(name, "GTPU", 4)) {
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_TUNNEL_GTPU;
+					in_tunnel = true;
+				} else if (!strncmp(name, "GRENAT", 6)) {
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_TUNNEL_GRENAT;
+					in_tunnel = true;
+				} else if (!strncmp(name, "L2TPv2CTL", 9)) {
+					ptype_mapping[i].sw_ptype |=
+						RTE_PTYPE_TUNNEL_L2TP;
+					in_tunnel = true;
+				}
 
 				break;
 			}