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 97AC0A0C3F; Thu, 15 Apr 2021 17:49:29 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 62E4A161B02; Thu, 15 Apr 2021 17:49:29 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mails.dpdk.org (Postfix) with ESMTP id 96559161949 for ; Thu, 15 Apr 2021 17:49:27 +0200 (CEST) IronPort-SDR: fTcMAR+MTUJ5qcRCoCTpi9PdrJzY3b25M4uLtQx48T/Rzu/nIBDb6joe9jKDNRJKcj15TsyJ+N nheonic7xL6Q== X-IronPort-AV: E=McAfee;i="6200,9189,9955"; a="192751072" X-IronPort-AV: E=Sophos;i="5.82,225,1613462400"; d="scan'208";a="192751072" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Apr 2021 08:49:25 -0700 IronPort-SDR: nBHn9HQ/calpnkc/JLWRHtOHxpAkS1RsLZqCwwqQcN9eKkfg1d3/pzCe/zshN/Q/VcZYiEhdaX FbFgmTXHlwEA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,225,1613462400"; d="scan'208";a="418784458" Received: from dpdk-yyzhang2.sh.intel.com ([10.67.117.129]) by fmsmga008.fm.intel.com with ESMTP; 15 Apr 2021 08:49:22 -0700 From: Yuying Zhang To: dev@dpdk.org, qi.z.zhang@intel.com Cc: Yuying Zhang Date: Thu, 15 Apr 2021 15:38:45 +0000 Message-Id: <20210415153845.840636-1-yuying.zhang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210317070243.136145-1-yuying.zhang@intel.com> References: <20210317070243.136145-1-yuying.zhang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v4] net/ice: support flow priority for DCF switch filter 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" Support rte flow priority attribute for DCF switch filter. When a packet is matched by two rules, the behavior of it is not defined. This patch supports flow priority to create different recipes for this situation. Only priority 0 and 1 are supported and higher value denotes higher priority. for example: 1. flow create 0 priority 0 ingress pattern eth / vlan tci is 2 / vlan tci is 2 / end actions vf id 2 / end 2. flow create 0 priority 1 ingress pattern eth / vlan / vlan / ipv4 dst is 192.168.0.1 / end actions vf id 1 / end These two rules can be created at the same time in DCF switch filter and priority of rule 2 is higher. Packet hits rule 2 when two conditions of rules are satisfied. Signed-off-by: Yuying Zhang --- doc/guides/rel_notes/release_21_05.rst | 1 + drivers/net/ice/ice_acl_filter.c | 1 + drivers/net/ice/ice_fdir_filter.c | 1 + drivers/net/ice/ice_generic_flow.c | 18 ++++++++++-------- drivers/net/ice/ice_generic_flow.h | 1 + drivers/net/ice/ice_hash.c | 2 ++ drivers/net/ice/ice_switch_filter.c | 14 +++++++++----- 7 files changed, 25 insertions(+), 13 deletions(-) diff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst index d28e44c997..147b48b789 100644 --- a/doc/guides/rel_notes/release_21_05.rst +++ b/doc/guides/rel_notes/release_21_05.rst @@ -126,6 +126,7 @@ New Features * Added Intel ice support on Windows. * Added GTPU TEID support for DCF switch filter. + * Added flow priority support for DCF switch filter. * **Updated Marvell OCTEON TX2 ethdev driver.** diff --git a/drivers/net/ice/ice_acl_filter.c b/drivers/net/ice/ice_acl_filter.c index 9e06e8a3de..33756099c6 100644 --- a/drivers/net/ice/ice_acl_filter.c +++ b/drivers/net/ice/ice_acl_filter.c @@ -904,6 +904,7 @@ ice_acl_parse(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority __rte_unused, void **meta, struct rte_flow_error *error) { diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c index 92e18d59cc..3b8ea32b1a 100644 --- a/drivers/net/ice/ice_fdir_filter.c +++ b/drivers/net/ice/ice_fdir_filter.c @@ -1997,6 +1997,7 @@ ice_fdir_parse(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority __rte_unused, void **meta, struct rte_flow_error *error) { diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 8704812622..261f0b78e4 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -1774,6 +1774,7 @@ enum rte_flow_item_type pattern_eth_ipv6_pfcp[] = { typedef struct ice_flow_engine * (*parse_engine_t)(struct ice_adapter *ad, struct rte_flow *flow, struct ice_parser_list *parser_list, + uint32_t priority, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], struct rte_flow_error *error); @@ -1965,11 +1966,10 @@ ice_flow_valid_attr(struct ice_adapter *ad, } else { *ice_pipeline_stage = ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY; - /* Not supported */ - if (attr->priority) { + if (attr->priority > 1) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, - attr, "Not support priority."); + attr, "Only support priority 0 and 1."); return -rte_errno; } } @@ -2240,6 +2240,7 @@ static struct ice_flow_engine * ice_parse_engine_create(struct ice_adapter *ad, struct rte_flow *flow, struct ice_parser_list *parser_list, + uint32_t priority, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], struct rte_flow_error *error) @@ -2255,7 +2256,7 @@ ice_parse_engine_create(struct ice_adapter *ad, if (parser_node->parser->parse_pattern_action(ad, parser_node->parser->array, parser_node->parser->array_len, - pattern, actions, &meta, error) < 0) + pattern, actions, priority, &meta, error) < 0) continue; engine = parser_node->parser->engine; @@ -2273,6 +2274,7 @@ static struct ice_flow_engine * ice_parse_engine_validate(struct ice_adapter *ad, struct rte_flow *flow __rte_unused, struct ice_parser_list *parser_list, + uint32_t priority, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], struct rte_flow_error *error) @@ -2285,7 +2287,7 @@ ice_parse_engine_validate(struct ice_adapter *ad, if (parser_node->parser->parse_pattern_action(ad, parser_node->parser->array, parser_node->parser->array_len, - pattern, actions, NULL, error) < 0) + pattern, actions, priority, NULL, error) < 0) continue; engine = parser_node->parser->engine; @@ -2335,7 +2337,7 @@ ice_flow_process_filter(struct rte_eth_dev *dev, return ret; *engine = ice_parse_engine(ad, flow, &pf->rss_parser_list, - pattern, actions, error); + attr->priority, pattern, actions, error); if (*engine != NULL) return 0; @@ -2343,11 +2345,11 @@ ice_flow_process_filter(struct rte_eth_dev *dev, case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR_ONLY: case ICE_FLOW_CLASSIFY_STAGE_DISTRIBUTOR: *engine = ice_parse_engine(ad, flow, &pf->dist_parser_list, - pattern, actions, error); + attr->priority, pattern, actions, error); break; case ICE_FLOW_CLASSIFY_STAGE_PERMISSION: *engine = ice_parse_engine(ad, flow, &pf->perm_parser_list, - pattern, actions, error); + attr->priority, pattern, actions, error); break; default: return -EINVAL; diff --git a/drivers/net/ice/ice_generic_flow.h b/drivers/net/ice/ice_generic_flow.h index 9f422e5925..a4d0b6671d 100644 --- a/drivers/net/ice/ice_generic_flow.h +++ b/drivers/net/ice/ice_generic_flow.h @@ -515,6 +515,7 @@ typedef int (*parse_pattern_action_t)(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority, void **meta, struct rte_flow_error *error); diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c index e56cdf9941..f2b17197be 100644 --- a/drivers/net/ice/ice_hash.c +++ b/drivers/net/ice/ice_hash.c @@ -102,6 +102,7 @@ ice_hash_parse_pattern_action(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority, void **meta, struct rte_flow_error *error); @@ -985,6 +986,7 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority __rte_unused, void **meta, struct rte_flow_error *error) { diff --git a/drivers/net/ice/ice_switch_filter.c b/drivers/net/ice/ice_switch_filter.c index 7560fc4353..0493e4dee2 100644 --- a/drivers/net/ice/ice_switch_filter.c +++ b/drivers/net/ice/ice_switch_filter.c @@ -1621,6 +1621,7 @@ ice_switch_inset_get(const struct rte_flow_item pattern[], static int ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, const struct rte_flow_action *actions, + uint32_t priority, struct rte_flow_error *error, struct ice_adv_rule_info *rule_info) { @@ -1668,7 +1669,7 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, rule_info->sw_act.src = rule_info->sw_act.vsi_handle; rule_info->sw_act.flag = ICE_FLTR_RX; rule_info->rx = 1; - rule_info->priority = 5; + rule_info->priority = priority + 5; return 0; } @@ -1676,6 +1677,7 @@ ice_switch_parse_dcf_action(struct ice_dcf_adapter *ad, static int ice_switch_parse_action(struct ice_pf *pf, const struct rte_flow_action *actions, + uint32_t priority, struct rte_flow_error *error, struct ice_adv_rule_info *rule_info) { @@ -1746,7 +1748,7 @@ ice_switch_parse_action(struct ice_pf *pf, rule_info->sw_act.vsi_handle = vsi->idx; rule_info->rx = 1; rule_info->sw_act.src = vsi->idx; - rule_info->priority = 5; + rule_info->priority = priority + 5; return 0; @@ -1818,6 +1820,7 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, uint32_t array_len, const struct rte_flow_item pattern[], const struct rte_flow_action actions[], + uint32_t priority, void **meta, struct rte_flow_error *error) { @@ -1908,10 +1911,11 @@ ice_switch_parse_pattern_action(struct ice_adapter *ad, goto error; if (ad->hw.dcf_enabled) - ret = ice_switch_parse_dcf_action((void *)ad, actions, error, - &rule_info); + ret = ice_switch_parse_dcf_action((void *)ad, actions, priority, + error, &rule_info); else - ret = ice_switch_parse_action(pf, actions, error, &rule_info); + ret = ice_switch_parse_action(pf, actions, priority, error, + &rule_info); if (ret) goto error; -- 2.25.1