DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev]  net/iavf: add inner 5 tuple hash for GTPU
@ 2020-06-12  2:44 Jeff Guo
  2020-06-14 15:09 ` [dpdk-dev] [dpdk-dev v2] " Jeff Guo
  0 siblings, 1 reply; 16+ messages in thread
From: Jeff Guo @ 2020-06-12  2:44 UTC (permalink / raw)
  To: beilei.xing, qi.z.zhang, jingjing.wu; +Cc: xiaolong.ye, dev, jia.guo

Previous iavf only support inner ipv4 hash for GTPU, this patch aims to
enable inner 5 tuple hash for GTPU, that involves inner ipv4 src/dst,
tcp sport/dport, udp sport/dport and protocol id.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
 drivers/net/iavf/iavf_hash.c | 1080 +++++++++++++++++++++++-----------
 1 file changed, 730 insertions(+), 350 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index a7691ef0c..91a734ac0 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -24,15 +24,19 @@
 #include "iavf_generic_flow.h"
 
 enum iavf_pattern_hint_type {
-	IAVF_PATTERN_HINT_NONE,
-	IAVF_PATTERN_HINT_IPV4,
-	IAVF_PATTERN_HINT_IPV4_UDP,
-	IAVF_PATTERN_HINT_IPV4_TCP,
-	IAVF_PATTERN_HINT_IPV4_SCTP,
-	IAVF_PATTERN_HINT_IPV6,
-	IAVF_PATTERN_HINT_IPV6_UDP,
-	IAVF_PATTERN_HINT_IPV6_TCP,
-	IAVF_PATTERN_HINT_IPV6_SCTP,
+	IAVF_PHINT_NONE,
+	IAVF_PHINT_IPV4,
+	IAVF_PHINT_IPV4_UDP,
+	IAVF_PHINT_IPV4_TCP,
+	IAVF_PHINT_IPV4_SCTP,
+	IAVF_PHINT_IPV6,
+	IAVF_PHINT_IPV6_UDP,
+	IAVF_PHINT_IPV6_TCP,
+	IAVF_PHINT_IPV6_SCTP,
+	IAVF_PHINT_IPV4_GTPU_IPV4,
+	IAVF_PHINT_IPV4_GTPU_EH_IPV4,
+	IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP,
+	IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP,
 };
 
 enum iavf_gtpu_hint {
@@ -83,42 +87,48 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
 			       void **meta,
 			       struct rte_flow_error *error);
 
-struct iavf_pattern_match_type phint_empty = {
-	IAVF_PATTERN_HINT_NONE};
-struct iavf_pattern_match_type phint_eth_ipv4 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_udp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
-	IAVF_PATTERN_HINT_IPV4_TCP};
-struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
-	IAVF_PATTERN_HINT_IPV4_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_esp = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_ah = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_udp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
-	IAVF_PATTERN_HINT_IPV6_TCP};
-struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
-	IAVF_PATTERN_HINT_IPV6_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv6_esp = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_ah = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_empty = {
+	IAVF_PHINT_NONE};
+static struct iavf_pattern_match_type phint_eth_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
+	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_ipv4 = {
+	IAVF_PHINT_IPV4_GTPU_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
+	IAVF_PHINT_IPV4_GTPU_EH_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp = {
+	IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp = {
+	IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv6 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
+	IAVF_PHINT_IPV6_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
+	IAVF_PHINT_IPV6_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
+	IAVF_PHINT_IPV6_UDP};
 
 /**
  * Supported pattern for hash.
@@ -131,25 +141,27 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp},
 	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp},
-	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
+	{iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_INSET_NONE,
+					&phint_eth_ipv4_gtpu_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
 	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
 	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv4_l2tpv3},
+					&phint_eth_ipv4_l2tpv3},
 	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE, &phint_eth_ipv4_pfcp},
+	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
 	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE, &phint_eth_ipv6_udp},
 	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
 	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp},
 	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
 	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
 	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv6_l2tpv3},
+					&phint_eth_ipv6_l2tpv3},
 	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE, &phint_eth_ipv6_pfcp},
 	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
 };
@@ -207,6 +219,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv4_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv4_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_udp_src_port { \
 	VIRTCHNL_PROTO_HDR_UDP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT), {BUFF_NOUSED } }
@@ -271,6 +305,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv6_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv6_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_up_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -295,6 +351,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	VIRTCHNL_PROTO_HDR_PFCP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID), {BUFF_NOUSED } }
 
+/* ETH */
+
 struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
 };
@@ -315,6 +373,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
 };
 
+/* IPV4 */
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
 };
@@ -323,117 +383,77 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_esp }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_ah }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_l2tpv3 }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_pfcp }
-};
-
 struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_tcp }
 };
 
@@ -472,105 +492,251 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp = {
 	proto_hint_sctp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_esp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_ah }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_l2tpv3 }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_pfcp }
 };
 
+/* GTPU UP */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+/* GTPU DWN */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+/* IPV6 */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
+};
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_tcp }
 };
 
@@ -595,12 +761,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_sctp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_dst_port }
 };
 
@@ -609,6 +775,26 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp = {
 	proto_hint_sctp }
 };
 
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_esp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_ah }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_l2tpv3 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_pfcp }
+};
+
 /**
  * The first member is pattern hint type,
  * the second member is hash type,
@@ -617,329 +803,539 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp = {
  */
 struct iavf_hash_match_type iavf_hash_type_list[] = {
 	/* IPV4 */
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY, &hdrs_hint_eth_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY, &hdrs_hint_eth_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
-			&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
-			&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
-			&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
-			&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3, &hdrs_hint_ipv4_l2tpv3,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4,
-	IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_ETH,
+		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_IPV4,
+		&hdrs_hint_ipv4, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_ESP,
+		&hdrs_hint_ipv4_esp, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_AH,
+		&hdrs_hint_ipv4_ah, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4, ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv4_l2tpv3, IAVF_GTPU_HINT_NONE},
 	/* IPV4 UDP */
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_PFCP,
 		&hdrs_hint_ipv4_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
+	{IAVF_PHINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
 		&hdrs_hint_ipv4_udp, IAVF_GTPU_HINT_NONE},
 	/* IPV4 TCP */
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
 		&hdrs_hint_ipv4_tcp, IAVF_GTPU_HINT_NONE},
 	/* IPV4 SCTP */
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
+	{IAVF_PHINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
 		&hdrs_hint_ipv4_sctp, IAVF_GTPU_HINT_NONE},
 	/* IPV6 */
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_L2_SRC_ONLY,
 		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_L2_DST_ONLY,
 		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
 		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
 		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH,
+	{IAVF_PHINT_IPV6, ETH_RSS_ETH,
 		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN,
+	{IAVF_PHINT_IPV6, ETH_RSS_S_VLAN,
 		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN,
+	{IAVF_PHINT_IPV6, ETH_RSS_C_VLAN,
 		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP,
+	{IAVF_PHINT_IPV6, ETH_RSS_IPV6,
+		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6, ETH_RSS_ESP,
 		&hdrs_hint_ipv6_esp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH,
+	{IAVF_PHINT_IPV6, ETH_RSS_AH,
 		&hdrs_hint_ipv6_ah, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3,
+	{IAVF_PHINT_IPV6, ETH_RSS_L2TPV3,
 		&hdrs_hint_ipv6_l2tpv3, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6,
-		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
 	/* IPV6 UDP */
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP,
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_PFCP,
 		&hdrs_hint_ipv6_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
+	{IAVF_PHINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
 		&hdrs_hint_ipv6_udp, IAVF_GTPU_HINT_NONE},
 	/* IPV6 TCP */
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
 		&hdrs_hint_ipv6_tcp, IAVF_GTPU_HINT_NONE},
 	/* IPV6 SCTP */
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
 		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
 		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
 		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
 		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
 		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
 		&hdrs_hint_ipv6_sctp, IAVF_GTPU_HINT_NONE},
+	/* GTPU */
+	/* GTPU IPV4*/
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_NONE},
+	{IAVF_PHINT_IPV4_GTPU_IPV4, ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_NONE},
+	/* GTPU EH*/
+	/* Inner IPV4 */
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	/* Inner IPV4->UDP */
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	/* Inner IPV4->TCP */
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
+	{IAVF_PHINT_IPV4_GTPU_EH_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY | ETH_RSS_GTPU,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
 };
 
 struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = {
@@ -1061,14 +1457,15 @@ iavf_hash_refine_type(uint64_t *rss_type, const struct rte_flow_item pattern[],
 	const struct rte_flow_item *item;
 
 	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-		if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
+		if (item->type == RTE_FLOW_ITEM_TYPE_GTPU ||
+		    item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
 			const struct rte_flow_item_gtp_psc *psc = item->spec;
 
 			if (psc && (psc->pdu_type == IAVF_GTPU_HINT_UPLINK ||
-				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK)) {
-				*rss_type |= ETH_RSS_GTPU;
+				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK))
 				*gtpu_hint = psc->pdu_type;
-			}
+
+			*rss_type |= ETH_RSS_GTPU;
 		}
 	}
 }
@@ -1083,7 +1480,6 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 					(pattern_match_item->meta);
 	struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta;
 	uint32_t type_list_len = RTE_DIM(iavf_hash_type_list);
-	struct iavf_hash_match_type *type_match_item;
 	enum iavf_gtpu_hint gtpu_hint = IAVF_GTPU_HINT_NONE;
 	enum rte_flow_action_type action_type;
 	const struct rte_flow_action_rss *rss;
@@ -1148,17 +1544,6 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 				rss_meta->rss_algorithm =
 					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
 
-			type_match_item =
-			rte_zmalloc("iavf_type_match_item",
-				    sizeof(struct iavf_hash_match_type), 0);
-			if (!type_match_item) {
-				rte_flow_error_set(error, EINVAL,
-						   RTE_FLOW_ERROR_TYPE_HANDLE,
-						   NULL,
-						   "No memory for type_match_item");
-				return -ENOMEM;
-			}
-
 			/* Find matched proto hdrs according to hash type. */
 			for (i = 0; i < type_list_len; i++) {
 				struct iavf_hash_match_type *ht_map =
@@ -1166,18 +1551,13 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 				if (rss_type == ht_map->hash_type &&
 				    mt->phint_type == ht_map->phint_type &&
 				    gtpu_hint == ht_map->gtpu_hint) {
-					type_match_item->hash_type =
-						ht_map->hash_type;
-					type_match_item->proto_hdrs =
-						ht_map->proto_hdrs;
 					rss_meta->proto_hdrs =
-						type_match_item->proto_hdrs;
+						ht_map->proto_hdrs;
 					item_found = true;
+					break;
 				}
 			}
 
-			rte_free(type_match_item);
-
 			if (!item_found)
 				return rte_flow_error_set(error, ENOTSUP,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v2] net/iavf: add inner 5 tuple hash for GTPU
  2020-06-12  2:44 [dpdk-dev] net/iavf: add inner 5 tuple hash for GTPU Jeff Guo
@ 2020-06-14 15:09 ` Jeff Guo
  2020-06-21 14:02   ` [dpdk-dev] [dpdk-dev v3] " Jeff Guo
  0 siblings, 1 reply; 16+ messages in thread
From: Jeff Guo @ 2020-06-14 15:09 UTC (permalink / raw)
  To: beilei.xing, qi.z.zhang, jingjing.wu
  Cc: xiaolong.ye, dev, jia.guo, simei.su, junfeng.guo

Previous iavf only support inner ipv4 hash for GTPU, this patch aims to
enable inner 5 tuple hash for GTPU, that involves inner ipv4 src/dst,
tcp sport/dport, udp sport/dport and protocol id.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
 drivers/net/iavf/iavf_hash.c | 1670 ++++++++++++++++++++++++----------
 1 file changed, 1174 insertions(+), 496 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index a7691ef0c..602856eb0 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -24,32 +24,34 @@
 #include "iavf_generic_flow.h"
 
 enum iavf_pattern_hint_type {
-	IAVF_PATTERN_HINT_NONE,
-	IAVF_PATTERN_HINT_IPV4,
-	IAVF_PATTERN_HINT_IPV4_UDP,
-	IAVF_PATTERN_HINT_IPV4_TCP,
-	IAVF_PATTERN_HINT_IPV4_SCTP,
-	IAVF_PATTERN_HINT_IPV6,
-	IAVF_PATTERN_HINT_IPV6_UDP,
-	IAVF_PATTERN_HINT_IPV6_TCP,
-	IAVF_PATTERN_HINT_IPV6_SCTP,
-};
-
-enum iavf_gtpu_hint {
-	IAVF_GTPU_HINT_DOWNLINK,
-	IAVF_GTPU_HINT_UPLINK,
-	IAVF_GTPU_HINT_NONE,
-};
+	IAVF_PHINT_NONE				= 0x00000000,
+	IAVF_PHINT_IPV4				= 0x00000001,
+	IAVF_PHINT_IPV4_UDP			= 0x00000002,
+	IAVF_PHINT_IPV4_TCP			= 0x00000004,
+	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
+	IAVF_PHINT_IPV6				= 0x00000010,
+	IAVF_PHINT_IPV6_UDP			= 0x00000020,
+	IAVF_PHINT_IPV6_TCP			= 0x00000040,
+	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
+	IAVF_PHINT_C_VLAN			= 0x00000100,
+	IAVF_PHINT_S_VLAN			= 0x00000200,
+	IAVF_PHINT_IPV4_GTPU_IP			= 0x00000400,
+	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000800,
+	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00001000,
+	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00002000,
+};
+
+#define GTPU_EH_DWNLINK	0
+#define GTPU_EH_UPLINK	1
 
 struct iavf_pattern_match_type {
-	enum iavf_pattern_hint_type phint_type;
+	uint64_t pattern_hint;
 };
 
 struct iavf_hash_match_type {
-	enum iavf_pattern_hint_type phint_type;
 	uint64_t hash_type;
 	struct virtchnl_proto_hdrs *proto_hdrs;
-	enum iavf_gtpu_hint gtpu_hint;
+	uint64_t pattern_hint;
 };
 
 struct iavf_rss_meta {
@@ -83,42 +85,52 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
 			       void **meta,
 			       struct rte_flow_error *error);
 
-struct iavf_pattern_match_type phint_empty = {
-	IAVF_PATTERN_HINT_NONE};
-struct iavf_pattern_match_type phint_eth_ipv4 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_udp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
-	IAVF_PATTERN_HINT_IPV4_TCP};
-struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
-	IAVF_PATTERN_HINT_IPV4_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_esp = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_ah = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_udp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
-	IAVF_PATTERN_HINT_IPV6_TCP};
-struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
-	IAVF_PATTERN_HINT_IPV6_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv6_esp = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_ah = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_empty = {
+	IAVF_PHINT_NONE};
+static struct iavf_pattern_match_type phint_eth_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
+	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
+	IAVF_PHINT_C_VLAN};
+static struct iavf_pattern_match_type phint_eth_ipv6 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
+	IAVF_PHINT_IPV6_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
+	IAVF_PHINT_IPV6_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
+	IAVF_PHINT_C_VLAN};
 
 /**
  * Supported pattern for hash.
@@ -131,26 +143,30 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp},
 	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp},
-	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
+	{iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_INSET_NONE,
+					&phint_eth_ipv4_gtpu_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
 	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
 	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv4_l2tpv3},
+					&phint_eth_ipv4_l2tpv3},
 	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE, &phint_eth_ipv4_pfcp},
+	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE, &phint_eth_vlan_ipv4},
+	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
 	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE, &phint_eth_ipv6_udp},
 	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
 	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp},
 	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
 	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
 	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv6_l2tpv3},
+					&phint_eth_ipv6_l2tpv3},
 	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE, &phint_eth_ipv6_pfcp},
+	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE, &phint_eth_vlan_ipv6},
 	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
 };
 
@@ -207,6 +223,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv4_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv4_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_udp_src_port { \
 	VIRTCHNL_PROTO_HDR_UDP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT), {BUFF_NOUSED } }
@@ -271,6 +309,36 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv6_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv6_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_gtpu_eh_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_EH, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
+#define proto_hint_gtpu_ip_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_IP, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_up_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -295,6 +363,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	VIRTCHNL_PROTO_HDR_PFCP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID), {BUFF_NOUSED } }
 
+/* ETH */
+
 struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
 };
@@ -315,6 +385,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
 };
 
+/* IPV4 */
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
 };
@@ -323,117 +395,77 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_esp }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_ah }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_l2tpv3 }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_pfcp }
-};
-
 struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_tcp }
 };
 
@@ -472,105 +504,334 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp = {
 	proto_hint_sctp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_esp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_ah }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_l2tpv3 }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_pfcp }
 };
 
+/* GTPU IP */
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_dst }
+};
+
+/* GTPU EH */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+/* GTPU UP */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+/* GTPU DWN */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+/* IPV6 */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
+};
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_tcp }
 };
 
@@ -595,12 +856,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_sctp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_dst_port }
 };
 
@@ -609,337 +870,762 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp = {
 	proto_hint_sctp }
 };
 
-/**
- * The first member is pattern hint type,
- * the second member is hash type,
- * the third member is virtchnl protocol hdrs.
- * the forth member is downlink/uplink type.
- */
-struct iavf_hash_match_type iavf_hash_type_list[] = {
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_esp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_ah }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_l2tpv3 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_pfcp }
+};
+
+struct iavf_hash_match_type iavf_hash_map_list[] = {
 	/* IPV4 */
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY, &hdrs_hint_eth_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY, &hdrs_hint_eth_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
-			&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
-			&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
-			&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
-			&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3, &hdrs_hint_ipv4_l2tpv3,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4,
-	IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv4_esp, IAVF_PHINT_IPV4},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv4_ah, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv4_l2tpv3, IAVF_PHINT_IPV4},
 	/* IPV4 UDP */
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv4_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
-		&hdrs_hint_ipv4_udp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv4_pfcp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp, IAVF_PHINT_IPV4_UDP},
 	/* IPV4 TCP */
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
-		&hdrs_hint_ipv4_tcp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
 	/* IPV4 SCTP */
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
-		&hdrs_hint_ipv4_sctp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP,
+		&hdrs_hint_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
 	/* IPV6 */
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH,
-		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN,
-		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN,
-		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP,
-		&hdrs_hint_ipv6_esp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH,
-		&hdrs_hint_ipv6_ah, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3,
-		&hdrs_hint_ipv6_l2tpv3, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6,
-		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6,
+		&hdrs_hint_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv6_esp, IAVF_PHINT_IPV6},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv6_ah, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv6_l2tpv3, IAVF_PHINT_IPV6},
 	/* IPV6 UDP */
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
-		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
+		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
-		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv6_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
-		&hdrs_hint_ipv6_udp, IAVF_GTPU_HINT_NONE},
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
+		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv4_pfcp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP,
+		&hdrs_hint_ipv4_udp, IAVF_PHINT_IPV6_UDP},
 	/* IPV6 TCP */
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
-		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
+		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
-		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
-		&hdrs_hint_ipv6_tcp, IAVF_GTPU_HINT_NONE},
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
+		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP,
+		&hdrs_hint_ipv4_tcp, IAVF_PHINT_IPV6_TCP},
 	/* IPV6 SCTP */
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
+		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
+		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP,
+		&hdrs_hint_ipv4_sctp, IAVF_PHINT_IPV6_SCTP},
+	/* VLAN */
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan, IAVF_PHINT_S_VLAN},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan, IAVF_PHINT_C_VLAN},
+};
+
+struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
+	/* GTPU */
+	/* GTPU IP */
+	/* GTPU IPV4*/
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	/* GTPU EH */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
-		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
-		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
-		&hdrs_hint_ipv6_sctp, IAVF_GTPU_HINT_NONE},
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH UP */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH DWN */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
 };
 
 struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = {
@@ -1037,10 +1723,12 @@ iavf_hash_init(struct iavf_adapter *ad)
 }
 
 static int
-iavf_hash_check_inset(const struct rte_flow_item pattern[],
-		      struct rte_flow_error *error)
+iavf_hash_parse_pattern(struct iavf_pattern_match_item *pattern_match_item,
+			const struct rte_flow_item pattern[], uint64_t *phint,
+			struct rte_flow_error *error)
 {
 	const struct rte_flow_item *item = pattern;
+	const struct rte_flow_item_gtp_psc *psc;
 
 	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
 		if (item->last) {
@@ -1049,45 +1737,45 @@ iavf_hash_check_inset(const struct rte_flow_item pattern[],
 					   "Not support range");
 			return -rte_errno;
 		}
-	}
-
-	return 0;
-}
 
-static void
-iavf_hash_refine_type(uint64_t *rss_type, const struct rte_flow_item pattern[],
-		      enum iavf_gtpu_hint *gtpu_hint)
-{
-	const struct rte_flow_item *item;
-
-	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-		if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
-			const struct rte_flow_item_gtp_psc *psc = item->spec;
-
-			if (psc && (psc->pdu_type == IAVF_GTPU_HINT_UPLINK ||
-				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK)) {
-				*rss_type |= ETH_RSS_GTPU;
-				*gtpu_hint = psc->pdu_type;
-			}
+		switch (item->type) {
+		case RTE_FLOW_ITEM_TYPE_GTPU:
+			*phint |= IAVF_PHINT_IPV4_GTPU_IP;
+			break;
+		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
+			psc = item->spec;
+			*phint &= ~IAVF_PHINT_IPV4_GTPU_IP;
+			if (!psc)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
+			else if (psc->pdu_type == GTPU_EH_UPLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_UPLINK;
+			else if (psc->pdu_type == GTPU_EH_DWNLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_DWNLINK;
+			break;
+		default:
+			break;
 		}
 	}
+
+	/* update and restore pattern hint */
+	*phint |= ((struct iavf_pattern_match_type *)
+				(pattern_match_item->meta))->pattern_hint;
+
+	return 0;
 }
 
 static int
 iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
-		       const struct rte_flow_item pattern[],
 		       const struct rte_flow_action actions[],
-		       void **meta, struct rte_flow_error *error)
+		       uint64_t pattern_hint, void **meta,
+		       struct rte_flow_error *error)
 {
-	struct iavf_pattern_match_type *mt = (struct iavf_pattern_match_type *)
-					(pattern_match_item->meta);
 	struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta;
-	uint32_t type_list_len = RTE_DIM(iavf_hash_type_list);
-	struct iavf_hash_match_type *type_match_item;
-	enum iavf_gtpu_hint gtpu_hint = IAVF_GTPU_HINT_NONE;
+	struct iavf_hash_match_type *hash_map_list;
 	enum rte_flow_action_type action_type;
 	const struct rte_flow_action_rss *rss;
 	const struct rte_flow_action *action;
+	uint32_t mlist_len;
 	bool item_found = false;
 	uint64_t rss_type;
 	uint16_t i;
@@ -1107,12 +1795,6 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 			 */
 			rss_type = rte_eth_rss_hf_refine(rss_type);
 
-			/**
-			 * Refine the hash type base on some specific item of
-			 * the pattern, such as identify the gtpu hash.
-			 */
-			iavf_hash_refine_type(&rss_type, pattern, &gtpu_hint);
-
 			/* Check if pattern is empty. */
 			if (pattern_match_item->pattern_list !=
 				iavf_pattern_empty && rss->func ==
@@ -1148,36 +1830,30 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 				rss_meta->rss_algorithm =
 					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
 
-			type_match_item =
-			rte_zmalloc("iavf_type_match_item",
-				    sizeof(struct iavf_hash_match_type), 0);
-			if (!type_match_item) {
-				rte_flow_error_set(error, EINVAL,
-						   RTE_FLOW_ERROR_TYPE_HANDLE,
-						   NULL,
-						   "No memory for type_match_item");
-				return -ENOMEM;
+			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_IP) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK)) {
+				hash_map_list = iavf_gtpu_hash_map_list;
+				mlist_len = RTE_DIM(iavf_gtpu_hash_map_list);
+			} else {
+				hash_map_list = iavf_hash_map_list;
+				mlist_len = RTE_DIM(iavf_hash_map_list);
 			}
 
 			/* Find matched proto hdrs according to hash type. */
-			for (i = 0; i < type_list_len; i++) {
+			for (i = 0; i < mlist_len; i++) {
 				struct iavf_hash_match_type *ht_map =
-					&iavf_hash_type_list[i];
+					&hash_map_list[i];
 				if (rss_type == ht_map->hash_type &&
-				    mt->phint_type == ht_map->phint_type &&
-				    gtpu_hint == ht_map->gtpu_hint) {
-					type_match_item->hash_type =
-						ht_map->hash_type;
-					type_match_item->proto_hdrs =
-						ht_map->proto_hdrs;
+				    pattern_hint == ht_map->pattern_hint) {
 					rss_meta->proto_hdrs =
-						type_match_item->proto_hdrs;
+						ht_map->proto_hdrs;
 					item_found = true;
+					break;
 				}
 			}
 
-			rte_free(type_match_item);
-
 			if (!item_found)
 				return rte_flow_error_set(error, ENOTSUP,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
@@ -1209,6 +1885,7 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 {
 	struct iavf_pattern_match_item *pattern_match_item;
 	struct iavf_rss_meta *rss_meta_ptr;
+	uint64_t phint = IAVF_PHINT_NONE;
 	int ret = 0;
 
 	rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
@@ -1228,12 +1905,13 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 		goto error;
 	}
 
-	ret = iavf_hash_check_inset(pattern, error);
+	ret = iavf_hash_parse_pattern(pattern_match_item, pattern, &phint,
+				      error);
 	if (ret)
 		goto error;
 
 	/* Check rss action. */
-	ret = iavf_hash_parse_action(pattern_match_item, pattern, actions,
+	ret = iavf_hash_parse_action(pattern_match_item, actions, phint,
 				     (void **)&rss_meta_ptr, error);
 
 error:
-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v3] net/iavf: add inner 5 tuple hash for GTPU
  2020-06-14 15:09 ` [dpdk-dev] [dpdk-dev v2] " Jeff Guo
