From patchwork Thu Sep 28 08:44:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Yuying" X-Patchwork-Id: 132094 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 588244265E; Thu, 28 Sep 2023 10:46:12 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9092640E01; Thu, 28 Sep 2023 10:45:41 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id 385754064A for ; Thu, 28 Sep 2023 10:45:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1695890730; x=1727426730; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=ag994wpg6dKPlThjedFewCxdgaML4uKTNBDY2e/xvGQ=; b=B3llPu8KRzggRZDFG6Cc9HSZddvnv5dKKx0n+vBh/vMC+hVfYUo5fyYx mbBx5TAO4tAM8b0lunTEU38Vi1m3AGiU9B+0NyTeOWQELmxV1DMOYkHRZ FJiim5odOBh459XDU89JlBcrNVXRjShmNP701ofbzib6lSKgOwzYzD/dB C1vfsBfGLC8WOW9zgIkwE31QlgXAOI2PdUYm7f8YuPeQQeS4DBdNLZZsa ROJLBYn9pHtkQuHWcEUOD8fiS5jd3ddXuAlA/uKZLEWhKAyx9AZGTL8GK OKZQXPbigQ3NxFvaw60kXYS0ItKv30JvD5HRqwchsfKbHHV3qja2kRJ9m Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10846"; a="468299525" X-IronPort-AV: E=Sophos;i="6.03,183,1694761200"; d="scan'208";a="468299525" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Sep 2023 01:45:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10846"; a="784622225" X-IronPort-AV: E=Sophos;i="6.03,183,1694761200"; d="scan'208";a="784622225" Received: from dpdk-wenjing-02.sh.intel.com ([10.67.119.3]) by orsmga001.jf.intel.com with ESMTP; 28 Sep 2023 01:45:27 -0700 From: yuying.zhang@intel.com To: yuying.zhang@intel.com, dev@dpdk.org, qi.z.zhang@intel.com, jingjing.wu@intel.com, beilei.xing@intel.com Subject: [PATCH v9 8/9] net/cpfl: add flow support for representor Date: Thu, 28 Sep 2023 08:44:57 +0000 Message-Id: <20230928084458.2333663-9-yuying.zhang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230928084458.2333663-1-yuying.zhang@intel.com> References: <20230927125416.2308974-1-yuying.zhang@intel.com> <20230928084458.2333663-1-yuying.zhang@intel.com> MIME-Version: 1.0 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 From: Yuying Zhang Add flow support for representor, so representor can create, destroy, validate and flush rules. Signed-off-by: Yuying Zhang --- drivers/net/cpfl/cpfl_flow_engine_fxp.c | 74 +++++++++++++++++++++++++ drivers/net/cpfl/cpfl_representor.c | 29 ++++++++++ 2 files changed, 103 insertions(+) diff --git a/drivers/net/cpfl/cpfl_flow_engine_fxp.c b/drivers/net/cpfl/cpfl_flow_engine_fxp.c index 154af5bd35..c460e6b5c6 100644 --- a/drivers/net/cpfl/cpfl_flow_engine_fxp.c +++ b/drivers/net/cpfl/cpfl_flow_engine_fxp.c @@ -73,6 +73,7 @@ cpfl_fxp_create(struct rte_eth_dev *dev, struct cpfl_adapter_ext *ad = itf->adapter; struct cpfl_rule_info_meta *rim = meta; struct cpfl_vport *vport; + struct cpfl_repr *repr; if (!rim) return ret; @@ -83,6 +84,10 @@ cpfl_fxp_create(struct rte_eth_dev *dev, * Even index is tx queue and odd index is rx queue. */ cpq_id = vport->base.devarg_id * 2; + } else if (itf->type == CPFL_ITF_TYPE_REPRESENTOR) { + repr = (struct cpfl_repr *)itf; + cpq_id = ((repr->repr_id.pf_id + repr->repr_id.vf_id) & + (CPFL_TX_CFGQ_NUM - 1)) * 2; } else { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, "fail to find correct control queue"); @@ -122,6 +127,7 @@ cpfl_fxp_destroy(struct rte_eth_dev *dev, struct cpfl_rule_info_meta *rim; uint32_t i; struct cpfl_vport *vport; + struct cpfl_repr *repr; rim = flow->rule; if (!rim) { @@ -135,6 +141,10 @@ cpfl_fxp_destroy(struct rte_eth_dev *dev, if (itf->type == CPFL_ITF_TYPE_VPORT) { vport = (struct cpfl_vport *)itf; cpq_id = vport->base.devarg_id * 2; + } else if (itf->type == CPFL_ITF_TYPE_REPRESENTOR) { + repr = (struct cpfl_repr *)itf; + cpq_id = ((repr->repr_id.pf_id + repr->repr_id.vf_id) & + (CPFL_TX_CFGQ_NUM - 1)) * 2; } else { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, "fail to find correct control queue"); @@ -414,6 +424,64 @@ cpfl_is_mod_action(const struct rte_flow_action actions[]) return false; } +static bool +cpfl_fxp_get_metadata_port(struct cpfl_itf *itf, + const struct rte_flow_action actions[]) +{ + const struct rte_flow_action *action; + enum rte_flow_action_type action_type; + const struct rte_flow_action_ethdev *ethdev; + struct cpfl_itf *target_itf; + bool ret; + + if (itf->type == CPFL_ITF_TYPE_VPORT) { + ret = cpfl_metadata_write_port_id(itf); + if (!ret) { + PMD_DRV_LOG(ERR, "fail to write port id"); + return false; + } + } + + ret = cpfl_metadata_write_sourcevsi(itf); + if (!ret) { + PMD_DRV_LOG(ERR, "fail to write source vsi id"); + return false; + } + + ret = cpfl_metadata_write_vsi(itf); + if (!ret) { + PMD_DRV_LOG(ERR, "fail to write vsi id"); + return false; + } + + if (!actions || actions->type == RTE_FLOW_ACTION_TYPE_END) + return false; + + for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; action++) { + action_type = action->type; + switch (action_type) { + case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT: + case RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR: + ethdev = (const struct rte_flow_action_ethdev *)action->conf; + target_itf = cpfl_get_itf_by_port_id(ethdev->port_id); + if (!target_itf) { + PMD_DRV_LOG(ERR, "fail to get target_itf by port id"); + return false; + } + ret = cpfl_metadata_write_targetvsi(target_itf); + if (!ret) { + PMD_DRV_LOG(ERR, "fail to write target vsi id"); + return false; + } + break; + default: + continue; + } + } + + return true; +} + static int cpfl_fxp_parse_pattern_action(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -430,6 +498,12 @@ cpfl_fxp_parse_pattern_action(struct rte_eth_dev *dev, struct cpfl_rule_info_meta *rim; int ret; + ret = cpfl_fxp_get_metadata_port(itf, actions); + if (!ret) { + PMD_DRV_LOG(ERR, "Fail to save metadata."); + return -EINVAL; + } + ret = cpfl_flow_parse_items(itf, adapter->flow_parser, pattern, attr, &pr_action); if (ret) { PMD_DRV_LOG(ERR, "No Match pattern support."); diff --git a/drivers/net/cpfl/cpfl_representor.c b/drivers/net/cpfl/cpfl_representor.c index 4d15a26c80..de3b426727 100644 --- a/drivers/net/cpfl/cpfl_representor.c +++ b/drivers/net/cpfl/cpfl_representor.c @@ -4,6 +4,8 @@ #include "cpfl_representor.h" #include "cpfl_rxtx.h" +#include "cpfl_flow.h" +#include "cpfl_rules.h" static int cpfl_repr_allowlist_update(struct cpfl_adapter_ext *adapter, @@ -374,6 +376,22 @@ cpfl_repr_link_update(struct rte_eth_dev *ethdev, return 0; } +static int +cpfl_dev_repr_flow_ops_get(struct rte_eth_dev *dev, + const struct rte_flow_ops **ops) +{ + if (!dev) + return -EINVAL; + +#ifdef RTE_HAS_JANSSON + *ops = &cpfl_flow_ops; +#else + *ops = NULL; + PMD_DRV_LOG(NOTICE, "not support rte_flow, please install json-c library."); +#endif + return 0; +} + static const struct eth_dev_ops cpfl_repr_dev_ops = { .dev_start = cpfl_repr_dev_start, .dev_stop = cpfl_repr_dev_stop, @@ -385,6 +403,7 @@ static const struct eth_dev_ops cpfl_repr_dev_ops = { .tx_queue_setup = cpfl_repr_tx_queue_setup, .link_update = cpfl_repr_link_update, + .flow_ops_get = cpfl_dev_repr_flow_ops_get, }; static int @@ -393,6 +412,7 @@ cpfl_repr_init(struct rte_eth_dev *eth_dev, void *init_param) struct cpfl_repr *repr = CPFL_DEV_TO_REPR(eth_dev); struct cpfl_repr_param *param = init_param; struct cpfl_adapter_ext *adapter = param->adapter; + int ret; repr->repr_id = param->repr_id; repr->vport_info = param->vport_info; @@ -402,6 +422,15 @@ cpfl_repr_init(struct rte_eth_dev *eth_dev, void *init_param) if (repr->vport_info->vport.info.vport_status == CPCHNL2_VPORT_STATUS_ENABLED) repr->func_up = true; + TAILQ_INIT(&repr->itf.flow_list); + memset(repr->itf.dma, 0, sizeof(repr->itf.dma)); + memset(repr->itf.msg, 0, sizeof(repr->itf.msg)); + ret = cpfl_alloc_dma_mem_batch(&repr->itf.flow_dma, repr->itf.dma, + sizeof(union cpfl_rule_cfg_pkt_record), + CPFL_FLOW_BATCH_SIZE); + if (ret < 0) + return ret; + eth_dev->dev_ops = &cpfl_repr_dev_ops; eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;