Please also separate this patch into code refactor purpose and new features
> -----Original Message----- > From: Guo, Jia <jia....@intel.com> > Sent: Sunday, June 21, 2020 10:09 PM > To: Zhang, Qi Z <qi.z.zh...@intel.com>; Yang, Qiming > <qiming.y...@intel.com> > Cc: Ye, Xiaolong <xiaolong...@intel.com>; dev@dpdk.org; Wu, Jingjing > <jingjing...@intel.com>; Guo, Junfeng <junfeng....@intel.com>; Su, Simei > <simei...@intel.com>; Guo, Jia <jia....@intel.com> > Subject: [dpdk-dev v3 2/2] net/ice: enable new input set for rss hash > > PF could add or delete a RSS rule base on the PF's hash capability. > Some new rss input set will be supported, the protocols as below: > eth/vlan/l2tpv3/esp/ah/pfcp/gtpu. > > Signed-off-by: Jeff Guo <jia....@intel.com> > --- > v3->v2: > refince code sturcture and fix simple xor issue fix some typos > --- > drivers/net/ice/ice_hash.c | 719 ++++++++++++++++++++++++++----------- > 1 file changed, 500 insertions(+), 219 deletions(-) > > diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c index > eaf6a35a1..d77c67f19 100644 > --- a/drivers/net/ice/ice_hash.c > +++ b/drivers/net/ice/ice_hash.c > @@ -25,6 +25,9 @@ > #include "ice_ethdev.h" > #include "ice_generic_flow.h" > > +#define ICE_GTPU_EH_DWNLINK 0 > +#define ICE_GTPU_EH_UPLINK 1 > + > struct rss_type_match_hdr { > uint32_t hdr_mask; > uint64_t eth_rss_hint; > @@ -76,91 +79,213 @@ ice_hash_parse_pattern_action(struct ice_adapter > *ad, > struct rte_flow_error *error); > > /* The first member is protocol header, the second member is ETH_RSS_*. > */ -struct rss_type_match_hdr hint_0 = { > +struct rss_type_match_hdr hint_empty = { > ICE_FLOW_SEG_HDR_NONE, 0}; > -struct rss_type_match_hdr hint_1 = { > - ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER, > ETH_RSS_IPV4}; > -struct rss_type_match_hdr hint_2 = { > - ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_UDP | > - ICE_FLOW_SEG_HDR_IPV_OTHER, ETH_RSS_NONFRAG_IPV4_UDP}; > -struct rss_type_match_hdr hint_3 = { > - ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_TCP | > - ICE_FLOW_SEG_HDR_IPV_OTHER, ETH_RSS_NONFRAG_IPV4_TCP}; > -struct rss_type_match_hdr hint_4 = { > - ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_SCTP | > - ICE_FLOW_SEG_HDR_IPV_OTHER, ETH_RSS_NONFRAG_IPV4_SCTP}; > -struct rss_type_match_hdr hint_5 = { > - ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER, > ETH_RSS_IPV6}; > -struct rss_type_match_hdr hint_6 = { > - ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_UDP | > - ICE_FLOW_SEG_HDR_IPV_OTHER, ETH_RSS_NONFRAG_IPV6_UDP}; > -struct rss_type_match_hdr hint_7 = { > - ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_TCP | > - ICE_FLOW_SEG_HDR_IPV_OTHER, ETH_RSS_NONFRAG_IPV6_TCP}; > -struct rss_type_match_hdr hint_8 = { > - ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_SCTP | > - ICE_FLOW_SEG_HDR_IPV_OTHER, ETH_RSS_NONFRAG_IPV6_SCTP}; > -struct rss_type_match_hdr hint_9 = { > - ICE_FLOW_SEG_HDR_GTPU_EH, ETH_RSS_IPV4}; > -struct rss_type_match_hdr hint_10 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_IPV4}; > -struct rss_type_match_hdr hint_11 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV4_UDP}; > -struct rss_type_match_hdr hint_12 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV4_TCP}; > -struct rss_type_match_hdr hint_13 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV4_SCTP}; > -struct rss_type_match_hdr hint_14 = { > - ICE_FLOW_SEG_HDR_GTPU_EH, ETH_RSS_NONFRAG_IPV4_UDP}; > -struct rss_type_match_hdr hint_15 = { > - ICE_FLOW_SEG_HDR_GTPU_EH, ETH_RSS_NONFRAG_IPV4_TCP}; > -struct rss_type_match_hdr hint_16 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_IPV6}; > -struct rss_type_match_hdr hint_17 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV6_UDP}; > -struct rss_type_match_hdr hint_18 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV6_TCP}; > -struct rss_type_match_hdr hint_19 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_NONFRAG_IPV6_SCTP}; > -struct rss_type_match_hdr hint_20 = { > - ICE_FLOW_SEG_HDR_PPPOE, ETH_RSS_ETH | ETH_RSS_PPPOE}; > +struct rss_type_match_hdr hint_eth_ipv4 = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER, > + ETH_RSS_ETH | ETH_RSS_IPV4}; > +struct rss_type_match_hdr hint_eth_ipv4_udp = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_UDP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP}; struct > rss_type_match_hdr > +hint_eth_ipv4_tcp = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_TCP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_TCP}; struct > rss_type_match_hdr > +hint_eth_ipv4_sctp = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_SCTP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_SCTP}; struct > rss_type_match_hdr > +hint_eth_ipv4_gtpu_ipv4 = { > + ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 | > + ICE_FLOW_SEG_HDR_IPV_OTHER, > + ETH_RSS_GTPU | ETH_RSS_IPV4}; > +struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4 = { > + ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | > + ICE_FLOW_SEG_HDR_IPV_OTHER, > + ETH_RSS_GTPU | ETH_RSS_IPV4}; > +struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4_udp = { > + ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | > + ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, > + ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP}; struct > rss_type_match_hdr > +hint_eth_ipv4_gtpu_eh_ipv4_tcp = { > + ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 | > + ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP, > + ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP}; struct > rss_type_match_hdr > +hint_eth_pppoes_ipv4 = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_IPV4}; struct > rss_type_match_hdr > +hint_eth_pppoes_ipv4_udp = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV4_UDP}; > struct > +rss_type_match_hdr hint_eth_pppoes_ipv4_tcp = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV4_TCP}; > struct > +rss_type_match_hdr hint_eth_pppoes_ipv4_sctp = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV4_SCTP}; > struct > +rss_type_match_hdr hint_eth_ipv4_esp = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_ESP, > + ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_ESP}; struct > rss_type_match_hdr > +hint_eth_ipv4_udp_esp = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_NAT_T_ESP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_ESP}; struct > +rss_type_match_hdr hint_eth_ipv4_eh = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_AH, > + ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_AH}; struct > rss_type_match_hdr > +hint_eth_ipv4_l2tpv3 = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_L2TPV3, > + ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_L2TPV3}; struct > +rss_type_match_hdr hint_eth_ipv4_pfcp = { > + ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_PFCP_SESSION, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_PFCP}; > struct > +rss_type_match_hdr hint_eth_vlan_ipv4 = { > + ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 | > + ICE_FLOW_SEG_HDR_IPV_OTHER, > + ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_C_VLAN}; struct > +rss_type_match_hdr hint_eth_ipv6 = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER, > + ETH_RSS_ETH | ETH_RSS_IPV6}; > +struct rss_type_match_hdr hint_eth_ipv6_udp = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_UDP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP}; struct > rss_type_match_hdr > +hint_eth_ipv6_tcp = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_TCP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_TCP}; struct > rss_type_match_hdr > +hint_eth_ipv6_sctp = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_SCTP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_SCTP}; struct > rss_type_match_hdr > +hint_eth_ipv6_esp = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_ESP, > + ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_ESP}; struct > rss_type_match_hdr > +hint_eth_ipv6_udp_esp = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_NAT_T_ESP, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_ESP}; struct > +rss_type_match_hdr hint_eth_ipv6_ah = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_AH, > + ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_AH}; struct > rss_type_match_hdr > +hint_eth_ipv6_l2tpv3 = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_L2TPV3, > + ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_L2TPV3}; struct > +rss_type_match_hdr hint_eth_ipv6_pfcp = { > + ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | > + ICE_FLOW_SEG_HDR_PFCP_SESSION, > + ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_PFCP}; > struct > +rss_type_match_hdr hint_eth_vlan_ipv6 = { > + ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 | > + ICE_FLOW_SEG_HDR_IPV_OTHER, > + ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_C_VLAN}; struct > +rss_type_match_hdr hint_eth_pppoes_ipv6 = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_IPV6}; struct > rss_type_match_hdr > +hint_eth_pppoes_ipv6_udp = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV6_UDP}; > struct > +rss_type_match_hdr hint_eth_pppoes_ipv6_tcp = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV6_TCP}; > struct > +rss_type_match_hdr hint_eth_pppoes_ipv6_sctp = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV6_SCTP}; > struct > +rss_type_match_hdr hint_eth_pppoes = { > + ICE_FLOW_SEG_HDR_PPPOE, > + ETH_RSS_ETH | ETH_RSS_PPPOE}; > > /* Supported pattern for os default package. */ static struct > ice_pattern_match_item ice_hash_pattern_list_os[] = { > - {pattern_eth_ipv4, ICE_INSET_NONE, &hint_1}, > - {pattern_eth_ipv4_udp, ICE_INSET_NONE, &hint_2}, > - {pattern_eth_ipv4_tcp, ICE_INSET_NONE, &hint_3}, > - {pattern_eth_ipv4_sctp, ICE_INSET_NONE, &hint_4}, > - {pattern_eth_ipv6, ICE_INSET_NONE, &hint_5}, > - {pattern_eth_ipv6_udp, ICE_INSET_NONE, &hint_6}, > - {pattern_eth_ipv6_tcp, ICE_INSET_NONE, &hint_7}, > - {pattern_eth_ipv6_sctp, ICE_INSET_NONE, &hint_8}, > - {pattern_empty, ICE_INSET_NONE, &hint_0}, > + {pattern_eth_ipv4, ICE_INSET_NONE, &hint_eth_ipv4}, > + {pattern_eth_ipv4_udp, ICE_INSET_NONE, &hint_eth_ipv4_udp}, > + {pattern_eth_ipv4_tcp, ICE_INSET_NONE, &hint_eth_ipv4_tcp}, > + {pattern_eth_ipv4_sctp, ICE_INSET_NONE, &hint_eth_ipv4_sctp}, > + {pattern_eth_ipv6, ICE_INSET_NONE, &hint_eth_ipv6}, > + {pattern_eth_ipv6_udp, ICE_INSET_NONE, &hint_eth_ipv6_udp}, > + {pattern_eth_ipv6_tcp, ICE_INSET_NONE, &hint_eth_ipv6_tcp}, > + {pattern_eth_ipv6_sctp, ICE_INSET_NONE, &hint_eth_ipv6_sctp}, > + {pattern_empty, ICE_INSET_NONE, &hint_empty}, > }; > > /* Supported pattern for comms package. */ static struct > ice_pattern_match_item ice_hash_pattern_list_comms[] = { > - {pattern_eth_ipv4, ICE_INSET_NONE, &hint_1}, > - {pattern_eth_ipv4_udp, ICE_INSET_NONE, &hint_2}, > - {pattern_eth_ipv4_tcp, ICE_INSET_NONE, &hint_3}, > - {pattern_eth_ipv4_sctp, ICE_INSET_NONE, &hint_4}, > - {pattern_eth_ipv6, ICE_INSET_NONE, &hint_5}, > - {pattern_eth_ipv6_udp, ICE_INSET_NONE, &hint_6}, > - {pattern_eth_ipv6_tcp, ICE_INSET_NONE, &hint_7}, > - {pattern_eth_ipv6_sctp, ICE_INSET_NONE, &hint_8}, > - {pattern_empty, ICE_INSET_NONE, &hint_0}, > - {pattern_eth_ipv4_gtpu_eh_ipv4, ICE_INSET_NONE, > &hint_9}, > - {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_INSET_NONE, &hint_14}, > - {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_INSET_NONE, &hint_15}, > - {pattern_eth_pppoes_ipv4, ICE_INSET_NONE, &hint_10}, > - {pattern_eth_pppoes_ipv4_udp, ICE_INSET_NONE, &hint_11}, > - {pattern_eth_pppoes_ipv4_tcp, ICE_INSET_NONE, &hint_12}, > - {pattern_eth_pppoes_ipv4_sctp, ICE_INSET_NONE, &hint_13}, > - {pattern_eth_pppoes_ipv6, ICE_INSET_NONE, &hint_16}, > - {pattern_eth_pppoes_ipv6_udp, ICE_INSET_NONE, &hint_17}, > - {pattern_eth_pppoes_ipv6_tcp, ICE_INSET_NONE, &hint_18}, > - {pattern_eth_pppoes_ipv6_sctp, ICE_INSET_NONE, &hint_19}, > - {pattern_eth_pppoes, ICE_INSET_NONE, &hint_20}, > + {pattern_empty, ICE_INSET_NONE, > + &hint_empty}, > + {pattern_eth_ipv4, ICE_INSET_NONE, > + &hint_eth_ipv4}, > + {pattern_eth_ipv4_udp, ICE_INSET_NONE, > + &hint_eth_ipv4_udp}, > + {pattern_eth_ipv4_tcp, ICE_INSET_NONE, > + &hint_eth_ipv4_tcp}, > + {pattern_eth_ipv4_sctp, ICE_INSET_NONE, > + &hint_eth_ipv4_sctp}, > + {pattern_eth_ipv4_gtpu_ipv4, ICE_INSET_NONE, > + &hint_eth_ipv4_gtpu_ipv4}, > + {pattern_eth_ipv4_gtpu_eh_ipv4, ICE_INSET_NONE, > + &hint_eth_ipv4_gtpu_eh_ipv4}, > + {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_INSET_NONE, > + &hint_eth_ipv4_gtpu_eh_ipv4_udp}, > + {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_INSET_NONE, > + &hint_eth_ipv4_gtpu_eh_ipv4_tcp}, > + {pattern_eth_pppoes_ipv4, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv4}, > + {pattern_eth_pppoes_ipv4_udp, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv4_udp}, > + {pattern_eth_pppoes_ipv4_tcp, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv4_tcp}, > + {pattern_eth_pppoes_ipv4_sctp, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv4_sctp}, > + {pattern_eth_ipv4_esp, ICE_INSET_NONE, > + &hint_eth_ipv4_esp}, > + {pattern_eth_ipv4_udp_esp, ICE_INSET_NONE, > + &hint_eth_ipv4_udp_esp}, > + {pattern_eth_ipv4_ah, ICE_INSET_NONE, > + &hint_eth_ipv4_eh}, > + {pattern_eth_ipv4_l2tp, ICE_INSET_NONE, > + &hint_eth_ipv4_l2tpv3}, > + {pattern_eth_ipv4_pfcp, ICE_INSET_NONE, > + &hint_eth_ipv4_pfcp}, > + {pattern_eth_vlan_ipv4, ICE_INSET_NONE, > + &hint_eth_vlan_ipv4}, > + {pattern_eth_ipv6, ICE_INSET_NONE, > + &hint_eth_ipv6}, > + {pattern_eth_ipv6_udp, ICE_INSET_NONE, > + &hint_eth_ipv6_udp}, > + {pattern_eth_ipv6_tcp, ICE_INSET_NONE, > + &hint_eth_ipv6_tcp}, > + {pattern_eth_ipv6_sctp, ICE_INSET_NONE, > + &hint_eth_ipv6_sctp}, > + {pattern_eth_ipv6_esp, ICE_INSET_NONE, > + &hint_eth_ipv6_esp}, > + {pattern_eth_ipv6_udp_esp, ICE_INSET_NONE, > + &hint_eth_ipv6_udp_esp}, > + {pattern_eth_ipv6_ah, ICE_INSET_NONE, > + &hint_eth_ipv6_ah}, > + {pattern_eth_ipv6_l2tp, ICE_INSET_NONE, > + &hint_eth_ipv6_l2tpv3}, > + {pattern_eth_ipv6_pfcp, ICE_INSET_NONE, > + &hint_eth_ipv6_pfcp}, > + {pattern_eth_vlan_ipv6, ICE_INSET_NONE, > + &hint_eth_vlan_ipv6}, > + {pattern_eth_pppoes_ipv6, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv6}, > + {pattern_eth_pppoes_ipv6_udp, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv6_udp}, > + {pattern_eth_pppoes_ipv6_tcp, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv6_tcp}, > + {pattern_eth_pppoes_ipv6_sctp, ICE_INSET_NONE, > + &hint_eth_pppoes_ipv6_sctp}, > + {pattern_eth_pppoes, ICE_INSET_NONE, > + &hint_eth_pppoes}, > }; > > /** > @@ -168,69 +293,227 @@ static struct ice_pattern_match_item > ice_hash_pattern_list_comms[] = { > * the second member is hash fields. > */ > struct ice_hash_match_type ice_hash_type_list[] = { > - {ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > - {ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > - {ETH_RSS_IPV4, > ICE_FLOW_HASH_IPV4}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_UDP, > ICE_HASH_UDP_IPV4}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_TCP, > ICE_HASH_TCP_IPV4}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV4_SCTP, > ICE_HASH_SCTP_IPV4}, > - {ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > - {ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > - {ETH_RSS_IPV6, > ICE_FLOW_HASH_IPV6}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_UDP, > ICE_HASH_UDP_IPV6}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_TCP, > ICE_HASH_TCP_IPV6}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > - {ETH_RSS_NONFRAG_IPV6_SCTP, > ICE_HASH_SCTP_IPV6}, > - {ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY, > BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, > - {ETH_RSS_PPPOE, > ICE_FLOW_HASH_PPPOE_SESS_ID}, > - {ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_L2_SRC_ONLY, > ICE_FLOW_HASH_PPPOE_SESS_ID | > BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, > + {ETH_RSS_L2_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, > + {ETH_RSS_L2_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)}, > + {ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, > + {ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)}, > + {ETH_RSS_ETH, > + BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)}, > + {ETH_RSS_PPPOE, > + ICE_FLOW_HASH_PPPOE_SESS_ID}, > + {ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_L2_SRC_ONLY, > + ICE_FLOW_HASH_PPPOE_SESS_ID | > + BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)}, > + {ETH_RSS_C_VLAN, > + BIT_ULL(ICE_FLOW_FIELD_IDX_C_VLAN)}, > + {ETH_RSS_S_VLAN, > + BIT_ULL(ICE_FLOW_FIELD_IDX_S_VLAN)}, > + {ETH_RSS_ESP, > + BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)}, > + {ETH_RSS_AH, > + BIT_ULL(ICE_FLOW_FIELD_IDX_AH_SPI)}, > + {ETH_RSS_L2TPV3, > + BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID)}, > + {ETH_RSS_PFCP, > + BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)}, > + {ETH_RSS_GTPU, > + BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID)}, > + /* IPV4 */ > + {ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > + {ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > + {ETH_RSS_IPV4, ICE_FLOW_HASH_IPV4}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_UDP, > + ICE_HASH_UDP_IPV4 | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_TCP, > + ICE_HASH_TCP_IPV4 | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + {ETH_RSS_NONFRAG_IPV4_SCTP, > + ICE_HASH_SCTP_IPV4 | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)}, > + /* IPV6 */ > + {ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > + {ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > + {ETH_RSS_IPV6, ICE_FLOW_HASH_IPV6}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_PFCP, > + BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)}, > + {ETH_RSS_NONFRAG_IPV6_UDP, > + ICE_HASH_UDP_IPV6 | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_TCP, > + ICE_HASH_TCP_IPV6 | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | > ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY, > + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT) | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > + {ETH_RSS_NONFRAG_IPV6_SCTP, > + ICE_HASH_SCTP_IPV6 | > + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)}, > }; > > static struct ice_flow_engine ice_hash_engine = { @@ -285,10 +568,13 @@ > ice_hash_init(struct ice_adapter *ad) } > > static int > -ice_hash_check_inset(const struct rte_flow_item pattern[], > - struct rte_flow_error *error) > +ice_hash_parse_pattern(struct ice_pattern_match_item > *pattern_match_item, > + const struct rte_flow_item pattern[], void **meta, > + struct rte_flow_error *error) > { > const struct rte_flow_item *item = pattern; > + const struct rte_flow_item_gtp_psc *psc; > + uint32_t hdrs = 0; > > for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) > { > if (item->last) { > @@ -298,15 +584,30 @@ ice_hash_check_inset(const struct rte_flow_item > pattern[], > return -rte_errno; > } > > - /* Ignore spec and mask. */ > - if (item->spec || item->mask) { > - rte_flow_error_set(error, EINVAL, > - RTE_FLOW_ERROR_TYPE_ITEM, item, > - "Invalid spec/mask."); > - return -rte_errno; > + switch (item->type) { > + case RTE_FLOW_ITEM_TYPE_GTPU: > + hdrs |= ICE_FLOW_SEG_HDR_GTPU_IP; > + break; > + case RTE_FLOW_ITEM_TYPE_GTP_PSC: > + psc = item->spec; > + hdrs &= ~ICE_FLOW_SEG_HDR_GTPU_IP; > + if (!psc) > + hdrs |= ICE_FLOW_SEG_HDR_GTPU_EH; > + else if (psc->pdu_type == ICE_GTPU_EH_UPLINK) > + hdrs |= ICE_FLOW_SEG_HDR_GTPU_UP; > + else if (psc->pdu_type == ICE_GTPU_EH_DWNLINK) > + hdrs |= ICE_FLOW_SEG_HDR_GTPU_DWN; > + break; > + default: > + break; > } > } > > + /* Save protocol header to rss_meta. */ > + ((struct rss_meta *)*meta)->pkt_hdr |= > + ((struct rss_type_match_hdr *) > + (pattern_match_item->meta))->hdr_mask | hdrs; > + > return 0; > } > > @@ -316,14 +617,14 @@ ice_hash_parse_action(struct > ice_pattern_match_item *pattern_match_item, > void **meta, > struct rte_flow_error *error) > { > - const struct rte_flow_action *action; > - enum rte_flow_action_type action_type; > - const struct rte_flow_action_rss *rss; > struct rss_type_match_hdr *m = (struct rss_type_match_hdr *) > (pattern_match_item->meta); > + struct rss_meta *hash_meta = (struct rss_meta *)*meta; > uint32_t type_list_len = RTE_DIM(ice_hash_type_list); > - struct ice_hash_match_type *type_match_item; > - uint64_t rss_hf; > + enum rte_flow_action_type action_type; > + const struct rte_flow_action_rss *rss; > + const struct rte_flow_action *action; > + uint64_t rss_type; > uint16_t i; > > /* Supported action is RSS. */ > @@ -333,46 +634,24 @@ ice_hash_parse_action(struct > ice_pattern_match_item *pattern_match_item, > switch (action_type) { > case RTE_FLOW_ACTION_TYPE_RSS: > rss = action->conf; > - rss_hf = rss->types; > + rss_type = rss->types; > > - /** > - * Check simultaneous use of SRC_ONLY and DST_ONLY > - * of the same level. > - */ > - rss_hf = rte_eth_rss_hf_refine(rss_hf); > - > - /* Check if pattern is empty. */ > + /* Check hash function and save it to rss_meta. */ > if (pattern_match_item->pattern_list != > - pattern_empty && rss->func == > - RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) > + 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_hf & ETH_RSS_ETH) && (rss_hf & ~ETH_RSS_PPPOE)) > - m->eth_rss_hint = ETH_RSS_ETH; > - else if ((rss_hf & ETH_RSS_PPPOE) && (rss_hf & > ~ETH_RSS_ETH)) > - m->eth_rss_hint = ETH_RSS_PPPOE; > - else if ((rss_hf & ETH_RSS_ETH) && (rss_hf & > ETH_RSS_PPPOE)) > - m->eth_rss_hint = ETH_RSS_ETH | ETH_RSS_PPPOE; > - > - /* Check if rss types match pattern. */ > - if (rss->func != RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) { > - if (((rss_hf & ETH_RSS_IPV4) != > m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_NONFRAG_IPV4_UDP) != > m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) != > m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_NONFRAG_IPV4_SCTP) != > m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_IPV6) != m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_NONFRAG_IPV6_UDP) != > m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) != > m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_NONFRAG_IPV6_SCTP) != > m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_ETH) != m->eth_rss_hint) && > - ((rss_hf & ETH_RSS_PPPOE) != m->eth_rss_hint) && > - (((rss_hf & (ETH_RSS_ETH | ETH_RSS_PPPOE)) != > - > m->eth_rss_hint))) > - return rte_flow_error_set(error, > - ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, > - action, "Not supported RSS types"); > + } else if (rss->func == > + RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){ > + ((struct rss_meta *)*meta)->hash_function = > + RTE_ETH_HASH_FUNCTION_SIMPLE_XOR; > + return 0; > + } else if (rss->func == > + RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) { > + ((struct rss_meta *)*meta)->hash_function = > + RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ; > } > > if (rss->level) > @@ -390,42 +669,47 @@ ice_hash_parse_action(struct > ice_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) > - ((struct rss_meta *)*meta)->hash_function = > - RTE_ETH_HASH_FUNCTION_SIMPLE_XOR; > + /** > + * Check simultaneous use of SRC_ONLY and DST_ONLY > + * of the same level. > + */ > + rss_type = rte_eth_rss_hf_refine(rss_type); > > - if (rss->func == > - RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) > - ((struct rss_meta *)*meta)->hash_function = > - RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ; > + uint64_t combine_type = ETH_RSS_L2_SRC_ONLY | > + ETH_RSS_L2_DST_ONLY | > + ETH_RSS_L3_SRC_ONLY | > + ETH_RSS_L3_DST_ONLY | > + ETH_RSS_L4_SRC_ONLY | > + ETH_RSS_L4_DST_ONLY; > > - type_match_item = rte_zmalloc("ice_type_match_item", > - sizeof(struct ice_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; > + /* Check if rss types match pattern. */ > + if (rss_type & ~combine_type & ~m->eth_rss_hint) { > + return rte_flow_error_set(error, > + ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION, > + action, "Not supported RSS types"); > } > > /* Find matched hash fields according to hash type. */ > for (i = 0; i < type_list_len; i++) { > - if (rss_hf == > - ice_hash_type_list[i].hash_type) { > - type_match_item->hash_type = > - ice_hash_type_list[i].hash_type; > - type_match_item->hash_flds = > - ice_hash_type_list[i].hash_flds; > + struct ice_hash_match_type *ht_map = > + &ice_hash_type_list[i]; > + > + if (rss_type == ht_map->hash_type) { > + hash_meta->hash_flds = > + ht_map->hash_flds; > + break; > } > } > > - /* Save hash fileds to rss_meta. */ > - ((struct rss_meta *)*meta)->hash_flds = > - type_match_item->hash_flds; > + /* update hash field for nat-t esp. */ > + if ((rss_type == ETH_RSS_ESP) && > + (m->eth_rss_hint || ETH_RSS_NONFRAG_IPV4_UDP)) { > + hash_meta->hash_flds &= > + ~(BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)); > + hash_meta->hash_flds |= > + BIT_ULL(ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI); > + } > > - rte_free(type_match_item); > break; > > case RTE_FLOW_ACTION_TYPE_END: > @@ -471,14 +755,11 @@ ice_hash_parse_pattern_action(__rte_unused > struct ice_adapter *ad, > goto error; > } > > - ret = ice_hash_check_inset(pattern, error); > + ret = ice_hash_parse_pattern(pattern_match_item, pattern, > + (void **)&rss_meta_ptr, error); > if (ret) > goto error; > > - /* Save protocol header to rss_meta. */ > - rss_meta_ptr->pkt_hdr = ((struct rss_type_match_hdr *) > - (pattern_match_item->meta))->hdr_mask; > - > /* Check rss action. */ > ret = ice_hash_parse_action(pattern_match_item, actions, > (void **)&rss_meta_ptr, error); > -- > 2.20.1