@ 2020-06-21 14:02   ` Jeff Guo
  2020-07-01 12:56     ` Zhang, Qi Z
                       ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Jeff Guo @ 2020-06-21 14:02 UTC (permalink / raw)
  To: beilei.xing, qi.z.zhang, jingjing.wu
  Cc: xiaolong.ye, dev, junfeng.guo, jia.guo

Previous iavf only support inner ipv4 hash for GTPU, this patch aims to
enable inner 5 tuple hash for GTPU, that involves inner ipv4 src/dst,
tcp sport/dport, udp sport/dport and protocol id.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
v3->v2:
correct some typo and refine code
---
 drivers/net/iavf/iavf_hash.c | 1816 ++++++++++++++++++++++++----------
 1 file changed, 1299 insertions(+), 517 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index a7691ef0c..16db38dcd 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -24,32 +24,34 @@
 #include "iavf_generic_flow.h"
 
 enum iavf_pattern_hint_type {
-	IAVF_PATTERN_HINT_NONE,
-	IAVF_PATTERN_HINT_IPV4,
-	IAVF_PATTERN_HINT_IPV4_UDP,
-	IAVF_PATTERN_HINT_IPV4_TCP,
-	IAVF_PATTERN_HINT_IPV4_SCTP,
-	IAVF_PATTERN_HINT_IPV6,
-	IAVF_PATTERN_HINT_IPV6_UDP,
-	IAVF_PATTERN_HINT_IPV6_TCP,
-	IAVF_PATTERN_HINT_IPV6_SCTP,
-};
-
-enum iavf_gtpu_hint {
-	IAVF_GTPU_HINT_DOWNLINK,
-	IAVF_GTPU_HINT_UPLINK,
-	IAVF_GTPU_HINT_NONE,
-};
+	IAVF_PHINT_NONE				= 0x00000000,
+	IAVF_PHINT_IPV4				= 0x00000001,
+	IAVF_PHINT_IPV4_UDP			= 0x00000002,
+	IAVF_PHINT_IPV4_TCP			= 0x00000004,
+	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
+	IAVF_PHINT_IPV6				= 0x00000010,
+	IAVF_PHINT_IPV6_UDP			= 0x00000020,
+	IAVF_PHINT_IPV6_TCP			= 0x00000040,
+	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
+	IAVF_PHINT_C_VLAN			= 0x00000100,
+	IAVF_PHINT_S_VLAN			= 0x00000200,
+	IAVF_PHINT_IPV4_GTPU_IP			= 0x00000400,
+	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000800,
+	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00001000,
+	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00002000,
+};
+
+#define IAVF_GTPU_EH_DWNLINK	0
+#define IAVF_GTPU_EH_UPLINK	1
 
 struct iavf_pattern_match_type {
-	enum iavf_pattern_hint_type phint_type;
+	uint64_t pattern_hint;
 };
 
 struct iavf_hash_match_type {
-	enum iavf_pattern_hint_type phint_type;
 	uint64_t hash_type;
 	struct virtchnl_proto_hdrs *proto_hdrs;
-	enum iavf_gtpu_hint gtpu_hint;
+	uint64_t pattern_hint;
 };
 
 struct iavf_rss_meta {
@@ -83,42 +85,56 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
 			       void **meta,
 			       struct rte_flow_error *error);
 
-struct iavf_pattern_match_type phint_empty = {
-	IAVF_PATTERN_HINT_NONE};
-struct iavf_pattern_match_type phint_eth_ipv4 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_udp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
-	IAVF_PATTERN_HINT_IPV4_TCP};
-struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
-	IAVF_PATTERN_HINT_IPV4_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_esp = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_ah = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_udp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
-	IAVF_PATTERN_HINT_IPV6_TCP};
-struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
-	IAVF_PATTERN_HINT_IPV6_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv6_esp = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_ah = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_empty = {
+	IAVF_PHINT_NONE};
+static struct iavf_pattern_match_type phint_eth_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
+	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp_esp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
+	IAVF_PHINT_C_VLAN};
+static struct iavf_pattern_match_type phint_eth_ipv6 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
+	IAVF_PHINT_IPV6_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
+	IAVF_PHINT_IPV6_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp_esp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
+	IAVF_PHINT_C_VLAN};
 
 /**
  * Supported pattern for hash.
@@ -131,26 +147,34 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp},
 	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp},
-	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
+	{iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_INSET_NONE,
+					&phint_eth_ipv4_gtpu_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
+	{iavf_pattern_eth_ipv4_udp_esp, IAVF_INSET_NONE,
+					&phint_eth_ipv4_udp_esp},
 	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
 	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv4_l2tpv3},
+					&phint_eth_ipv4_l2tpv3},
 	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE, &phint_eth_ipv4_pfcp},
+	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE, &phint_eth_vlan_ipv4},
+	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
 	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE, &phint_eth_ipv6_udp},
 	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
 	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp},
 	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
+	{iavf_pattern_eth_ipv6_udp_esp, IAVF_INSET_NONE,
+					&phint_eth_ipv6_udp_esp},
 	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
 	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv6_l2tpv3},
+					&phint_eth_ipv6_l2tpv3},
 	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE, &phint_eth_ipv6_pfcp},
+	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE, &phint_eth_vlan_ipv6},
 	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
 };
 
@@ -207,6 +231,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv4_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv4_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_udp_src_port { \
 	VIRTCHNL_PROTO_HDR_UDP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT), {BUFF_NOUSED } }
@@ -271,6 +317,40 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv6_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv6_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_gtpu_ip_teid { \
+	VIRTCHNL_PROTO_HDR_GTPU_IP, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_GTPU_IP_TEID), {BUFF_NOUSED } }
+
+#define proto_hint_gtpu_eh_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_EH, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
+#define proto_hint_gtpu_ip_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_IP, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_up_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -295,6 +375,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	VIRTCHNL_PROTO_HDR_PFCP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID), {BUFF_NOUSED } }
 
+/* ETH */
+
 struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
 };
@@ -315,6 +397,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
 };
 
+/* IPV4 */
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
 };
@@ -323,117 +407,77 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_esp }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_ah }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_l2tpv3 }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_pfcp }
-};
-
 struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_tcp }
 };
 
@@ -472,105 +516,393 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp = {
 	proto_hint_sctp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_esp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_ah }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_l2tpv3 }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_pfcp }
 };
 
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv4_only,
+	proto_hint_udp_only, proto_hint_esp }
+};
+
+/* GTPU IP */
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_teid_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_teid}
+};
+
+/* GTPU EH */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4, proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4, proto_hint_tcp}
+};
+
+/* GTPU UP */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4, proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4, proto_hint_tcp}
+};
+
+/* GTPU DWN */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4, proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4, proto_hint_tcp}
+};
+
+/* IPV6 */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
+};
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_tcp }
 };
 
@@ -595,12 +927,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_sctp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_dst_port }
 };
 
@@ -609,337 +941,804 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp = {
 	proto_hint_sctp }
 };
 
-/**
- * The first member is pattern hint type,
- * the second member is hash type,
- * the third member is virtchnl protocol hdrs.
- * the forth member is downlink/uplink type.
- */
-struct iavf_hash_match_type iavf_hash_type_list[] = {
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_esp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_ah }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_l2tpv3 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_pfcp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv6_only,
+	proto_hint_udp_only, proto_hint_esp }
+};
+
+struct iavf_hash_match_type iavf_hash_map_list[] = {
 	/* IPV4 */
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY, &hdrs_hint_eth_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY, &hdrs_hint_eth_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
-			&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
-			&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
-			&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
-			&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3, &hdrs_hint_ipv4_l2tpv3,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4,
-	IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv4_esp, IAVF_PHINT_IPV4},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv4_ah, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv4_l2tpv3, IAVF_PHINT_IPV4},
 	/* IPV4 UDP */
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv4_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
-		&hdrs_hint_ipv4_udp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv4_pfcp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv4_udp_esp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp, IAVF_PHINT_IPV4_UDP},
 	/* IPV4 TCP */
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
-		&hdrs_hint_ipv4_tcp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
 	/* IPV4 SCTP */
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
-		&hdrs_hint_ipv4_sctp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP,
+		&hdrs_hint_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
 	/* IPV6 */
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH,
-		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN,
-		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN,
-		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP,
-		&hdrs_hint_ipv6_esp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH,
-		&hdrs_hint_ipv6_ah, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3,
-		&hdrs_hint_ipv6_l2tpv3, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6,
-		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6,
+		&hdrs_hint_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv6_esp, IAVF_PHINT_IPV6},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv6_ah, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv6_l2tpv3, IAVF_PHINT_IPV6},
 	/* IPV6 UDP */
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv6_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
-		&hdrs_hint_ipv6_udp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv6_pfcp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv6_udp_esp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP,
+		&hdrs_hint_ipv6_udp, IAVF_PHINT_IPV6_UDP},
 	/* IPV6 TCP */
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
-		&hdrs_hint_ipv6_tcp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP,
+		&hdrs_hint_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
 	/* IPV6 SCTP */
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
-		&hdrs_hint_ipv6_sctp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP,
+		&hdrs_hint_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+	/* VLAN */
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan, IAVF_PHINT_S_VLAN},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan, IAVF_PHINT_C_VLAN},
+};
+
+struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
+	/* GTPU */
+	/* GTPU IP */
+	/* GTPU IPV4*/
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_GTPU,
+		&hdrs_hint_teid_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	/* GTPU EH */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH UP */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH DWN */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_udp_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
 };
 
 struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = {
@@ -1037,10 +1836,12 @@ iavf_hash_init(struct iavf_adapter *ad)
 }
 
 static int
-iavf_hash_check_inset(const struct rte_flow_item pattern[],
-		      struct rte_flow_error *error)
+iavf_hash_parse_pattern(struct iavf_pattern_match_item *pattern_match_item,
+			const struct rte_flow_item pattern[], uint64_t *phint,
+			struct rte_flow_error *error)
 {
 	const struct rte_flow_item *item = pattern;
+	const struct rte_flow_item_gtp_psc *psc;
 
 	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
 		if (item->last) {
@@ -1049,45 +1850,44 @@ iavf_hash_check_inset(const struct rte_flow_item pattern[],
 					   "Not support range");
 			return -rte_errno;
 		}
-	}
 
-	return 0;
-}
-
-static void
-iavf_hash_refine_type(uint64_t *rss_type, const struct rte_flow_item pattern[],
-		      enum iavf_gtpu_hint *gtpu_hint)
-{
-	const struct rte_flow_item *item;
-
-	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-		if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
-			const struct rte_flow_item_gtp_psc *psc = item->spec;
-
-			if (psc && (psc->pdu_type == IAVF_GTPU_HINT_UPLINK ||
-				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK)) {
-				*rss_type |= ETH_RSS_GTPU;
-				*gtpu_hint = psc->pdu_type;
-			}
+		switch (item->type) {
+		case RTE_FLOW_ITEM_TYPE_GTPU:
+			*phint |= IAVF_PHINT_IPV4_GTPU_IP;
+			break;
+		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
+			psc = item->spec;
+			*phint &= ~IAVF_PHINT_IPV4_GTPU_IP;
+			if (!psc)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
+			else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_UPLINK;
+			else if (psc->pdu_type == IAVF_GTPU_EH_DWNLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_DWNLINK;
+			break;
+		default:
+			break;
 		}
 	}
+
+	/* update and restore pattern hint */
+	*phint |= ((struct iavf_pattern_match_type *)
+				(pattern_match_item->meta))->pattern_hint;
+
+	return 0;
 }
 
 static int
-iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
-		       const struct rte_flow_item pattern[],
-		       const struct rte_flow_action actions[],
-		       void **meta, struct rte_flow_error *error)
+iavf_hash_parse_action(const struct rte_flow_action actions[],
+		       uint64_t pattern_hint, void **meta,
+		       struct rte_flow_error *error)
 {
-	struct iavf_pattern_match_type *mt = (struct iavf_pattern_match_type *)
-					(pattern_match_item->meta);
 	struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta;
-	uint32_t type_list_len = RTE_DIM(iavf_hash_type_list);
-	struct iavf_hash_match_type *type_match_item;
-	enum iavf_gtpu_hint gtpu_hint = IAVF_GTPU_HINT_NONE;
+	struct iavf_hash_match_type *hash_map_list;
 	enum rte_flow_action_type action_type;
 	const struct rte_flow_action_rss *rss;
 	const struct rte_flow_action *action;
+	uint32_t mlist_len;
 	bool item_found = false;
 	uint64_t rss_type;
 	uint16_t i;
@@ -1101,25 +1901,18 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 			rss = action->conf;
 			rss_type = rss->types;
 
-			/**
-			 * Check simultaneous use of SRC_ONLY and DST_ONLY
-			 * of the same level.
-			 */
-			rss_type = rte_eth_rss_hf_refine(rss_type);
-
-			/**
-			 * Refine the hash type base on some specific item of
-			 * the pattern, such as identify the gtpu hash.
-			 */
-			iavf_hash_refine_type(&rss_type, pattern, &gtpu_hint);
-
-			/* Check if pattern is empty. */
-			if (pattern_match_item->pattern_list !=
-				iavf_pattern_empty && rss->func ==
-				RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
-				return rte_flow_error_set(error, ENOTSUP,
-					RTE_FLOW_ERROR_TYPE_ACTION, action,
-					"Not supported flow");
+			if (rss->func ==
+			    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
+			} else if (rss->func ==
+				   RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
+			} else {
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
+			}
 
 			if (rss->level)
 				return rte_flow_error_set(error, ENOTSUP,
@@ -1136,48 +1929,36 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
 					"a non-NULL RSS queue is not supported");
 
-			/* Check hash function and save it to rss_meta. */
-			if (rss->func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
-			else if (rss->func ==
-				 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
-			else
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
+			/**
+			 * Check simultaneous use of SRC_ONLY and DST_ONLY
+			 * of the same level.
+			 */
+			rss_type = rte_eth_rss_hf_refine(rss_type);
 
-			type_match_item =
-			rte_zmalloc("iavf_type_match_item",
-				    sizeof(struct iavf_hash_match_type), 0);
-			if (!type_match_item) {
-				rte_flow_error_set(error, EINVAL,
-						   RTE_FLOW_ERROR_TYPE_HANDLE,
-						   NULL,
-						   "No memory for type_match_item");
-				return -ENOMEM;
+			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_IP) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK)) {
+				hash_map_list = iavf_gtpu_hash_map_list;
+				mlist_len = RTE_DIM(iavf_gtpu_hash_map_list);
+			} else {
+				hash_map_list = iavf_hash_map_list;
+				mlist_len = RTE_DIM(iavf_hash_map_list);
 			}
 
 			/* Find matched proto hdrs according to hash type. */
-			for (i = 0; i < type_list_len; i++) {
+			for (i = 0; i < mlist_len; i++) {
 				struct iavf_hash_match_type *ht_map =
-					&iavf_hash_type_list[i];
+					&hash_map_list[i];
 				if (rss_type == ht_map->hash_type &&
-				    mt->phint_type == ht_map->phint_type &&
-				    gtpu_hint == ht_map->gtpu_hint) {
-					type_match_item->hash_type =
-						ht_map->hash_type;
-					type_match_item->proto_hdrs =
-						ht_map->proto_hdrs;
+				    pattern_hint == ht_map->pattern_hint) {
 					rss_meta->proto_hdrs =
-						type_match_item->proto_hdrs;
+						ht_map->proto_hdrs;
 					item_found = true;
+					break;
 				}
 			}
 
-			rte_free(type_match_item);
-
 			if (!item_found)
 				return rte_flow_error_set(error, ENOTSUP,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
@@ -1209,6 +1990,7 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 {
 	struct iavf_pattern_match_item *pattern_match_item;
 	struct iavf_rss_meta *rss_meta_ptr;
+	uint64_t phint = IAVF_PHINT_NONE;
 	int ret = 0;
 
 	rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
@@ -1228,12 +2010,12 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 		goto error;
 	}
 
-	ret = iavf_hash_check_inset(pattern, error);
+	ret = iavf_hash_parse_pattern(pattern_match_item, pattern, &phint,
+				      error);
 	if (ret)
 		goto error;
 
-	/* Check rss action. */
-	ret = iavf_hash_parse_action(pattern_match_item, pattern, actions,
+	ret = iavf_hash_parse_action(actions, phint,
 				     (void **)&rss_meta_ptr, error);
 
 error:
-- 
2.20.1


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

* Re: [dpdk-dev] [dpdk-dev v3] net/iavf: add inner 5 tuple hash for GTPU
  2020-06-21 14:02   ` [dpdk-dev] [dpdk-dev v3] " Jeff Guo
@ 2020-07-01 12:56     ` Zhang, Qi Z
  2020-07-03  3:52       ` Jeff Guo
  2020-07-03  3:56     ` [dpdk-dev] [dpdk-dev v4 0/3] enable new hash flow for VF Jeff Guo
  2020-07-07  5:14     ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Jeff Guo
  2 siblings, 1 reply; 16+ messages in thread
From: Zhang, Qi Z @ 2020-07-01 12:56 UTC (permalink / raw)
  To: Guo, Jia, Xing, Beilei, Wu, Jingjing; +Cc: Ye, Xiaolong, dev, Guo, Junfeng



> -----Original Message-----
> From: Guo, Jia <jia.guo@intel.com>
> Sent: Sunday, June 21, 2020 10:03 PM
> To: Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>;
> Wu, Jingjing <jingjing.wu@intel.com>
> Cc: Ye, Xiaolong <xiaolong.ye@intel.com>; dev@dpdk.org; Guo, Junfeng
> <junfeng.guo@intel.com>; Guo, Jia <jia.guo@intel.com>
> Subject: [dpdk-dev v3] net/iavf: add inner 5 tuple hash for GTPU
> 
> Previous iavf only support inner ipv4 hash for GTPU, this patch aims to
> enable inner 5 tuple hash for GTPU, that involves inner ipv4 src/dst,
> tcp sport/dport, udp sport/dport and protocol id.

Overall the patch include too many code refactor which is not related with the feature be described in the commit log
Please separate into patches with specific purpose, otherwise it's really hard to review.
Also some comment in line.

> 
> Signed-off-by: Jeff Guo <jia.guo@intel.com>
> ---
> v3->v2:
> correct some typo and refine code
> ---
>  drivers/net/iavf/iavf_hash.c | 1816 ++++++++++++++++++++++++----------
>  1 file changed, 1299 insertions(+), 517 deletions(-)
> 
> diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
> index a7691ef0c..16db38dcd 100644
> --- a/drivers/net/iavf/iavf_hash.c
> +++ b/drivers/net/iavf/iavf_hash.c
> @@ -24,32 +24,34 @@
>  #include "iavf_generic_flow.h"
> 
>  enum iavf_pattern_hint_type {
> -	IAVF_PATTERN_HINT_NONE,
> -	IAVF_PATTERN_HINT_IPV4,
> -	IAVF_PATTERN_HINT_IPV4_UDP,
> -	IAVF_PATTERN_HINT_IPV4_TCP,
> -	IAVF_PATTERN_HINT_IPV4_SCTP,
> -	IAVF_PATTERN_HINT_IPV6,
> -	IAVF_PATTERN_HINT_IPV6_UDP,
> -	IAVF_PATTERN_HINT_IPV6_TCP,
> -	IAVF_PATTERN_HINT_IPV6_SCTP,
> -};
> -
> -enum iavf_gtpu_hint {
> -	IAVF_GTPU_HINT_DOWNLINK,
> -	IAVF_GTPU_HINT_UPLINK,
> -	IAVF_GTPU_HINT_NONE,
> -};
> +	IAVF_PHINT_NONE				= 0x00000000,
> +	IAVF_PHINT_IPV4				= 0x00000001,
> +	IAVF_PHINT_IPV4_UDP			= 0x00000002,
> +	IAVF_PHINT_IPV4_TCP			= 0x00000004,
> +	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
> +	IAVF_PHINT_IPV6				= 0x00000010,
> +	IAVF_PHINT_IPV6_UDP			= 0x00000020,
> +	IAVF_PHINT_IPV6_TCP			= 0x00000040,
> +	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
> +	IAVF_PHINT_C_VLAN			= 0x00000100,
> +	IAVF_PHINT_S_VLAN			= 0x00000200,
> +	IAVF_PHINT_IPV4_GTPU_IP			= 0x00000400,
> +	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000800,
> +	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00001000,
> +	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00002000,
> +};
> +
> +#define IAVF_GTPU_EH_DWNLINK	0
> +#define IAVF_GTPU_EH_UPLINK	1
> 
>  struct iavf_pattern_match_type {
> -	enum iavf_pattern_hint_type phint_type;
> +	uint64_t pattern_hint;
>  };
> 
>  struct iavf_hash_match_type {
> -	enum iavf_pattern_hint_type phint_type;
>  	uint64_t hash_type;
>  	struct virtchnl_proto_hdrs *proto_hdrs;
> -	enum iavf_gtpu_hint gtpu_hint;
> +	uint64_t pattern_hint;
>  };
> 
>  struct iavf_rss_meta {
> @@ -83,42 +85,56 @@ iavf_hash_parse_pattern_action(struct iavf_adapter
> *ad,
>  			       void **meta,
>  			       struct rte_flow_error *error);
> 
> -struct iavf_pattern_match_type phint_empty = {
> -	IAVF_PATTERN_HINT_NONE};
> -struct iavf_pattern_match_type phint_eth_ipv4 = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_udp = {
> -	IAVF_PATTERN_HINT_IPV4_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
> -	IAVF_PATTERN_HINT_IPV4_TCP};
> -struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
> -	IAVF_PATTERN_HINT_IPV4_SCTP};
> -struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
> -	IAVF_PATTERN_HINT_IPV4_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv4_esp = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_ah = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
> -	IAVF_PATTERN_HINT_IPV4_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv6 = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_udp = {
> -	IAVF_PATTERN_HINT_IPV6_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
> -	IAVF_PATTERN_HINT_IPV6_TCP};
> -struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
> -	IAVF_PATTERN_HINT_IPV6_SCTP};
> -struct iavf_pattern_match_type phint_eth_ipv6_esp = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_ah = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
> -	IAVF_PATTERN_HINT_IPV6_UDP};
> +static struct iavf_pattern_match_type phint_empty = {
> +	IAVF_PHINT_NONE};
> +static struct iavf_pattern_match_type phint_eth_ipv4 = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
> +	IAVF_PHINT_IPV4_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
> +	IAVF_PHINT_IPV4_TCP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
> +	IAVF_PHINT_IPV4_SCTP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_ipv4 = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp
> = {
> +	IAVF_PHINT_IPV4_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp =
> {
> +	IAVF_PHINT_IPV4_TCP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_udp_esp = {
> +	IAVF_PHINT_IPV4_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
> +	IAVF_PHINT_IPV4_UDP};
> +static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
> +	IAVF_PHINT_C_VLAN};
> +static struct iavf_pattern_match_type phint_eth_ipv6 = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
> +	IAVF_PHINT_IPV6_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
> +	IAVF_PHINT_IPV6_TCP};
> +static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
> +	IAVF_PHINT_IPV6_SCTP};
> +static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_udp_esp = {
> +	IAVF_PHINT_IPV6_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
> +	IAVF_PHINT_IPV6_UDP};
> +static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
> +	IAVF_PHINT_C_VLAN};

