From patchwork Tue Aug 3 08:37:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wenjun Wu X-Patchwork-Id: 96579 X-Patchwork-Delegate: qi.z.zhang@intel.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 77730A0C41; Tue, 3 Aug 2021 10:57:12 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5C656411B6; Tue, 3 Aug 2021 10:57:12 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mails.dpdk.org (Postfix) with ESMTP id A8DD540E32 for ; Tue, 3 Aug 2021 10:57:09 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10064"; a="211764352" X-IronPort-AV: E=Sophos;i="5.84,291,1620716400"; d="scan'208";a="211764352" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2021 01:56:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,291,1620716400"; d="scan'208";a="479396554" Received: from wuwenjun.sh.intel.com ([10.67.110.197]) by fmsmga008.fm.intel.com with ESMTP; 03 Aug 2021 01:56:46 -0700 From: Wenjun Wu To: dev@dpdk.org Date: Tue, 3 Aug 2021 16:37:56 +0800 Message-Id: <20210803083817.1243796-2-wenjun1.wu@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210803083817.1243796-1-wenjun1.wu@intel.com> References: <20210803083817.1243796-1-wenjun1.wu@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 01/22] net/ice: support RSS hash for IP fragment X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" [ upstream commit f1ea76eb63944a65e9e0bbc32244bc7c8b4fbd1d ] [ upstream commit 664b8eb745b9b6249231cea2f2bc6ff4d4b6bc40 ] [ upstream commit 8434528175614f4cc8ab25fd28560848d8999605 ] New pattern and RSS hash flow parsing are added to handle fragmented IPv4/IPv6 packet. This patch is not for LTS upstream, just for customer to cherry-pick. Signed-off-by: Jeff Guo Signed-off-by: Ting Xu Signed-off-by: Qi Zhang Signed-off-by: Wenjun Wu Acked-by: Qi Zhang --- drivers/net/ice/base/ice_flow.c | 51 +++++++++++++++++++++++++++++- drivers/net/ice/base/ice_flow.h | 5 ++- drivers/net/ice/ice_generic_flow.c | 25 +++++++++++++++ drivers/net/ice/ice_generic_flow.h | 7 ++++ drivers/net/ice/ice_hash.c | 37 ++++++++++++++++++++-- 5 files changed, 120 insertions(+), 5 deletions(-) diff --git a/drivers/net/ice/base/ice_flow.c b/drivers/net/ice/base/ice_flow.c index c75f58659c..049e2f0c26 100644 --- a/drivers/net/ice/base/ice_flow.c +++ b/drivers/net/ice/base/ice_flow.c @@ -13,6 +13,8 @@ #define ICE_FLOW_FLD_SZ_IPV6_PRE32_ADDR 4 #define ICE_FLOW_FLD_SZ_IPV6_PRE48_ADDR 6 #define ICE_FLOW_FLD_SZ_IPV6_PRE64_ADDR 8 +#define ICE_FLOW_FLD_SZ_IPV4_ID 2 +#define ICE_FLOW_FLD_SZ_IPV6_ID 4 #define ICE_FLOW_FLD_SZ_IP_DSCP 1 #define ICE_FLOW_FLD_SZ_IP_TTL 1 #define ICE_FLOW_FLD_SZ_IP_PROT 1 @@ -94,6 +96,12 @@ struct ice_flow_field_info ice_flds_info[ICE_FLOW_FIELD_IDX_MAX] = { ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV6, 8, ICE_FLOW_FLD_SZ_IPV6_ADDR), /* ICE_FLOW_FIELD_IDX_IPV6_DA */ ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV6, 24, ICE_FLOW_FLD_SZ_IPV6_ADDR), + /* ICE_FLOW_FIELD_IDX_IPV4_FRAG */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV_FRAG, 4, + ICE_FLOW_FLD_SZ_IPV4_ID), + /* ICE_FLOW_FIELD_IDX_IPV6_FRAG */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV_FRAG, 4, + ICE_FLOW_FLD_SZ_IPV6_ID), /* ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA */ ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV6, 8, ICE_FLOW_FLD_SZ_IPV6_PRE32_ADDR), @@ -468,6 +476,28 @@ static const u32 ice_ptypes_gtpc_tid[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, }; +static const u32 ice_ptypes_ipv4_frag[] = { + 0x00400000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +static const u32 ice_ptypes_ipv6_frag[] = { + 0x00000000, 0x00000000, 0x01000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + /* Packet types for GTPU */ static const struct ice_ptype_attributes ice_attr_gtpu_session[] = { { ICE_MAC_IPV4_GTPU_IPV4_FRAG, ICE_PTYPE_ATTR_GTP_SESSION }, @@ -851,6 +881,16 @@ ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params) (const ice_bitmap_t *)ice_ptypes_ipv6_ofos_all; ice_and_bitmap(params->ptypes, params->ptypes, src, ICE_FLOW_PTYPE_MAX); + } else if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) && + (hdrs & ICE_FLOW_SEG_HDR_IPV_FRAG)) { + src = (const ice_bitmap_t *)ice_ptypes_ipv4_frag; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if ((hdrs & ICE_FLOW_SEG_HDR_IPV6) && + (hdrs & ICE_FLOW_SEG_HDR_IPV_FRAG)) { + src = (const ice_bitmap_t *)ice_ptypes_ipv6_frag; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); } else if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) && !(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK_NO_OTHER)) { src = !i ? (const ice_bitmap_t *)ice_ptypes_ipv4_ofos_no_l4 : @@ -1121,6 +1161,9 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params, case ICE_FLOW_FIELD_IDX_IPV4_DA: prot_id = seg == 0 ? ICE_PROT_IPV4_OF_OR_S : ICE_PROT_IPV4_IL; break; + case ICE_FLOW_FIELD_IDX_IPV4_ID: + prot_id = ICE_PROT_IPV4_OF_OR_S; + break; case ICE_FLOW_FIELD_IDX_IPV6_SA: case ICE_FLOW_FIELD_IDX_IPV6_DA: case ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA: @@ -1131,6 +1174,9 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params, case ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA: prot_id = seg == 0 ? ICE_PROT_IPV6_OF_OR_S : ICE_PROT_IPV6_IL; break; + case ICE_FLOW_FIELD_IDX_IPV6_ID: + prot_id = ICE_PROT_IPV6_FRAG; + break; case ICE_FLOW_FIELD_IDX_TCP_SRC_PORT: case ICE_FLOW_FIELD_IDX_TCP_DST_PORT: case ICE_FLOW_FIELD_IDX_TCP_FLAGS: @@ -3278,13 +3324,16 @@ ice_flow_set_rss_seg_info(struct ice_flow_seg_info *segs, u8 seg_cnt, /* set outer most header */ if (cfg->hdr_type == ICE_RSS_INNER_HEADERS_W_OUTER_IPV4) segs[ICE_RSS_OUTER_HEADERS].hdrs |= ICE_FLOW_SEG_HDR_IPV4 | + ICE_FLOW_SEG_HDR_IPV_FRAG | ICE_FLOW_SEG_HDR_IPV_OTHER; else if (cfg->hdr_type == ICE_RSS_INNER_HEADERS_W_OUTER_IPV6) segs[ICE_RSS_OUTER_HEADERS].hdrs |= ICE_FLOW_SEG_HDR_IPV6 | + ICE_FLOW_SEG_HDR_IPV_FRAG | ICE_FLOW_SEG_HDR_IPV_OTHER; if (seg->hdrs & ~ICE_FLOW_RSS_SEG_HDR_VAL_MASKS & - ~ICE_FLOW_RSS_HDRS_INNER_MASK & ~ICE_FLOW_SEG_HDR_IPV_OTHER) + ~ICE_FLOW_RSS_HDRS_INNER_MASK & ~ICE_FLOW_SEG_HDR_IPV_OTHER & + ~ICE_FLOW_SEG_HDR_IPV_FRAG) return ICE_ERR_PARAM; val = (u64)(seg->hdrs & ICE_FLOW_RSS_SEG_HDR_L3_MASKS); diff --git a/drivers/net/ice/base/ice_flow.h b/drivers/net/ice/base/ice_flow.h index 2a9ae66454..b503417b70 100644 --- a/drivers/net/ice/base/ice_flow.h +++ b/drivers/net/ice/base/ice_flow.h @@ -182,7 +182,8 @@ enum ice_flow_seg_hdr { /* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and * ICE_FLOW_SEG_HDR_IPV6 which include the IPV4 other PTYPEs */ - ICE_FLOW_SEG_HDR_IPV_OTHER = 0x20000000, + ICE_FLOW_SEG_HDR_IPV_FRAG = 0x20000000, + ICE_FLOW_SEG_HDR_IPV_OTHER = 0x40000000, }; /* These segements all have the same PTYPES, but are otherwise distinguished by @@ -219,6 +220,8 @@ enum ice_flow_field { ICE_FLOW_FIELD_IDX_IPV4_DA, ICE_FLOW_FIELD_IDX_IPV6_SA, ICE_FLOW_FIELD_IDX_IPV6_DA, + ICE_FLOW_FIELD_IDX_IPV4_ID, + ICE_FLOW_FIELD_IDX_IPV6_ID, ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA, ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA, ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA, diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 1429cbc3b6..bc4e0a5704 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -212,6 +212,31 @@ enum rte_flow_item_type pattern_eth_qinq_ipv6[] = { RTE_FLOW_ITEM_TYPE_IPV6, RTE_FLOW_ITEM_TYPE_END, }; + +enum rte_flow_item_type pattern_eth_ipv6_frag_ext[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_IPV6, + RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, + RTE_FLOW_ITEM_TYPE_END, +}; + +enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_VLAN, + RTE_FLOW_ITEM_TYPE_IPV6, + RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, + RTE_FLOW_ITEM_TYPE_END, +}; + +enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[] = { + RTE_FLOW_ITEM_TYPE_ETH, + RTE_FLOW_ITEM_TYPE_VLAN, + RTE_FLOW_ITEM_TYPE_VLAN, + RTE_FLOW_ITEM_TYPE_IPV6, + RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT, + RTE_FLOW_ITEM_TYPE_END, +}; + enum rte_flow_item_type pattern_eth_ipv6_udp[] = { RTE_FLOW_ITEM_TYPE_ETH, RTE_FLOW_ITEM_TYPE_IPV6, diff --git a/drivers/net/ice/ice_generic_flow.h b/drivers/net/ice/ice_generic_flow.h index 434d2f425d..eb0368e280 100644 --- a/drivers/net/ice/ice_generic_flow.h +++ b/drivers/net/ice/ice_generic_flow.h @@ -84,6 +84,8 @@ (ICE_PROT_IPV4_OUTER | ICE_IP_PROTO) #define ICE_INSET_IPV4_TTL \ (ICE_PROT_IPV4_OUTER | ICE_IP_TTL) +#define ICE_INSET_IPV4_PKID \ + (ICE_PROT_IPV4 | ICE_IP_PK_ID) #define ICE_INSET_IPV6_SRC \ (ICE_PROT_IPV6_OUTER | ICE_IP_SRC) #define ICE_INSET_IPV6_DST \ @@ -94,6 +96,8 @@ (ICE_PROT_IPV6_OUTER | ICE_IP_TTL) #define ICE_INSET_IPV6_TC \ (ICE_PROT_IPV6_OUTER | ICE_IP_TOS) +#define ICE_INSET_IPV6_PKID \ + (ICE_PROT_IPV6 | ICE_IP_PK_ID) #define ICE_INSET_TCP_SRC_PORT \ (ICE_PROT_TCP_OUTER | ICE_SPORT) @@ -236,6 +240,9 @@ extern enum rte_flow_item_type pattern_eth_qinq_ipv4_icmp[]; extern enum rte_flow_item_type pattern_eth_ipv6[]; extern enum rte_flow_item_type pattern_eth_vlan_ipv6[]; extern enum rte_flow_item_type pattern_eth_qinq_ipv6[]; +extern enum rte_flow_item_type pattern_eth_ipv6_frag_ext[]; +extern enum rte_flow_item_type pattern_eth_vlan_ipv6_frag_ext[]; +extern enum rte_flow_item_type pattern_eth_qinq_ipv6_frag_ext[]; extern enum rte_flow_item_type pattern_eth_ipv6_udp[]; extern enum rte_flow_item_type pattern_eth_vlan_ipv6_udp[]; extern enum rte_flow_item_type pattern_eth_qinq_ipv6_udp[]; diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c index 1bb7d2c7c6..2b0a479c7e 100644 --- a/drivers/net/ice/ice_hash.c +++ b/drivers/net/ice/ice_hash.c @@ -83,7 +83,7 @@ struct rss_type_match_hdr hint_empty = { ICE_FLOW_SEG_HDR_NONE, 0}; 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}; + ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_FRAG_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, @@ -227,7 +227,7 @@ struct rss_type_match_hdr hint_eth_ipv4_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}; + ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | ETH_RSS_C_VLAN}; struct rss_type_match_hdr hint_eth_vlan_ipv4_udp = { ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, @@ -246,6 +246,10 @@ struct rss_type_match_hdr hint_eth_vlan_ipv4_sctp = { 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_frag_ext = { + ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 | + ICE_FLOW_SEG_HDR_IPV_FRAG, + ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_FRAG_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, @@ -282,6 +286,10 @@ 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_vlan_ipv6_frag_ext = { + ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 | + ICE_FLOW_SEG_HDR_IPV_FRAG, + ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_C_VLAN}; struct rss_type_match_hdr hint_eth_vlan_ipv6_udp = { ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP, @@ -415,6 +423,8 @@ static struct ice_pattern_match_item ice_hash_pattern_list_comms[] = { &hint_eth_vlan_ipv4_sctp}, {pattern_eth_ipv6, ICE_INSET_NONE, &hint_eth_ipv6}, + {pattern_eth_ipv6_frag_ext, ICE_INSET_NONE, + &hint_eth_ipv6_frag_ext}, {pattern_eth_ipv6_udp, ICE_INSET_NONE, &hint_eth_ipv6_udp}, {pattern_eth_ipv6_tcp, ICE_INSET_NONE, @@ -433,6 +443,8 @@ static struct ice_pattern_match_item ice_hash_pattern_list_comms[] = { &hint_eth_ipv6_pfcp}, {pattern_eth_vlan_ipv6, ICE_INSET_NONE, &hint_eth_vlan_ipv6}, + {pattern_eth_vlan_ipv6_frag_ext, ICE_INSET_NONE, + &hint_eth_vlan_ipv6_frag_ext}, {pattern_eth_vlan_ipv6_udp, ICE_INSET_NONE, &hint_eth_vlan_ipv6_udp}, {pattern_eth_vlan_ipv6_tcp, ICE_INSET_NONE, @@ -492,6 +504,9 @@ struct ice_hash_match_type ice_hash_type_list[] = { {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_FRAG_IPV4, + ICE_FLOW_HASH_IPV4 | + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_ID)}, {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) | @@ -591,6 +606,9 @@ struct ice_hash_match_type ice_hash_type_list[] = { {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_FRAG_IPV6, + ICE_FLOW_HASH_IPV6 | + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_ID)}, {ETH_RSS_IPV6_PRE32 | ETH_RSS_L3_SRC_ONLY, BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)}, {ETH_RSS_IPV6_PRE32 | ETH_RSS_L3_DST_ONLY, @@ -1087,10 +1105,12 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item, RTE_ETH_RSS_L3_PRE64; rss_attr_symm = ETH_RSS_IPV4 | + ETH_RSS_FRAG_IPV4 | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_IPV6 | + ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_NONFRAG_IPV6_SCTP; @@ -1144,6 +1164,14 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item, RTE_FLOW_ERROR_TYPE_ACTION, action, "Not supported flow"); } + /* update hash field for ip fragment */ + if (rss_type & ETH_RSS_FRAG_IPV4) { + hash_meta->pkt_hdr |= ICE_FLOW_SEG_HDR_IPV_FRAG; + hash_meta->pkt_hdr &= + ~(ICE_FLOW_SEG_HDR_IPV_OTHER); + hash_meta->hash_flds |= + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_ID); + } /* update hash field for eth-non-ip. */ if (rss_type & ETH_RSS_ETH) { @@ -1293,7 +1321,10 @@ ice_hash_create(struct ice_adapter *ad, filter_ptr->rss_cfg.hash.symm = (hash_function == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ); - filter_ptr->rss_cfg.hash.hdr_type = ICE_RSS_ANY_HEADERS; + if (headermask & ICE_FLOW_SEG_HDR_IPV_FRAG) + filter_ptr->rss_cfg.hash.hdr_type = ICE_RSS_OUTER_HEADERS; + else + filter_ptr->rss_cfg.hash.hdr_type = ICE_RSS_ANY_HEADERS; ret = ice_add_rss_cfg_wrap(pf, vsi->idx, &filter_ptr->rss_cfg.hash);