diff mbox series

[v4,09/13] net/ice: add support for IPv6 NAT-T

Message ID 20200403044609.27512-10-wei.zhao1@intel.com (mailing list archive)
State Accepted, archived
Delegated to: xiaolong ye
Headers show
Series add switch filter support for intel DCF | expand

Checks

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

Commit Message

Zhao1, Wei April 3, 2020, 4:46 a.m. UTC
This patch add switch filter support for IPv6 NAT-T packets,
it enable swicth filter to direct ipv6 packets with
NAT-T payload to specific action.

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
---
 drivers/net/ice/ice_generic_flow.c  | 14 ++++++++++++++
 drivers/net/ice/ice_generic_flow.h  |  2 ++
 drivers/net/ice/ice_switch_filter.c | 19 +++++++++++++++++--
 3 files changed, 33 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c
index 04dcaba08..3365aeb86 100644
--- a/drivers/net/ice/ice_generic_flow.c
+++ b/drivers/net/ice/ice_generic_flow.c
@@ -1394,6 +1394,20 @@  enum rte_flow_item_type pattern_eth_ipv6_ah[] = {
 	RTE_FLOW_ITEM_TYPE_AH,
 	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,
+	RTE_FLOW_ITEM_TYPE_UDP,
+	RTE_FLOW_ITEM_TYPE_ESP,
+	RTE_FLOW_ITEM_TYPE_END,
+};
+enum rte_flow_item_type pattern_eth_ipv6_udp_ah[] = {
+	RTE_FLOW_ITEM_TYPE_ETH,
+	RTE_FLOW_ITEM_TYPE_IPV6,
+	RTE_FLOW_ITEM_TYPE_UDP,
+	RTE_FLOW_ITEM_TYPE_AH,
+	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 8a866d2ee..9fe35df45 100644
--- a/drivers/net/ice/ice_generic_flow.h
+++ b/drivers/net/ice/ice_generic_flow.h
@@ -393,9 +393,11 @@  extern enum rte_flow_item_type pattern_eth_qinq_pppoes_ipv6_icmp6[];
 
 /* 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_ipv6_ah[];
+extern enum rte_flow_item_type pattern_eth_ipv6_udp_ah[];
 
 /* L2TP */
 extern enum rte_flow_item_type pattern_eth_ipv6_l2tp[];
diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c
index 9b4b9346c..4248b8911 100644
--- a/drivers/net/ice/ice_switch_filter.c
+++ b/drivers/net/ice/ice_switch_filter.c
@@ -150,8 +150,12 @@  ice_pattern_match_item ice_switch_pattern_dist_comms[] = {
 			ICE_SW_INSET_MAC_PPPOE_PROTO, ICE_INSET_NONE},
 	{pattern_eth_ipv6_esp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv6_udp_esp,
+			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_ah,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv6_udp_ah,
+			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_l2tp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv4_pfcp,
@@ -224,8 +228,12 @@  ice_pattern_match_item ice_switch_pattern_perm[] = {
 			ICE_SW_INSET_PERM_TUNNEL_IPV4_TCP, ICE_INSET_NONE},
 	{pattern_eth_ipv6_esp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv6_udp_esp,
+			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_ah,
 			ICE_INSET_NONE, ICE_INSET_NONE},
+	{pattern_eth_ipv6_udp_ah,
+			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv6_l2tp,
 			ICE_INSET_NONE, ICE_INSET_NONE},
 	{pattern_eth_ipv4_pfcp,
@@ -364,6 +372,7 @@  ice_switch_inset_get(const struct rte_flow_item pattern[],
 	uint16_t tunnel_valid = 0;
 	uint16_t pppoe_valid = 0;
 	uint16_t ipv6_valiad = 0;
+	uint16_t udp_valiad = 0;
 
 
 	for (item = pattern; item->type !=
@@ -642,6 +651,7 @@  ice_switch_inset_get(const struct rte_flow_item pattern[],
 		case RTE_FLOW_ITEM_TYPE_UDP:
 			udp_spec = item->spec;
 			udp_mask = item->mask;
+			udp_valiad = 1;
 			if (udp_spec && udp_mask) {
 				/* Check UDP mask and update input set*/
 				if (udp_mask->hdr.dgram_len ||
@@ -974,7 +984,9 @@  ice_switch_inset_get(const struct rte_flow_item pattern[],
 					   "Invalid esp item");
 				return -ENOTSUP;
 			}
-			if (ipv6_valiad)
+			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;
 
@@ -988,7 +1000,9 @@  ice_switch_inset_get(const struct rte_flow_item pattern[],
 					   "Invalid ah item");
 				return -ENOTSUP;
 			}
-			if (ipv6_valiad)
+			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;
 
@@ -1237,6 +1251,7 @@  ice_is_profile_rule(enum ice_sw_tunnel_type tun_type)
 	case ICE_SW_TUN_PROFID_IPV6_ESP:
 	case ICE_SW_TUN_PROFID_IPV6_AH:
 	case ICE_SW_TUN_PROFID_MAC_IPV6_L2TPV3:
+	case ICE_SW_TUN_PROFID_IPV6_NAT_T:
 	case ICE_SW_TUN_PROFID_IPV4_PFCP_NODE:
 	case ICE_SW_TUN_PROFID_IPV4_PFCP_SESSION:
 	case ICE_SW_TUN_PROFID_IPV6_PFCP_NODE: