DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/3] add support for L2TP AH ESP and NAT-T on switch
@ 2020-04-17  8:26 Wei Zhao
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 1/3] net/ice/base: add support for " Wei Zhao
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Wei Zhao @ 2020-04-17  8:26 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu

This patch set add switch filter support for AH ESP NAT-T
and L2TP protocol, and use spi or session idas input set
for switch rule.

Wei Zhao (3):
  net/ice/base: add support for AH ESP and NAT-T on switch
  net/ice/base: add support for L2TP on switch
  net/ice: add flow support for AH ESP and L2TP

 drivers/net/ice/base/ice_protocol_type.h |  14 +
 drivers/net/ice/base/ice_switch.c        | 311 +++++++++++++++++++++++
 drivers/net/ice/base/ice_switch.h        |   2 +
 drivers/net/ice/ice_generic_flow.c       |  25 ++
 drivers/net/ice/ice_generic_flow.h       |  23 ++
 drivers/net/ice/ice_switch_filter.c      | 198 ++++++++++++---
 6 files changed, 543 insertions(+), 30 deletions(-)

-- 
2.19.1


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

* [dpdk-dev] [PATCH 1/3] net/ice/base: add support for AH ESP and NAT-T on switch
  2020-04-17  8:26 [dpdk-dev] [PATCH 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
@ 2020-04-17  8:26 ` Wei Zhao
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 2/3] net/ice/base: add support for L2TP " Wei Zhao
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 12+ messages in thread
From: Wei Zhao @ 2020-04-17  8:26 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu, Wei Zhao

Add dummy packet and tunnel type to support
AH ESP and NAT-T on switch, now we can use spi as
input set for swicth rule.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/base/ice_protocol_type.h |  12 ++
 drivers/net/ice/base/ice_switch.c        | 235 +++++++++++++++++++++++
 drivers/net/ice/base/ice_switch.h        |   1 +
 3 files changed, 248 insertions(+)

diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h
index 3fb065169..2ca7cd8ac 100644
--- a/drivers/net/ice/base/ice_protocol_type.h
+++ b/drivers/net/ice/base/ice_protocol_type.h
@@ -50,6 +50,7 @@ enum ice_protocol_type {
 	ICE_L2TPV3,
 	ICE_ESP,
 	ICE_AH,
+	ICE_NAT_T,
 	ICE_PROTOCOL_LAST
 };
 
@@ -65,6 +66,12 @@ enum ice_sw_tunnel_type {
 			 */
 	ICE_SW_TUN_GTP,
 	ICE_SW_TUN_PPPOE,
+	ICE_SW_TUN_IPV4_ESP,
+	ICE_SW_TUN_IPV6_ESP,
+	ICE_SW_TUN_IPV4_AH,
+	ICE_SW_TUN_IPV6_AH,
+	ICE_SW_TUN_IPV4_NAT_T,
+	ICE_SW_TUN_IPV6_NAT_T,
 	ICE_SW_TUN_PROFID_IPV6_ESP,
 	ICE_SW_TUN_PROFID_IPV6_AH,
 	ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3,
@@ -287,6 +294,10 @@ struct ice_ah_hdr {
 	__be32 seq;
 };
 
+struct ice_nat_t_hdr {
+	struct ice_esp_hdr esp;
+};
+
 struct ice_nvgre {
 	__be16 flags;
 	__be16 protocol;
@@ -309,6 +320,7 @@ union ice_prot_hdr {
 	struct ice_l2tpv3_sess_hdr l2tpv3_sess_hdr;
 	struct ice_esp_hdr esp_hdr;
 	struct ice_ah_hdr ah_hdr;
+	struct ice_nat_t_hdr nat_t_hdr;
 };
 
 /* This is mapping table entry that maps every word within a given protocol
diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c
index 07f8efd65..1da438f5e 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -590,6 +590,176 @@ static const u8 dummy_pppoe_ipv6_packet[] = {
 	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
 };
 
+static const struct ice_dummy_pkt_offsets dummy_ipv4_esp_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_ESP,			34 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_esp_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x32, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_ESP 34 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_esp_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_ESP,			54 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_esp_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 14 */
+	0x00, 0x08, 0x32, 0x00, /* Next header ESP */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_ESP 54 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv4_ah_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_AH,			34 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_ah_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x20, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x33, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_AH 34 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_ah_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_AH,			54 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_ah_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 14 */
+	0x00, 0x0c, 0x33, 0x00, /* Next header AH */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_AH 54 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv4_nat_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_UDP_ILOS,		34 },
+	{ ICE_NAT_T,		42 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_nat_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x24, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x11, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x11, 0x94, /* ICE_NAT_T 34 */
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_nat_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_UDP_ILOS,		54 },
+	{ ICE_NAT_T,		62 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_nat_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 14 */
+	0x00, 0x10, 0x11, 0x00, /* Next header NAT_T */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x11, 0x94, /* ICE_NAT_T 54 */
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+
+};
+
 /* this is a recipe to profile association bitmap */
 static ice_declare_bitmap(recipe_to_profile[ICE_MAX_NUM_RECIPES],
 			  ICE_MAX_NUM_PROFILES);
@@ -4947,6 +5117,11 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[ICE_PROTOCOL_LAST] = {
 	{ ICE_NVGRE,		{ 0, 2, 4, 6 } },
 	{ ICE_GTP,		{ 8, 10, 12, 14, 16, 18, 20 } },
 	{ ICE_PPPOE,		{ 0, 2, 4, 6 } },
+	{ ICE_PFCP,		{ 8, 10, 12, 14, 16, 18, 20, 22 } },
+	{ ICE_L2TPV3,		{ 0, 2, 4, 6, 8, 10 } },
+	{ ICE_ESP,		{ 0, 2, 4, 6 } },
+	{ ICE_AH,		{ 0, 2, 4, 6, 8, 10 } },
+	{ ICE_NAT_T,		{ 8, 10, 12, 14 } },
 };
 
 /* The following table describes preferred grouping of recipes.
@@ -4974,6 +5149,11 @@ static const struct ice_protocol_entry ice_prot_id_tbl[ICE_PROTOCOL_LAST] = {
 	{ ICE_NVGRE,		ICE_GRE_OF_HW },
 	{ ICE_GTP,		ICE_UDP_OF_HW },
 	{ ICE_PPPOE,		ICE_PPPOE_HW },
+	{ ICE_PFCP,		ICE_UDP_ILOS_HW },
+	{ ICE_L2TPV3,		ICE_L2TPV3_HW },
+	{ ICE_ESP,		ICE_ESP_HW },
+	{ ICE_AH,		ICE_AH_HW },
+	{ ICE_NAT_T,		ICE_UDP_ILOS_HW },
 };
 
 /**
@@ -5762,6 +5942,7 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 		ice_set_bit(ICE_PROFID_MAC_IPV6_L2TPV3, bm);
 		return;
 	case ICE_SW_TUN_PROFID_IPV6_NAT_T:
+	case ICE_SW_TUN_IPV6_NAT_T:
 		ice_set_bit(ICE_PROFID_IPV6_NAT_T, bm);
 		return;
 	case ICE_SW_TUN_PROFID_IPV4_PFCP_NODE:
@@ -5776,6 +5957,9 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 	case ICE_SW_TUN_PROFID_IPV6_PFCP_SESSION:
 		ice_set_bit(ICE_PROFID_IPV6_PFCP_SESSION, bm);
 		return;
+	case ICE_SW_TUN_IPV4_NAT_T:
+		ice_set_bit(ICE_PROFID_IPV4_NAT_T, bm);
+		return;
 	case ICE_SW_TUN_AND_NON_TUN:
 	default:
 		prof_type = ICE_PROF_ALL;
@@ -6071,6 +6255,48 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 			ipv6 = true;
 	}
 
+	if (tun_type == ICE_SW_TUN_IPV4_ESP) {
+		*pkt = dummy_ipv4_esp_pkt;
+		*pkt_len = sizeof(dummy_ipv4_esp_pkt);
+		*offsets = dummy_ipv4_esp_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_ESP) {
+		*pkt = dummy_ipv6_esp_pkt;
+		*pkt_len = sizeof(dummy_ipv6_esp_pkt);
+		*offsets = dummy_ipv6_esp_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV4_AH) {
+		*pkt = dummy_ipv4_ah_pkt;
+		*pkt_len = sizeof(dummy_ipv4_ah_pkt);
+		*offsets = dummy_ipv4_ah_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_AH) {
+		*pkt = dummy_ipv6_ah_pkt;
+		*pkt_len = sizeof(dummy_ipv6_ah_pkt);
+		*offsets = dummy_ipv6_ah_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV4_NAT_T) {
+		*pkt = dummy_ipv4_nat_pkt;
+		*pkt_len = sizeof(dummy_ipv4_nat_pkt);
+		*offsets = dummy_ipv4_nat_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_NAT_T) {
+		*pkt = dummy_ipv6_nat_pkt;
+		*pkt_len = sizeof(dummy_ipv6_nat_pkt);
+		*offsets = dummy_ipv6_nat_packet_offsets;
+		return;
+	}
+
 	if (tun_type == ICE_SW_TUN_GTP) {
 		*pkt = dummy_udp_gtp_packet;
 		*pkt_len = sizeof(dummy_udp_gtp_packet);
@@ -6260,6 +6486,15 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		case ICE_PPPOE:
 			len = sizeof(struct ice_pppoe_hdr);
 			break;
+		case ICE_ESP:
+			len = sizeof(struct ice_esp_hdr);
+			break;
+		case ICE_NAT_T:
+			len = sizeof(struct ice_nat_t_hdr);
+			break;
+		case ICE_AH:
+			len = sizeof(struct ice_ah_hdr);
+			break;
 		default:
 			return ICE_ERR_PARAM;
 		}
diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h
index f7ae5c741..765ed0945 100644
--- a/drivers/net/ice/base/ice_switch.h
+++ b/drivers/net/ice/base/ice_switch.h
@@ -18,6 +18,7 @@
 /* Switch Profile IDs for Profile related switch rules */
 #define ICE_PROFID_IPV6_ESP		72
 #define ICE_PROFID_IPV6_AH		74
+#define ICE_PROFID_IPV4_NAT_T		75
 #define ICE_PROFID_IPV6_NAT_T		76
 #define ICE_PROFID_MAC_IPV6_L2TPV3	78
 #define ICE_PROFID_IPV4_PFCP_NODE	79
-- 
2.19.1


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

* [dpdk-dev] [PATCH 2/3] net/ice/base: add support for L2TP on switch
  2020-04-17  8:26 [dpdk-dev] [PATCH 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 1/3] net/ice/base: add support for " Wei Zhao
@ 2020-04-17  8:26 ` Wei Zhao
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP Wei Zhao
  2020-04-20  5:18 ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
  3 siblings, 0 replies; 12+ messages in thread
From: Wei Zhao @ 2020-04-17  8:26 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu, Wei Zhao

Add dummy packet and tunnel type to support
L2TP on switch, now we can use session id as
input set for swicth rule.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/base/ice_protocol_type.h |  2 +
 drivers/net/ice/base/ice_switch.c        | 76 ++++++++++++++++++++++++
 drivers/net/ice/base/ice_switch.h        |  1 +
 3 files changed, 79 insertions(+)

diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h
index 2ca7cd8ac..46cd77e68 100644
--- a/drivers/net/ice/base/ice_protocol_type.h
+++ b/drivers/net/ice/base/ice_protocol_type.h
@@ -72,6 +72,8 @@ enum ice_sw_tunnel_type {
 	ICE_SW_TUN_IPV6_AH,
 	ICE_SW_TUN_IPV4_NAT_T,
 	ICE_SW_TUN_IPV6_NAT_T,
+	ICE_SW_TUN_IPV4_L2TPV3,
+	ICE_SW_TUN_IPV6_L2TPV3,
 	ICE_SW_TUN_PROFID_IPV6_ESP,
 	ICE_SW_TUN_PROFID_IPV6_AH,
 	ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3,
diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c
index 1da438f5e..28924085e 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -760,6 +760,61 @@ static const u8 dummy_ipv6_nat_pkt[] = {
 
 };
 
+static const struct ice_dummy_pkt_offsets dummy_ipv4_l2tpv3_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_L2TPV3,		34 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_l2tpv3_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x20, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x73, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_L2TPV3 34 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_l2tpv3_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_L2TPV3,		54 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_l2tpv3_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_IL 14 */
+	0x00, 0x0c, 0x73, 0x40,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_L2TPV3 54 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
 /* this is a recipe to profile association bitmap */
 static ice_declare_bitmap(recipe_to_profile[ICE_MAX_NUM_RECIPES],
 			  ICE_MAX_NUM_PROFILES);
@@ -5939,6 +5994,7 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 		ice_set_bit(ICE_PROFID_IPV6_AH, bm);
 		return;
 	case ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3:
+	case ICE_SW_TUN_IPV6_L2TPV3:
 		ice_set_bit(ICE_PROFID_MAC_IPV6_L2TPV3, bm);
 		return;
 	case ICE_SW_TUN_PROFID_IPV6_NAT_T:
@@ -5960,6 +6016,9 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 	case ICE_SW_TUN_IPV4_NAT_T:
 		ice_set_bit(ICE_PROFID_IPV4_NAT_T, bm);
 		return;
+	case ICE_SW_TUN_IPV4_L2TPV3:
+		ice_set_bit(ICE_PROFID_MAC_IPV4_L2TPV3, bm);
+		return;
 	case ICE_SW_TUN_AND_NON_TUN:
 	default:
 		prof_type = ICE_PROF_ALL;
@@ -6297,6 +6356,20 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		return;
 	}
 
+	if (tun_type == ICE_SW_TUN_IPV4_L2TPV3) {
+		*pkt = dummy_ipv4_l2tpv3_pkt;
+		*pkt_len = sizeof(dummy_ipv4_l2tpv3_pkt);
+		*offsets = dummy_ipv4_l2tpv3_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_L2TPV3) {
+		*pkt = dummy_ipv6_l2tpv3_pkt;
+		*pkt_len = sizeof(dummy_ipv6_l2tpv3_pkt);
+		*offsets = dummy_ipv6_l2tpv3_packet_offsets;
+		return;
+	}
+
 	if (tun_type == ICE_SW_TUN_GTP) {
 		*pkt = dummy_udp_gtp_packet;
 		*pkt_len = sizeof(dummy_udp_gtp_packet);
@@ -6495,6 +6568,9 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		case ICE_AH:
 			len = sizeof(struct ice_ah_hdr);
 			break;
+		case ICE_L2TPV3:
+			len = sizeof(struct ice_l2tpv3_sess_hdr);
+			break;
 		default:
 			return ICE_ERR_PARAM;
 		}
diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h
index 765ed0945..8cbda4081 100644
--- a/drivers/net/ice/base/ice_switch.h
+++ b/drivers/net/ice/base/ice_switch.h
@@ -20,6 +20,7 @@
 #define ICE_PROFID_IPV6_AH		74
 #define ICE_PROFID_IPV4_NAT_T		75
 #define ICE_PROFID_IPV6_NAT_T		76
+#define ICE_PROFID_MAC_IPV4_L2TPV3	77
 #define ICE_PROFID_MAC_IPV6_L2TPV3	78
 #define ICE_PROFID_IPV4_PFCP_NODE	79
 #define ICE_PROFID_IPV4_PFCP_SESSION	80
-- 
2.19.1


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

* [dpdk-dev] [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP
  2020-04-17  8:26 [dpdk-dev] [PATCH 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 1/3] net/ice/base: add support for " Wei Zhao
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 2/3] net/ice/base: add support for L2TP " Wei Zhao
@ 2020-04-17  8:26 ` Wei Zhao
  2020-04-20  5:16   ` Zhang, Qi Z
  2020-04-20  5:18 ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
  3 siblings, 1 reply; 12+ messages in thread
From: Wei Zhao @ 2020-04-17  8:26 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu, Wei Zhao

Add switch filter support for AH ESP and L2TP protocol,
and use spi or session idas input set for switch rule.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/ice_generic_flow.c  |  25 ++++
 drivers/net/ice/ice_generic_flow.h  |  23 ++++
 drivers/net/ice/ice_switch_filter.c | 198 +++++++++++++++++++++++-----
 3 files changed, 216 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c
index 3365aeb86..ad103d0e8 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -1382,18 +1382,37 @@ enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[] = {
 	RTE_FLOW_ITEM_TYPE_ICMP6,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_esp[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_ESP,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_esp[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
 	RTE_FLOW_ITEM_TYPE_ESP,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_ah[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_AH,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_ah[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
 	RTE_FLOW_ITEM_TYPE_AH,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_udp_esp[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_UDP,
+	RTE_FLOW_ITEM_TYPE_ESP,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp_esp[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
@@ -1408,6 +1427,12 @@ enum rte_flow_item_type pattern_eth_ipv6_udp_ah[] = {
 	RTE_FLOW_ITEM_TYPE_AH,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_l2tp[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_l2tp[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h b/drivers/net/ice/ice_generic_flow.h
index 9fe35df45..492a48cd9 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -31,6 +31,10 @@
 #define ICE_PROT_NVGRE             (1ULL << 20)
 #define ICE_PROT_GTPU              (1ULL << 21)
 #define ICE_PROT_PPPOE_S           (1ULL << 22)
+#define ICE_PROT_ESP               (1ULL << 23)
+#define ICE_PROT_AH                (1ULL << 24)
+#define ICE_PROT_L2TPV3OIP         (1ULL << 25)
+#define ICE_PROT_PFCP              (1ULL << 26)
 
 /* field */
 
@@ -52,6 +56,11 @@
 #define ICE_GTPU_QFI               (1ULL << 48)
 #define ICE_PPPOE_SESSION          (1ULL << 47)
 #define ICE_PPPOE_PROTO            (1ULL << 46)
+#define ICE_ESP_SPI                (1ULL << 45)
+#define ICE_AH_SPI                 (1ULL << 44)
+#define ICE_L2TPV3OIP_SESSION_ID   (1ULL << 43)
+#define ICE_PFCP_SEID              (1ULL << 42)
+#define ICE_PFCP_S_FIELD           (1ULL << 41)
 
 /* input set */
 
@@ -184,6 +193,16 @@
 	(ICE_PROT_PPPOE_S | ICE_PPPOE_SESSION)
 #define ICE_INSET_PPPOE_PROTO \
 	(ICE_PROT_PPPOE_S | ICE_PPPOE_PROTO)
+#define ICE_INSET_ESP_SPI \
+	(ICE_PROT_ESP | ICE_ESP_SPI)
+#define ICE_INSET_AH_SPI \
+	(ICE_PROT_AH | ICE_AH_SPI)
+#define ICE_INSET_L2TPV3OIP_SESSION_ID \
+	(ICE_PROT_L2TPV3OIP | ICE_L2TPV3OIP_SESSION_ID)
+#define ICE_INSET_PFCP_S_FIELD \
+	(ICE_PROT_PFCP | ICE_PFCP_S_FIELD)
+#define ICE_INSET_PFCP_SEID \
+	(ICE_PROT_PFCP | ICE_PFCP_S_FIELD | ICE_PFCP_SEID)
 
 /* empty pattern */
 extern enum rte_flow_item_type pattern_empty[];
@@ -392,14 +411,18 @@ extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_icmp6[];
 extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[];
 
 /* ESP */
+extern enum rte_flow_item_type pattern_eth_ipv4_esp[];
+extern enum rte_flow_item_type pattern_eth_ipv4_udp_esp[];
 extern enum rte_flow_item_type pattern_eth_ipv6_esp[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp_esp[];
 
 /* AH */
+extern enum rte_flow_item_type pattern_eth_ipv4_ah[];
 extern enum rte_flow_item_type pattern_eth_ipv6_ah[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp_ah[];
 
 /* L2TP */
+extern enum rte_flow_item_type pattern_eth_ipv4_l2tp[];
 extern enum rte_flow_item_type pattern_eth_ipv6_l2tp[];
 
 /* PFCP */
diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c
index 55a5618a7..78cda6acd 100644
--- a/drivers/net/ice/ice_switch_filter.c
+++ b/drivers/net/ice/ice_switch_filter.c
@@ -95,6 +95,24 @@
 	ICE_INSET_VLAN_OUTER | ICE_INSET_VLAN_INNER | \
 	ICE_INSET_DMAC | ICE_INSET_ETHERTYPE | ICE_INSET_PPPOE_SESSION | \
 	ICE_INSET_PPPOE_PROTO)
+#define ICE_SW_INSET_MAC_IPV4_ESP ( \
+	ICE_SW_INSET_MAC_IPV4 | ICE_INSET_ESP_SPI)
+#define ICE_SW_INSET_MAC_IPV6_ESP ( \
+	ICE_SW_INSET_MAC_IPV6 | ICE_INSET_ESP_SPI)
+#define ICE_SW_INSET_MAC_IPV4_AH ( \
+	ICE_SW_INSET_MAC_IPV4 | ICE_INSET_AH_SPI)
+#define ICE_SW_INSET_MAC_IPV6_AH ( \
+	ICE_SW_INSET_MAC_IPV6 | ICE_INSET_AH_SPI)
+#define ICE_SW_INSET_MAC_IPV4_L2TP ( \
+	ICE_SW_INSET_MAC_IPV4 | ICE_INSET_L2TPV3OIP_SESSION_ID)
+#define ICE_SW_INSET_MAC_IPV6_L2TP ( \
+	ICE_SW_INSET_MAC_IPV6 | ICE_INSET_L2TPV3OIP_SESSION_ID)
+#define ICE_SW_INSET_MAC_IPV4_PFCP ( \
+	ICE_SW_INSET_MAC_IPV4 | \
+	ICE_INSET_PFCP_S_FIELD | ICE_INSET_PFCP_SEID)
+#define ICE_SW_INSET_MAC_IPV6_PFCP ( \
+	ICE_SW_INSET_MAC_IPV6 | \
+	ICE_INSET_PFCP_S_FIELD | ICE_INSET_PFCP_SEID)
 
 struct sw_meta {
 	struct ice_adv_lkup_elem *list;
@@ -148,16 +166,24 @@ ice_pattern_match_item ice_switch_pattern_dist_comms[] = {
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
 	{pattern_eth_vlan_pppoes_proto,
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
+	{pattern_eth_ipv4_esp,
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_udp_esp,
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_ah,
+			ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_ah,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_ah,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv4_l2tp,
+			ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_l2tp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv4_pfcp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_pfcp,
@@ -240,16 +266,24 @@ ice_pattern_match_item ice_switch_pattern_perm[] = {
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
 	{pattern_eth_vlan_pppoes_proto,
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
+	{pattern_eth_ipv4_esp,
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_udp_esp,
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_ah,
+			ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_ah,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_ah,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv4_l2tp,
+			ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_l2tp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv4_pfcp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_pfcp,
@@ -383,11 +417,12 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 	const struct rte_flow_item_pfcp *pfcp_spec, *pfcp_mask;
 	uint64_t input_set = ICE_INSET_NONE;
 	uint16_t j, t = 0;
-	uint16_t tunnel_valid = 0;
-	uint16_t pppoe_valid = 0;
-	uint16_t ipv6_valiad = 0;
-	uint16_t udp_valiad = 0;
-
+	bool profile_rule = 0;
+	bool tunnel_valid = 0;
+	bool pppoe_valid = 0;
+	bool ipv6_valiad = 0;
+	bool ipv4_valiad = 0;
+	bool udp_valiad = 0;
 
 	for (item = pattern; item->type !=
 			RTE_FLOW_ITEM_TYPE_END; item++) {
@@ -470,6 +505,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 		case RTE_FLOW_ITEM_TYPE_IPV4:
 			ipv4_spec = item->spec;
 			ipv4_mask = item->mask;
+			ipv4_valiad = 1;
 			if (ipv4_spec && ipv4_mask) {
 				/* Check IPv4 mask and update input set */
 				if (ipv4_mask->hdr.version_ihl ||
@@ -991,48 +1027,151 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 		case RTE_FLOW_ITEM_TYPE_ESP:
 			esp_spec = item->spec;
 			esp_mask = item->mask;
-			if (esp_spec || esp_mask) {
+			if ((esp_spec && !esp_mask) ||
+				(!esp_spec && esp_mask)) {
 				rte_flow_error_set(error, EINVAL,
 					   RTE_FLOW_ERROR_TYPE_ITEM,
 					   item,
 					   "Invalid esp item");
-				return -ENOTSUP;
+				return 0;
+			}
+			/* Check esp mask and update input set */
+			if (esp_mask && esp_mask->hdr.seq) {
+				rte_flow_error_set(error, EINVAL,
+						RTE_FLOW_ERROR_TYPE_ITEM,
+						item,
+						"Invalid esp mask");
+				return 0;
+			}
+
+			if (!esp_spec && !esp_mask && !input_set) {
+				profile_rule = 1;
+				if (ipv6_valiad && udp_valiad)
+					*tun_type =
+					ICE_SW_TUN_PROFID_IPV6_NAT_T;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_PROFID_IPV6_ESP;
+				else if (ipv4_valiad)
+					return 0;
+			} else if (esp_spec && esp_mask &&
+						esp_mask->hdr.spi){
+				if (udp_valiad)
+					list[t].type = ICE_NAT_T;
+				else
+					list[t].type = ICE_ESP;
+				list[t].h_u.esp_hdr.spi =
+					esp_spec->hdr.spi;
+				list[t].m_u.esp_hdr.spi =
+					esp_mask->hdr.spi;
+				input_set |= ICE_INSET_ESP_SPI;
+				t++;
+			}
+
+			if (!profile_rule) {
+				if (ipv6_valiad && udp_valiad)
+					*tun_type = ICE_SW_TUN_IPV6_NAT_T;
+				else if (ipv4_valiad && udp_valiad)
+					*tun_type = ICE_SW_TUN_IPV4_NAT_T;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_IPV6_ESP;
+				else if (ipv4_valiad)
+					*tun_type = ICE_SW_TUN_IPV4_ESP;
 			}
-			if (ipv6_valiad && udp_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_NAT_T;
-			else if (ipv6_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_ESP;
 			break;
 
 		case RTE_FLOW_ITEM_TYPE_AH:
 			ah_spec = item->spec;
 			ah_mask = item->mask;
-			if (ah_spec || ah_mask) {
+			if ((ah_spec && !ah_mask) ||
+				(!ah_spec && ah_mask)) {
 				rte_flow_error_set(error, EINVAL,
 					   RTE_FLOW_ERROR_TYPE_ITEM,
 					   item,
 					   "Invalid ah item");
-				return -ENOTSUP;
+				return 0;
+			}
+			/* Check ah mask and update input set */
+			if (ah_mask &&
+				(ah_mask->next_hdr ||
+				ah_mask->payload_len ||
+				ah_mask->seq_num ||
+				ah_mask->reserved)) {
+				rte_flow_error_set(error, EINVAL,
+						RTE_FLOW_ERROR_TYPE_ITEM,
+						item,
+						"Invalid ah mask");
+				return 0;
+			}
+
+			if (!ah_spec && !ah_mask && !input_set) {
+				profile_rule = 1;
+				if (ipv6_valiad && udp_valiad)
+					*tun_type =
+					ICE_SW_TUN_PROFID_IPV6_NAT_T;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_PROFID_IPV6_AH;
+				else if (ipv4_valiad)
+					return 0;
+			} else if (ah_spec && ah_mask &&
+						ah_mask->spi){
+				list[t].type = ICE_AH;
+				list[t].h_u.ah_hdr.spi =
+					ah_spec->spi;
+				list[t].m_u.ah_hdr.spi =
+					ah_mask->spi;
+				input_set |= ICE_INSET_AH_SPI;
+				t++;
+			}
+
+			if (!profile_rule) {
+				if (udp_valiad)
+					return 0;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_IPV6_AH;
+				else if (ipv4_valiad)
+					*tun_type = ICE_SW_TUN_IPV4_AH;
 			}
-			if (ipv6_valiad && udp_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_NAT_T;
-			else if (ipv6_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_AH;
 			break;
 
 		case RTE_FLOW_ITEM_TYPE_L2TPV3OIP:
 			l2tp_spec = item->spec;
 			l2tp_mask = item->mask;
-			if (l2tp_spec || l2tp_mask) {
+			if ((l2tp_spec && !l2tp_mask) ||
+				(!l2tp_spec && l2tp_mask)) {
 				rte_flow_error_set(error, EINVAL,
 					   RTE_FLOW_ERROR_TYPE_ITEM,
 					   item,
 					   "Invalid l2tp item");
-				return -ENOTSUP;
+				return 0;
+			}
+
+			if (!l2tp_spec && !l2tp_mask && !input_set) {
+				if (ipv6_valiad)
+					*tun_type =
+					ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3;
+				else if (ipv4_valiad)
+					return 0;
+			} else if (l2tp_spec && l2tp_mask &&
+						l2tp_mask->session_id){
+				list[t].type = ICE_L2TPV3;
+				list[t].h_u.l2tpv3_sess_hdr.session_id =
+					l2tp_spec->session_id;
+				list[t].m_u.l2tpv3_sess_hdr.session_id =
+					l2tp_mask->session_id;
+				input_set |= ICE_INSET_L2TPV3OIP_SESSION_ID;
+				t++;
+			}
+
+			if (!profile_rule) {
+				if (ipv6_valiad)
+					*tun_type =
+					ICE_SW_TUN_IPV6_L2TPV3;
+				else if (ipv4_valiad)
+					*tun_type =
+					ICE_SW_TUN_IPV4_L2TPV3;
 			}
-			if (ipv6_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3;
 			break;
+
 		case RTE_FLOW_ITEM_TYPE_PFCP:
 			pfcp_spec = item->spec;
 			pfcp_mask = item->mask;
@@ -1082,7 +1221,6 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 			}
 			break;
 
-
 		case RTE_FLOW_ITEM_TYPE_VOID:
 			break;
 
-- 
2.19.1


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

* Re: [dpdk-dev] [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP Wei Zhao
@ 2020-04-20  5:16   ` Zhang, Qi Z
  2020-04-20  5:18     ` Zhao1, Wei
  0 siblings, 1 reply; 12+ messages in thread
From: Zhang, Qi Z @ 2020-04-20  5:16 UTC (permalink / raw)
  To: Zhao1, Wei, dev; +Cc: Fu, Qi



> -----Original Message-----
> From: Zhao1, Wei <wei.zhao1@intel.com>
> Sent: Friday, April 17, 2020 4:26 PM
> To: dev@dpdk.org
> Cc: Zhang, Qi Z <qi.z.zhang@intel.com>; Fu, Qi <qi.fu@intel.com>; Zhao1,
> Wei <wei.zhao1@intel.com>
> Subject: [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP
> 
> Add switch filter support for AH ESP and L2TP protocol, and use spi or
> session idas input set for switch rule.
> 
> Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
> ---
.....

>  struct sw_meta {
>  	struct ice_adv_lkup_elem *list;
> @@ -148,16 +166,24 @@ ice_pattern_match_item
> ice_switch_pattern_dist_comms[] = {
>  			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
>  	{pattern_eth_vlan_pppoes_proto,
>  			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
> +	{pattern_eth_ipv4_esp,
> +			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
> +	{pattern_eth_ipv4_udp_esp,
> +			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},

Why IPv6 input be used by IPv4 flow? Just typo?

>  	{pattern_eth_ipv6_esp,
> -			ICE_INSET_NONE, ICE_INSET_NONE},
> +			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},

Same issue.



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

* Re: [dpdk-dev] [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP
  2020-04-20  5:16   ` Zhang, Qi Z
@ 2020-04-20  5:18     ` Zhao1, Wei
  0 siblings, 0 replies; 12+ messages in thread
From: Zhao1, Wei @ 2020-04-20  5:18 UTC (permalink / raw)
  To: Zhang, Qi Z, dev; +Cc: Fu, Qi

Ok, fix in v2

> -----Original Message-----
> From: Zhang, Qi Z <qi.z.zhang@intel.com>
> Sent: Monday, April 20, 2020 1:17 PM
> To: Zhao1, Wei <wei.zhao1@intel.com>; dev@dpdk.org
> Cc: Fu, Qi <qi.fu@intel.com>
> Subject: RE: [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP
> 
> 
> 
> > -----Original Message-----
> > From: Zhao1, Wei <wei.zhao1@intel.com>
> > Sent: Friday, April 17, 2020 4:26 PM
> > To: dev@dpdk.org
> > Cc: Zhang, Qi Z <qi.z.zhang@intel.com>; Fu, Qi <qi.fu@intel.com>;
> > Zhao1, Wei <wei.zhao1@intel.com>
> > Subject: [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP
> >
> > Add switch filter support for AH ESP and L2TP protocol, and use spi or
> > session idas input set for switch rule.
> >
> > Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
> > ---
> .....
> 
> >  struct sw_meta {
> >  	struct ice_adv_lkup_elem *list;
> > @@ -148,16 +166,24 @@ ice_pattern_match_item
> > ice_switch_pattern_dist_comms[] = {
> >  			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
> >  	{pattern_eth_vlan_pppoes_proto,
> >  			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
> > +	{pattern_eth_ipv4_esp,
> > +			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
> > +	{pattern_eth_ipv4_udp_esp,
> > +			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
> 
> Why IPv6 input be used by IPv4 flow? Just typo?
> 
> >  	{pattern_eth_ipv6_esp,
> > -			ICE_INSET_NONE, ICE_INSET_NONE},
> > +			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
> 
> Same issue.
> 
> 


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

* [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch
  2020-04-17  8:26 [dpdk-dev] [PATCH 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
                   ` (2 preceding siblings ...)
  2020-04-17  8:26 ` [dpdk-dev] [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP Wei Zhao
@ 2020-04-20  5:18 ` Wei Zhao
  2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 1/3] net/ice/base: add support for " Wei Zhao
                     ` (3 more replies)
  3 siblings, 4 replies; 12+ messages in thread
From: Wei Zhao @ 2020-04-20  5:18 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu

This patch set add switch filter support for AH ESP NAT-T
and L2TP protocol, and use spi or session idas input set
for switch rule.

v2:
-fix bug for input set error.

Wei Zhao (3):
  net/ice/base: add support for AH ESP and NAT-T on switch
  net/ice/base: add support for L2TP on switch
  net/ice: add flow support for AH ESP and L2TP

 drivers/net/ice/base/ice_protocol_type.h |  14 +
 drivers/net/ice/base/ice_switch.c        | 311 +++++++++++++++++++++++
 drivers/net/ice/base/ice_switch.h        |   2 +
 drivers/net/ice/ice_generic_flow.c       |  25 ++
 drivers/net/ice/ice_generic_flow.h       |  23 ++
 drivers/net/ice/ice_switch_filter.c      | 198 ++++++++++++---
 6 files changed, 543 insertions(+), 30 deletions(-)

-- 
2.19.1


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

* [dpdk-dev] [PATCH v2 1/3] net/ice/base: add support for AH ESP and NAT-T on switch
  2020-04-20  5:18 ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
@ 2020-04-20  5:18   ` Wei Zhao
  2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 2/3] net/ice/base: add support for L2TP " Wei Zhao
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 12+ messages in thread
From: Wei Zhao @ 2020-04-20  5:18 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu, Wei Zhao

Add dummy packet and tunnel type to support
AH ESP and NAT-T on switch, now we can use spi as
input set for swicth rule.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/base/ice_protocol_type.h |  12 ++
 drivers/net/ice/base/ice_switch.c        | 235 +++++++++++++++++++++++
 drivers/net/ice/base/ice_switch.h        |   1 +
 3 files changed, 248 insertions(+)

diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h
index 3fb065169..2ca7cd8ac 100644
--- a/drivers/net/ice/base/ice_protocol_type.h
+++ b/drivers/net/ice/base/ice_protocol_type.h
@@ -50,6 +50,7 @@ enum ice_protocol_type {
 	ICE_L2TPV3,
 	ICE_ESP,
 	ICE_AH,
+	ICE_NAT_T,
 	ICE_PROTOCOL_LAST
 };
 
@@ -65,6 +66,12 @@ enum ice_sw_tunnel_type {
 			 */
 	ICE_SW_TUN_GTP,
 	ICE_SW_TUN_PPPOE,
+	ICE_SW_TUN_IPV4_ESP,
+	ICE_SW_TUN_IPV6_ESP,
+	ICE_SW_TUN_IPV4_AH,
+	ICE_SW_TUN_IPV6_AH,
+	ICE_SW_TUN_IPV4_NAT_T,
+	ICE_SW_TUN_IPV6_NAT_T,
 	ICE_SW_TUN_PROFID_IPV6_ESP,
 	ICE_SW_TUN_PROFID_IPV6_AH,
 	ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3,
@@ -287,6 +294,10 @@ struct ice_ah_hdr {
 	__be32 seq;
 };
 
+struct ice_nat_t_hdr {
+	struct ice_esp_hdr esp;
+};
+
 struct ice_nvgre {
 	__be16 flags;
 	__be16 protocol;
@@ -309,6 +320,7 @@ union ice_prot_hdr {
 	struct ice_l2tpv3_sess_hdr l2tpv3_sess_hdr;
 	struct ice_esp_hdr esp_hdr;
 	struct ice_ah_hdr ah_hdr;
+	struct ice_nat_t_hdr nat_t_hdr;
 };
 
 /* This is mapping table entry that maps every word within a given protocol
diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c
index 07f8efd65..1da438f5e 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -590,6 +590,176 @@ static const u8 dummy_pppoe_ipv6_packet[] = {
 	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
 };
 
+static const struct ice_dummy_pkt_offsets dummy_ipv4_esp_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_ESP,			34 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_esp_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x32, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_ESP 34 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_esp_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_ESP,			54 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_esp_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 14 */
+	0x00, 0x08, 0x32, 0x00, /* Next header ESP */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_ESP 54 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv4_ah_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_AH,			34 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_ah_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x20, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x33, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_AH 34 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_ah_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_AH,			54 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_ah_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 14 */
+	0x00, 0x0c, 0x33, 0x00, /* Next header AH */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_AH 54 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv4_nat_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_UDP_ILOS,		34 },
+	{ ICE_NAT_T,		42 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_nat_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x24, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x11, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x11, 0x94, /* ICE_NAT_T 34 */
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_nat_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_UDP_ILOS,		54 },
+	{ ICE_NAT_T,		62 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_nat_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 14 */
+	0x00, 0x10, 0x11, 0x00, /* Next header NAT_T */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x11, 0x94, /* ICE_NAT_T 54 */
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+
+};
+
 /* this is a recipe to profile association bitmap */
 static ice_declare_bitmap(recipe_to_profile[ICE_MAX_NUM_RECIPES],
 			  ICE_MAX_NUM_PROFILES);
@@ -4947,6 +5117,11 @@ static const struct ice_prot_ext_tbl_entry ice_prot_ext[ICE_PROTOCOL_LAST] = {
 	{ ICE_NVGRE,		{ 0, 2, 4, 6 } },
 	{ ICE_GTP,		{ 8, 10, 12, 14, 16, 18, 20 } },
 	{ ICE_PPPOE,		{ 0, 2, 4, 6 } },
+	{ ICE_PFCP,		{ 8, 10, 12, 14, 16, 18, 20, 22 } },
+	{ ICE_L2TPV3,		{ 0, 2, 4, 6, 8, 10 } },
+	{ ICE_ESP,		{ 0, 2, 4, 6 } },
+	{ ICE_AH,		{ 0, 2, 4, 6, 8, 10 } },
+	{ ICE_NAT_T,		{ 8, 10, 12, 14 } },
 };
 
 /* The following table describes preferred grouping of recipes.
@@ -4974,6 +5149,11 @@ static const struct ice_protocol_entry ice_prot_id_tbl[ICE_PROTOCOL_LAST] = {
 	{ ICE_NVGRE,		ICE_GRE_OF_HW },
 	{ ICE_GTP,		ICE_UDP_OF_HW },
 	{ ICE_PPPOE,		ICE_PPPOE_HW },
+	{ ICE_PFCP,		ICE_UDP_ILOS_HW },
+	{ ICE_L2TPV3,		ICE_L2TPV3_HW },
+	{ ICE_ESP,		ICE_ESP_HW },
+	{ ICE_AH,		ICE_AH_HW },
+	{ ICE_NAT_T,		ICE_UDP_ILOS_HW },
 };
 
 /**
@@ -5762,6 +5942,7 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 		ice_set_bit(ICE_PROFID_MAC_IPV6_L2TPV3, bm);
 		return;
 	case ICE_SW_TUN_PROFID_IPV6_NAT_T:
+	case ICE_SW_TUN_IPV6_NAT_T:
 		ice_set_bit(ICE_PROFID_IPV6_NAT_T, bm);
 		return;
 	case ICE_SW_TUN_PROFID_IPV4_PFCP_NODE:
@@ -5776,6 +5957,9 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 	case ICE_SW_TUN_PROFID_IPV6_PFCP_SESSION:
 		ice_set_bit(ICE_PROFID_IPV6_PFCP_SESSION, bm);
 		return;
+	case ICE_SW_TUN_IPV4_NAT_T:
+		ice_set_bit(ICE_PROFID_IPV4_NAT_T, bm);
+		return;
 	case ICE_SW_TUN_AND_NON_TUN:
 	default:
 		prof_type = ICE_PROF_ALL;
@@ -6071,6 +6255,48 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 			ipv6 = true;
 	}
 
+	if (tun_type == ICE_SW_TUN_IPV4_ESP) {
+		*pkt = dummy_ipv4_esp_pkt;
+		*pkt_len = sizeof(dummy_ipv4_esp_pkt);
+		*offsets = dummy_ipv4_esp_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_ESP) {
+		*pkt = dummy_ipv6_esp_pkt;
+		*pkt_len = sizeof(dummy_ipv6_esp_pkt);
+		*offsets = dummy_ipv6_esp_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV4_AH) {
+		*pkt = dummy_ipv4_ah_pkt;
+		*pkt_len = sizeof(dummy_ipv4_ah_pkt);
+		*offsets = dummy_ipv4_ah_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_AH) {
+		*pkt = dummy_ipv6_ah_pkt;
+		*pkt_len = sizeof(dummy_ipv6_ah_pkt);
+		*offsets = dummy_ipv6_ah_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV4_NAT_T) {
+		*pkt = dummy_ipv4_nat_pkt;
+		*pkt_len = sizeof(dummy_ipv4_nat_pkt);
+		*offsets = dummy_ipv4_nat_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_NAT_T) {
+		*pkt = dummy_ipv6_nat_pkt;
+		*pkt_len = sizeof(dummy_ipv6_nat_pkt);
+		*offsets = dummy_ipv6_nat_packet_offsets;
+		return;
+	}
+
 	if (tun_type == ICE_SW_TUN_GTP) {
 		*pkt = dummy_udp_gtp_packet;
 		*pkt_len = sizeof(dummy_udp_gtp_packet);
@@ -6260,6 +6486,15 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		case ICE_PPPOE:
 			len = sizeof(struct ice_pppoe_hdr);
 			break;
+		case ICE_ESP:
+			len = sizeof(struct ice_esp_hdr);
+			break;
+		case ICE_NAT_T:
+			len = sizeof(struct ice_nat_t_hdr);
+			break;
+		case ICE_AH:
+			len = sizeof(struct ice_ah_hdr);
+			break;
 		default:
 			return ICE_ERR_PARAM;
 		}
diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h
index f7ae5c741..765ed0945 100644
--- a/drivers/net/ice/base/ice_switch.h
+++ b/drivers/net/ice/base/ice_switch.h
@@ -18,6 +18,7 @@
 /* Switch Profile IDs for Profile related switch rules */
 #define ICE_PROFID_IPV6_ESP		72
 #define ICE_PROFID_IPV6_AH		74
+#define ICE_PROFID_IPV4_NAT_T		75
 #define ICE_PROFID_IPV6_NAT_T		76
 #define ICE_PROFID_MAC_IPV6_L2TPV3	78
 #define ICE_PROFID_IPV4_PFCP_NODE	79
-- 
2.19.1


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

* [dpdk-dev] [PATCH v2 2/3] net/ice/base: add support for L2TP on switch
  2020-04-20  5:18 ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
  2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 1/3] net/ice/base: add support for " Wei Zhao
@ 2020-04-20  5:18   ` Wei Zhao
  2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 3/3] net/ice: add flow support for AH ESP and L2TP Wei Zhao
  2020-04-20  7:26   ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Zhang, Qi Z
  3 siblings, 0 replies; 12+ messages in thread
From: Wei Zhao @ 2020-04-20  5:18 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu, Wei Zhao

Add dummy packet and tunnel type to support
L2TP on switch, now we can use session id as
input set for swicth rule.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/base/ice_protocol_type.h |  2 +
 drivers/net/ice/base/ice_switch.c        | 76 ++++++++++++++++++++++++
 drivers/net/ice/base/ice_switch.h        |  1 +
 3 files changed, 79 insertions(+)

diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h
index 2ca7cd8ac..46cd77e68 100644
--- a/drivers/net/ice/base/ice_protocol_type.h
+++ b/drivers/net/ice/base/ice_protocol_type.h
@@ -72,6 +72,8 @@ enum ice_sw_tunnel_type {
 	ICE_SW_TUN_IPV6_AH,
 	ICE_SW_TUN_IPV4_NAT_T,
 	ICE_SW_TUN_IPV6_NAT_T,
+	ICE_SW_TUN_IPV4_L2TPV3,
+	ICE_SW_TUN_IPV6_L2TPV3,
 	ICE_SW_TUN_PROFID_IPV6_ESP,
 	ICE_SW_TUN_PROFID_IPV6_AH,
 	ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3,
diff --git a/drivers/net/ice/base/ice_switch.c b/drivers/net/ice/base/ice_switch.c
index 1da438f5e..28924085e 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -760,6 +760,61 @@ static const u8 dummy_ipv6_nat_pkt[] = {
 
 };
 
+static const struct ice_dummy_pkt_offsets dummy_ipv4_l2tpv3_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV4_OFOS,	14 },
+	{ ICE_L2TPV3,		34 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv4_l2tpv3_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x08, 0x00,
+
+	0x45, 0x00, 0x00, 0x20, /* ICE_IPV4_IL 14 */
+	0x00, 0x00, 0x40, 0x00,
+	0x40, 0x73, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_L2TPV3 34 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_ipv6_l2tpv3_packet_offsets[] = {
+	{ ICE_MAC_OFOS,		0 },
+	{ ICE_IPV6_OFOS,	14 },
+	{ ICE_L2TPV3,		54 },
+	{ ICE_PROTOCOL_LAST,	0 },
+};
+
+static const u8 dummy_ipv6_l2tpv3_pkt[] = {
+	0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x86, 0xDD,
+
+	0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_IL 14 */
+	0x00, 0x0c, 0x73, 0x40,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+
+	0x00, 0x00, 0x00, 0x00, /* ICE_L2TPV3 54 */
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00,		/* 2 bytes for 4 bytes alignment */
+};
+
 /* this is a recipe to profile association bitmap */
 static ice_declare_bitmap(recipe_to_profile[ICE_MAX_NUM_RECIPES],
 			  ICE_MAX_NUM_PROFILES);
@@ -5939,6 +5994,7 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 		ice_set_bit(ICE_PROFID_IPV6_AH, bm);
 		return;
 	case ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3:
+	case ICE_SW_TUN_IPV6_L2TPV3:
 		ice_set_bit(ICE_PROFID_MAC_IPV6_L2TPV3, bm);
 		return;
 	case ICE_SW_TUN_PROFID_IPV6_NAT_T:
@@ -5960,6 +6016,9 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
 	case ICE_SW_TUN_IPV4_NAT_T:
 		ice_set_bit(ICE_PROFID_IPV4_NAT_T, bm);
 		return;
+	case ICE_SW_TUN_IPV4_L2TPV3:
+		ice_set_bit(ICE_PROFID_MAC_IPV4_L2TPV3, bm);
+		return;
 	case ICE_SW_TUN_AND_NON_TUN:
 	default:
 		prof_type = ICE_PROF_ALL;
@@ -6297,6 +6356,20 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		return;
 	}
 
+	if (tun_type == ICE_SW_TUN_IPV4_L2TPV3) {
+		*pkt = dummy_ipv4_l2tpv3_pkt;
+		*pkt_len = sizeof(dummy_ipv4_l2tpv3_pkt);
+		*offsets = dummy_ipv4_l2tpv3_packet_offsets;
+		return;
+	}
+
+	if (tun_type == ICE_SW_TUN_IPV6_L2TPV3) {
+		*pkt = dummy_ipv6_l2tpv3_pkt;
+		*pkt_len = sizeof(dummy_ipv6_l2tpv3_pkt);
+		*offsets = dummy_ipv6_l2tpv3_packet_offsets;
+		return;
+	}
+
 	if (tun_type == ICE_SW_TUN_GTP) {
 		*pkt = dummy_udp_gtp_packet;
 		*pkt_len = sizeof(dummy_udp_gtp_packet);
@@ -6495,6 +6568,9 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
 		case ICE_AH:
 			len = sizeof(struct ice_ah_hdr);
 			break;
+		case ICE_L2TPV3:
+			len = sizeof(struct ice_l2tpv3_sess_hdr);
+			break;
 		default:
 			return ICE_ERR_PARAM;
 		}
diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h
index 765ed0945..8cbda4081 100644
--- a/drivers/net/ice/base/ice_switch.h
+++ b/drivers/net/ice/base/ice_switch.h
@@ -20,6 +20,7 @@
 #define ICE_PROFID_IPV6_AH		74
 #define ICE_PROFID_IPV4_NAT_T		75
 #define ICE_PROFID_IPV6_NAT_T		76
+#define ICE_PROFID_MAC_IPV4_L2TPV3	77
 #define ICE_PROFID_MAC_IPV6_L2TPV3	78
 #define ICE_PROFID_IPV4_PFCP_NODE	79
 #define ICE_PROFID_IPV4_PFCP_SESSION	80
-- 
2.19.1


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

* [dpdk-dev] [PATCH v2 3/3] net/ice: add flow support for AH ESP and L2TP
  2020-04-20  5:18 ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
  2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 1/3] net/ice/base: add support for " Wei Zhao
  2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 2/3] net/ice/base: add support for L2TP " Wei Zhao
@ 2020-04-20  5:18   ` Wei Zhao
  2020-04-20  7:26   ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Zhang, Qi Z
  3 siblings, 0 replies; 12+ messages in thread
From: Wei Zhao @ 2020-04-20  5:18 UTC (permalink / raw)
  To: dev; +Cc: qi.z.zhang, qi.fu, Wei Zhao

Add switch filter support for AH ESP and L2TP protocol,
and use spi or session idas input set for switch rule.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/ice_generic_flow.c  |  25 ++++
 drivers/net/ice/ice_generic_flow.h  |  23 ++++
 drivers/net/ice/ice_switch_filter.c | 198 +++++++++++++++++++++++-----
 3 files changed, 216 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c
index 3365aeb86..ad103d0e8 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -1382,18 +1382,37 @@ enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[] = {
 	RTE_FLOW_ITEM_TYPE_ICMP6,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_esp[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_ESP,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_esp[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
 	RTE_FLOW_ITEM_TYPE_ESP,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_ah[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_AH,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_ah[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
 	RTE_FLOW_ITEM_TYPE_AH,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_udp_esp[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_UDP,
+	RTE_FLOW_ITEM_TYPE_ESP,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_udp_esp[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
@@ -1408,6 +1427,12 @@ enum rte_flow_item_type pattern_eth_ipv6_udp_ah[] = {
 	RTE_FLOW_ITEM_TYPE_AH,
 	RTE_FLOW_ITEM_TYPE_END,
 };
+enum rte_flow_item_type pattern_eth_ipv4_l2tp[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV4,
+	RTE_FLOW_ITEM_TYPE_L2TPV3OIP,
+	RTE_FLOW_ITEM_TYPE_END,
+};
 enum rte_flow_item_type pattern_eth_ipv6_l2tp[] = {
 	RTE_FLOW_ITEM_TYPE_ETH,
 	RTE_FLOW_ITEM_TYPE_IPV6,
diff --git a/drivers/net/ice/ice_generic_flow.h b/drivers/net/ice/ice_generic_flow.h
index 9fe35df45..492a48cd9 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -31,6 +31,10 @@
 #define ICE_PROT_NVGRE             (1ULL << 20)
 #define ICE_PROT_GTPU              (1ULL << 21)
 #define ICE_PROT_PPPOE_S           (1ULL << 22)
+#define ICE_PROT_ESP               (1ULL << 23)
+#define ICE_PROT_AH                (1ULL << 24)
+#define ICE_PROT_L2TPV3OIP         (1ULL << 25)
+#define ICE_PROT_PFCP              (1ULL << 26)
 
 /* field */
 
@@ -52,6 +56,11 @@
 #define ICE_GTPU_QFI               (1ULL << 48)
 #define ICE_PPPOE_SESSION          (1ULL << 47)
 #define ICE_PPPOE_PROTO            (1ULL << 46)
+#define ICE_ESP_SPI                (1ULL << 45)
+#define ICE_AH_SPI                 (1ULL << 44)
+#define ICE_L2TPV3OIP_SESSION_ID   (1ULL << 43)
+#define ICE_PFCP_SEID              (1ULL << 42)
+#define ICE_PFCP_S_FIELD           (1ULL << 41)
 
 /* input set */
 
@@ -184,6 +193,16 @@
 	(ICE_PROT_PPPOE_S | ICE_PPPOE_SESSION)
 #define ICE_INSET_PPPOE_PROTO \
 	(ICE_PROT_PPPOE_S | ICE_PPPOE_PROTO)
+#define ICE_INSET_ESP_SPI \
+	(ICE_PROT_ESP | ICE_ESP_SPI)
+#define ICE_INSET_AH_SPI \
+	(ICE_PROT_AH | ICE_AH_SPI)
+#define ICE_INSET_L2TPV3OIP_SESSION_ID \
+	(ICE_PROT_L2TPV3OIP | ICE_L2TPV3OIP_SESSION_ID)
+#define ICE_INSET_PFCP_S_FIELD \
+	(ICE_PROT_PFCP | ICE_PFCP_S_FIELD)
+#define ICE_INSET_PFCP_SEID \
+	(ICE_PROT_PFCP | ICE_PFCP_S_FIELD | ICE_PFCP_SEID)
 
 /* empty pattern */
 extern enum rte_flow_item_type pattern_empty[];
@@ -392,14 +411,18 @@ extern enum rte_flow_item_type pattern_eth_vlan_pppoes_ipv6_icmp6[];
 extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[];
 
 /* ESP */
+extern enum rte_flow_item_type pattern_eth_ipv4_esp[];
+extern enum rte_flow_item_type pattern_eth_ipv4_udp_esp[];
 extern enum rte_flow_item_type pattern_eth_ipv6_esp[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp_esp[];
 
 /* AH */
+extern enum rte_flow_item_type pattern_eth_ipv4_ah[];
 extern enum rte_flow_item_type pattern_eth_ipv6_ah[];
 extern enum rte_flow_item_type pattern_eth_ipv6_udp_ah[];
 
 /* L2TP */
+extern enum rte_flow_item_type pattern_eth_ipv4_l2tp[];
 extern enum rte_flow_item_type pattern_eth_ipv6_l2tp[];
 
 /* PFCP */
diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c
index 55a5618a7..179430136 100644
--- a/drivers/net/ice/ice_switch_filter.c
+++ b/drivers/net/ice/ice_switch_filter.c
@@ -95,6 +95,24 @@
 	ICE_INSET_VLAN_OUTER | ICE_INSET_VLAN_INNER | \
 	ICE_INSET_DMAC | ICE_INSET_ETHERTYPE | ICE_INSET_PPPOE_SESSION | \
 	ICE_INSET_PPPOE_PROTO)
+#define ICE_SW_INSET_MAC_IPV4_ESP ( \
+	ICE_SW_INSET_MAC_IPV4 | ICE_INSET_ESP_SPI)
+#define ICE_SW_INSET_MAC_IPV6_ESP ( \
+	ICE_SW_INSET_MAC_IPV6 | ICE_INSET_ESP_SPI)
+#define ICE_SW_INSET_MAC_IPV4_AH ( \
+	ICE_SW_INSET_MAC_IPV4 | ICE_INSET_AH_SPI)
+#define ICE_SW_INSET_MAC_IPV6_AH ( \
+	ICE_SW_INSET_MAC_IPV6 | ICE_INSET_AH_SPI)
+#define ICE_SW_INSET_MAC_IPV4_L2TP ( \
+	ICE_SW_INSET_MAC_IPV4 | ICE_INSET_L2TPV3OIP_SESSION_ID)
+#define ICE_SW_INSET_MAC_IPV6_L2TP ( \
+	ICE_SW_INSET_MAC_IPV6 | ICE_INSET_L2TPV3OIP_SESSION_ID)
+#define ICE_SW_INSET_MAC_IPV4_PFCP ( \
+	ICE_SW_INSET_MAC_IPV4 | \
+	ICE_INSET_PFCP_S_FIELD | ICE_INSET_PFCP_SEID)
+#define ICE_SW_INSET_MAC_IPV6_PFCP ( \
+	ICE_SW_INSET_MAC_IPV6 | \
+	ICE_INSET_PFCP_S_FIELD | ICE_INSET_PFCP_SEID)
 
 struct sw_meta {
 	struct ice_adv_lkup_elem *list;
@@ -148,16 +166,24 @@ ice_pattern_match_item ice_switch_pattern_dist_comms[] = {
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
 	{pattern_eth_vlan_pppoes_proto,
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
+	{pattern_eth_ipv4_esp,
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_udp_esp,
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_ah,
+			ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_ah,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_ah,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv4_l2tp,
+			ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_l2tp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv4_pfcp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_pfcp,
@@ -240,16 +266,24 @@ ice_pattern_match_item ice_switch_pattern_perm[] = {
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
 	{pattern_eth_vlan_pppoes_proto,
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
+	{pattern_eth_ipv4_esp,
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_udp_esp,
+			ICE_SW_INSET_MAC_IPV4_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_esp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_ESP, ICE_INSET_NONE},
+	{pattern_eth_ipv4_ah,
+			ICE_SW_INSET_MAC_IPV4_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_ah,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_AH, ICE_INSET_NONE},
 	{pattern_eth_ipv6_udp_ah,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv4_l2tp,
+			ICE_SW_INSET_MAC_IPV4_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_l2tp,
-			ICE_INSET_NONE, ICE_INSET_NONE},
+			ICE_SW_INSET_MAC_IPV6_L2TP, ICE_INSET_NONE},
 	{pattern_eth_ipv4_pfcp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_pfcp,
@@ -383,11 +417,12 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 	const struct rte_flow_item_pfcp *pfcp_spec, *pfcp_mask;
 	uint64_t input_set = ICE_INSET_NONE;
 	uint16_t j, t = 0;
-	uint16_t tunnel_valid = 0;
-	uint16_t pppoe_valid = 0;
-	uint16_t ipv6_valiad = 0;
-	uint16_t udp_valiad = 0;
-
+	bool profile_rule = 0;
+	bool tunnel_valid = 0;
+	bool pppoe_valid = 0;
+	bool ipv6_valiad = 0;
+	bool ipv4_valiad = 0;
+	bool udp_valiad = 0;
 
 	for (item = pattern; item->type !=
 			RTE_FLOW_ITEM_TYPE_END; item++) {
@@ -470,6 +505,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 		case RTE_FLOW_ITEM_TYPE_IPV4:
 			ipv4_spec = item->spec;
 			ipv4_mask = item->mask;
+			ipv4_valiad = 1;
 			if (ipv4_spec && ipv4_mask) {
 				/* Check IPv4 mask and update input set */
 				if (ipv4_mask->hdr.version_ihl ||
@@ -991,48 +1027,151 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 		case RTE_FLOW_ITEM_TYPE_ESP:
 			esp_spec = item->spec;
 			esp_mask = item->mask;
-			if (esp_spec || esp_mask) {
+			if ((esp_spec && !esp_mask) ||
+				(!esp_spec && esp_mask)) {
 				rte_flow_error_set(error, EINVAL,
 					   RTE_FLOW_ERROR_TYPE_ITEM,
 					   item,
 					   "Invalid esp item");
-				return -ENOTSUP;
+				return 0;
+			}
+			/* Check esp mask and update input set */
+			if (esp_mask && esp_mask->hdr.seq) {
+				rte_flow_error_set(error, EINVAL,
+						RTE_FLOW_ERROR_TYPE_ITEM,
+						item,
+						"Invalid esp mask");
+				return 0;
+			}
+
+			if (!esp_spec && !esp_mask && !input_set) {
+				profile_rule = 1;
+				if (ipv6_valiad && udp_valiad)
+					*tun_type =
+					ICE_SW_TUN_PROFID_IPV6_NAT_T;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_PROFID_IPV6_ESP;
+				else if (ipv4_valiad)
+					return 0;
+			} else if (esp_spec && esp_mask &&
+						esp_mask->hdr.spi){
+				if (udp_valiad)
+					list[t].type = ICE_NAT_T;
+				else
+					list[t].type = ICE_ESP;
+				list[t].h_u.esp_hdr.spi =
+					esp_spec->hdr.spi;
+				list[t].m_u.esp_hdr.spi =
+					esp_mask->hdr.spi;
+				input_set |= ICE_INSET_ESP_SPI;
+				t++;
+			}
+
+			if (!profile_rule) {
+				if (ipv6_valiad && udp_valiad)
+					*tun_type = ICE_SW_TUN_IPV6_NAT_T;
+				else if (ipv4_valiad && udp_valiad)
+					*tun_type = ICE_SW_TUN_IPV4_NAT_T;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_IPV6_ESP;
+				else if (ipv4_valiad)
+					*tun_type = ICE_SW_TUN_IPV4_ESP;
 			}
-			if (ipv6_valiad && udp_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_NAT_T;
-			else if (ipv6_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_ESP;
 			break;
 
 		case RTE_FLOW_ITEM_TYPE_AH:
 			ah_spec = item->spec;
 			ah_mask = item->mask;
-			if (ah_spec || ah_mask) {
+			if ((ah_spec && !ah_mask) ||
+				(!ah_spec && ah_mask)) {
 				rte_flow_error_set(error, EINVAL,
 					   RTE_FLOW_ERROR_TYPE_ITEM,
 					   item,
 					   "Invalid ah item");
-				return -ENOTSUP;
+				return 0;
+			}
+			/* Check ah mask and update input set */
+			if (ah_mask &&
+				(ah_mask->next_hdr ||
+				ah_mask->payload_len ||
+				ah_mask->seq_num ||
+				ah_mask->reserved)) {
+				rte_flow_error_set(error, EINVAL,
+						RTE_FLOW_ERROR_TYPE_ITEM,
+						item,
+						"Invalid ah mask");
+				return 0;
+			}
+
+			if (!ah_spec && !ah_mask && !input_set) {
+				profile_rule = 1;
+				if (ipv6_valiad && udp_valiad)
+					*tun_type =
+					ICE_SW_TUN_PROFID_IPV6_NAT_T;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_PROFID_IPV6_AH;
+				else if (ipv4_valiad)
+					return 0;
+			} else if (ah_spec && ah_mask &&
+						ah_mask->spi){
+				list[t].type = ICE_AH;
+				list[t].h_u.ah_hdr.spi =
+					ah_spec->spi;
+				list[t].m_u.ah_hdr.spi =
+					ah_mask->spi;
+				input_set |= ICE_INSET_AH_SPI;
+				t++;
+			}
+
+			if (!profile_rule) {
+				if (udp_valiad)
+					return 0;
+				else if (ipv6_valiad)
+					*tun_type = ICE_SW_TUN_IPV6_AH;
+				else if (ipv4_valiad)
+					*tun_type = ICE_SW_TUN_IPV4_AH;
 			}
-			if (ipv6_valiad && udp_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_NAT_T;
-			else if (ipv6_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_IPV6_AH;
 			break;
 
 		case RTE_FLOW_ITEM_TYPE_L2TPV3OIP:
 			l2tp_spec = item->spec;
 			l2tp_mask = item->mask;
-			if (l2tp_spec || l2tp_mask) {
+			if ((l2tp_spec && !l2tp_mask) ||
+				(!l2tp_spec && l2tp_mask)) {
 				rte_flow_error_set(error, EINVAL,
 					   RTE_FLOW_ERROR_TYPE_ITEM,
 					   item,
 					   "Invalid l2tp item");
-				return -ENOTSUP;
+				return 0;
+			}
+
+			if (!l2tp_spec && !l2tp_mask && !input_set) {
+				if (ipv6_valiad)
+					*tun_type =
+					ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3;
+				else if (ipv4_valiad)
+					return 0;
+			} else if (l2tp_spec && l2tp_mask &&
+						l2tp_mask->session_id){
+				list[t].type = ICE_L2TPV3;
+				list[t].h_u.l2tpv3_sess_hdr.session_id =
+					l2tp_spec->session_id;
+				list[t].m_u.l2tpv3_sess_hdr.session_id =
+					l2tp_mask->session_id;
+				input_set |= ICE_INSET_L2TPV3OIP_SESSION_ID;
+				t++;
+			}
+
+			if (!profile_rule) {
+				if (ipv6_valiad)
+					*tun_type =
+					ICE_SW_TUN_IPV6_L2TPV3;
+				else if (ipv4_valiad)
+					*tun_type =
+					ICE_SW_TUN_IPV4_L2TPV3;
 			}
-			if (ipv6_valiad)
-				*tun_type = ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3;
 			break;
+
 		case RTE_FLOW_ITEM_TYPE_PFCP:
 			pfcp_spec = item->spec;
 			pfcp_mask = item->mask;
@@ -1082,7 +1221,6 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
 			}
 			break;
 
-
 		case RTE_FLOW_ITEM_TYPE_VOID:
 			break;
 
-- 
2.19.1


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

* Re: [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch
  2020-04-20  5:18 ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
                     ` (2 preceding siblings ...)
  2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 3/3] net/ice: add flow support for AH ESP and L2TP Wei Zhao
@ 2020-04-20  7:26   ` Zhang, Qi Z
  2020-04-22  6:38     ` Ye Xiaolong
  3 siblings, 1 reply; 12+ messages in thread
From: Zhang, Qi Z @ 2020-04-20  7:26 UTC (permalink / raw)
  To: Zhao1, Wei, dev; +Cc: Fu, Qi



> -----Original Message-----
> From: Zhao1, Wei <wei.zhao1@intel.com>
> Sent: Monday, April 20, 2020 1:19 PM
> To: dev@dpdk.org
> Cc: Zhang, Qi Z <qi.z.zhang@intel.com>; Fu, Qi <qi.fu@intel.com>
> Subject: [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch
> 
> This patch set add switch filter support for AH ESP NAT-T and L2TP protocol,
> and use spi or session idas input set for switch rule.
> 
> v2:
> -fix bug for input set error.
> 
> Wei Zhao (3):
>   net/ice/base: add support for AH ESP and NAT-T on switch
>   net/ice/base: add support for L2TP on switch
>   net/ice: add flow support for AH ESP and L2TP
> 
>  drivers/net/ice/base/ice_protocol_type.h |  14 +
>  drivers/net/ice/base/ice_switch.c        | 311
> +++++++++++++++++++++++
>  drivers/net/ice/base/ice_switch.h        |   2 +
>  drivers/net/ice/ice_generic_flow.c       |  25 ++
>  drivers/net/ice/ice_generic_flow.h       |  23 ++
>  drivers/net/ice/ice_switch_filter.c      | 198 ++++++++++++---
>  6 files changed, 543 insertions(+), 30 deletions(-)
> 
> --
> 2.19.1

Acked-by: Qi Zhang <qi.z.zhang@intel.com>


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

* Re: [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch
  2020-04-20  7:26   ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Zhang, Qi Z
@ 2020-04-22  6:38     ` Ye Xiaolong
  0 siblings, 0 replies; 12+ messages in thread
From: Ye Xiaolong @ 2020-04-22  6:38 UTC (permalink / raw)
  To: Zhang, Qi Z; +Cc: Zhao1, Wei, dev, Fu, Qi

On 04/20, Zhang, Qi Z wrote:
>
>
>> -----Original Message-----
>> From: Zhao1, Wei <wei.zhao1@intel.com>
>> Sent: Monday, April 20, 2020 1:19 PM
>> To: dev@dpdk.org
>> Cc: Zhang, Qi Z <qi.z.zhang@intel.com>; Fu, Qi <qi.fu@intel.com>
>> Subject: [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch
>> 
>> This patch set add switch filter support for AH ESP NAT-T and L2TP protocol,
>> and use spi or session idas input set for switch rule.
>> 
>> v2:
>> -fix bug for input set error.
>> 
>> Wei Zhao (3):
>>   net/ice/base: add support for AH ESP and NAT-T on switch
>>   net/ice/base: add support for L2TP on switch
>>   net/ice: add flow support for AH ESP and L2TP
>> 
>>  drivers/net/ice/base/ice_protocol_type.h |  14 +
>>  drivers/net/ice/base/ice_switch.c        | 311
>> +++++++++++++++++++++++
>>  drivers/net/ice/base/ice_switch.h        |   2 +
>>  drivers/net/ice/ice_generic_flow.c       |  25 ++
>>  drivers/net/ice/ice_generic_flow.h       |  23 ++
>>  drivers/net/ice/ice_switch_filter.c      | 198 ++++++++++++---
>>  6 files changed, 543 insertions(+), 30 deletions(-)
>> 
>> --
>> 2.19.1
>
>Acked-by: Qi Zhang <qi.z.zhang@intel.com>
>

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

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

end of thread, other threads:[~2020-04-22  6:43 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-17  8:26 [dpdk-dev] [PATCH 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
2020-04-17  8:26 ` [dpdk-dev] [PATCH 1/3] net/ice/base: add support for " Wei Zhao
2020-04-17  8:26 ` [dpdk-dev] [PATCH 2/3] net/ice/base: add support for L2TP " Wei Zhao
2020-04-17  8:26 ` [dpdk-dev] [PATCH 3/3] net/ice: add flow support for AH ESP and L2TP Wei Zhao
2020-04-20  5:16   ` Zhang, Qi Z
2020-04-20  5:18     ` Zhao1, Wei
2020-04-20  5:18 ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Wei Zhao
2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 1/3] net/ice/base: add support for " Wei Zhao
2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 2/3] net/ice/base: add support for L2TP " Wei Zhao
2020-04-20  5:18   ` [dpdk-dev] [PATCH v2 3/3] net/ice: add flow support for AH ESP and L2TP Wei Zhao
2020-04-20  7:26   ` [dpdk-dev] [PATCH v2 0/3] add support for L2TP AH ESP and NAT-T on switch Zhang, Qi Z
2020-04-22  6:38     ` 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).