Add static can be in a separate patch.
> 
>  /**
>   * Supported pattern for hash.
> @@ -131,26 +147,34 @@ static struct iavf_pattern_match_item
> iavf_hash_pattern_list[] = {
>  	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE,
> &phint_eth_ipv4_udp},
>  	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
>  	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE,
> &phint_eth_ipv4_sctp},
> -	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
> +	{iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_INSET_NONE,
> +					&phint_eth_ipv4_gtpu_ipv4},
>  	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_gtpu_eh},
> +					&phint_eth_ipv4_gtpu_eh_ipv4},
>  	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_gtpu_eh},
> +					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
>  	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_gtpu_eh},
> +					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
>  	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
> +	{iavf_pattern_eth_ipv4_udp_esp, IAVF_INSET_NONE,
> +					&phint_eth_ipv4_udp_esp},
>  	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
>  	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_l2tpv3},
> +					&phint_eth_ipv4_l2tpv3},
>  	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE,
> &phint_eth_ipv4_pfcp},
> +	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE,

Looks like the new vlan pattern is not related with the 5 tuple, please move this feature into a separate patch.

> &phint_eth_vlan_ipv4},
> +	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
>  	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE,
> &phint_eth_ipv6_udp},
>  	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
>  	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE,
> &phint_eth_ipv6_sctp},
>  	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
> +	{iavf_pattern_eth_ipv6_udp_esp, IAVF_INSET_NONE,
> +					&phint_eth_ipv6_udp_esp},

This is not related with GTPU, please either move this to a separate path or modify the commit log to describe more correctly what you want to do.

>  	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
>  	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
> -						&phint_eth_ipv6_l2tpv3},
> +					&phint_eth_ipv6_l2tpv3},

This looks redundant change, if it's a code clean move this to separate patch.

>  	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE,
> &phint_eth_ipv6_pfcp},
> +	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE,
> &phint_eth_vlan_ipv6},
>  	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
>  };
> 
> @@ -207,6 +231,28 @@ static struct iavf_pattern_match_item
> iavf_hash_pattern_list[] = {
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED } }
> 
> +#define proto_hint_ipv4_src_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV4, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
> +	{BUFF_NOUSED } }
> +
> +#define proto_hint_ipv4_dst_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV4, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
> +	{BUFF_NOUSED } }
> +
> +#define proto_hint_ipv4_only_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV4, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT),
> {BUFF_NOUSED } }
> +
> +#define proto_hint_ipv4_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV4, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT),
> {BUFF_NOUSED } }
> +
>  #define proto_hint_udp_src_port { \
>  	VIRTCHNL_PROTO_HDR_UDP, \
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT),
> {BUFF_NOUSED } }
> @@ -271,6 +317,40 @@ static struct iavf_pattern_match_item
> iavf_hash_pattern_list[] = {
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
> 
> +#define proto_hint_ipv6_src_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV6, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
> +	{BUFF_NOUSED } }
> +
> +#define proto_hint_ipv6_dst_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV6, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
> +	{BUFF_NOUSED } }
> +
> +#define proto_hint_ipv6_only_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV6, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT),
> {BUFF_NOUSED } }
> +
> +#define proto_hint_ipv6_prot { \
> +	VIRTCHNL_PROTO_HDR_IPV6, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT),
> {BUFF_NOUSED } }
> +
> +#define proto_hint_gtpu_ip_teid { \
> +	VIRTCHNL_PROTO_HDR_GTPU_IP, \
> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_GTPU_IP_TEID),
> {BUFF_NOUSED } }
> +
> +#define proto_hint_gtpu_eh_only { \
> +	VIRTCHNL_PROTO_HDR_GTPU_EH, \
> +	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
> +
> +#define proto_hint_gtpu_ip_only { \
> +	VIRTCHNL_PROTO_HDR_GTPU_IP, \
> +	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
> +
>  #define proto_hint_gtpu_up_only { \
>  	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
>  	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
> @@ -295,6 +375,8 @@ static struct iavf_pattern_match_item
> iavf_hash_pattern_list[] = {
>  	VIRTCHNL_PROTO_HDR_PFCP, \
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID),
> {BUFF_NOUSED } }
> 
> +/* ETH */
> +
>  struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
>  };
> @@ -315,6 +397,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
>  };
> 
> +/* IPV4 */
> +
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
>  };
> @@ -323,117 +407,77 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst =
> {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_up_only,
> -	proto_hint_ipv4_src }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_dwn_only,
> -	proto_hint_ipv4_src }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_up_only,
> -	proto_hint_ipv4_dst }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_dwn_only,
> -	proto_hint_ipv4_dst }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_esp }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_ah }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_l2tpv3 }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_pfcp }
> -};
> -
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_src_prot,
>  	proto_hint_udp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_src_prot,
>  	proto_hint_udp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_dst_prot,
>  	proto_hint_udp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_dst_prot,
>  	proto_hint_udp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_only_prot,
>  	proto_hint_udp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_only_prot,
>  	proto_hint_udp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
>  	proto_hint_udp }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_src_prot,
>  	proto_hint_tcp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_src_prot,
>  	proto_hint_tcp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_dst_prot,
>  	proto_hint_tcp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_dst_prot,
>  	proto_hint_tcp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_only_prot,
>  	proto_hint_tcp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv4_only_prot,
>  	proto_hint_tcp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
>  	proto_hint_tcp }
>  };
> 
> @@ -472,105 +516,393 @@ struct virtchnl_proto_hdrs
> hdrs_hint_ipv4_sctp = {
>  	proto_hint_sctp }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_esp }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_ah }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_l2tpv3 }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_pfcp }
>  };
> 
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv4_only,
> +	proto_hint_udp_only, proto_hint_esp }
> +};
> +
> +/* GTPU IP */
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_ip = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_ip_only,
> +	proto_hint_ipv4_src }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_ip = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_ip_only,
> +	proto_hint_ipv4_dst }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_ip = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_ip_only,
> +	proto_hint_ipv4 }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_teid_gtpu_ip = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_ip_teid}
> +};
> +
> +/* GTPU EH */
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_src }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_dst }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4 }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4, proto_hint_udp}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_ipv4, proto_hint_tcp}
> +};
> +
> +/* GTPU UP */
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_src }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_dst }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4 }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4, proto_hint_udp}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_up = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_up_only,
> +	proto_hint_ipv4, proto_hint_tcp}
> +};
> +
> +/* GTPU DWN */
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_src }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_dst }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4 }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4, proto_hint_udp}
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_dwn = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_dwn_only,
> +	proto_hint_ipv4, proto_hint_tcp}
> +};
> +
> +/* IPV6 */
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
> +};
> +
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_src_prot,
>  	proto_hint_udp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_src_prot,
>  	proto_hint_udp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_dst_prot,
>  	proto_hint_udp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_dst_prot,
>  	proto_hint_udp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_only_prot,
>  	proto_hint_udp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_only_prot,
>  	proto_hint_udp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
>  	proto_hint_udp }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_src_prot,
>  	proto_hint_tcp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_src_prot,
>  	proto_hint_tcp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_dst_prot,
>  	proto_hint_tcp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_dst_prot,
>  	proto_hint_tcp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_only_prot,
>  	proto_hint_tcp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
> {proto_hint_ipv6_only_prot,
>  	proto_hint_tcp_dst_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
>  	proto_hint_tcp }
>  };
> 
> @@ -595,12 +927,12 @@ struct virtchnl_proto_hdrs
> hdrs_hint_ipv6_dst_sctp_dst_port = {
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>  	proto_hint_sctp_src_port }
>  };
> 
>  struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>  	proto_hint_sctp_dst_port }
>  };
> 
> @@ -609,337 +941,804 @@ struct virtchnl_proto_hdrs
> hdrs_hint_ipv6_sctp = {
>  	proto_hint_sctp }
>  };
> 
> -/**
> - * The first member is pattern hint type,
> - * the second member is hash type,
> - * the third member is virtchnl protocol hdrs.
> - * the forth member is downlink/uplink type.
> - */
> -struct iavf_hash_match_type iavf_hash_type_list[] = {
> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +	proto_hint_esp }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +	proto_hint_ah }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +	proto_hint_l2tpv3 }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +	proto_hint_pfcp }
> +};
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_esp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv6_only,
> +	proto_hint_udp_only, proto_hint_esp }
> +};
> +
> +struct iavf_hash_match_type iavf_hash_map_list[] = {
>  	/* IPV4 */
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY,
> &hdrs_hint_eth_src,
> -						IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY,
> &hdrs_hint_eth_dst,
> -						IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
> -			&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
> -			&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth,
> -						IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan,
> -						IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan,
> -						IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY,
> &hdrs_hint_ipv4_src,
> -						IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY,
> &hdrs_hint_ipv4_dst,
> -						IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
> -			&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
> -			&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp,
> -	IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah,
> -	IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3,
> &hdrs_hint_ipv4_l2tpv3,
> -	IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4,
> -	IAVF_GTPU_HINT_NONE},
> +	{ETH_RSS_L2_SRC_ONLY,
> +		&hdrs_hint_eth_src, IAVF_PHINT_IPV4},
> +	{ETH_RSS_L2_DST_ONLY,
> +		&hdrs_hint_eth_dst, IAVF_PHINT_IPV4},
> +	{ETH_RSS_ETH,
> +		&hdrs_hint_eth, IAVF_PHINT_IPV4},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4,
> +		&hdrs_hint_ipv4, IAVF_PHINT_IPV4},
> +	{ETH_RSS_ESP,
> +		&hdrs_hint_ipv4_esp, IAVF_PHINT_IPV4},
> +	{ETH_RSS_AH,
> +		&hdrs_hint_ipv4_ah, IAVF_PHINT_IPV4},
> +	{ETH_RSS_L2TPV3,
> +		&hdrs_hint_ipv4_l2tpv3, IAVF_PHINT_IPV4},
>  	/* IPV4 UDP */
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
> ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
> ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
> ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
> ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
> ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
> ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
> ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
> ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> +		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> -		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> -		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> +		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>  		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> +		IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> +		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> -		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> -		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
> -		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
> +		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>  		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP,
> -		&hdrs_hint_ipv4_pfcp, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
> -		&hdrs_hint_ipv4_udp, IAVF_GTPU_HINT_NONE},
> +		IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_PFCP,
> +		&hdrs_hint_ipv4_pfcp, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_ESP,
> +		&hdrs_hint_ipv4_udp_esp, IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP,
> +		&hdrs_hint_ipv4_udp, IAVF_PHINT_IPV4_UDP},
>  	/* IPV4 TCP */
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
> ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
> ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
> ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
> ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
> +		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
> +		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>  		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
> +		IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
> +		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
> +		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>  		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
> -		&hdrs_hint_ipv4_tcp, IAVF_GTPU_HINT_NONE},
> +		IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP,
> +		&hdrs_hint_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
>  	/* IPV4 SCTP */
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_src_sctp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_src_sctp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_dst_sctp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_dst_sctp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
> +		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
> +		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>  		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
> +		IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
> +		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
> +		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>  		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
> -		&hdrs_hint_ipv4_sctp, IAVF_GTPU_HINT_NONE},
> +		IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
> +	{ETH_RSS_NONFRAG_IPV4_SCTP,
> +		&hdrs_hint_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
>  	/* IPV6 */
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY,
> -		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY,
> -		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY,
> -		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY,
> -		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH,
> -		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN,
> -		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN,
> -		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP,
> -		&hdrs_hint_ipv6_esp, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH,
> -		&hdrs_hint_ipv6_ah, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3,
> -		&hdrs_hint_ipv6_l2tpv3, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6,
> -		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
> +	{ETH_RSS_L2_SRC_ONLY,
> +		&hdrs_hint_eth_src, IAVF_PHINT_IPV6},
> +	{ETH_RSS_L2_DST_ONLY,
> +		&hdrs_hint_eth_dst, IAVF_PHINT_IPV6},
> +	{ETH_RSS_ETH,
> +		&hdrs_hint_eth, IAVF_PHINT_IPV6},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
> +	{ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
> +	{ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
> +	{ETH_RSS_IPV6,
> +		&hdrs_hint_ipv6, IAVF_PHINT_IPV6},
> +	{ETH_RSS_ESP,
> +		&hdrs_hint_ipv6_esp, IAVF_PHINT_IPV6},
> +	{ETH_RSS_AH,
> +		&hdrs_hint_ipv6_ah, IAVF_PHINT_IPV6},
> +	{ETH_RSS_L2TPV3,
> +		&hdrs_hint_ipv6_l2tpv3, IAVF_PHINT_IPV6},
>  	/* IPV6 UDP */
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_udp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_udp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_udp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_udp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
> +		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
> +		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>  		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
> +		IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
> +		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
> +		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>  		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP,
> -		&hdrs_hint_ipv6_pfcp, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
> -		&hdrs_hint_ipv6_udp, IAVF_GTPU_HINT_NONE},
> +		IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_PFCP,
> +		&hdrs_hint_ipv6_pfcp, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_ESP,
> +		&hdrs_hint_ipv6_udp_esp, IAVF_PHINT_IPV6_UDP},
> +	{ETH_RSS_NONFRAG_IPV6_UDP,
> +		&hdrs_hint_ipv6_udp, IAVF_PHINT_IPV6_UDP},
>  	/* IPV6 TCP */
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_tcp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_tcp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_tcp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_tcp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
> +		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
> +		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>  		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
> +		IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
> +		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
> +		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>  		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
> -		&hdrs_hint_ipv6_tcp, IAVF_GTPU_HINT_NONE},
> +		IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
> +	{ETH_RSS_NONFRAG_IPV6_TCP,
> +		&hdrs_hint_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
>  	/* IPV6 SCTP */
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_sctp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_sctp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_sctp_src_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_sctp_dst_port,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
> +		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>  		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
> +		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>  		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
> +		IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
> +		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>  		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
> +		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>  		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
> -		IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
> -		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
> -		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
> -		&hdrs_hint_ipv6_sctp, IAVF_GTPU_HINT_NONE},
> +		IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
> +	{ETH_RSS_NONFRAG_IPV6_SCTP,
> +		&hdrs_hint_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
> +	/* VLAN */
> +	{ETH_RSS_S_VLAN,
> +		&hdrs_hint_svlan, IAVF_PHINT_S_VLAN},
> +	{ETH_RSS_C_VLAN,
> +		&hdrs_hint_cvlan, IAVF_PHINT_C_VLAN},
> +};
> +
> +struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
> +	/* GTPU */
> +	/* GTPU IP */
> +	/* GTPU IPV4*/
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_ip,
> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_ip,
> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_ip,
> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_ip,
> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4,
> +		&hdrs_hint_ipv4_gtpu_ip,
> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
> +	{ETH_RSS_GTPU,
> +		&hdrs_hint_teid_gtpu_ip,
> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
> +	/* GTPU EH */
> +	/* Inner IPV4 */
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4,
> +		&hdrs_hint_ipv4_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
> +	/* Inner IPV4->UDP */
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP,
> +		&hdrs_hint_ipv4_udp_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
> +	/* Inner IPV4->TCP */
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP,
> +		&hdrs_hint_ipv4_tcp_gtpu_eh,
> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
> +	/* GTPU EH UP */
> +	/* Inner IPV4 */
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4,
> +		&hdrs_hint_ipv4_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
> +	/* Inner IPV4->UDP */
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP,
> +		&hdrs_hint_ipv4_udp_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
> +	/* Inner IPV4->TCP */
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP,
> +		&hdrs_hint_ipv4_tcp_gtpu_up,
> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
> +	/* GTPU EH DWN */
> +	/* Inner IPV4 */
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4 |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
> +	{ETH_RSS_IPV4,
> +		&hdrs_hint_ipv4_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
> +	/* Inner IPV4->UDP */
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	{ETH_RSS_NONFRAG_IPV4_UDP,
> +		&hdrs_hint_ipv4_udp_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
> +	/* Inner IPV4->TCP */
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_SRC_ONLY,
> +		&hdrs_hint_ipv4_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L3_DST_ONLY,
> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP |
> +		ETH_RSS_L4_DST_ONLY,
> +		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
> +	{ETH_RSS_NONFRAG_IPV4_TCP,
> +		&hdrs_hint_ipv4_udp_gtpu_dwn,
> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>  };
> 
>  struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = {
> @@ -1037,10 +1836,12 @@ iavf_hash_init(struct iavf_adapter *ad)
>  }
> 
>  static int
> -iavf_hash_check_inset(const struct rte_flow_item pattern[],
> -		      struct rte_flow_error *error)
> +iavf_hash_parse_pattern(struct iavf_pattern_match_item
> *pattern_match_item,
> +			const struct rte_flow_item pattern[], uint64_t *phint,
> +			struct rte_flow_error *error)
>  {
>  	const struct rte_flow_item *item = pattern;
> +	const struct rte_flow_item_gtp_psc *psc;
> 
>  	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++)
> {
>  		if (item->last) {
> @@ -1049,45 +1850,44 @@ iavf_hash_check_inset(const struct
> rte_flow_item pattern[],
>  					   "Not support range");
>  			return -rte_errno;
>  		}
> -	}
> 
> -	return 0;
> -}
> -
> -static void
> -iavf_hash_refine_type(uint64_t *rss_type, const struct rte_flow_item
> pattern[],
> -		      enum iavf_gtpu_hint *gtpu_hint)
> -{
> -	const struct rte_flow_item *item;
> -
> -	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++)
> {
> -		if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
> -			const struct rte_flow_item_gtp_psc *psc = item->spec;
> -
> -			if (psc && (psc->pdu_type == IAVF_GTPU_HINT_UPLINK ||
> -				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK)) {
> -				*rss_type |= ETH_RSS_GTPU;
> -				*gtpu_hint = psc->pdu_type;
> -			}
> +		switch (item->type) {
> +		case RTE_FLOW_ITEM_TYPE_GTPU:
> +			*phint |= IAVF_PHINT_IPV4_GTPU_IP;
> +			break;
> +		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
> +			psc = item->spec;
> +			*phint &= ~IAVF_PHINT_IPV4_GTPU_IP;
> +			if (!psc)
> +				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
> +			else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
> +				*phint |= IAVF_PHINT_IPV4_GTPU_EH_UPLINK;
> +			else if (psc->pdu_type == IAVF_GTPU_EH_DWNLINK)
> +				*phint |= IAVF_PHINT_IPV4_GTPU_EH_DWNLINK;
> +			break;
> +		default:
> +			break;
>  		}
>  	}
> +
> +	/* update and restore pattern hint */
> +	*phint |= ((struct iavf_pattern_match_type *)
> +				(pattern_match_item->meta))->pattern_hint;
> +
> +	return 0;
>  }
> 
>  static int
> -iavf_hash_parse_action(struct iavf_pattern_match_item
> *pattern_match_item,
> -		       const struct rte_flow_item pattern[],
> -		       const struct rte_flow_action actions[],
> -		       void **meta, struct rte_flow_error *error)
> +iavf_hash_parse_action(const struct rte_flow_action actions[],
> +		       uint64_t pattern_hint, void **meta,
> +		       struct rte_flow_error *error)
>  {
> -	struct iavf_pattern_match_type *mt = (struct iavf_pattern_match_type
> *)
> -					(pattern_match_item->meta);
>  	struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta;
> -	uint32_t type_list_len = RTE_DIM(iavf_hash_type_list);
> -	struct iavf_hash_match_type *type_match_item;
> -	enum iavf_gtpu_hint gtpu_hint = IAVF_GTPU_HINT_NONE;
> +	struct iavf_hash_match_type *hash_map_list;
>  	enum rte_flow_action_type action_type;
>  	const struct rte_flow_action_rss *rss;
>  	const struct rte_flow_action *action;
> +	uint32_t mlist_len;
>  	bool item_found = false;
>  	uint64_t rss_type;
>  	uint16_t i;
> @@ -1101,25 +1901,18 @@ iavf_hash_parse_action(struct
> iavf_pattern_match_item *pattern_match_item,
>  			rss = action->conf;
>  			rss_type = rss->types;
> 
> -			/**
> -			 * Check simultaneous use of SRC_ONLY and DST_ONLY
> -			 * of the same level.
> -			 */
> -			rss_type = rte_eth_rss_hf_refine(rss_type);
> -
> -			/**
> -			 * Refine the hash type base on some specific item of
> -			 * the pattern, such as identify the gtpu hash.
> -			 */
> -			iavf_hash_refine_type(&rss_type, pattern, &gtpu_hint);
> -
> -			/* Check if pattern is empty. */
> -			if (pattern_match_item->pattern_list !=
> -				iavf_pattern_empty && rss->func ==
> -				RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
> -				return rte_flow_error_set(error, ENOTSUP,
> -					RTE_FLOW_ERROR_TYPE_ACTION, action,
> -					"Not supported flow");
> +			if (rss->func ==
> +			    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
> +				rss_meta->rss_algorithm =
> +					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
> +			} else if (rss->func ==
> +				   RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
> +				rss_meta->rss_algorithm =
> +					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
> +			} else {
> +				rss_meta->rss_algorithm =
> +					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
> +			}
> 
>  			if (rss->level)
>  				return rte_flow_error_set(error, ENOTSUP,
> @@ -1136,48 +1929,36 @@ iavf_hash_parse_action(struct
> iavf_pattern_match_item *pattern_match_item,
>  					RTE_FLOW_ERROR_TYPE_ACTION, action,
>  					"a non-NULL RSS queue is not supported");
> 
> -			/* Check hash function and save it to rss_meta. */
> -			if (rss->func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
> -				rss_meta->rss_algorithm =
> -					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
> -			else if (rss->func ==
> -				 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
> -				rss_meta->rss_algorithm =
> -					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
> -			else
> -				rss_meta->rss_algorithm =
> -					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
> +			/**
> +			 * Check simultaneous use of SRC_ONLY and DST_ONLY
> +			 * of the same level.
> +			 */
> +			rss_type = rte_eth_rss_hf_refine(rss_type);
> 
> -			type_match_item =
> -			rte_zmalloc("iavf_type_match_item",
> -				    sizeof(struct iavf_hash_match_type), 0);
> -			if (!type_match_item) {
> -				rte_flow_error_set(error, EINVAL,
> -						   RTE_FLOW_ERROR_TYPE_HANDLE,
> -						   NULL,
> -						   "No memory for type_match_item");
> -				return -ENOMEM;
> +			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_IP) ||
> +			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
> +			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
> +			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK))
> {
> +				hash_map_list = iavf_gtpu_hash_map_list;
> +				mlist_len = RTE_DIM(iavf_gtpu_hash_map_list);
> +			} else {
> +				hash_map_list = iavf_hash_map_list;
> +				mlist_len = RTE_DIM(iavf_hash_map_list);
>  			}
> 
>  			/* Find matched proto hdrs according to hash type. */
> -			for (i = 0; i < type_list_len; i++) {
> +			for (i = 0; i < mlist_len; i++) {
>  				struct iavf_hash_match_type *ht_map =
> -					&iavf_hash_type_list[i];
> +					&hash_map_list[i];
>  				if (rss_type == ht_map->hash_type &&
> -				    mt->phint_type == ht_map->phint_type &&
> -				    gtpu_hint == ht_map->gtpu_hint) {
> -					type_match_item->hash_type =
> -						ht_map->hash_type;
> -					type_match_item->proto_hdrs =
> -						ht_map->proto_hdrs;
> +				    pattern_hint == ht_map->pattern_hint) {
>  					rss_meta->proto_hdrs =
> -						type_match_item->proto_hdrs;
> +						ht_map->proto_hdrs;
>  					item_found = true;
> +					break;
>  				}
>  			}
> 
> -			rte_free(type_match_item);
> -
>  			if (!item_found)
>  				return rte_flow_error_set(error, ENOTSUP,
>  					RTE_FLOW_ERROR_TYPE_ACTION, action,
> @@ -1209,6 +1990,7 @@ iavf_hash_parse_pattern_action(__rte_unused
> struct iavf_adapter *ad,
>  {
>  	struct iavf_pattern_match_item *pattern_match_item;
>  	struct iavf_rss_meta *rss_meta_ptr;
> +	uint64_t phint = IAVF_PHINT_NONE;
>  	int ret = 0;
> 
>  	rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
> @@ -1228,12 +2010,12 @@ iavf_hash_parse_pattern_action(__rte_unused
> struct iavf_adapter *ad,
>  		goto error;
>  	}
> 
> -	ret = iavf_hash_check_inset(pattern, error);
> +	ret = iavf_hash_parse_pattern(pattern_match_item, pattern, &phint,
> +				      error);
>  	if (ret)
>  		goto error;
> 
> -	/* Check rss action. */
> -	ret = iavf_hash_parse_action(pattern_match_item, pattern, actions,
> +	ret = iavf_hash_parse_action(actions, phint,
>  				     (void **)&rss_meta_ptr, error);
> 
>  error:
> --
> 2.20.1


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

* Re: [dpdk-dev] [dpdk-dev v3] net/iavf: add inner 5 tuple hash for GTPU
  2020-07-01 12:56     ` Zhang, Qi Z
@ 2020-07-03  3:52       ` Jeff Guo
  0 siblings, 0 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-03  3:52 UTC (permalink / raw)
  To: Zhang, Qi Z, Xing, Beilei, Wu, Jingjing; +Cc: Ye, Xiaolong, dev, Guo, Junfeng

hi, qi

Let me separate the patch and thanks your advise.

On 7/1/2020 8:56 PM, Zhang, Qi Z wrote:
>
>> -----Original Message-----
>> From: Guo, Jia <jia.guo@intel.com>
>> Sent: Sunday, June 21, 2020 10:03 PM
>> To: Xing, Beilei <beilei.xing@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>;
>> Wu, Jingjing <jingjing.wu@intel.com>
>> Cc: Ye, Xiaolong <xiaolong.ye@intel.com>; dev@dpdk.org; Guo, Junfeng
>> <junfeng.guo@intel.com>; Guo, Jia <jia.guo@intel.com>
>> Subject: [dpdk-dev v3] net/iavf: add inner 5 tuple hash for GTPU
>>
>> Previous iavf only support inner ipv4 hash for GTPU, this patch aims to
>> enable inner 5 tuple hash for GTPU, that involves inner ipv4 src/dst,
>> tcp sport/dport, udp sport/dport and protocol id.
> Overall the patch include too many code refactor which is not related with the feature be described in the commit log
> Please separate into patches with specific purpose, otherwise it's really hard to review.
> Also some comment in line.
>> Signed-off-by: Jeff Guo <jia.guo@intel.com>
>> ---
>> v3->v2:
>> correct some typo and refine code
>> ---
>>   drivers/net/iavf/iavf_hash.c | 1816 ++++++++++++++++++++++++----------
>>   1 file changed, 1299 insertions(+), 517 deletions(-)
>>
>> diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
>> index a7691ef0c..16db38dcd 100644
>> --- a/drivers/net/iavf/iavf_hash.c
>> +++ b/drivers/net/iavf/iavf_hash.c
>> @@ -24,32 +24,34 @@
>>   #include "iavf_generic_flow.h"
>>
>>   enum iavf_pattern_hint_type {
>> -	IAVF_PATTERN_HINT_NONE,
>> -	IAVF_PATTERN_HINT_IPV4,
>> -	IAVF_PATTERN_HINT_IPV4_UDP,
>> -	IAVF_PATTERN_HINT_IPV4_TCP,
>> -	IAVF_PATTERN_HINT_IPV4_SCTP,
>> -	IAVF_PATTERN_HINT_IPV6,
>> -	IAVF_PATTERN_HINT_IPV6_UDP,
>> -	IAVF_PATTERN_HINT_IPV6_TCP,
>> -	IAVF_PATTERN_HINT_IPV6_SCTP,
>> -};
>> -
>> -enum iavf_gtpu_hint {
>> -	IAVF_GTPU_HINT_DOWNLINK,
>> -	IAVF_GTPU_HINT_UPLINK,
>> -	IAVF_GTPU_HINT_NONE,
>> -};
>> +	IAVF_PHINT_NONE				= 0x00000000,
>> +	IAVF_PHINT_IPV4				= 0x00000001,
>> +	IAVF_PHINT_IPV4_UDP			= 0x00000002,
>> +	IAVF_PHINT_IPV4_TCP			= 0x00000004,
>> +	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
>> +	IAVF_PHINT_IPV6				= 0x00000010,
>> +	IAVF_PHINT_IPV6_UDP			= 0x00000020,
>> +	IAVF_PHINT_IPV6_TCP			= 0x00000040,
>> +	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
>> +	IAVF_PHINT_C_VLAN			= 0x00000100,
>> +	IAVF_PHINT_S_VLAN			= 0x00000200,
>> +	IAVF_PHINT_IPV4_GTPU_IP			= 0x00000400,
>> +	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000800,
>> +	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00001000,
>> +	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00002000,
>> +};
>> +
>> +#define IAVF_GTPU_EH_DWNLINK	0
>> +#define IAVF_GTPU_EH_UPLINK	1
>>
>>   struct iavf_pattern_match_type {
>> -	enum iavf_pattern_hint_type phint_type;
>> +	uint64_t pattern_hint;
>>   };
>>
>>   struct iavf_hash_match_type {
>> -	enum iavf_pattern_hint_type phint_type;
>>   	uint64_t hash_type;
>>   	struct virtchnl_proto_hdrs *proto_hdrs;
>> -	enum iavf_gtpu_hint gtpu_hint;
>> +	uint64_t pattern_hint;
>>   };
>>
>>   struct iavf_rss_meta {
>> @@ -83,42 +85,56 @@ iavf_hash_parse_pattern_action(struct iavf_adapter
>> *ad,
>>   			       void **meta,
>>   			       struct rte_flow_error *error);
>>
>> -struct iavf_pattern_match_type phint_empty = {
>> -	IAVF_PATTERN_HINT_NONE};
>> -struct iavf_pattern_match_type phint_eth_ipv4 = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_udp = {
>> -	IAVF_PATTERN_HINT_IPV4_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
>> -	IAVF_PATTERN_HINT_IPV4_TCP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
>> -	IAVF_PATTERN_HINT_IPV4_SCTP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
>> -	IAVF_PATTERN_HINT_IPV4_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_esp = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_ah = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
>> -	IAVF_PATTERN_HINT_IPV4_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv6 = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_udp = {
>> -	IAVF_PATTERN_HINT_IPV6_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
>> -	IAVF_PATTERN_HINT_IPV6_TCP};
>> -struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
>> -	IAVF_PATTERN_HINT_IPV6_SCTP};
>> -struct iavf_pattern_match_type phint_eth_ipv6_esp = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_ah = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
>> -	IAVF_PATTERN_HINT_IPV6_UDP};
>> +static struct iavf_pattern_match_type phint_empty = {
>> +	IAVF_PHINT_NONE};
>> +static struct iavf_pattern_match_type phint_eth_ipv4 = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
>> +	IAVF_PHINT_IPV4_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
>> +	IAVF_PHINT_IPV4_TCP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
>> +	IAVF_PHINT_IPV4_SCTP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_ipv4 = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp
>> = {
>> +	IAVF_PHINT_IPV4_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp =
>> {
>> +	IAVF_PHINT_IPV4_TCP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_udp_esp = {
>> +	IAVF_PHINT_IPV4_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
>> +	IAVF_PHINT_IPV4_UDP};
>> +static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
>> +	IAVF_PHINT_C_VLAN};
>> +static struct iavf_pattern_match_type phint_eth_ipv6 = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
>> +	IAVF_PHINT_IPV6_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
>> +	IAVF_PHINT_IPV6_TCP};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
>> +	IAVF_PHINT_IPV6_SCTP};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_udp_esp = {
>> +	IAVF_PHINT_IPV6_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
>> +	IAVF_PHINT_IPV6_UDP};
>> +static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
>> +	IAVF_PHINT_C_VLAN};
> Add static can be in a separate patch.
>>   /**
>>    * Supported pattern for hash.
>> @@ -131,26 +147,34 @@ static struct iavf_pattern_match_item
>> iavf_hash_pattern_list[] = {
>>   	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE,
>> &phint_eth_ipv4_udp},
>>   	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
>>   	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE,
>> &phint_eth_ipv4_sctp},
>> -	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
>> +	{iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_INSET_NONE,
>> +					&phint_eth_ipv4_gtpu_ipv4},
>>   	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_gtpu_eh},
>> +					&phint_eth_ipv4_gtpu_eh_ipv4},
>>   	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_gtpu_eh},
>> +					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
>>   	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_gtpu_eh},
>> +					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
>>   	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
>> +	{iavf_pattern_eth_ipv4_udp_esp, IAVF_INSET_NONE,
>> +					&phint_eth_ipv4_udp_esp},
>>   	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
>>   	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_l2tpv3},
>> +					&phint_eth_ipv4_l2tpv3},
>>   	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE,
>> &phint_eth_ipv4_pfcp},
>> +	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE,
> Looks like the new vlan pattern is not related with the 5 tuple, please move this feature into a separate patch.
>
>> &phint_eth_vlan_ipv4},
>> +	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
>>   	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE,
>> &phint_eth_ipv6_udp},
>>   	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
>>   	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE,
>> &phint_eth_ipv6_sctp},
>>   	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
>> +	{iavf_pattern_eth_ipv6_udp_esp, IAVF_INSET_NONE,
>> +					&phint_eth_ipv6_udp_esp},
> This is not related with GTPU, please either move this to a separate path or modify the commit log to describe more correctly what you want to do.
>
>>   	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
>>   	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
>> -						&phint_eth_ipv6_l2tpv3},
>> +					&phint_eth_ipv6_l2tpv3},
> This looks redundant change, if it's a code clean move this to separate patch.
>
>>   	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE,
>> &phint_eth_ipv6_pfcp},
>> +	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE,
>> &phint_eth_vlan_ipv6},
>>   	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
>>   };
>>
>> @@ -207,6 +231,28 @@ static struct iavf_pattern_match_item
>> iavf_hash_pattern_list[] = {
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED } }
>>
>> +#define proto_hint_ipv4_src_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV4, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
>> +	{BUFF_NOUSED } }
>> +
>> +#define proto_hint_ipv4_dst_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV4, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
>> +	{BUFF_NOUSED } }
>> +
>> +#define proto_hint_ipv4_only_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV4, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT),
>> {BUFF_NOUSED } }
>> +
>> +#define proto_hint_ipv4_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV4, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT),
>> {BUFF_NOUSED } }
>> +
>>   #define proto_hint_udp_src_port { \
>>   	VIRTCHNL_PROTO_HDR_UDP, \
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT),
>> {BUFF_NOUSED } }
>> @@ -271,6 +317,40 @@ static struct iavf_pattern_match_item
>> iavf_hash_pattern_list[] = {
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
>>
>> +#define proto_hint_ipv6_src_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV6, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
>> +	{BUFF_NOUSED } }
>> +
>> +#define proto_hint_ipv6_dst_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV6, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
>> +	{BUFF_NOUSED } }
>> +
>> +#define proto_hint_ipv6_only_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV6, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT),
>> {BUFF_NOUSED } }
>> +
>> +#define proto_hint_ipv6_prot { \
>> +	VIRTCHNL_PROTO_HDR_IPV6, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT),
>> {BUFF_NOUSED } }
>> +
>> +#define proto_hint_gtpu_ip_teid { \
>> +	VIRTCHNL_PROTO_HDR_GTPU_IP, \
>> +	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_GTPU_IP_TEID),
>> {BUFF_NOUSED } }
>> +
>> +#define proto_hint_gtpu_eh_only { \
>> +	VIRTCHNL_PROTO_HDR_GTPU_EH, \
>> +	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
>> +
>> +#define proto_hint_gtpu_ip_only { \
>> +	VIRTCHNL_PROTO_HDR_GTPU_IP, \
>> +	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
>> +
>>   #define proto_hint_gtpu_up_only { \
>>   	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
>>   	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
>> @@ -295,6 +375,8 @@ static struct iavf_pattern_match_item
>> iavf_hash_pattern_list[] = {
>>   	VIRTCHNL_PROTO_HDR_PFCP, \
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID),
>> {BUFF_NOUSED } }
>>
>> +/* ETH */
>> +
>>   struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
>>   };
>> @@ -315,6 +397,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
>>   };
>>
>> +/* IPV4 */
>> +
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
>>   };
>> @@ -323,117 +407,77 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst =
>> {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_up_only,
>> -	proto_hint_ipv4_src }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_dwn_only,
>> -	proto_hint_ipv4_src }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_up_only,
>> -	proto_hint_ipv4_dst }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_dwn_only,
>> -	proto_hint_ipv4_dst }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_esp }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_ah }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_l2tpv3 }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_pfcp }
>> -};
>> -
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_src_prot,
>>   	proto_hint_udp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_src_prot,
>>   	proto_hint_udp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_dst_prot,
>>   	proto_hint_udp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_dst_prot,
>>   	proto_hint_udp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_only_prot,
>>   	proto_hint_udp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_only_prot,
>>   	proto_hint_udp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
>>   	proto_hint_udp }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_src_prot,
>>   	proto_hint_tcp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_src_prot,
>>   	proto_hint_tcp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_dst_prot,
>>   	proto_hint_tcp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_dst_prot,
>>   	proto_hint_tcp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_only_prot,
>>   	proto_hint_tcp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv4_only_prot,
>>   	proto_hint_tcp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
>>   	proto_hint_tcp }
>>   };
>>
>> @@ -472,105 +516,393 @@ struct virtchnl_proto_hdrs
>> hdrs_hint_ipv4_sctp = {
>>   	proto_hint_sctp }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_esp }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_ah }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_l2tpv3 }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_pfcp }
>>   };
>>
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv4_only,
>> +	proto_hint_udp_only, proto_hint_esp }
>> +};
>> +
>> +/* GTPU IP */
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_ip = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_ip_only,
>> +	proto_hint_ipv4_src }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_ip = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_ip_only,
>> +	proto_hint_ipv4_dst }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_ip = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_ip_only,
>> +	proto_hint_ipv4 }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_teid_gtpu_ip = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_ip_teid}
>> +};
>> +
>> +/* GTPU EH */
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_src }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_dst }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4 }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4, proto_hint_udp}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_ipv4, proto_hint_tcp}
>> +};
>> +
>> +/* GTPU UP */
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_src }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_dst }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4 }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4, proto_hint_udp}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_up = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_up_only,
>> +	proto_hint_ipv4, proto_hint_tcp}
>> +};
>> +
>> +/* GTPU DWN */
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_src }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_dst }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4 }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4, proto_hint_udp}
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_dwn = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_dwn_only,
>> +	proto_hint_ipv4, proto_hint_tcp}
>> +};
>> +
>> +/* IPV6 */
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
>> +};
>> +
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_src_prot,
>>   	proto_hint_udp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_src_prot,
>>   	proto_hint_udp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_dst_prot,
>>   	proto_hint_udp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_dst_prot,
>>   	proto_hint_udp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_only_prot,
>>   	proto_hint_udp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_only_prot,
>>   	proto_hint_udp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
>>   	proto_hint_udp }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_src_prot,
>>   	proto_hint_tcp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_src_prot,
>>   	proto_hint_tcp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_dst_prot,
>>   	proto_hint_tcp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_dst_prot,
>>   	proto_hint_tcp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_only_prot,
>>   	proto_hint_tcp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO,
>> {proto_hint_ipv6_only_prot,
>>   	proto_hint_tcp_dst_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
>>   	proto_hint_tcp }
>>   };
>>
>> @@ -595,12 +927,12 @@ struct virtchnl_proto_hdrs
>> hdrs_hint_ipv6_dst_sctp_dst_port = {
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>>   	proto_hint_sctp_src_port }
>>   };
>>
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>>   	proto_hint_sctp_dst_port }
>>   };
>>
>> @@ -609,337 +941,804 @@ struct virtchnl_proto_hdrs
>> hdrs_hint_ipv6_sctp = {
>>   	proto_hint_sctp }
>>   };
>>
>> -/**
>> - * The first member is pattern hint type,
>> - * the second member is hash type,
>> - * the third member is virtchnl protocol hdrs.
>> - * the forth member is downlink/uplink type.
>> - */
>> -struct iavf_hash_match_type iavf_hash_type_list[] = {
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +	proto_hint_esp }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +	proto_hint_ah }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +	proto_hint_l2tpv3 }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +	proto_hint_pfcp }
>> +};
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_esp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv6_only,
>> +	proto_hint_udp_only, proto_hint_esp }
>> +};
>> +
>> +struct iavf_hash_match_type iavf_hash_map_list[] = {
>>   	/* IPV4 */
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY,
>> &hdrs_hint_eth_src,
>> -						IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY,
>> &hdrs_hint_eth_dst,
>> -						IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
>> -			&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
>> -			&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth,
>> -						IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan,
>> -						IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan,
>> -						IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY,
>> &hdrs_hint_ipv4_src,
>> -						IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY,
>> &hdrs_hint_ipv4_dst,
>> -						IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
>> -			&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
>> -			&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp,
>> -	IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah,
>> -	IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3,
>> &hdrs_hint_ipv4_l2tpv3,
>> -	IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4,
>> -	IAVF_GTPU_HINT_NONE},
>> +	{ETH_RSS_L2_SRC_ONLY,
>> +		&hdrs_hint_eth_src, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L2_DST_ONLY,
>> +		&hdrs_hint_eth_dst, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_ETH,
>> +		&hdrs_hint_eth, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4,
>> +		&hdrs_hint_ipv4, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_ESP,
>> +		&hdrs_hint_ipv4_esp, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_AH,
>> +		&hdrs_hint_ipv4_ah, IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L2TPV3,
>> +		&hdrs_hint_ipv4_l2tpv3, IAVF_PHINT_IPV4},
>>   	/* IPV4 UDP */
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
>> ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
>> ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
>> ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY |
>> ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
>> ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
>> ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
>> ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY |
>> ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> +		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> -		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> -		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> +		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>>   		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> +		IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> +		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> -		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> -		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
>> -		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
>> +		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>>   		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP,
>> -		&hdrs_hint_ipv4_pfcp, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
>> -		&hdrs_hint_ipv4_udp, IAVF_GTPU_HINT_NONE},
>> +		IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_PFCP,
>> +		&hdrs_hint_ipv4_pfcp, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_ESP,
>> +		&hdrs_hint_ipv4_udp_esp, IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP,
>> +		&hdrs_hint_ipv4_udp, IAVF_PHINT_IPV4_UDP},
>>   	/* IPV4 TCP */
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
>> ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY |
>> ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
>> ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY |
>> ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
>> +		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
>> +		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>>   		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
>> +		IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
>> +		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
>> +		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>>   		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
>> -		&hdrs_hint_ipv4_tcp, IAVF_GTPU_HINT_NONE},
>> +		IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP,
>> +		&hdrs_hint_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
>>   	/* IPV4 SCTP */
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_src_sctp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_src_sctp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_dst_sctp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_dst_sctp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
>> +		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
>> +		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>>   		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
>> +		IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
>> +		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
>> +		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP |
>>   		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
>> -		&hdrs_hint_ipv4_sctp, IAVF_GTPU_HINT_NONE},
>> +		IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV4_SCTP,
>> +		&hdrs_hint_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
>>   	/* IPV6 */
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY,
>> -		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY,
>> -		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY,
>> -		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY,
>> -		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH,
>> -		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN,
>> -		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN,
>> -		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP,
>> -		&hdrs_hint_ipv6_esp, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH,
>> -		&hdrs_hint_ipv6_ah, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3,
>> -		&hdrs_hint_ipv6_l2tpv3, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6,
>> -		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
>> +	{ETH_RSS_L2_SRC_ONLY,
>> +		&hdrs_hint_eth_src, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_L2_DST_ONLY,
>> +		&hdrs_hint_eth_dst, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_ETH,
>> +		&hdrs_hint_eth, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_IPV6,
>> +		&hdrs_hint_ipv6, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_ESP,
>> +		&hdrs_hint_ipv6_esp, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_AH,
>> +		&hdrs_hint_ipv6_ah, IAVF_PHINT_IPV6},
>> +	{ETH_RSS_L2TPV3,
>> +		&hdrs_hint_ipv6_l2tpv3, IAVF_PHINT_IPV6},
>>   	/* IPV6 UDP */
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_udp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_udp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_udp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_udp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
>> +		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
>> +		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>>   		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
>> +		IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
>> +		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
>> +		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP |
>>   		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP,
>> -		&hdrs_hint_ipv6_pfcp, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
>> -		&hdrs_hint_ipv6_udp, IAVF_GTPU_HINT_NONE},
>> +		IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_PFCP,
>> +		&hdrs_hint_ipv6_pfcp, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_ESP,
>> +		&hdrs_hint_ipv6_udp_esp, IAVF_PHINT_IPV6_UDP},
>> +	{ETH_RSS_NONFRAG_IPV6_UDP,
>> +		&hdrs_hint_ipv6_udp, IAVF_PHINT_IPV6_UDP},
>>   	/* IPV6 TCP */
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_tcp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_tcp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_tcp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_tcp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
>> +		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
>> +		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>>   		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
>> +		IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
>> +		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
>> +		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP |
>>   		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
>> -		&hdrs_hint_ipv6_tcp, IAVF_GTPU_HINT_NONE},
>> +		IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
>> +	{ETH_RSS_NONFRAG_IPV6_TCP,
>> +		&hdrs_hint_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
>>   	/* IPV6 SCTP */
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_sctp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_sctp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_sctp_src_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
>> -		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_sctp_dst_port,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
>> +		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>>   		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
>> +		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>>   		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
>> +		IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
>> +		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>>   		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
>> +		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP |
>>   		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
>> -		IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
>> -		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
>> -		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
>> -	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
>> -		&hdrs_hint_ipv6_sctp, IAVF_GTPU_HINT_NONE},
>> +		IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
>> +	{ETH_RSS_NONFRAG_IPV6_SCTP,
>> +		&hdrs_hint_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
>> +	/* VLAN */
>> +	{ETH_RSS_S_VLAN,
>> +		&hdrs_hint_svlan, IAVF_PHINT_S_VLAN},
>> +	{ETH_RSS_C_VLAN,
>> +		&hdrs_hint_cvlan, IAVF_PHINT_C_VLAN},
>> +};
>> +
>> +struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
>> +	/* GTPU */
>> +	/* GTPU IP */
>> +	/* GTPU IPV4*/
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_ip,
>> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_ip,
>> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_ip,
>> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_ip,
>> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4,
>> +		&hdrs_hint_ipv4_gtpu_ip,
>> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_GTPU,
>> +		&hdrs_hint_teid_gtpu_ip,
>> +		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
>> +	/* GTPU EH */
>> +	/* Inner IPV4 */
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4,
>> +		&hdrs_hint_ipv4_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
>> +	/* Inner IPV4->UDP */
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP,
>> +		&hdrs_hint_ipv4_udp_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
>> +	/* Inner IPV4->TCP */
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP,
>> +		&hdrs_hint_ipv4_tcp_gtpu_eh,
>> +		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
>> +	/* GTPU EH UP */
>> +	/* Inner IPV4 */
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4,
>> +		&hdrs_hint_ipv4_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
>> +	/* Inner IPV4->UDP */
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP,
>> +		&hdrs_hint_ipv4_udp_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
>> +	/* Inner IPV4->TCP */
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP,
>> +		&hdrs_hint_ipv4_tcp_gtpu_up,
>> +		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
>> +	/* GTPU EH DWN */
>> +	/* Inner IPV4 */
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4 |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
>> +	{ETH_RSS_IPV4,
>> +		&hdrs_hint_ipv4_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
>> +	/* Inner IPV4->UDP */
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	{ETH_RSS_NONFRAG_IPV4_UDP,
>> +		&hdrs_hint_ipv4_udp_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
>> +	/* Inner IPV4->TCP */
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_SRC_ONLY,
>> +		&hdrs_hint_ipv4_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L3_DST_ONLY,
>> +		&hdrs_hint_ipv4_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP |
>> +		ETH_RSS_L4_DST_ONLY,
>> +		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>> +	{ETH_RSS_NONFRAG_IPV4_TCP,
>> +		&hdrs_hint_ipv4_udp_gtpu_dwn,
>> +		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
>>   };
>>
>>   struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = {
>> @@ -1037,10 +1836,12 @@ iavf_hash_init(struct iavf_adapter *ad)
>>   }
>>
>>   static int
>> -iavf_hash_check_inset(const struct rte_flow_item pattern[],
>> -		      struct rte_flow_error *error)
>> +iavf_hash_parse_pattern(struct iavf_pattern_match_item
>> *pattern_match_item,
>> +			const struct rte_flow_item pattern[], uint64_t *phint,
>> +			struct rte_flow_error *error)
>>   {
>>   	const struct rte_flow_item *item = pattern;
>> +	const struct rte_flow_item_gtp_psc *psc;
>>
>>   	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++)
>> {
>>   		if (item->last) {
>> @@ -1049,45 +1850,44 @@ iavf_hash_check_inset(const struct
>> rte_flow_item pattern[],
>>   					   "Not support range");
>>   			return -rte_errno;
>>   		}
>> -	}
>>
>> -	return 0;
>> -}
>> -
>> -static void
>> -iavf_hash_refine_type(uint64_t *rss_type, const struct rte_flow_item
>> pattern[],
>> -		      enum iavf_gtpu_hint *gtpu_hint)
>> -{
>> -	const struct rte_flow_item *item;
>> -
>> -	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++)
>> {
>> -		if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
>> -			const struct rte_flow_item_gtp_psc *psc = item->spec;
>> -
>> -			if (psc && (psc->pdu_type == IAVF_GTPU_HINT_UPLINK ||
>> -				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK)) {
>> -				*rss_type |= ETH_RSS_GTPU;
>> -				*gtpu_hint = psc->pdu_type;
>> -			}
>> +		switch (item->type) {
>> +		case RTE_FLOW_ITEM_TYPE_GTPU:
>> +			*phint |= IAVF_PHINT_IPV4_GTPU_IP;
>> +			break;
>> +		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
>> +			psc = item->spec;
>> +			*phint &= ~IAVF_PHINT_IPV4_GTPU_IP;
>> +			if (!psc)
>> +				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
>> +			else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
>> +				*phint |= IAVF_PHINT_IPV4_GTPU_EH_UPLINK;
>> +			else if (psc->pdu_type == IAVF_GTPU_EH_DWNLINK)
>> +				*phint |= IAVF_PHINT_IPV4_GTPU_EH_DWNLINK;
>> +			break;
>> +		default:
>> +			break;
>>   		}
>>   	}
>> +
>> +	/* update and restore pattern hint */
>> +	*phint |= ((struct iavf_pattern_match_type *)
>> +				(pattern_match_item->meta))->pattern_hint;
>> +
>> +	return 0;
>>   }
>>
>>   static int
>> -iavf_hash_parse_action(struct iavf_pattern_match_item
>> *pattern_match_item,
>> -		       const struct rte_flow_item pattern[],
>> -		       const struct rte_flow_action actions[],
>> -		       void **meta, struct rte_flow_error *error)
>> +iavf_hash_parse_action(const struct rte_flow_action actions[],
>> +		       uint64_t pattern_hint, void **meta,
>> +		       struct rte_flow_error *error)
>>   {
>> -	struct iavf_pattern_match_type *mt = (struct iavf_pattern_match_type
>> *)
>> -					(pattern_match_item->meta);
>>   	struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta;
>> -	uint32_t type_list_len = RTE_DIM(iavf_hash_type_list);
>> -	struct iavf_hash_match_type *type_match_item;
>> -	enum iavf_gtpu_hint gtpu_hint = IAVF_GTPU_HINT_NONE;
>> +	struct iavf_hash_match_type *hash_map_list;
>>   	enum rte_flow_action_type action_type;
>>   	const struct rte_flow_action_rss *rss;
>>   	const struct rte_flow_action *action;
>> +	uint32_t mlist_len;
>>   	bool item_found = false;
>>   	uint64_t rss_type;
>>   	uint16_t i;
>> @@ -1101,25 +1901,18 @@ iavf_hash_parse_action(struct
>> iavf_pattern_match_item *pattern_match_item,
>>   			rss = action->conf;
>>   			rss_type = rss->types;
>>
>> -			/**
>> -			 * Check simultaneous use of SRC_ONLY and DST_ONLY
>> -			 * of the same level.
>> -			 */
>> -			rss_type = rte_eth_rss_hf_refine(rss_type);
>> -
>> -			/**
>> -			 * Refine the hash type base on some specific item of
>> -			 * the pattern, such as identify the gtpu hash.
>> -			 */
>> -			iavf_hash_refine_type(&rss_type, pattern, &gtpu_hint);
>> -
>> -			/* Check if pattern is empty. */
>> -			if (pattern_match_item->pattern_list !=
>> -				iavf_pattern_empty && rss->func ==
>> -				RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
>> -				return rte_flow_error_set(error, ENOTSUP,
>> -					RTE_FLOW_ERROR_TYPE_ACTION, action,
>> -					"Not supported flow");
>> +			if (rss->func ==
>> +			    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
>> +				rss_meta->rss_algorithm =
>> +					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
>> +			} else if (rss->func ==
>> +				   RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
>> +				rss_meta->rss_algorithm =
>> +					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
>> +			} else {
>> +				rss_meta->rss_algorithm =
>> +					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
>> +			}
>>
>>   			if (rss->level)
>>   				return rte_flow_error_set(error, ENOTSUP,
>> @@ -1136,48 +1929,36 @@ iavf_hash_parse_action(struct
>> iavf_pattern_match_item *pattern_match_item,
>>   					RTE_FLOW_ERROR_TYPE_ACTION, action,
>>   					"a non-NULL RSS queue is not supported");
>>
>> -			/* Check hash function and save it to rss_meta. */
>> -			if (rss->func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
>> -				rss_meta->rss_algorithm =
>> -					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
>> -			else if (rss->func ==
>> -				 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
>> -				rss_meta->rss_algorithm =
>> -					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
>> -			else
>> -				rss_meta->rss_algorithm =
>> -					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
>> +			/**
>> +			 * Check simultaneous use of SRC_ONLY and DST_ONLY
>> +			 * of the same level.
>> +			 */
>> +			rss_type = rte_eth_rss_hf_refine(rss_type);
>>
>> -			type_match_item =
>> -			rte_zmalloc("iavf_type_match_item",
>> -				    sizeof(struct iavf_hash_match_type), 0);
>> -			if (!type_match_item) {
>> -				rte_flow_error_set(error, EINVAL,
>> -						   RTE_FLOW_ERROR_TYPE_HANDLE,
>> -						   NULL,
>> -						   "No memory for type_match_item");
>> -				return -ENOMEM;
>> +			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_IP) ||
>> +			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
>> +			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
>> +			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK))
>> {
>> +				hash_map_list = iavf_gtpu_hash_map_list;
>> +				mlist_len = RTE_DIM(iavf_gtpu_hash_map_list);
>> +			} else {
>> +				hash_map_list = iavf_hash_map_list;
>> +				mlist_len = RTE_DIM(iavf_hash_map_list);
>>   			}
>>
>>   			/* Find matched proto hdrs according to hash type. */
>> -			for (i = 0; i < type_list_len; i++) {
>> +			for (i = 0; i < mlist_len; i++) {
>>   				struct iavf_hash_match_type *ht_map =
>> -					&iavf_hash_type_list[i];
>> +					&hash_map_list[i];
>>   				if (rss_type == ht_map->hash_type &&
>> -				    mt->phint_type == ht_map->phint_type &&
>> -				    gtpu_hint == ht_map->gtpu_hint) {
>> -					type_match_item->hash_type =
>> -						ht_map->hash_type;
>> -					type_match_item->proto_hdrs =
>> -						ht_map->proto_hdrs;
>> +				    pattern_hint == ht_map->pattern_hint) {
>>   					rss_meta->proto_hdrs =
>> -						type_match_item->proto_hdrs;
>> +						ht_map->proto_hdrs;
>>   					item_found = true;
>> +					break;
>>   				}
>>   			}
>>
>> -			rte_free(type_match_item);
>> -
>>   			if (!item_found)
>>   				return rte_flow_error_set(error, ENOTSUP,
>>   					RTE_FLOW_ERROR_TYPE_ACTION, action,
>> @@ -1209,6 +1990,7 @@ iavf_hash_parse_pattern_action(__rte_unused
>> struct iavf_adapter *ad,
>>   {
>>   	struct iavf_pattern_match_item *pattern_match_item;
>>   	struct iavf_rss_meta *rss_meta_ptr;
>> +	uint64_t phint = IAVF_PHINT_NONE;
>>   	int ret = 0;
>>
>>   	rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
>> @@ -1228,12 +2010,12 @@ iavf_hash_parse_pattern_action(__rte_unused
>> struct iavf_adapter *ad,
>>   		goto error;
>>   	}
>>
>> -	ret = iavf_hash_check_inset(pattern, error);
>> +	ret = iavf_hash_parse_pattern(pattern_match_item, pattern, &phint,
>> +				      error);
>>   	if (ret)
>>   		goto error;
>>
>> -	/* Check rss action. */
>> -	ret = iavf_hash_parse_action(pattern_match_item, pattern, actions,
>> +	ret = iavf_hash_parse_action(actions, phint,
>>   				     (void **)&rss_meta_ptr, error);
>>
>>   error:
>> --
>> 2.20.1

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

* [dpdk-dev] [dpdk-dev v4 0/3] enable new hash flow for VF
  2020-06-21 14:02   ` [dpdk-dev] [dpdk-dev v3] " Jeff Guo
  2020-07-01 12:56     ` Zhang, Qi Z
@ 2020-07-03  3:56     ` Jeff Guo
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow Jeff Guo
                         ` (2 more replies)
  2020-07-07  5:14     ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Jeff Guo
  2 siblings, 3 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-03  3:56 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Some new hash flow will be supported to expend the flow hash
capability, the input set are the 5 tuple for regular ip pattern and
also GTPU inner ip pattern, and the session id for NAT-T ESP protocol,
the l3 src/dst and the teid for GTPU_IP protocol.

Jeff Guo (3):
  net/iavf: refactor for hash flow
  net/iavf: enable 5 tuple rss hash
  net/iavf: enable some new hash flow

 drivers/net/iavf/iavf_hash.c | 1816 ++++++++++++++++++++++++----------
 1 file changed, 1299 insertions(+), 517 deletions(-)

-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow
  2020-07-03  3:56     ` [dpdk-dev] [dpdk-dev v4 0/3] enable new hash flow for VF Jeff Guo
@ 2020-07-03  3:56       ` Jeff Guo
  2020-07-03 14:24         ` Zhang, Qi Z
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 2/3] net/iavf: enable 5 tuple rss hash Jeff Guo
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 3/3] net/iavf: enable some new hash flow Jeff Guo
  2 siblings, 1 reply; 16+ messages in thread
From: Jeff Guo @ 2020-07-03  3:56 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Refactor hash flow by change the process of the pattern parser and the
action parser, and refine the lookup table for regular IP and GTPU_EH.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
 drivers/net/iavf/iavf_hash.c | 1658 ++++++++++++++++++++++++----------
 1 file changed, 1163 insertions(+), 495 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index a7691ef0c..921dc961f 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -24,32 +24,33 @@
 #include "iavf_generic_flow.h"
 
 enum iavf_pattern_hint_type {
-	IAVF_PATTERN_HINT_NONE,
-	IAVF_PATTERN_HINT_IPV4,
-	IAVF_PATTERN_HINT_IPV4_UDP,
-	IAVF_PATTERN_HINT_IPV4_TCP,
-	IAVF_PATTERN_HINT_IPV4_SCTP,
-	IAVF_PATTERN_HINT_IPV6,
-	IAVF_PATTERN_HINT_IPV6_UDP,
-	IAVF_PATTERN_HINT_IPV6_TCP,
-	IAVF_PATTERN_HINT_IPV6_SCTP,
-};
-
-enum iavf_gtpu_hint {
-	IAVF_GTPU_HINT_DOWNLINK,
-	IAVF_GTPU_HINT_UPLINK,
-	IAVF_GTPU_HINT_NONE,
-};
+	IAVF_PHINT_NONE				= 0x00000000,
+	IAVF_PHINT_IPV4				= 0x00000001,
+	IAVF_PHINT_IPV4_UDP			= 0x00000002,
+	IAVF_PHINT_IPV4_TCP			= 0x00000004,
+	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
+	IAVF_PHINT_IPV6				= 0x00000010,
+	IAVF_PHINT_IPV6_UDP			= 0x00000020,
+	IAVF_PHINT_IPV6_TCP			= 0x00000040,
+	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
+	IAVF_PHINT_C_VLAN			= 0x00000100,
+	IAVF_PHINT_S_VLAN			= 0x00000200,
+	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000400,
+	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00000800,
+	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00001000,
+};
+
+#define IAVF_GTPU_EH_DWNLINK	0
+#define IAVF_GTPU_EH_UPLINK	1
 
 struct iavf_pattern_match_type {
-	enum iavf_pattern_hint_type phint_type;
+	uint64_t pattern_hint;
 };
 
 struct iavf_hash_match_type {
-	enum iavf_pattern_hint_type phint_type;
 	uint64_t hash_type;
 	struct virtchnl_proto_hdrs *proto_hdrs;
-	enum iavf_gtpu_hint gtpu_hint;
+	uint64_t pattern_hint;
 };
 
 struct iavf_rss_meta {
@@ -83,42 +84,50 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
 			       void **meta,
 			       struct rte_flow_error *error);
 
-struct iavf_pattern_match_type phint_empty = {
-	IAVF_PATTERN_HINT_NONE};
-struct iavf_pattern_match_type phint_eth_ipv4 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_udp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
-	IAVF_PATTERN_HINT_IPV4_TCP};
-struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
-	IAVF_PATTERN_HINT_IPV4_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_esp = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_ah = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_udp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
-	IAVF_PATTERN_HINT_IPV6_TCP};
-struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
-	IAVF_PATTERN_HINT_IPV6_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv6_esp = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_ah = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_empty = {
+	IAVF_PHINT_NONE};
+static struct iavf_pattern_match_type phint_eth_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
+	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
+	IAVF_PHINT_C_VLAN};
+static struct iavf_pattern_match_type phint_eth_ipv6 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
+	IAVF_PHINT_IPV6_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
+	IAVF_PHINT_IPV6_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
+	IAVF_PHINT_C_VLAN};
 
 /**
  * Supported pattern for hash.
@@ -131,26 +140,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp},
 	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp},
-	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
 	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
 	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv4_l2tpv3},
+					&phint_eth_ipv4_l2tpv3},
 	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE, &phint_eth_ipv4_pfcp},
+	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE, &phint_eth_vlan_ipv4},
+	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
 	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE, &phint_eth_ipv6_udp},
 	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
 	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp},
 	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
 	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
 	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv6_l2tpv3},
+					&phint_eth_ipv6_l2tpv3},
 	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE, &phint_eth_ipv6_pfcp},
+	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE, &phint_eth_vlan_ipv6},
 	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
 };
 
@@ -271,6 +282,10 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
 
+#define proto_hint_gtpu_eh_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_EH, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_up_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -295,6 +310,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	VIRTCHNL_PROTO_HDR_PFCP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID), {BUFF_NOUSED } }
 
+/* ETH */
+
 struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
 };
@@ -315,6 +332,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
 };
 
+/* IPV4 */
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
 };
@@ -323,46 +342,6 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_esp }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_ah }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_l2tpv3 }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_pfcp }
-};
-
 struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
 };
@@ -472,34 +451,302 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp = {
 	proto_hint_sctp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_esp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_ah }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_l2tpv3 }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_pfcp }
 };
 
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv4_only,
+	proto_hint_udp_only, proto_hint_esp }
+};
+
+/* GTPU EH */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp}
+};
+
+/* GTPU UP */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_tcp}
+};
+
+/* GTPU DWN */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp}
+};
+
+/* IPV6 */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
+};
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 }
 };
@@ -525,13 +772,11 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
-	proto_hint_udp_src_port }
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
-	proto_hint_udp_dst_port }
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
@@ -560,12 +805,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_tcp_dst_port }
 };
 
@@ -595,12 +840,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_sctp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_dst_port }
 };
 
@@ -609,337 +854,782 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp = {
 	proto_hint_sctp }
 };
 
-/**
- * The first member is pattern hint type,
- * the second member is hash type,
- * the third member is virtchnl protocol hdrs.
- * the forth member is downlink/uplink type.
- */
-struct iavf_hash_match_type iavf_hash_type_list[] = {
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_esp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_ah }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_l2tpv3 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_pfcp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv6_only,
+	proto_hint_udp_only, proto_hint_esp }
+};
+
+struct iavf_hash_match_type iavf_hash_map_list[] = {
 	/* IPV4 */
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY, &hdrs_hint_eth_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY, &hdrs_hint_eth_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
-			&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
-			&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
-			&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
-			&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3, &hdrs_hint_ipv4_l2tpv3,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4,
-	IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv4_esp, IAVF_PHINT_IPV4},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv4_ah, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv4_l2tpv3, IAVF_PHINT_IPV4},
 	/* IPV4 UDP */
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv4_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
-		&hdrs_hint_ipv4_udp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv4_pfcp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv4_udp_esp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp, IAVF_PHINT_IPV4_UDP},
 	/* IPV4 TCP */
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
-		&hdrs_hint_ipv4_tcp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
 	/* IPV4 SCTP */
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
-		&hdrs_hint_ipv4_sctp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP,
+		&hdrs_hint_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
 	/* IPV6 */
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH,
-		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN,
-		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN,
-		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP,
-		&hdrs_hint_ipv6_esp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH,
-		&hdrs_hint_ipv6_ah, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3,
-		&hdrs_hint_ipv6_l2tpv3, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6,
-		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6,
+		&hdrs_hint_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv6_esp, IAVF_PHINT_IPV6},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv6_ah, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv6_l2tpv3, IAVF_PHINT_IPV6},
 	/* IPV6 UDP */
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv6_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
-		&hdrs_hint_ipv6_udp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv6_pfcp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv6_udp_esp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP,
+		&hdrs_hint_ipv6_udp, IAVF_PHINT_IPV6_UDP},
 	/* IPV6 TCP */
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
-		&hdrs_hint_ipv6_tcp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP,
+		&hdrs_hint_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
 	/* IPV6 SCTP */
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
-		&hdrs_hint_ipv6_sctp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP,
+		&hdrs_hint_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+	/* VLAN */
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan, IAVF_PHINT_S_VLAN},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan, IAVF_PHINT_C_VLAN},
+};
+
+struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
+	/* GTPU */
+	/* GTPU EH */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH UP */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH DWN */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
 };
 
 struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = {
@@ -1037,10 +1727,12 @@ iavf_hash_init(struct iavf_adapter *ad)
 }
 
 static int
-iavf_hash_check_inset(const struct rte_flow_item pattern[],
-		      struct rte_flow_error *error)
+iavf_hash_parse_pattern(struct iavf_pattern_match_item *pattern_match_item,
+			const struct rte_flow_item pattern[], uint64_t *phint,
+			struct rte_flow_error *error)
 {
 	const struct rte_flow_item *item = pattern;
+	const struct rte_flow_item_gtp_psc *psc;
 
 	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
 		if (item->last) {
@@ -1049,45 +1741,40 @@ iavf_hash_check_inset(const struct rte_flow_item pattern[],
 					   "Not support range");
 			return -rte_errno;
 		}
-	}
 
-	return 0;
-}
-
-static void
-iavf_hash_refine_type(uint64_t *rss_type, const struct rte_flow_item pattern[],
-		      enum iavf_gtpu_hint *gtpu_hint)
-{
-	const struct rte_flow_item *item;
-
-	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-		if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
-			const struct rte_flow_item_gtp_psc *psc = item->spec;
-
-			if (psc && (psc->pdu_type == IAVF_GTPU_HINT_UPLINK ||
-				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK)) {
-				*rss_type |= ETH_RSS_GTPU;
-				*gtpu_hint = psc->pdu_type;
-			}
+		switch (item->type) {
+		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
+			psc = item->spec;
+			if (!psc)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
+			else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_UPLINK;
+			else if (psc->pdu_type == IAVF_GTPU_EH_DWNLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_DWNLINK;
+			break;
+		default:
+			break;
 		}
 	}
+
+	/* update and restore pattern hint */
+	*phint |= ((struct iavf_pattern_match_type *)
+				(pattern_match_item->meta))->pattern_hint;
+
+	return 0;
 }
 
 static int
-iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
-		       const struct rte_flow_item pattern[],
-		       const struct rte_flow_action actions[],
-		       void **meta, struct rte_flow_error *error)
+iavf_hash_parse_action(const struct rte_flow_action actions[],
+		       uint64_t pattern_hint, void **meta,
+		       struct rte_flow_error *error)
 {
-	struct iavf_pattern_match_type *mt = (struct iavf_pattern_match_type *)
-					(pattern_match_item->meta);
 	struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta;
-	uint32_t type_list_len = RTE_DIM(iavf_hash_type_list);
-	struct iavf_hash_match_type *type_match_item;
-	enum iavf_gtpu_hint gtpu_hint = IAVF_GTPU_HINT_NONE;
+	struct iavf_hash_match_type *hash_map_list;
 	enum rte_flow_action_type action_type;
 	const struct rte_flow_action_rss *rss;
 	const struct rte_flow_action *action;
+	uint32_t mlist_len;
 	bool item_found = false;
 	uint64_t rss_type;
 	uint16_t i;
@@ -1101,25 +1788,18 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 			rss = action->conf;
 			rss_type = rss->types;
 
-			/**
-			 * Check simultaneous use of SRC_ONLY and DST_ONLY
-			 * of the same level.
-			 */
-			rss_type = rte_eth_rss_hf_refine(rss_type);
-
-			/**
-			 * Refine the hash type base on some specific item of
-			 * the pattern, such as identify the gtpu hash.
-			 */
-			iavf_hash_refine_type(&rss_type, pattern, &gtpu_hint);
-
-			/* Check if pattern is empty. */
-			if (pattern_match_item->pattern_list !=
-				iavf_pattern_empty && rss->func ==
-				RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
-				return rte_flow_error_set(error, ENOTSUP,
-					RTE_FLOW_ERROR_TYPE_ACTION, action,
-					"Not supported flow");
+			if (rss->func ==
+			    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
+			} else if (rss->func ==
+				   RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
+			} else {
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
+			}
 
 			if (rss->level)
 				return rte_flow_error_set(error, ENOTSUP,
@@ -1136,48 +1816,35 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
 					"a non-NULL RSS queue is not supported");
 
-			/* Check hash function and save it to rss_meta. */
-			if (rss->func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
-			else if (rss->func ==
-				 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
-			else
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
+			/**
+			 * Check simultaneous use of SRC_ONLY and DST_ONLY
+			 * of the same level.
+			 */
+			rss_type = rte_eth_rss_hf_refine(rss_type);
 
-			type_match_item =
-			rte_zmalloc("iavf_type_match_item",
-				    sizeof(struct iavf_hash_match_type), 0);
-			if (!type_match_item) {
-				rte_flow_error_set(error, EINVAL,
-						   RTE_FLOW_ERROR_TYPE_HANDLE,
-						   NULL,
-						   "No memory for type_match_item");
-				return -ENOMEM;
+			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK)) {
+				hash_map_list = iavf_gtpu_hash_map_list;
+				mlist_len = RTE_DIM(iavf_gtpu_hash_map_list);
+			} else {
+				hash_map_list = iavf_hash_map_list;
+				mlist_len = RTE_DIM(iavf_hash_map_list);
 			}
 
 			/* Find matched proto hdrs according to hash type. */
-			for (i = 0; i < type_list_len; i++) {
+			for (i = 0; i < mlist_len; i++) {
 				struct iavf_hash_match_type *ht_map =
-					&iavf_hash_type_list[i];
+					&hash_map_list[i];
 				if (rss_type == ht_map->hash_type &&
-				    mt->phint_type == ht_map->phint_type &&
-				    gtpu_hint == ht_map->gtpu_hint) {
-					type_match_item->hash_type =
-						ht_map->hash_type;
-					type_match_item->proto_hdrs =
-						ht_map->proto_hdrs;
+				    pattern_hint == ht_map->pattern_hint) {
 					rss_meta->proto_hdrs =
-						type_match_item->proto_hdrs;
+						ht_map->proto_hdrs;
 					item_found = true;
+					break;
 				}
 			}
 
-			rte_free(type_match_item);
-
 			if (!item_found)
 				return rte_flow_error_set(error, ENOTSUP,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
@@ -1209,6 +1876,7 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 {
 	struct iavf_pattern_match_item *pattern_match_item;
 	struct iavf_rss_meta *rss_meta_ptr;
+	uint64_t phint = IAVF_PHINT_NONE;
 	int ret = 0;
 
 	rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
@@ -1228,12 +1896,12 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 		goto error;
 	}
 
-	ret = iavf_hash_check_inset(pattern, error);
+	ret = iavf_hash_parse_pattern(pattern_match_item, pattern, &phint,
+				      error);
 	if (ret)
 		goto error;
 
-	/* Check rss action. */
-	ret = iavf_hash_parse_action(pattern_match_item, pattern, actions,
+	ret = iavf_hash_parse_action(actions, phint,
 				     (void **)&rss_meta_ptr, error);
 
 error:
-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v4 2/3] net/iavf: enable 5 tuple rss hash
  2020-07-03  3:56     ` [dpdk-dev] [dpdk-dev v4 0/3] enable new hash flow for VF Jeff Guo
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow Jeff Guo
@ 2020-07-03  3:56       ` Jeff Guo
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 3/3] net/iavf: enable some new hash flow Jeff Guo
  2 siblings, 0 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-03  3:56 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Previous iavf not support 5 tuple hash, this patch aims to enable it
for regular ip pattern and also GTPU inner ip pattern, the 5 tuple
involves ip src and ip dst, tcp sport and tcp dport, udp sport and
udp dport and protocol id.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
 drivers/net/iavf/iavf_hash.c | 186 ++++++++++++++++++++++-------------
 1 file changed, 116 insertions(+), 70 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index 921dc961f..a253d08f6 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -218,6 +218,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv4_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv4_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_udp_src_port { \
 	VIRTCHNL_PROTO_HDR_UDP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT), {BUFF_NOUSED } }
@@ -282,6 +304,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv6_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv6_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_eh_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -347,72 +391,72 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_tcp }
 };
 
@@ -480,22 +524,22 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
@@ -505,22 +549,22 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
@@ -535,54 +579,54 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_eh = {
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_udp}
+	proto_hint_ipv4_prot, proto_hint_udp}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_eh = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp}
+	proto_hint_ipv4_prot, proto_hint_tcp}
 };
 
 /* GTPU UP */
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
@@ -592,22 +636,22 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
@@ -622,54 +666,54 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_up = {
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_udp}
+	proto_hint_ipv4_prot, proto_hint_udp}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_up = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
-	proto_hint_tcp}
+	proto_hint_ipv4_prot, proto_hint_tcp}
 };
 
 /* GTPU DWN */
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
@@ -679,22 +723,22 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
@@ -709,32 +753,32 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_dwn = {
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_src_port}
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_dst_port}
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_src_port}
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_dst_port}
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp}
+	proto_hint_ipv4_prot, proto_hint_udp}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_dwn = {
 	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp}
+	proto_hint_ipv4_prot, proto_hint_tcp}
 };
 
 /* IPV6 */
@@ -752,70 +796,72 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_src_port }
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
+	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_dst_port }
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
+	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_tcp }
 };
 
-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v4 3/3] net/iavf: enable some new hash flow
  2020-07-03  3:56     ` [dpdk-dev] [dpdk-dev v4 0/3] enable new hash flow for VF Jeff Guo
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow Jeff Guo
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 2/3] net/iavf: enable 5 tuple rss hash Jeff Guo
@ 2020-07-03  3:56       ` Jeff Guo
  2 siblings, 0 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-03  3:56 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Some new hash flow will be supported to expend the flow hash
capability, the input set are the session id for NAT-T ESP protocol,
the l3 src/dst and the teid for GTPU_IP protocol.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
 drivers/net/iavf/iavf_hash.c | 76 ++++++++++++++++++++++++++++++++++--
 1 file changed, 72 insertions(+), 4 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index a253d08f6..bb51b76b5 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -35,9 +35,10 @@ enum iavf_pattern_hint_type {
 	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
 	IAVF_PHINT_C_VLAN			= 0x00000100,
 	IAVF_PHINT_S_VLAN			= 0x00000200,
-	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000400,
-	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00000800,
-	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00001000,
+	IAVF_PHINT_IPV4_GTPU_IP			= 0x00000400,
+	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000800,
+	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00001000,
+	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00002000,
 };
 
 #define IAVF_GTPU_EH_DWNLINK	0
@@ -94,6 +95,8 @@ static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
 	IAVF_PHINT_IPV4_TCP};
 static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
 	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_ipv4 = {
+	IAVF_PHINT_IPV4};
 static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
 	IAVF_PHINT_IPV4};
 static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp = {
@@ -102,6 +105,8 @@ static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp = {
 	IAVF_PHINT_IPV4_TCP};
 static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
 	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp_esp = {
+	IAVF_PHINT_IPV4_UDP};
 static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
 	IAVF_PHINT_IPV4};
 static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
@@ -120,6 +125,8 @@ static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
 	IAVF_PHINT_IPV6_SCTP};
 static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
 	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp_esp = {
+	IAVF_PHINT_IPV6_UDP};
 static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
 	IAVF_PHINT_IPV6};
 static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
@@ -140,6 +147,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp},
 	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp},
+	{iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_INSET_NONE,
+					&phint_eth_ipv4_gtpu_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
 					&phint_eth_ipv4_gtpu_eh_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
@@ -147,6 +156,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
 					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
+	{iavf_pattern_eth_ipv4_udp_esp, IAVF_INSET_NONE,
+					&phint_eth_ipv4_udp_esp},
 	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
 	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
 					&phint_eth_ipv4_l2tpv3},
@@ -157,6 +168,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
 	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp},
 	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
+	{iavf_pattern_eth_ipv6_udp_esp, IAVF_INSET_NONE,
+					&phint_eth_ipv6_udp_esp},
 	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
 	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
 					&phint_eth_ipv6_l2tpv3},
@@ -326,10 +339,18 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
 
+#define proto_hint_gtpu_ip_teid { \
+	VIRTCHNL_PROTO_HDR_GTPU_IP, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_GTPU_IP_TEID), {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_eh_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
 
+#define proto_hint_gtpu_ip_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_IP, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_up_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -520,6 +541,26 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
 	proto_hint_udp_only, proto_hint_esp }
 };
 
+/* GTPU IP */
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_teid_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_teid}
+};
+
 /* GTPU EH */
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
@@ -1235,6 +1276,28 @@ struct iavf_hash_match_type iavf_hash_map_list[] = {
 
 struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
 	/* GTPU */
+	/* GTPU IP */
+	/* GTPU IPV4*/
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_GTPU,
+		&hdrs_hint_teid_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
 	/* GTPU EH */
 	/* Inner IPV4 */
 	{ETH_RSS_L3_SRC_ONLY,
@@ -1789,8 +1852,12 @@ iavf_hash_parse_pattern(struct iavf_pattern_match_item *pattern_match_item,
 		}
 
 		switch (item->type) {
+		case RTE_FLOW_ITEM_TYPE_GTPU:
+			*phint |= IAVF_PHINT_IPV4_GTPU_IP;
+			break;
 		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
 			psc = item->spec;
+			*phint &= ~IAVF_PHINT_IPV4_GTPU_IP;
 			if (!psc)
 				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
 			else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
@@ -1868,7 +1935,8 @@ iavf_hash_parse_action(const struct rte_flow_action actions[],
 			 */
 			rss_type = rte_eth_rss_hf_refine(rss_type);
 
-			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
+			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_IP) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
 			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
 			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK)) {
 				hash_map_list = iavf_gtpu_hash_map_list;
-- 
2.20.1


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

* Re: [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow
  2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow Jeff Guo
@ 2020-07-03 14:24         ` Zhang, Qi Z
  2020-07-05 11:28           ` Jeff Guo
  0 siblings, 1 reply; 16+ messages in thread
From: Zhang, Qi Z @ 2020-07-03 14:24 UTC (permalink / raw)
  To: Guo, Jia, Wu, Jingjing, Xing, Beilei
  Cc: dev, Guo, Junfeng, Yang, Qiming, Su, Simei



> -----Original Message-----
> From: Guo, Jia <jia.guo@intel.com>
> Sent: Friday, July 3, 2020 11:57 AM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>
> Cc: dev@dpdk.org; Guo, Junfeng <junfeng.guo@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Su, Simei <simei.su@intel.com>; Guo, Jia
> <jia.guo@intel.com>
> Subject: [dpdk-dev v4 1/3] net/iavf: refactor for hash flow
> 
> Refactor hash flow by change the process of the pattern parser and the
> action parser, and refine the lookup table for regular IP and GTPU_EH.
> 
> Signed-off-by: Jeff Guo <jia.guo@intel.com>
> ---
>  drivers/net/iavf/iavf_hash.c | 1658 ++++++++++++++++++++++++----------
>  1 file changed, 1163 insertions(+), 495 deletions(-)
> 
> diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
> index a7691ef0c..921dc961f 100644
> --- a/drivers/net/iavf/iavf_hash.c
> +++ b/drivers/net/iavf/iavf_hash.c
> @@ -24,32 +24,33 @@
>  #include "iavf_generic_flow.h"
> 
>  enum iavf_pattern_hint_type {
> -	IAVF_PATTERN_HINT_NONE,
> -	IAVF_PATTERN_HINT_IPV4,
> -	IAVF_PATTERN_HINT_IPV4_UDP,
> -	IAVF_PATTERN_HINT_IPV4_TCP,
> -	IAVF_PATTERN_HINT_IPV4_SCTP,
> -	IAVF_PATTERN_HINT_IPV6,
> -	IAVF_PATTERN_HINT_IPV6_UDP,
> -	IAVF_PATTERN_HINT_IPV6_TCP,
> -	IAVF_PATTERN_HINT_IPV6_SCTP,
> -};
> -
> -enum iavf_gtpu_hint {
> -	IAVF_GTPU_HINT_DOWNLINK,
> -	IAVF_GTPU_HINT_UPLINK,
> -	IAVF_GTPU_HINT_NONE,
> -};
> +	IAVF_PHINT_NONE				= 0x00000000,
> +	IAVF_PHINT_IPV4				= 0x00000001,
> +	IAVF_PHINT_IPV4_UDP			= 0x00000002,
> +	IAVF_PHINT_IPV4_TCP			= 0x00000004,
> +	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
> +	IAVF_PHINT_IPV6				= 0x00000010,
> +	IAVF_PHINT_IPV6_UDP			= 0x00000020,
> +	IAVF_PHINT_IPV6_TCP			= 0x00000040,
> +	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
> +	IAVF_PHINT_C_VLAN			= 0x00000100,
> +	IAVF_PHINT_S_VLAN			= 0x00000200,
> +	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000400,
> +	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00000800,
> +	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00001000,
> +};
> +
> +#define IAVF_GTPU_EH_DWNLINK	0
> +#define IAVF_GTPU_EH_UPLINK	1
> 
>  struct iavf_pattern_match_type {
> -	enum iavf_pattern_hint_type phint_type;
> +	uint64_t pattern_hint;
>  };
> 
>  struct iavf_hash_match_type {
> -	enum iavf_pattern_hint_type phint_type;
>  	uint64_t hash_type;
>  	struct virtchnl_proto_hdrs *proto_hdrs;
> -	enum iavf_gtpu_hint gtpu_hint;
> +	uint64_t pattern_hint;
>  };
> 
>  struct iavf_rss_meta {
> @@ -83,42 +84,50 @@ iavf_hash_parse_pattern_action(struct iavf_adapter
> *ad,
>  			       void **meta,
>  			       struct rte_flow_error *error);
> 
> -struct iavf_pattern_match_type phint_empty = {
> -	IAVF_PATTERN_HINT_NONE};
> -struct iavf_pattern_match_type phint_eth_ipv4 = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_udp = {
> -	IAVF_PATTERN_HINT_IPV4_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
> -	IAVF_PATTERN_HINT_IPV4_TCP};
> -struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
> -	IAVF_PATTERN_HINT_IPV4_SCTP};
> -struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
> -	IAVF_PATTERN_HINT_IPV4_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv4_esp = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_ah = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
> -	IAVF_PATTERN_HINT_IPV4};
> -struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
> -	IAVF_PATTERN_HINT_IPV4_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv6 = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_udp = {
> -	IAVF_PATTERN_HINT_IPV6_UDP};
> -struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
> -	IAVF_PATTERN_HINT_IPV6_TCP};
> -struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
> -	IAVF_PATTERN_HINT_IPV6_SCTP};
> -struct iavf_pattern_match_type phint_eth_ipv6_esp = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_ah = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
> -	IAVF_PATTERN_HINT_IPV6};
> -struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
> -	IAVF_PATTERN_HINT_IPV6_UDP};
> +static struct iavf_pattern_match_type phint_empty = {
> +	IAVF_PHINT_NONE};
> +static struct iavf_pattern_match_type phint_eth_ipv4 = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
> +	IAVF_PHINT_IPV4_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
> +	IAVF_PHINT_IPV4_TCP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
> +	IAVF_PHINT_IPV4_SCTP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp
> = {
> +	IAVF_PHINT_IPV4_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp =
> {
> +	IAVF_PHINT_IPV4_TCP};
> +static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
> +	IAVF_PHINT_IPV4};
> +static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
> +	IAVF_PHINT_IPV4_UDP};
> +static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
> +	IAVF_PHINT_C_VLAN};
> +static struct iavf_pattern_match_type phint_eth_ipv6 = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
> +	IAVF_PHINT_IPV6_UDP};
> +static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
> +	IAVF_PHINT_IPV6_TCP};
> +static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
> +	IAVF_PHINT_IPV6_SCTP};
> +static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
> +	IAVF_PHINT_IPV6};
> +static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
> +	IAVF_PHINT_IPV6_UDP};
> +static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
> +	IAVF_PHINT_C_VLAN};
> 
>  /**
>   * Supported pattern for hash.
> @@ -131,26 +140,28 @@ static struct iavf_pattern_match_item
> iavf_hash_pattern_list[] = {
>  	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE,
> &phint_eth_ipv4_udp},
>  	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
>  	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE,
> &phint_eth_ipv4_sctp},
> -	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
>  	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_gtpu_eh},
> +					&phint_eth_ipv4_gtpu_eh_ipv4},
>  	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_gtpu_eh},
> +					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
>  	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_gtpu_eh},
> +					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
>  	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
>  	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
>  	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
> -						&phint_eth_ipv4_l2tpv3},
> +					&phint_eth_ipv4_l2tpv3},
>  	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE,
> &phint_eth_ipv4_pfcp},
> +	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE,
> &phint_eth_vlan_ipv4},
> +	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
>  	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE,
> &phint_eth_ipv6_udp},
>  	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
>  	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE,
> &phint_eth_ipv6_sctp},
>  	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
>  	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
>  	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
> -						&phint_eth_ipv6_l2tpv3},
> +					&phint_eth_ipv6_l2tpv3},
>  	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE,
> &phint_eth_ipv6_pfcp},
> +	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE,
> &phint_eth_vlan_ipv6},
>  	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
>  };
> 
> @@ -271,6 +282,10 @@ static struct iavf_pattern_match_item
> iavf_hash_pattern_list[] = {
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
> 
> +#define proto_hint_gtpu_eh_only { \
> +	VIRTCHNL_PROTO_HDR_GTPU_EH, \
> +	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
> +
>  #define proto_hint_gtpu_up_only { \
>  	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
>  	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
> @@ -295,6 +310,8 @@ static struct iavf_pattern_match_item
> iavf_hash_pattern_list[] = {
>  	VIRTCHNL_PROTO_HDR_PFCP, \
>  	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID),
> {BUFF_NOUSED } }
> 
> +/* ETH */
> +
>  struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
>  };
> @@ -315,6 +332,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
>  };
> 
> +/* IPV4 */
> +
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
>  };
> @@ -323,46 +342,6 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_up_only,
> -	proto_hint_ipv4_src }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_dwn_only,
> -	proto_hint_ipv4_src }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_up_only,
> -	proto_hint_ipv4_dst }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
> {proto_hint_gtpu_dwn_only,
> -	proto_hint_ipv4_dst }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_esp }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_ah }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_l2tpv3 }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
> -	proto_hint_pfcp }
> -};
> -
>  struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
>  	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
>  };
> @@ -472,34 +451,302 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp
> = {
>  	proto_hint_sctp }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
> -};
> -
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_esp }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_ah }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_l2tpv3 }
>  };
> 
> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>  	proto_hint_pfcp }
>  };
> 
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv4_only,
> +	proto_hint_udp_only, proto_hint_esp }
> +};
> +
> +/* GTPU EH */
> +
> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
> {proto_hint_gtpu_eh_only,
> +	proto_hint_udp_src_port}

The counter is three, but you have only two proto layers here, anything I missed?

btw, I don't think these code belongs to code refactor, looks like you are adding inner l4 header which is not supported previously
would it be better just keep his patch only for code refactor, and separate new features in a new patch?


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

* Re: [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow
  2020-07-03 14:24         ` Zhang, Qi Z
@ 2020-07-05 11:28           ` Jeff Guo
  0 siblings, 0 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-05 11:28 UTC (permalink / raw)
  To: Zhang, Qi Z, Wu, Jingjing, Xing, Beilei
  Cc: dev, Guo, Junfeng, Yang, Qiming, Su, Simei

hi, qi

On 7/3/2020 10:24 PM, Zhang, Qi Z wrote:
>
>> -----Original Message-----
>> From: Guo, Jia <jia.guo@intel.com>
>> Sent: Friday, July 3, 2020 11:57 AM
>> To: Zhang, Qi Z <qi.z.zhang@intel.com>; Wu, Jingjing
>> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>
>> Cc: dev@dpdk.org; Guo, Junfeng <junfeng.guo@intel.com>; Yang, Qiming
>> <qiming.yang@intel.com>; Su, Simei <simei.su@intel.com>; Guo, Jia
>> <jia.guo@intel.com>
>> Subject: [dpdk-dev v4 1/3] net/iavf: refactor for hash flow
>>
>> Refactor hash flow by change the process of the pattern parser and the
>> action parser, and refine the lookup table for regular IP and GTPU_EH.
>>
>> Signed-off-by: Jeff Guo <jia.guo@intel.com>
>> ---
>>   drivers/net/iavf/iavf_hash.c | 1658 ++++++++++++++++++++++++----------
>>   1 file changed, 1163 insertions(+), 495 deletions(-)
>>
>> diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
>> index a7691ef0c..921dc961f 100644
>> --- a/drivers/net/iavf/iavf_hash.c
>> +++ b/drivers/net/iavf/iavf_hash.c
>> @@ -24,32 +24,33 @@
>>   #include "iavf_generic_flow.h"
>>
>>   enum iavf_pattern_hint_type {
>> -	IAVF_PATTERN_HINT_NONE,
>> -	IAVF_PATTERN_HINT_IPV4,
>> -	IAVF_PATTERN_HINT_IPV4_UDP,
>> -	IAVF_PATTERN_HINT_IPV4_TCP,
>> -	IAVF_PATTERN_HINT_IPV4_SCTP,
>> -	IAVF_PATTERN_HINT_IPV6,
>> -	IAVF_PATTERN_HINT_IPV6_UDP,
>> -	IAVF_PATTERN_HINT_IPV6_TCP,
>> -	IAVF_PATTERN_HINT_IPV6_SCTP,
>> -};
>> -
>> -enum iavf_gtpu_hint {
>> -	IAVF_GTPU_HINT_DOWNLINK,
>> -	IAVF_GTPU_HINT_UPLINK,
>> -	IAVF_GTPU_HINT_NONE,
>> -};
>> +	IAVF_PHINT_NONE				= 0x00000000,
>> +	IAVF_PHINT_IPV4				= 0x00000001,
>> +	IAVF_PHINT_IPV4_UDP			= 0x00000002,
>> +	IAVF_PHINT_IPV4_TCP			= 0x00000004,
>> +	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
>> +	IAVF_PHINT_IPV6				= 0x00000010,
>> +	IAVF_PHINT_IPV6_UDP			= 0x00000020,
>> +	IAVF_PHINT_IPV6_TCP			= 0x00000040,
>> +	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
>> +	IAVF_PHINT_C_VLAN			= 0x00000100,
>> +	IAVF_PHINT_S_VLAN			= 0x00000200,
>> +	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000400,
>> +	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00000800,
>> +	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00001000,
>> +};
>> +
>> +#define IAVF_GTPU_EH_DWNLINK	0
>> +#define IAVF_GTPU_EH_UPLINK	1
>>
>>   struct iavf_pattern_match_type {
>> -	enum iavf_pattern_hint_type phint_type;
>> +	uint64_t pattern_hint;
>>   };
>>
>>   struct iavf_hash_match_type {
>> -	enum iavf_pattern_hint_type phint_type;
>>   	uint64_t hash_type;
>>   	struct virtchnl_proto_hdrs *proto_hdrs;
>> -	enum iavf_gtpu_hint gtpu_hint;
>> +	uint64_t pattern_hint;
>>   };
>>
>>   struct iavf_rss_meta {
>> @@ -83,42 +84,50 @@ iavf_hash_parse_pattern_action(struct iavf_adapter
>> *ad,
>>   			       void **meta,
>>   			       struct rte_flow_error *error);
>>
>> -struct iavf_pattern_match_type phint_empty = {
>> -	IAVF_PATTERN_HINT_NONE};
>> -struct iavf_pattern_match_type phint_eth_ipv4 = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_udp = {
>> -	IAVF_PATTERN_HINT_IPV4_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
>> -	IAVF_PATTERN_HINT_IPV4_TCP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
>> -	IAVF_PATTERN_HINT_IPV4_SCTP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
>> -	IAVF_PATTERN_HINT_IPV4_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv4_esp = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_ah = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
>> -	IAVF_PATTERN_HINT_IPV4};
>> -struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
>> -	IAVF_PATTERN_HINT_IPV4_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv6 = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_udp = {
>> -	IAVF_PATTERN_HINT_IPV6_UDP};
>> -struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
>> -	IAVF_PATTERN_HINT_IPV6_TCP};
>> -struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
>> -	IAVF_PATTERN_HINT_IPV6_SCTP};
>> -struct iavf_pattern_match_type phint_eth_ipv6_esp = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_ah = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
>> -	IAVF_PATTERN_HINT_IPV6};
>> -struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
>> -	IAVF_PATTERN_HINT_IPV6_UDP};
>> +static struct iavf_pattern_match_type phint_empty = {
>> +	IAVF_PHINT_NONE};
>> +static struct iavf_pattern_match_type phint_eth_ipv4 = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
>> +	IAVF_PHINT_IPV4_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
>> +	IAVF_PHINT_IPV4_TCP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
>> +	IAVF_PHINT_IPV4_SCTP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp
>> = {
>> +	IAVF_PHINT_IPV4_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp =
>> {
>> +	IAVF_PHINT_IPV4_TCP};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
>> +	IAVF_PHINT_IPV4};
>> +static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
>> +	IAVF_PHINT_IPV4_UDP};
>> +static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
>> +	IAVF_PHINT_C_VLAN};
>> +static struct iavf_pattern_match_type phint_eth_ipv6 = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
>> +	IAVF_PHINT_IPV6_UDP};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
>> +	IAVF_PHINT_IPV6_TCP};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
>> +	IAVF_PHINT_IPV6_SCTP};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
>> +	IAVF_PHINT_IPV6};
>> +static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
>> +	IAVF_PHINT_IPV6_UDP};
>> +static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
>> +	IAVF_PHINT_C_VLAN};
>>
>>   /**
>>    * Supported pattern for hash.
>> @@ -131,26 +140,28 @@ static struct iavf_pattern_match_item
>> iavf_hash_pattern_list[] = {
>>   	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE,
>> &phint_eth_ipv4_udp},
>>   	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
>>   	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE,
>> &phint_eth_ipv4_sctp},
>> -	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
>>   	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_gtpu_eh},
>> +					&phint_eth_ipv4_gtpu_eh_ipv4},
>>   	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_gtpu_eh},
>> +					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
>>   	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_gtpu_eh},
>> +					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
>>   	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
>>   	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
>>   	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
>> -						&phint_eth_ipv4_l2tpv3},
>> +					&phint_eth_ipv4_l2tpv3},
>>   	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE,
>> &phint_eth_ipv4_pfcp},
>> +	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE,
>> &phint_eth_vlan_ipv4},
>> +	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
>>   	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE,
>> &phint_eth_ipv6_udp},
>>   	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
>>   	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE,
>> &phint_eth_ipv6_sctp},
>>   	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
>>   	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
>>   	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
>> -						&phint_eth_ipv6_l2tpv3},
>> +					&phint_eth_ipv6_l2tpv3},
>>   	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE,
>> &phint_eth_ipv6_pfcp},
>> +	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE,
>> &phint_eth_vlan_ipv6},
>>   	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
>>   };
>>
>> @@ -271,6 +282,10 @@ static struct iavf_pattern_match_item
>> iavf_hash_pattern_list[] = {
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
>>
>> +#define proto_hint_gtpu_eh_only { \
>> +	VIRTCHNL_PROTO_HDR_GTPU_EH, \
>> +	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
>> +
>>   #define proto_hint_gtpu_up_only { \
>>   	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
>>   	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
>> @@ -295,6 +310,8 @@ static struct iavf_pattern_match_item
>> iavf_hash_pattern_list[] = {
>>   	VIRTCHNL_PROTO_HDR_PFCP, \
>>   	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID),
>> {BUFF_NOUSED } }
>>
>> +/* ETH */
>> +
>>   struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
>>   };
>> @@ -315,6 +332,8 @@ struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
>>   };
>>
>> +/* IPV4 */
>> +
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
>>   };
>> @@ -323,46 +342,6 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_up_only,
>> -	proto_hint_ipv4_src }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_dwn_only,
>> -	proto_hint_ipv4_src }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_up_only,
>> -	proto_hint_ipv4_dst }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
>> -	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO,
>> {proto_hint_gtpu_dwn_only,
>> -	proto_hint_ipv4_dst }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_esp }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_ah }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_l2tpv3 }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>> -	proto_hint_pfcp }
>> -};
>> -
>>   struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
>>   	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4 }
>>   };
>> @@ -472,34 +451,302 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp
>> = {
>>   	proto_hint_sctp }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
>> -};
>> -
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_esp }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_ah }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_l2tpv3 }
>>   };
>>
>> -struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
>> -	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
>>   	proto_hint_pfcp }
>>   };
>>
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
>> +	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv4_only,
>> +	proto_hint_udp_only, proto_hint_esp }
>> +};
>> +
>> +/* GTPU EH */
>> +
>> +struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
>> +	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE,
>> {proto_hint_gtpu_eh_only,
>> +	proto_hint_udp_src_port}
> The counter is three, but you have only two proto layers here, anything I missed?


Oh, that is a fault when i split the patch set with 2/3, will correct it 
on next coming version. Thanks.


> btw, I don't think these code belongs to code refactor, looks like you are adding inner l4 header which is not supported previously
> would it be better just keep his patch only for code refactor, and separate new features in a new patch?


Eventually, the gtpu inner L4 header is supported previously, so no need 
to separate it here.


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

* [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF
  2020-06-21 14:02   ` [dpdk-dev] [dpdk-dev v3] " Jeff Guo
  2020-07-01 12:56     ` Zhang, Qi Z
  2020-07-03  3:56     ` [dpdk-dev] [dpdk-dev v4 0/3] enable new hash flow for VF Jeff Guo
@ 2020-07-07  5:14     ` Jeff Guo
  2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 1/3] net/iavf: refactor for hash flow Jeff Guo
                         ` (3 more replies)
  2 siblings, 4 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-07  5:14 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Some new hash flow will be supported to expend the flow hash
capability, the input set are the 5 tuple for regular ip pattern and
also GTPU inner ip pattern, and the session id for NAT-T ESP protocol,
the l3 src/dst and the teid for GTPU_IP protocol.

v5->v4:
refine the lookup table for eth/vlan
fix issue after splitting patch

v4->v3:
split patch set

Jeff Guo (3):
  net/iavf: refactor for hash flow
  net/iavf: enable 5 tuple rss hash
  net/iavf: enable some new hash flow

 drivers/net/iavf/iavf_hash.c | 2075 +++++++++++++++++++++++++---------
 1 file changed, 1560 insertions(+), 515 deletions(-)

-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v5 1/3] net/iavf: refactor for hash flow
  2020-07-07  5:14     ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Jeff Guo
@ 2020-07-07  5:14       ` Jeff Guo
  2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 2/3] net/iavf: enable 5 tuple rss hash Jeff Guo
                         ` (2 subsequent siblings)
  3 siblings, 0 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-07  5:14 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Refactor hash flow by change the process of the pattern parser and the
action parser, and refine the lookup table for regular IP and GTPU_EH,
ETH, and also VLAN.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
v5->v4:
fix issue after splitting patch
refine the lookup table for ETH and VLAN
---
 drivers/net/iavf/iavf_hash.c | 1915 +++++++++++++++++++++++++---------
 1 file changed, 1424 insertions(+), 491 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index a7691ef0c..3ef97e9a2 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -24,32 +24,31 @@
 #include "iavf_generic_flow.h"
 
 enum iavf_pattern_hint_type {
-	IAVF_PATTERN_HINT_NONE,
-	IAVF_PATTERN_HINT_IPV4,
-	IAVF_PATTERN_HINT_IPV4_UDP,
-	IAVF_PATTERN_HINT_IPV4_TCP,
-	IAVF_PATTERN_HINT_IPV4_SCTP,
-	IAVF_PATTERN_HINT_IPV6,
-	IAVF_PATTERN_HINT_IPV6_UDP,
-	IAVF_PATTERN_HINT_IPV6_TCP,
-	IAVF_PATTERN_HINT_IPV6_SCTP,
-};
-
-enum iavf_gtpu_hint {
-	IAVF_GTPU_HINT_DOWNLINK,
-	IAVF_GTPU_HINT_UPLINK,
-	IAVF_GTPU_HINT_NONE,
-};
+	IAVF_PHINT_NONE				= 0x00000000,
+	IAVF_PHINT_IPV4				= 0x00000001,
+	IAVF_PHINT_IPV4_UDP			= 0x00000002,
+	IAVF_PHINT_IPV4_TCP			= 0x00000004,
+	IAVF_PHINT_IPV4_SCTP			= 0x00000008,
+	IAVF_PHINT_IPV6				= 0x00000010,
+	IAVF_PHINT_IPV6_UDP			= 0x00000020,
+	IAVF_PHINT_IPV6_TCP			= 0x00000040,
+	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
+	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000100,
+	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00000200,
+	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00000400,
+};
+
+#define IAVF_GTPU_EH_DWNLINK	0
+#define IAVF_GTPU_EH_UPLINK	1
 
 struct iavf_pattern_match_type {
-	enum iavf_pattern_hint_type phint_type;
+	uint64_t pattern_hint;
 };
 
 struct iavf_hash_match_type {
-	enum iavf_pattern_hint_type phint_type;
 	uint64_t hash_type;
 	struct virtchnl_proto_hdrs *proto_hdrs;
-	enum iavf_gtpu_hint gtpu_hint;
+	uint64_t pattern_hint;
 };
 
 struct iavf_rss_meta {
@@ -83,42 +82,62 @@ iavf_hash_parse_pattern_action(struct iavf_adapter *ad,
 			       void **meta,
 			       struct rte_flow_error *error);
 
-struct iavf_pattern_match_type phint_empty = {
-	IAVF_PATTERN_HINT_NONE};
-struct iavf_pattern_match_type phint_eth_ipv4 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_udp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
-	IAVF_PATTERN_HINT_IPV4_TCP};
-struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
-	IAVF_PATTERN_HINT_IPV4_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv4_esp = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_ah = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV4};
-struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
-	IAVF_PATTERN_HINT_IPV4_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_udp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
-struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
-	IAVF_PATTERN_HINT_IPV6_TCP};
-struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
-	IAVF_PATTERN_HINT_IPV6_SCTP};
-struct iavf_pattern_match_type phint_eth_ipv6_esp = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_ah = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
-	IAVF_PATTERN_HINT_IPV6};
-struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
-	IAVF_PATTERN_HINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_empty = {
+	IAVF_PHINT_NONE};
+static struct iavf_pattern_match_type phint_eth_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
+	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_pfcp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv4 = {
+	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv4_udp = {
+	IAVF_PHINT_IPV4_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv4_tcp = {
+	IAVF_PHINT_IPV4_TCP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv4_sctp = {
+	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv6 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_ipv6_tcp = {
+	IAVF_PHINT_IPV6_TCP};
+static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
+	IAVF_PHINT_IPV6_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_pfcp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv6 = {
+	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv6_udp = {
+	IAVF_PHINT_IPV6_UDP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv6_tcp = {
+	IAVF_PHINT_IPV6_TCP};
+static struct iavf_pattern_match_type phint_eth_vlan_ipv6_sctp = {
+	IAVF_PHINT_IPV6_SCTP};
 
 /**
  * Supported pattern for hash.
@@ -131,26 +150,40 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp},
 	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp},
-	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_udp},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
-						&phint_eth_ipv4_gtpu_eh},
+					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
 	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
 	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv4_l2tpv3},
+					&phint_eth_ipv4_l2tpv3},
 	{iavf_pattern_eth_ipv4_pfcp, IAVF_INSET_NONE, &phint_eth_ipv4_pfcp},
+	{iavf_pattern_eth_vlan_ipv4, IAVF_INSET_NONE, &phint_eth_vlan_ipv4},
+	{iavf_pattern_eth_vlan_ipv4_udp, IAVF_INSET_NONE,
+					&phint_eth_vlan_ipv4_udp},
+	{iavf_pattern_eth_vlan_ipv4_tcp, IAVF_INSET_NONE,
+					&phint_eth_vlan_ipv4_tcp},
+	{iavf_pattern_eth_vlan_ipv4_sctp, IAVF_INSET_NONE,
+					&phint_eth_vlan_ipv4_sctp},
+	{iavf_pattern_eth_ipv6, IAVF_INSET_NONE, &phint_eth_ipv6},
 	{iavf_pattern_eth_ipv6_udp, IAVF_INSET_NONE, &phint_eth_ipv6_udp},
 	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
 	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp},
 	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
 	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
 	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
-						&phint_eth_ipv6_l2tpv3},
+					&phint_eth_ipv6_l2tpv3},
 	{iavf_pattern_eth_ipv6_pfcp, IAVF_INSET_NONE, &phint_eth_ipv6_pfcp},
+	{iavf_pattern_eth_vlan_ipv6, IAVF_INSET_NONE, &phint_eth_vlan_ipv6},
+	{iavf_pattern_eth_vlan_ipv6_udp, IAVF_INSET_NONE,
+					&phint_eth_vlan_ipv6_udp},
+	{iavf_pattern_eth_vlan_ipv6_tcp, IAVF_INSET_NONE,
+					&phint_eth_vlan_ipv6_tcp},
+	{iavf_pattern_eth_vlan_ipv6_sctp, IAVF_INSET_NONE,
+					&phint_eth_vlan_ipv6_sctp},
 	{iavf_pattern_empty, IAVF_INSET_NONE, &phint_empty},
 };
 
@@ -271,6 +304,10 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
 
+#define proto_hint_gtpu_eh_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_EH, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_up_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -295,72 +332,114 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	VIRTCHNL_PROTO_HDR_PFCP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PFCP_SEID), {BUFF_NOUSED } }
 
-struct virtchnl_proto_hdrs hdrs_hint_eth_src = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_src }
+/* IPV4 */
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv4 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_eth_src,
+	proto_hint_ipv4_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_eth_dst = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth_dst }
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv4_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_src,
+	proto_hint_ipv4_only, proto_hint_udp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_eth = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_eth }
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv4_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_src,
+	proto_hint_ipv4_only, proto_hint_tcp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_svlan = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_svlan }
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv4_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_src,
+	proto_hint_ipv4_only, proto_hint_sctp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_cvlan = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_cvlan }
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv4 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_eth_dst,
+	proto_hint_ipv4_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv4_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_dst,
+	proto_hint_ipv4_only, proto_hint_udp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv4_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_dst,
+	proto_hint_ipv4_only, proto_hint_tcp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_src }
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv4_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_dst,
+	proto_hint_ipv4_only, proto_hint_sctp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_src }
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv4 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_eth,
+	proto_hint_ipv4_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_ipv4_dst }
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv4_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth,
+	proto_hint_ipv4_only, proto_hint_udp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_ipv4_dst }
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv4_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth,
+	proto_hint_ipv4_only, proto_hint_tcp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_esp }
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv4_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth,
+	proto_hint_ipv4_only, proto_hint_sctp_only }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_ah }
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv4 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_svlan,
+	proto_hint_ipv4_only}
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_l2tpv3 }
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv4_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_svlan,
+	proto_hint_ipv4_only, proto_hint_udp_only}
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
-	proto_hint_pfcp }
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv4_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_svlan,
+	proto_hint_ipv4_only, proto_hint_tcp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv4_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_svlan,
+	proto_hint_ipv4_only, proto_hint_sctp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv4 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_cvlan,
+	proto_hint_ipv4_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv4_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_cvlan,
+	proto_hint_ipv4_only, proto_hint_udp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv4_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_cvlan,
+	proto_hint_ipv4_only, proto_hint_tcp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv4_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_cvlan,
+	proto_hint_ipv4_only, proto_hint_sctp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv4_dst }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
@@ -472,34 +551,402 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_sctp = {
 	proto_hint_sctp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
-};
-
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_esp }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_ah }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_l2tpv3 }
 };
 
-struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
 	proto_hint_pfcp }
 };
 
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv4_only,
+	proto_hint_udp_only, proto_hint_esp }
+};
+
+/* GTPU EH */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_eh = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
+	proto_hint_tcp}
+};
+
+/* GTPU UP */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_up = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
+	proto_hint_tcp}
+};
+
+/* GTPU DWN */
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_src_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp_dst_port}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_udp}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_dwn = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
+	proto_hint_tcp}
+};
+
+/* IPV6 */
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv6 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_eth_src,
+	proto_hint_ipv6_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv6_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_src,
+	proto_hint_ipv6_only, proto_hint_udp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv6_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_src,
+	proto_hint_ipv6_only, proto_hint_tcp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_src_ipv6_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_src,
+	proto_hint_ipv6_only, proto_hint_sctp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv6 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_eth_dst,
+	proto_hint_ipv6_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv6_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_dst,
+	proto_hint_ipv6_only, proto_hint_udp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv6_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_dst,
+	proto_hint_ipv6_only, proto_hint_tcp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_dst_ipv6_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth_dst,
+	proto_hint_ipv6_only, proto_hint_sctp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv6 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_eth,
+	proto_hint_ipv6_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv6_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth,
+	proto_hint_ipv6_only, proto_hint_udp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv6_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth,
+	proto_hint_ipv6_only, proto_hint_tcp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_eth_ipv6_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_eth,
+	proto_hint_ipv6_only, proto_hint_sctp_only }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv6 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_svlan,
+	proto_hint_ipv6_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv6_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_svlan,
+	proto_hint_ipv6_only, proto_hint_udp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv6_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_svlan,
+	proto_hint_ipv6_only, proto_hint_tcp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_svlan_ipv6_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_svlan,
+	proto_hint_ipv6_only, proto_hint_sctp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv6 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_cvlan,
+	proto_hint_ipv6_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv6_udp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_cvlan,
+	proto_hint_ipv6_only, proto_hint_udp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv6_tcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_cvlan,
+	proto_hint_ipv6_only, proto_hint_tcp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_cvlan_ipv6_sctp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_cvlan,
+	proto_hint_ipv6_only, proto_hint_sctp_only}
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_src = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6_dst }
+};
+
 struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
 	TUNNEL_LEVEL_OUTER, PROTO_COUNT_ONE, {proto_hint_ipv6 }
 };
