From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A2228A0509; Sat, 7 May 2022 03:20:55 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5352140395; Sat, 7 May 2022 03:20:55 +0200 (CEST) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mails.dpdk.org (Postfix) with ESMTP id 400164014F for ; Sat, 7 May 2022 03:20:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651886453; x=1683422453; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PpYNswG5UMSPiWKkGWiRkHs9p54u8aLQ8nWY5+wwI20=; b=auPiTIoQ4eAyWGrfjMxTmdZBQQfcOjIoReCJGjMGVye9qSJtBiAE9at4 iqWKG0antJiYhTDJclsVuS82TsCFE+mn8pdaiF0t8xD/tODRyt3nZQ69n OfVselNqikEqoe01b453rR6Q4KYkKBgim1i4OuD1/DVM+yOfuFpKmyi+I DRUyiemqLoq9SLziY04ldvmBA1fZDRlrr88XwWYOyQlDbh52/jIPNSnmt ZqTYRoXItWbQipSlO9BNvU4U4bHNjas1ii9v9o6TiPnSmgywY2Ayer4vH j2oQOr10GR5fkuIPq8PWfGjA1GpVFZZFY9BvVIzLZy8fG0dBMLhWLkMQd A==; X-IronPort-AV: E=McAfee;i="6400,9594,10339"; a="268245737" X-IronPort-AV: E=Sophos;i="5.91,205,1647327600"; d="scan'208";a="268245737" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 May 2022 18:20:49 -0700 X-IronPort-AV: E=Sophos;i="5.91,205,1647327600"; d="scan'208";a="564118131" Received: from intel-cd-odc-gavin.cd.intel.com ([10.240.178.193]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 May 2022 18:20:48 -0700 From: Jie Wang To: dev@dpdk.org Cc: stevex.yang@intel.com, qiming.yang@intel.com, qi.z.zhang@intel.com, Jie Wang Subject: [PATCH v2] net/ice/base: enable FDIR support for IPV6_NETX_PROTO Date: Sat, 7 May 2022 17:13:45 +0800 Message-Id: <20220507091345.175582-1-jie1x.wang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220407030104.786060-1-jie1x.wang@intel.com> References: <20220407030104.786060-1-jie1x.wang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 To support the new DDP and be compatible with the old version DDP file, API function 'check_ddp_support_proto_id' is added to detect if the required protocol ID is supported by the current DDP file. Add new protocol ID IPV6_NETX_PROTO support for PF FDIR if current DDP is new DDP and keep behavior if it is the old version DDP. v2: rebase and optimize the API function Signed-off-by: Jie Wang --- drivers/net/ice/base/ice_flow.c | 16 ++++++++++- drivers/net/ice/base/ice_parser.c | 35 ++++++++++++++++++++++++ drivers/net/ice/base/ice_parser.h | 2 ++ drivers/net/ice/base/ice_proto_grp.c | 1 - drivers/net/ice/base/ice_proto_grp.h | 1 + drivers/net/ice/base/ice_protocol_type.h | 1 + 6 files changed, 54 insertions(+), 2 deletions(-) diff --git a/drivers/net/ice/base/ice_flow.c b/drivers/net/ice/base/ice_flow.c index bcbb9b12c4..4a73f0c674 100644 --- a/drivers/net/ice/base/ice_flow.c +++ b/drivers/net/ice/base/ice_flow.c @@ -1370,6 +1370,7 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params, u16 sib_mask = 0; u16 mask; u16 off; + bool exist; flds = params->prof->segs[seg].fields; @@ -1410,7 +1411,16 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params, break; case ICE_FLOW_FIELD_IDX_IPV6_TTL: case ICE_FLOW_FIELD_IDX_IPV6_PROT: - prot_id = seg == 0 ? ICE_PROT_IPV6_OF_OR_S : ICE_PROT_IPV6_IL; + prot_id = ICE_PROT_IPV6_NEXT_PROTO; + exist = ice_check_ddp_support_proto_id(hw, prot_id); + if (!exist) + prot_id = seg == 0 ? + ICE_PROT_IPV6_OF_OR_S : + ICE_PROT_IPV6_IL; + else + prot_id = seg == 0 ? + ICE_PROT_IPV6_NEXT_PROTO : + ICE_PROT_IPV6_IL; /* TTL and PROT share the same extraction seq. entry. * Each is considered a sibling to the other in terms of sharing @@ -1543,6 +1553,10 @@ ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params, flds[fld].xtrct.disp = (u8)(ice_flds_info[fld].off % ese_bits); flds[fld].xtrct.idx = params->es_cnt; flds[fld].xtrct.mask = ice_flds_info[fld].mask; + if (prot_id == ICE_PROT_IPV6_NEXT_PROTO) { + flds[fld].xtrct.off = 0; + flds[fld].xtrct.disp = 0; + } /* Adjust the next field-entry index after accommodating the number of * entries this field consumes diff --git a/drivers/net/ice/base/ice_parser.c b/drivers/net/ice/base/ice_parser.c index 9b106baff0..6529f5d635 100644 --- a/drivers/net/ice/base/ice_parser.c +++ b/drivers/net/ice/base/ice_parser.c @@ -552,3 +552,38 @@ void ice_parser_profile_dump(struct ice_hw *hw, struct ice_parser_profile *prof) ice_info(hw, "flags = 0x%04x\n", prof->flags); ice_info(hw, "flags_msk = 0x%04x\n", prof->flags_msk); } + +/** + * ice_check_ddp_support_proto_id - check DDP package file support protocol ID + * @hw: pointer to the HW struct + * @proto_id: protocol ID value + * + * This function maintains the compatibility of the program process by checking + * whether the current DDP file supports the required protocol ID. + */ +bool ice_check_ddp_support_proto_id(struct ice_hw *hw, + enum ice_prot_id proto_id) +{ + struct ice_proto_grp_item *proto_grp_table; + struct ice_proto_grp_item *proto_grp; + bool exist = false; + u16 idx, i; + + proto_grp_table = ice_proto_grp_table_get(hw); + if (!proto_grp_table) + return false; + + for (idx = 0; idx < ICE_PROTO_GRP_TABLE_SIZE; idx++) { + proto_grp = &proto_grp_table[idx]; + for (i = 0; i < ICE_PROTO_COUNT_PER_GRP; i++) { + if (proto_grp->po[i].proto_id == proto_id) { + exist = true; + goto exit; + } + } + } + +exit: + ice_free(hw, proto_grp_table); + return exist; +} diff --git a/drivers/net/ice/base/ice_parser.h b/drivers/net/ice/base/ice_parser.h index 816aea782a..22c73b686b 100644 --- a/drivers/net/ice/base/ice_parser.h +++ b/drivers/net/ice/base/ice_parser.h @@ -110,4 +110,6 @@ enum ice_status ice_parser_profile_init(struct ice_parser_result *rslt, struct ice_parser_profile *prof); void ice_parser_profile_dump(struct ice_hw *hw, struct ice_parser_profile *prof); +bool ice_check_ddp_support_proto_id(struct ice_hw *hw, + enum ice_prot_id proto_id); #endif /* _ICE_PARSER_H_ */ diff --git a/drivers/net/ice/base/ice_proto_grp.c b/drivers/net/ice/base/ice_proto_grp.c index 69d5d9a18a..7ce87de110 100644 --- a/drivers/net/ice/base/ice_proto_grp.c +++ b/drivers/net/ice/base/ice_proto_grp.c @@ -5,7 +5,6 @@ #include "ice_common.h" #include "ice_parser_util.h" -#define ICE_PROTO_GRP_TABLE_SIZE 192 static void _proto_off_dump(struct ice_hw *hw, struct ice_proto_off *po, int idx) diff --git a/drivers/net/ice/base/ice_proto_grp.h b/drivers/net/ice/base/ice_proto_grp.h index 88d84505dd..1a5b5d5f44 100644 --- a/drivers/net/ice/base/ice_proto_grp.h +++ b/drivers/net/ice/base/ice_proto_grp.h @@ -6,6 +6,7 @@ #define _ICE_PROTO_GRP_H_ #define ICE_PROTO_COUNT_PER_GRP 8 +#define ICE_PROTO_GRP_TABLE_SIZE 192 struct ice_proto_off { bool polarity; /* true: positive, false: nagtive */ diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h index 0e6e5990be..83867418c6 100644 --- a/drivers/net/ice/base/ice_protocol_type.h +++ b/drivers/net/ice/base/ice_protocol_type.h @@ -163,6 +163,7 @@ enum ice_prot_id { ICE_PROT_IPV6_OF_OR_S = 40, ICE_PROT_IPV6_IL = 41, ICE_PROT_IPV6_IL_IL = 42, + ICE_PROT_IPV6_NEXT_PROTO = 43, ICE_PROT_IPV6_FRAG = 47, ICE_PROT_TCP_IL = 49, ICE_PROT_UDP_OF = 52, -- 2.25.1