From patchwork Fri Oct 1 13:47:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 100282 X-Patchwork-Delegate: ferruh.yigit@amd.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 A8EDEA0032; Fri, 1 Oct 2021 15:48:15 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1BEAF411F6; Fri, 1 Oct 2021 15:48:01 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 114ED411E6 for ; Fri, 1 Oct 2021 15:47:59 +0200 (CEST) Received: by shelob.oktetlabs.ru (Postfix, from userid 122) id B949A7F6E4; Fri, 1 Oct 2021 16:47:58 +0300 (MSK) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=ALL_TRUSTED, DKIM_ADSP_DISCARD, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17]) by shelob.oktetlabs.ru (Postfix) with ESMTP id 210E77F6D7; Fri, 1 Oct 2021 16:47:28 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 210E77F6D7 Authentication-Results: shelob.oktetlabs.ru/210E77F6D7; dkim=none; dkim-atps=neutral From: Andrew Rybchenko To: Ajit Khaparde , Somnath Kotur Cc: dev@dpdk.org, Ori Kam , Thomas Monjalon , Ferruh Yigit , Ivan Malov Date: Fri, 1 Oct 2021 16:47:11 +0300 Message-Id: <20211001134716.1608857-8-andrew.rybchenko@oktetlabs.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211001134716.1608857-1-andrew.rybchenko@oktetlabs.ru> References: <20210907125157.3843-1-ivan.malov@oktetlabs.ru> <20211001134716.1608857-1-andrew.rybchenko@oktetlabs.ru> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 07/12] net/bnxt: support ethdev and E-Switch port flow items 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" Add support for RTE_FLOW_ITEM_TYPE_ETHDEV and RTE_FLOW_ITEM_TYPE_ESWITCH_PORT items based on RTE_FLOW_ITEM_TYPE_PORT_ID action. The major difference of these items from PORT_ID is that these new items define traffic direction itself. ETHDEV is always from the driver vNIC. ESWITCH_PORT is either from v-port (network) or VF vNIC (VF representor case). Signed-off-by: Andrew Rybchenko --- drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c | 10 ++- drivers/net/bnxt/tf_ulp/ulp_rte_parser.c | 80 ++++++++++++++----- drivers/net/bnxt/tf_ulp/ulp_rte_parser.h | 9 ++- 3 files changed, 76 insertions(+), 23 deletions(-) diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c index 9b165c12b5..87914cc845 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c @@ -266,7 +266,7 @@ struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = { }, [RTE_FLOW_ITEM_TYPE_PORT_ID] = { .hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED, - .proto_hdr_func = ulp_rte_port_id_hdr_handler + .proto_hdr_func = ulp_rte_port_hdr_handler }, [RTE_FLOW_ITEM_TYPE_RAW] = { .hdr_type = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED, @@ -427,6 +427,14 @@ struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = { [RTE_FLOW_ITEM_TYPE_HIGIG2] = { .hdr_type = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED, .proto_hdr_func = NULL + }, + [RTE_FLOW_ITEM_TYPE_ETHDEV] = { + .hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED, + .proto_hdr_func = ulp_rte_port_hdr_handler + }, + [RTE_FLOW_ITEM_TYPE_ESWITCH_PORT] = { + .hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED, + .proto_hdr_func = ulp_rte_port_hdr_handler } }; diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c index 3a9c9bba27..c747150864 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c @@ -400,7 +400,8 @@ bnxt_ulp_rte_parser_direction_compute(struct ulp_rte_parser_params *params) static int32_t ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params, uint32_t ifindex, - uint16_t mask) + uint16_t mask, + enum bnxt_ulp_direction_type item_dir) { uint16_t svif; enum bnxt_ulp_direction_type dir; @@ -429,11 +430,14 @@ ulp_rte_parser_svif_set(struct ulp_rte_parser_params *params, bnxt_ulp_rte_parser_direction_compute(params); /* Get the computed direction */ - dir = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION); - if (dir == BNXT_ULP_DIR_INGRESS) { + dir = (item_dir != BNXT_ULP_DIR_INVALID) ? item_dir : + ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_DIRECTION); + if (dir == BNXT_ULP_DIR_INGRESS && + port_type != BNXT_ULP_INTF_TYPE_VF_REP) { svif_type = BNXT_ULP_PHY_PORT_SVIF; } else { - if (port_type == BNXT_ULP_INTF_TYPE_VF_REP) + if (port_type == BNXT_ULP_INTF_TYPE_VF_REP && + item_dir != BNXT_ULP_DIR_EGRESS) svif_type = BNXT_ULP_VF_FUNC_SVIF; else svif_type = BNXT_ULP_DRV_FUNC_SVIF; @@ -474,7 +478,8 @@ ulp_rte_parser_implicit_match_port_process(struct ulp_rte_parser_params *params) } /* Update the SVIF details */ - rc = ulp_rte_parser_svif_set(params, ifindex, svif_mask); + rc = ulp_rte_parser_svif_set(params, ifindex, svif_mask, + BNXT_ULP_DIR_INVALID); return rc; } @@ -522,7 +527,8 @@ ulp_rte_pf_hdr_handler(const struct rte_flow_item *item __rte_unused, } /* Update the SVIF details */ - return ulp_rte_parser_svif_set(params, ifindex, svif_mask); + return ulp_rte_parser_svif_set(params, ifindex, svif_mask, + BNXT_ULP_DIR_INVALID); } /* Function to handle the parsing of RTE Flow item VF Header. */ @@ -555,39 +561,75 @@ ulp_rte_vf_hdr_handler(const struct rte_flow_item *item, return rc; } /* Update the SVIF details */ - return ulp_rte_parser_svif_set(params, ifindex, mask); + return ulp_rte_parser_svif_set(params, ifindex, mask, + BNXT_ULP_DIR_INVALID); } -/* Function to handle the parsing of RTE Flow item port id Header. */ +/* + * Function to handle the parsing of RTE Flow items port id, ethdev and + * E-Switch port Headers. + */ int32_t -ulp_rte_port_id_hdr_handler(const struct rte_flow_item *item, - struct ulp_rte_parser_params *params) +ulp_rte_port_hdr_handler(const struct rte_flow_item *item, + struct ulp_rte_parser_params *params) { - const struct rte_flow_item_port_id *port_spec = item->spec; - const struct rte_flow_item_port_id *port_mask = item->mask; + enum bnxt_ulp_direction_type item_dir; + uint16_t ethdev_id; uint16_t mask = 0; int32_t rc = BNXT_TF_RC_PARSE_ERR; uint32_t ifindex; - if (!port_spec) { - BNXT_TF_DBG(ERR, "ParseErr:Port id is not valid\n"); + if (!item->spec) { + BNXT_TF_DBG(ERR, "ParseErr:Port spec is not valid\n"); return rc; } - if (!port_mask) { - BNXT_TF_DBG(ERR, "ParseErr:Phy Port mask is not valid\n"); + if (!item->mask) { + BNXT_TF_DBG(ERR, "ParseErr:Port mask is not valid\n"); + return rc; + } + + switch (item->type) { + case RTE_FLOW_ITEM_TYPE_PORT_ID: { + const struct rte_flow_item_port_id *port_spec = item->spec; + const struct rte_flow_item_port_id *port_mask = item->mask; + + item_dir = BNXT_ULP_DIR_INVALID; + ethdev_id = port_spec->id; + mask = port_mask->id; + break; + } + case RTE_FLOW_ITEM_TYPE_ETHDEV: { + const struct rte_flow_item_ethdev *ethdev_spec = item->spec; + const struct rte_flow_item_ethdev *ethdev_mask = item->mask; + + item_dir = BNXT_ULP_DIR_INGRESS; + ethdev_id = ethdev_spec->id; + mask = ethdev_mask->id; + break; + } + case RTE_FLOW_ITEM_TYPE_ESWITCH_PORT: { + const struct rte_flow_item_ethdev *ethdev_spec = item->spec; + const struct rte_flow_item_ethdev *ethdev_mask = item->mask; + + item_dir = BNXT_ULP_DIR_EGRESS; + ethdev_id = ethdev_spec->id; + mask = ethdev_mask->id; + break; + } + default: + BNXT_TF_DBG(ERR, "ParseErr:Unexpected item\n"); return rc; } - mask = port_mask->id; /* perform the conversion from dpdk port to bnxt ifindex */ if (ulp_port_db_dev_port_to_ulp_index(params->ulp_ctx, - port_spec->id, + ethdev_id, &ifindex)) { BNXT_TF_DBG(ERR, "ParseErr:Portid is not valid\n"); return rc; } /* Update the SVIF details */ - return ulp_rte_parser_svif_set(params, ifindex, mask); + return ulp_rte_parser_svif_set(params, ifindex, mask, item_dir); } /* Function to handle the parsing of RTE Flow item phy port Header. */ diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h index e14f86278a..531596b00d 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h @@ -90,10 +90,13 @@ int32_t ulp_rte_vf_hdr_handler(const struct rte_flow_item *item, struct ulp_rte_parser_params *params); -/* Function to handle the parsing of RTE Flow item port id Header. */ +/* + * Function to handle the parsing of RTE Flow items port id, ethdev and + * E-Switch port Headers. + */ int32_t -ulp_rte_port_id_hdr_handler(const struct rte_flow_item *item, - struct ulp_rte_parser_params *params); +ulp_rte_port_hdr_handler(const struct rte_flow_item *item, + struct ulp_rte_parser_params *params); /* Function to handle the parsing of RTE Flow item port Header. */ int32_t