@@ -525,12 +972,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_udp_dst_port }
 };
 
@@ -560,12 +1007,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_tcp_dst_port }
 };
 
@@ -595,12 +1042,12 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_sctp_dst_port = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_udp_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
 	proto_hint_sctp_dst_port }
 };
 
@@ -609,337 +1056,845 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6_sctp = {
 	proto_hint_sctp }
 };
 
-/**
- * The first member is pattern hint type,
- * the second member is hash type,
- * the third member is virtchnl protocol hdrs.
- * the forth member is downlink/uplink type.
- */
-struct iavf_hash_match_type iavf_hash_type_list[] = {
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_esp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_ah = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_ah }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_l2tpv3 = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_l2tpv3 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_pfcp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	proto_hint_pfcp }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_esp = {
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_THREE, {proto_hint_ipv6_only,
+	proto_hint_udp_only, proto_hint_esp }
+};
+
+struct iavf_hash_match_type iavf_hash_map_list[] = {
 	/* IPV4 */
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_SRC_ONLY, &hdrs_hint_eth_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2_DST_ONLY, &hdrs_hint_eth_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
-			&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
-			&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ETH, &hdrs_hint_eth,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_S_VLAN, &hdrs_hint_svlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN, &hdrs_hint_cvlan,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-						IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
-			&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
-			&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_ESP, &hdrs_hint_ipv4_esp,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_AH, &hdrs_hint_ipv4_ah,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_L2TPV3, &hdrs_hint_ipv4_l2tpv3,
-	IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_IPV4, &hdrs_hint_ipv4,
-	IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv4_esp, IAVF_PHINT_IPV4},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv4_ah, IAVF_PHINT_IPV4},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv4_l2tpv3, IAVF_PHINT_IPV4},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv4_udp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv4, IAVF_PHINT_IPV4},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv4_udp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
 	/* IPV4 UDP */
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv4_udp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv4_udp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv4_udp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_SRC_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_src_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_src_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_up, IAVF_GTPU_HINT_UPLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
-		ETH_RSS_L3_DST_ONLY | ETH_RSS_GTPU,
-		&hdrs_hint_ipv4_dst_gtpu_dwn, IAVF_GTPU_HINT_DOWNLINK},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP |
+		&hdrs_hint_ipv4_dst_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv4_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_UDP, ETH_RSS_NONFRAG_IPV4_UDP,
-		&hdrs_hint_ipv4_udp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_port, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv4_pfcp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv4_udp_esp, IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp, IAVF_PHINT_IPV4_UDP},
 	/* IPV4 TCP */
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_src_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP |
+		&hdrs_hint_ipv4_dst_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_TCP, ETH_RSS_NONFRAG_IPV4_TCP,
-		&hdrs_hint_ipv4_tcp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_port, IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp, IAVF_PHINT_IPV4_TCP},
 	/* IPV4 SCTP */
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv4_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv4_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv4_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv4_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_src_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv4_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP |
+		&hdrs_hint_ipv4_dst_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv4_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv4_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv4_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4_SCTP, ETH_RSS_NONFRAG_IPV4_SCTP,
-		&hdrs_hint_ipv4_sctp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_sctp_src_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_sctp_dst_port, IAVF_PHINT_IPV4_SCTP},
+	{ETH_RSS_NONFRAG_IPV4_SCTP,
+		&hdrs_hint_ipv4_sctp, IAVF_PHINT_IPV4_SCTP},
 	/* IPV6 */
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_SRC_ONLY,
-		&hdrs_hint_eth_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L2_DST_ONLY,
-		&hdrs_hint_eth_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ETH,
-		&hdrs_hint_eth, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_S_VLAN,
-		&hdrs_hint_svlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV4, ETH_RSS_C_VLAN,
-		&hdrs_hint_cvlan, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_ESP,
-		&hdrs_hint_ipv6_esp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_AH,
-		&hdrs_hint_ipv6_ah, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_L2TPV3,
-		&hdrs_hint_ipv6_l2tpv3, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6, ETH_RSS_IPV6,
-		&hdrs_hint_ipv6, IAVF_GTPU_HINT_NONE},
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6},
+	{ETH_RSS_IPV6,
+		&hdrs_hint_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv6_esp, IAVF_PHINT_IPV6},
+	{ETH_RSS_AH,
+		&hdrs_hint_ipv6_ah, IAVF_PHINT_IPV6},
+	{ETH_RSS_L2TPV3,
+		&hdrs_hint_ipv6_l2tpv3, IAVF_PHINT_IPV6},
 	/* IPV6 UDP */
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_udp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_udp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv6_udp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv6_udp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv6_udp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_src_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_src_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_dst_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP |
+		&hdrs_hint_ipv6_dst_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_udp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_udp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_PFCP,
-		&hdrs_hint_ipv6_pfcp, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_UDP, ETH_RSS_NONFRAG_IPV6_UDP,
-		&hdrs_hint_ipv6_udp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_udp_src_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_udp_dst_port, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_PFCP,
+		&hdrs_hint_ipv6_pfcp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_ESP,
+		&hdrs_hint_ipv6_udp_esp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_NONFRAG_IPV6_UDP,
+		&hdrs_hint_ipv6_udp, IAVF_PHINT_IPV6_UDP},
 	/* IPV6 TCP */
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_tcp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_tcp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_src_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_src_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_dst_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP |
+		&hdrs_hint_ipv6_dst_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_tcp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_tcp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_TCP, ETH_RSS_NONFRAG_IPV6_TCP,
-		&hdrs_hint_ipv6_tcp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_tcp_src_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_tcp_dst_port, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_NONFRAG_IPV6_TCP,
+		&hdrs_hint_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
 	/* IPV6 SCTP */
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_src_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_src_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_SRC_ONLY,
-		&hdrs_hint_ipv6_src, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_SRC_ONLY, &hdrs_hint_ipv6_dst_sctp_src_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY |
-		ETH_RSS_L4_DST_ONLY, &hdrs_hint_ipv6_dst_sctp_dst_port,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L3_DST_ONLY,
-		&hdrs_hint_ipv6_dst, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+	{ETH_RSS_L2_SRC_ONLY,
+		&hdrs_hint_eth_src_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L2_DST_ONLY,
+		&hdrs_hint_eth_dst_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_ETH,
+		&hdrs_hint_eth_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv6_src, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv6_dst, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_src_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_src_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_SRC_ONLY, &hdrs_hint_ipv6_src,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_dst_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP |
+		&hdrs_hint_ipv6_dst_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP |
 		ETH_RSS_L3_DST_ONLY, &hdrs_hint_ipv6_dst,
-		IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_SRC_ONLY,
-		&hdrs_hint_ipv6_sctp_src_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_L4_DST_ONLY,
-		&hdrs_hint_ipv6_sctp_dst_port, IAVF_GTPU_HINT_NONE},
-	{IAVF_PATTERN_HINT_IPV6_SCTP, ETH_RSS_NONFRAG_IPV6_SCTP,
-		&hdrs_hint_ipv6_sctp, IAVF_GTPU_HINT_NONE},
+		IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv6_sctp_src_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv6_sctp_dst_port, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_NONFRAG_IPV6_SCTP,
+		&hdrs_hint_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv6_udp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_S_VLAN,
+		&hdrs_hint_svlan_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv6, IAVF_PHINT_IPV6},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv6_udp, IAVF_PHINT_IPV6_UDP},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv6_tcp, IAVF_PHINT_IPV6_TCP},
+	{ETH_RSS_C_VLAN,
+		&hdrs_hint_cvlan_ipv6_sctp, IAVF_PHINT_IPV6_SCTP},
+};
+
+struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
+	/* GTPU */
+	/* GTPU EH */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_eh,
+		IAVF_PHINT_IPV4_GTPU_EH | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH UP */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_up,
+		IAVF_PHINT_IPV4_GTPU_EH_UPLINK | IAVF_PHINT_IPV4_TCP},
+	/* GTPU EH DWN */
+	/* Inner IPV4 */
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4},
+	/* Inner IPV4->UDP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_udp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_udp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	{ETH_RSS_NONFRAG_IPV4_UDP,
+		&hdrs_hint_ipv4_udp_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_UDP},
+	/* Inner IPV4->TCP */
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_src_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP |
+		ETH_RSS_L4_DST_ONLY,
+		&hdrs_hint_ipv4_tcp_dst_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
+	{ETH_RSS_NONFRAG_IPV4_TCP,
+		&hdrs_hint_ipv4_tcp_gtpu_dwn,
+		IAVF_PHINT_IPV4_GTPU_EH_DWNLINK | IAVF_PHINT_IPV4_TCP},
 };
 
 struct virtchnl_proto_hdrs *iavf_hash_default_hdrs[] = {
@@ -1037,10 +1992,12 @@ iavf_hash_init(struct iavf_adapter *ad)
 }
 
 static int
-iavf_hash_check_inset(const struct rte_flow_item pattern[],
-		      struct rte_flow_error *error)
+iavf_hash_parse_pattern(struct iavf_pattern_match_item *pattern_match_item,
+			const struct rte_flow_item pattern[], uint64_t *phint,
+			struct rte_flow_error *error)
 {
 	const struct rte_flow_item *item = pattern;
+	const struct rte_flow_item_gtp_psc *psc;
 
 	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
 		if (item->last) {
@@ -1049,45 +2006,40 @@ iavf_hash_check_inset(const struct rte_flow_item pattern[],
 					   "Not support range");
 			return -rte_errno;
 		}
-	}
 
-	return 0;
-}
-
-static void
-iavf_hash_refine_type(uint64_t *rss_type, const struct rte_flow_item pattern[],
-		      enum iavf_gtpu_hint *gtpu_hint)
-{
-	const struct rte_flow_item *item;
-
-	for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
-		if (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {
-			const struct rte_flow_item_gtp_psc *psc = item->spec;
-
-			if (psc && (psc->pdu_type == IAVF_GTPU_HINT_UPLINK ||
-				    psc->pdu_type == IAVF_GTPU_HINT_DOWNLINK)) {
-				*rss_type |= ETH_RSS_GTPU;
-				*gtpu_hint = psc->pdu_type;
-			}
+		switch (item->type) {
+		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
+			psc = item->spec;
+			if (!psc)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
+			else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_UPLINK;
+			else if (psc->pdu_type == IAVF_GTPU_EH_DWNLINK)
+				*phint |= IAVF_PHINT_IPV4_GTPU_EH_DWNLINK;
+			break;
+		default:
+			break;
 		}
 	}
+
+	/* update and restore pattern hint */
+	*phint |= ((struct iavf_pattern_match_type *)
+				(pattern_match_item->meta))->pattern_hint;
+
+	return 0;
 }
 
 static int
-iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
-		       const struct rte_flow_item pattern[],
-		       const struct rte_flow_action actions[],
-		       void **meta, struct rte_flow_error *error)
+iavf_hash_parse_action(const struct rte_flow_action actions[],
+		       uint64_t pattern_hint, void **meta,
+		       struct rte_flow_error *error)
 {
-	struct iavf_pattern_match_type *mt = (struct iavf_pattern_match_type *)
-					(pattern_match_item->meta);
 	struct iavf_rss_meta *rss_meta = (struct iavf_rss_meta *)*meta;
-	uint32_t type_list_len = RTE_DIM(iavf_hash_type_list);
-	struct iavf_hash_match_type *type_match_item;
-	enum iavf_gtpu_hint gtpu_hint = IAVF_GTPU_HINT_NONE;
+	struct iavf_hash_match_type *hash_map_list;
 	enum rte_flow_action_type action_type;
 	const struct rte_flow_action_rss *rss;
 	const struct rte_flow_action *action;
+	uint32_t mlist_len;
 	bool item_found = false;
 	uint64_t rss_type;
 	uint16_t i;
@@ -1101,25 +2053,18 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 			rss = action->conf;
 			rss_type = rss->types;
 
-			/**
-			 * Check simultaneous use of SRC_ONLY and DST_ONLY
-			 * of the same level.
-			 */
-			rss_type = rte_eth_rss_hf_refine(rss_type);
-
-			/**
-			 * Refine the hash type base on some specific item of
-			 * the pattern, such as identify the gtpu hash.
-			 */
-			iavf_hash_refine_type(&rss_type, pattern, &gtpu_hint);
-
-			/* Check if pattern is empty. */
-			if (pattern_match_item->pattern_list !=
-				iavf_pattern_empty && rss->func ==
-				RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
-				return rte_flow_error_set(error, ENOTSUP,
-					RTE_FLOW_ERROR_TYPE_ACTION, action,
-					"Not supported flow");
+			if (rss->func ==
+			    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
+			} else if (rss->func ==
+				   RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
+			} else {
+				rss_meta->rss_algorithm =
+					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
+			}
 
 			if (rss->level)
 				return rte_flow_error_set(error, ENOTSUP,
@@ -1136,48 +2081,35 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *pattern_match_item,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
 					"a non-NULL RSS queue is not supported");
 
-			/* Check hash function and save it to rss_meta. */
-			if (rss->func == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR)
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_XOR_ASYMMETRIC;
-			else if (rss->func ==
-				 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC;
-			else
-				rss_meta->rss_algorithm =
-					VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
+			/**
+			 * Check simultaneous use of SRC_ONLY and DST_ONLY
+			 * of the same level.
+			 */
+			rss_type = rte_eth_rss_hf_refine(rss_type);
 
-			type_match_item =
-			rte_zmalloc("iavf_type_match_item",
-				    sizeof(struct iavf_hash_match_type), 0);
-			if (!type_match_item) {
-				rte_flow_error_set(error, EINVAL,
-						   RTE_FLOW_ERROR_TYPE_HANDLE,
-						   NULL,
-						   "No memory for type_match_item");
-				return -ENOMEM;
+			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK)) {
+				hash_map_list = iavf_gtpu_hash_map_list;
+				mlist_len = RTE_DIM(iavf_gtpu_hash_map_list);
+			} else {
+				hash_map_list = iavf_hash_map_list;
+				mlist_len = RTE_DIM(iavf_hash_map_list);
 			}
 
 			/* Find matched proto hdrs according to hash type. */
-			for (i = 0; i < type_list_len; i++) {
+			for (i = 0; i < mlist_len; i++) {
 				struct iavf_hash_match_type *ht_map =
-					&iavf_hash_type_list[i];
+					&hash_map_list[i];
 				if (rss_type == ht_map->hash_type &&
-				    mt->phint_type == ht_map->phint_type &&
-				    gtpu_hint == ht_map->gtpu_hint) {
-					type_match_item->hash_type =
-						ht_map->hash_type;
-					type_match_item->proto_hdrs =
-						ht_map->proto_hdrs;
+				    pattern_hint == ht_map->pattern_hint) {
 					rss_meta->proto_hdrs =
-						type_match_item->proto_hdrs;
+						ht_map->proto_hdrs;
 					item_found = true;
+					break;
 				}
 			}
 
-			rte_free(type_match_item);
-
 			if (!item_found)
 				return rte_flow_error_set(error, ENOTSUP,
 					RTE_FLOW_ERROR_TYPE_ACTION, action,
@@ -1209,6 +2141,7 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 {
 	struct iavf_pattern_match_item *pattern_match_item;
 	struct iavf_rss_meta *rss_meta_ptr;
+	uint64_t phint = IAVF_PHINT_NONE;
 	int ret = 0;
 
 	rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
@@ -1228,12 +2161,12 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,
 		goto error;
 	}
 
-	ret = iavf_hash_check_inset(pattern, error);
+	ret = iavf_hash_parse_pattern(pattern_match_item, pattern, &phint,
+				      error);
 	if (ret)
 		goto error;
 
-	/* Check rss action. */
-	ret = iavf_hash_parse_action(pattern_match_item, pattern, actions,
+	ret = iavf_hash_parse_action(actions, phint,
 				     (void **)&rss_meta_ptr, error);
 
 error:
-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v5 2/3] net/iavf: enable 5 tuple rss hash
  2020-07-07  5:14     ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Jeff Guo
  2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 1/3] net/iavf: refactor for hash flow Jeff Guo
@ 2020-07-07  5:14       ` Jeff Guo
  2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 3/3] net/iavf: enable some new hash flow Jeff Guo
  2020-07-07  9:18       ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Zhang, Qi Z
  3 siblings, 0 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-07  5:14 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Previous iavf not support 5 tuple hash, this patch aims to enable it
for regular ip pattern and also GTPU inner ip pattern, the 5 tuple
involves ip src and ip dst, tcp sport and tcp dport, udp sport and
udp dport and protocol id.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
v5->v4:
no change
---
 drivers/net/iavf/iavf_hash.c | 268 ++++++++++++++++++++---------------
 1 file changed, 156 insertions(+), 112 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index 3ef97e9a2..b3b36cbc7 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -240,6 +240,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv4_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv4_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv4_prot { \
+	VIRTCHNL_PROTO_HDR_IPV4, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_udp_src_port { \
 	VIRTCHNL_PROTO_HDR_UDP, \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_SRC_PORT), {BUFF_NOUSED } }
@@ -304,6 +326,28 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST), {BUFF_NOUSED } }
 
+#define proto_hint_ipv6_src_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_dst_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), \
+	{BUFF_NOUSED } }
+
+#define proto_hint_ipv6_only_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
+#define proto_hint_ipv6_prot { \
+	VIRTCHNL_PROTO_HDR_IPV6, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_SRC) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_eh_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -447,72 +491,72 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4 = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv4_prot,
 	proto_hint_tcp }
 };
 
@@ -579,23 +623,23 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
 /* GTPU EH */
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
@@ -604,23 +648,23 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_eh = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_eh = {
@@ -634,55 +678,55 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_eh = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_udp}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_prot, proto_hint_udp}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_eh = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_eh_only,
-	proto_hint_tcp}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_eh_only,
+	proto_hint_ipv4_prot, proto_hint_tcp}
 };
 
 /* GTPU UP */
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
@@ -691,23 +735,23 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_up = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_up = {
@@ -721,55 +765,55 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_up = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_udp}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_prot, proto_hint_udp}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_up = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_up_only,
-	proto_hint_tcp}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_up_only,
+	proto_hint_ipv4_prot, proto_hint_tcp}
 };
 
 /* GTPU DWN */
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_only_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
@@ -778,23 +822,23 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_dwn = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_udp_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_tcp_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_src_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_dwn = {
@@ -808,33 +852,33 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_dwn = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_udp_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_udp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_src_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_src_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_src_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_tcp_dst_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp_dst_port}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_dst_prot, proto_hint_tcp_dst_port}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_udp}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_prot, proto_hint_udp}
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_tcp_gtpu_dwn = {
-	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_dwn_only,
-	proto_hint_tcp}
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_THREE, {proto_hint_gtpu_dwn_only,
+	proto_hint_ipv4_prot, proto_hint_tcp}
 };
 
 /* IPV6 */
@@ -952,72 +996,72 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv6 = {
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_udp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_udp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_udp }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_src_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_src_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_dst_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_dst_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_src_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_src_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp_dst_port = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_only_prot,
 	proto_hint_tcp_dst_port }
 };
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv6_tcp = {
-	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6,
+	TUNNEL_LEVEL_OUTER, PROTO_COUNT_TWO, {proto_hint_ipv6_prot,
 	proto_hint_tcp }
 };
 
-- 
2.20.1


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

* [dpdk-dev] [dpdk-dev v5 3/3] net/iavf: enable some new hash flow
  2020-07-07  5:14     ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Jeff Guo
  2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 1/3] net/iavf: refactor for hash flow Jeff Guo
  2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 2/3] net/iavf: enable 5 tuple rss hash Jeff Guo
@ 2020-07-07  5:14       ` Jeff Guo
  2020-07-07  9:18       ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Zhang, Qi Z
  3 siblings, 0 replies; 16+ messages in thread
From: Jeff Guo @ 2020-07-07  5:14 UTC (permalink / raw)
  To: qi.z.zhang, jingjing.wu, beilei.xing
  Cc: dev, junfeng.guo, qiming.yang, simei.su, jia.guo

Some new hash flow will be supported to expend the flow hash
capability, the input set are the session id for NAT-T ESP protocol,
the l3 src/dst and the teid for GTPU_IP protocol.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
v5->v4:
no change
---
 drivers/net/iavf/iavf_hash.c | 76 ++++++++++++++++++++++++++++++++++--
 1 file changed, 72 insertions(+), 4 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index b3b36cbc7..1394519e7 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -33,9 +33,10 @@ enum iavf_pattern_hint_type {
 	IAVF_PHINT_IPV6_UDP			= 0x00000020,
 	IAVF_PHINT_IPV6_TCP			= 0x00000040,
 	IAVF_PHINT_IPV6_SCTP			= 0x00000080,
-	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000100,
-	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00000200,
-	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00000400,
+	IAVF_PHINT_IPV4_GTPU_IP			= 0x00000100,
+	IAVF_PHINT_IPV4_GTPU_EH			= 0x00000200,
+	IAVF_PHINT_IPV4_GTPU_EH_DWNLINK		= 0x00000400,
+	IAVF_PHINT_IPV4_GTPU_EH_UPLINK		= 0x00000800,
 };
 
 #define IAVF_GTPU_EH_DWNLINK	0
@@ -92,6 +93,8 @@ static struct iavf_pattern_match_type phint_eth_ipv4_tcp = {
 	IAVF_PHINT_IPV4_TCP};
 static struct iavf_pattern_match_type phint_eth_ipv4_sctp = {
 	IAVF_PHINT_IPV4_SCTP};
+static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_ipv4 = {
+	IAVF_PHINT_IPV4};
 static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4 = {
 	IAVF_PHINT_IPV4};
 static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_udp = {
@@ -100,6 +103,8 @@ static struct iavf_pattern_match_type phint_eth_ipv4_gtpu_eh_ipv4_tcp = {
 	IAVF_PHINT_IPV4_TCP};
 static struct iavf_pattern_match_type phint_eth_ipv4_esp = {
 	IAVF_PHINT_IPV4};
+static struct iavf_pattern_match_type phint_eth_ipv4_udp_esp = {
+	IAVF_PHINT_IPV4_UDP};
 static struct iavf_pattern_match_type phint_eth_ipv4_ah = {
 	IAVF_PHINT_IPV4};
 static struct iavf_pattern_match_type phint_eth_ipv4_l2tpv3 = {
@@ -124,6 +129,8 @@ static struct iavf_pattern_match_type phint_eth_ipv6_sctp = {
 	IAVF_PHINT_IPV6_SCTP};
 static struct iavf_pattern_match_type phint_eth_ipv6_esp = {
 	IAVF_PHINT_IPV6};
+static struct iavf_pattern_match_type phint_eth_ipv6_udp_esp = {
+	IAVF_PHINT_IPV6_UDP};
 static struct iavf_pattern_match_type phint_eth_ipv6_ah = {
 	IAVF_PHINT_IPV6};
 static struct iavf_pattern_match_type phint_eth_ipv6_l2tpv3 = {
@@ -150,6 +157,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_udp, IAVF_INSET_NONE, &phint_eth_ipv4_udp},
 	{iavf_pattern_eth_ipv4_tcp, IAVF_INSET_NONE, &phint_eth_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_sctp, IAVF_INSET_NONE, &phint_eth_ipv4_sctp},
+	{iavf_pattern_eth_ipv4_gtpu_ipv4, IAVF_INSET_NONE,
+					&phint_eth_ipv4_gtpu_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4, IAVF_INSET_NONE,
 					&phint_eth_ipv4_gtpu_eh_ipv4},
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_udp, IAVF_INSET_NONE,
@@ -157,6 +166,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv4_gtpu_eh_ipv4_tcp, IAVF_INSET_NONE,
 					&phint_eth_ipv4_gtpu_eh_ipv4_tcp},
 	{iavf_pattern_eth_ipv4_esp, IAVF_INSET_NONE, &phint_eth_ipv4_esp},
+	{iavf_pattern_eth_ipv4_udp_esp, IAVF_INSET_NONE,
+					&phint_eth_ipv4_udp_esp},
 	{iavf_pattern_eth_ipv4_ah, IAVF_INSET_NONE, &phint_eth_ipv4_ah},
 	{iavf_pattern_eth_ipv4_l2tpv3, IAVF_INSET_NONE,
 					&phint_eth_ipv4_l2tpv3},
@@ -173,6 +184,8 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	{iavf_pattern_eth_ipv6_tcp, IAVF_INSET_NONE, &phint_eth_ipv6_tcp},
 	{iavf_pattern_eth_ipv6_sctp, IAVF_INSET_NONE, &phint_eth_ipv6_sctp},
 	{iavf_pattern_eth_ipv6_esp, IAVF_INSET_NONE, &phint_eth_ipv6_esp},
+	{iavf_pattern_eth_ipv6_udp_esp, IAVF_INSET_NONE,
+					&phint_eth_ipv6_udp_esp},
 	{iavf_pattern_eth_ipv6_ah, IAVF_INSET_NONE, &phint_eth_ipv6_ah},
 	{iavf_pattern_eth_ipv6_l2tpv3, IAVF_INSET_NONE,
 					&phint_eth_ipv6_l2tpv3},
@@ -348,10 +361,18 @@ static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_DST) | \
 	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PROT), {BUFF_NOUSED } }
 
+#define proto_hint_gtpu_ip_teid { \
+	VIRTCHNL_PROTO_HDR_GTPU_IP, \
+	FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_GTPU_IP_TEID), {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_eh_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
 
+#define proto_hint_gtpu_ip_only { \
+	VIRTCHNL_PROTO_HDR_GTPU_IP, \
+	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
+
 #define proto_hint_gtpu_up_only { \
 	VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP, \
 	FIELD_FOR_PROTO_ONLY, {BUFF_NOUSED } }
@@ -620,6 +641,26 @@ struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_esp = {
 	proto_hint_udp_only, proto_hint_esp }
 };
 
+/* GTPU IP */
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_src_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_src }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_dst_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4_dst }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_ipv4_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_only,
+	proto_hint_ipv4 }
+};
+
+struct virtchnl_proto_hdrs hdrs_hint_teid_gtpu_ip = {
+	TUNNEL_LEVEL_FIRST_INNER, PROTO_COUNT_TWO, {proto_hint_gtpu_ip_teid}
+};
+
 /* GTPU EH */
 
 struct virtchnl_proto_hdrs hdrs_hint_ipv4_udp_src_gtpu_eh = {
@@ -1498,6 +1539,28 @@ struct iavf_hash_match_type iavf_hash_map_list[] = {
 
 struct iavf_hash_match_type iavf_gtpu_hash_map_list[] = {
 	/* GTPU */
+	/* GTPU IP */
+	/* GTPU IPV4*/
+	{ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_SRC_ONLY,
+		&hdrs_hint_ipv4_src_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4 |
+		ETH_RSS_L3_DST_ONLY,
+		&hdrs_hint_ipv4_dst_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_IPV4,
+		&hdrs_hint_ipv4_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
+	{ETH_RSS_GTPU,
+		&hdrs_hint_teid_gtpu_ip,
+		IAVF_PHINT_IPV4_GTPU_IP | IAVF_PHINT_IPV4},
 	/* GTPU EH */
 	/* Inner IPV4 */
 	{ETH_RSS_L3_SRC_ONLY,
@@ -2052,8 +2115,12 @@ iavf_hash_parse_pattern(struct iavf_pattern_match_item *pattern_match_item,
 		}
 
 		switch (item->type) {
+		case RTE_FLOW_ITEM_TYPE_GTPU:
+			*phint |= IAVF_PHINT_IPV4_GTPU_IP;
+			break;
 		case RTE_FLOW_ITEM_TYPE_GTP_PSC:
 			psc = item->spec;
+			*phint &= ~IAVF_PHINT_IPV4_GTPU_IP;
 			if (!psc)
 				*phint |= IAVF_PHINT_IPV4_GTPU_EH;
 			else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
@@ -2131,7 +2198,8 @@ iavf_hash_parse_action(const struct rte_flow_action actions[],
 			 */
 			rss_type = rte_eth_rss_hf_refine(rss_type);
 
-			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
+			if ((pattern_hint & IAVF_PHINT_IPV4_GTPU_IP) ||
+			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH) ||
 			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_UPLINK) ||
 			    (pattern_hint & IAVF_PHINT_IPV4_GTPU_EH_DWNLINK)) {
 				hash_map_list = iavf_gtpu_hash_map_list;
-- 
2.20.1


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

* Re: [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF
  2020-07-07  5:14     ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Jeff Guo
                         ` (2 preceding siblings ...)
  2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 3/3] net/iavf: enable some new hash flow Jeff Guo
@ 2020-07-07  9:18       ` Zhang, Qi Z
  3 siblings, 0 replies; 16+ messages in thread
From: Zhang, Qi Z @ 2020-07-07  9:18 UTC (permalink / raw)
  To: Guo, Jia, Wu, Jingjing, Xing, Beilei
  Cc: dev, Guo, Junfeng, Yang, Qiming, Su, Simei



> -----Original Message-----
> From: Guo, Jia <jia.guo@intel.com>
> Sent: Tuesday, July 7, 2020 1:14 PM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>
> Cc: dev@dpdk.org; Guo, Junfeng <junfeng.guo@intel.com>; Yang, Qiming
> <qiming.yang@intel.com>; Su, Simei <simei.su@intel.com>; Guo, Jia
> <jia.guo@intel.com>
> Subject: [dpdk-dev v5 0/3] enable new hash flow for VF
> 
> Some new hash flow will be supported to expend the flow hash capability,
> the input set are the 5 tuple for regular ip pattern and also GTPU inner ip
> pattern, and the session id for NAT-T ESP protocol, the l3 src/dst and the teid
> for GTPU_IP protocol.
> 
> v5->v4:
> refine the lookup table for eth/vlan
> fix issue after splitting patch
> 
> v4->v3:
> split patch set
> 
> Jeff Guo (3):
>   net/iavf: refactor for hash flow
>   net/iavf: enable 5 tuple rss hash
>   net/iavf: enable some new hash flow
> 
>  drivers/net/iavf/iavf_hash.c | 2075 +++++++++++++++++++++++++---------
>  1 file changed, 1560 insertions(+), 515 deletions(-)
> 
> --
> 2.20.1

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

Applied to dpdk-next-net-intel.

Thanks
Qi


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

end of thread, other threads:[~2020-07-07  9:18 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-12  2:44 [dpdk-dev] net/iavf: add inner 5 tuple hash for GTPU Jeff Guo
2020-06-14 15:09 ` [dpdk-dev] [dpdk-dev v2] " Jeff Guo
2020-06-21 14:02   ` [dpdk-dev] [dpdk-dev v3] " Jeff Guo
2020-07-01 12:56     ` Zhang, Qi Z
2020-07-03  3:52       ` Jeff Guo
2020-07-03  3:56     ` [dpdk-dev] [dpdk-dev v4 0/3] enable new hash flow for VF Jeff Guo
2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 1/3] net/iavf: refactor for hash flow Jeff Guo
2020-07-03 14:24         ` Zhang, Qi Z
2020-07-05 11:28           ` Jeff Guo
2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 2/3] net/iavf: enable 5 tuple rss hash Jeff Guo
2020-07-03  3:56       ` [dpdk-dev] [dpdk-dev v4 3/3] net/iavf: enable some new hash flow Jeff Guo
2020-07-07  5:14     ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Jeff Guo
2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 1/3] net/iavf: refactor for hash flow Jeff Guo
2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 2/3] net/iavf: enable 5 tuple rss hash Jeff Guo
2020-07-07  5:14       ` [dpdk-dev] [dpdk-dev v5 3/3] net/iavf: enable some new hash flow Jeff Guo
2020-07-07  9:18       ` [dpdk-dev] [dpdk-dev v5 0/3] enable new hash flow for VF Zhang, Qi Z

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