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 C6122A0C55; Wed, 13 Oct 2021 18:43:52 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 95AA94118B; Wed, 13 Oct 2021 18:43:12 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 305FB410E8 for ; Wed, 13 Oct 2021 18:42:59 +0200 (CEST) Received: from localhost.localdomain (unknown [5.144.123.99]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id CE06B7F6FC; Wed, 13 Oct 2021 19:42:58 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru CE06B7F6FC DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1634143378; bh=URYabuZDBCY0IZHm+Vn/eD4nRsuEIdXKC7WAvV4bKlE=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=lQHf94UO2S1hQTr90mQ29y1290X+DZtxfWw9aZgjgdbUlVk0Qtk7lOOPrCF+OFtHp lvrVdPVa5eYht/YHCVKvvBJ5Kc3w4I7krpEkLCQ6k2qxbddCzKidWeYk+SM4vQAZE+ Gbmwc67UNjtGRX1/a57SOAqW0p5yKQ9NAMz5EIhA= From: Ivan Malov To: dev@dpdk.org Cc: Ferruh Yigit , Thomas Monjalon , Ori Kam , Andrew Rybchenko , Ajit Khaparde , Somnath Kotur Date: Wed, 13 Oct 2021 19:42:39 +0300 Message-Id: <20211013164243.21264-9-ivan.malov@oktetlabs.ru> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20211013164243.21264-1-ivan.malov@oktetlabs.ru> References: <20211001134716.1608857-1-andrew.rybchenko@oktetlabs.ru> <20211013164243.21264-1-ivan.malov@oktetlabs.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v4 08/12] net/bnxt: support meta flow actions to overrule destinations 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" From: Andrew Rybchenko Add support for actions PORT_REPRESENTOR and REPRESENTED_PORT based on the existing support for action PORT_ID. Signed-off-by: Andrew Rybchenko --- doc/guides/nics/features/bnxt.ini | 2 + drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c | 12 ++- drivers/net/bnxt/tf_ulp/ulp_rte_parser.c | 84 ++++++++++++++----- drivers/net/bnxt/tf_ulp/ulp_rte_parser.h | 6 +- 4 files changed, 79 insertions(+), 25 deletions(-) diff --git a/doc/guides/nics/features/bnxt.ini b/doc/guides/nics/features/bnxt.ini index 1b58caa4ac..0a85249155 100644 --- a/doc/guides/nics/features/bnxt.ini +++ b/doc/guides/nics/features/bnxt.ini @@ -94,3 +94,5 @@ set_tp_src = Y vf = Y vxlan_decap = Y vxlan_encap = Y +port_representor = Y +represented_port = Y 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 d28dd2e587..e9337ecd2c 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c @@ -67,7 +67,7 @@ struct bnxt_ulp_rte_act_info ulp_act_info[] = { }, [RTE_FLOW_ACTION_TYPE_PORT_ID] = { .act_type = BNXT_ULP_ACT_TYPE_SUPPORTED, - .proto_act_func = ulp_rte_port_id_act_handler + .proto_act_func = ulp_rte_port_act_handler }, [RTE_FLOW_ACTION_TYPE_METER] = { .act_type = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED, @@ -212,7 +212,15 @@ struct bnxt_ulp_rte_act_info ulp_act_info[] = { [RTE_FLOW_ACTION_TYPE_SAMPLE] = { .act_type = BNXT_ULP_ACT_TYPE_SUPPORTED, .proto_act_func = ulp_rte_sample_act_handler - } + }, + [RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR] = { + .act_type = BNXT_ULP_ACT_TYPE_SUPPORTED, + .proto_act_func = ulp_rte_port_act_handler + }, + [RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT] = { + .act_type = BNXT_ULP_ACT_TYPE_SUPPORTED, + .proto_act_func = ulp_rte_port_act_handler + }, }; struct bnxt_ulp_rte_act_info ulp_vendor_act_info[] = { diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c index efda522c3e..40da953f06 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c @@ -496,10 +496,11 @@ ulp_rte_parser_implicit_act_port_process(struct ulp_rte_parser_params *params) return BNXT_TF_RC_SUCCESS; } port_id.id = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_INCOMING_IF); + action_item.type = RTE_FLOW_ACTION_TYPE_PORT_ID; action_item.conf = &port_id; /* Update the action port based on incoming port */ - ulp_rte_port_id_act_handler(&action_item, params); + ulp_rte_port_act_handler(&action_item, params); /* Reset the action port set bit */ ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_IS_SET, 0); @@ -2163,7 +2164,8 @@ ulp_rte_count_act_handler(const struct rte_flow_action *action_item, /* Function to handle the parsing of action ports. */ static int32_t ulp_rte_parser_act_port_set(struct ulp_rte_parser_params *param, - uint32_t ifindex) + uint32_t ifindex, + enum bnxt_ulp_direction_type act_dir) { enum bnxt_ulp_direction_type dir; uint16_t pid_s; @@ -2173,8 +2175,13 @@ ulp_rte_parser_act_port_set(struct ulp_rte_parser_params *param, uint32_t vnic_type; /* Get the direction */ - dir = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_DIRECTION); - if (dir == BNXT_ULP_DIR_EGRESS) { + /* If action implicitly specifies direction, use the specification. */ + dir = (act_dir == BNXT_ULP_DIR_INVALID) ? + ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_DIRECTION) : + act_dir; + port_type = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_ACT_PORT_TYPE); + if (dir == BNXT_ULP_DIR_EGRESS && + port_type != BNXT_ULP_INTF_TYPE_VF_REP) { /* For egress direction, fill vport */ if (ulp_port_db_vport_get(param->ulp_ctx, ifindex, &pid_s)) return BNXT_TF_RC_ERROR; @@ -2185,9 +2192,17 @@ ulp_rte_parser_act_port_set(struct ulp_rte_parser_params *param, &pid, BNXT_ULP_ACT_PROP_SZ_VPORT); } else { /* For ingress direction, fill vnic */ - port_type = ULP_COMP_FLD_IDX_RD(param, - BNXT_ULP_CF_IDX_ACT_PORT_TYPE); - if (port_type == BNXT_ULP_INTF_TYPE_VF_REP) + /* + * Action Destination + * ------------------------------------ + * PORT_REPRESENTOR Driver Function + * ------------------------------------ + * REPRESENTED_PORT VF + * ------------------------------------ + * PORT_ID VF + */ + if (act_dir != BNXT_ULP_DIR_INGRESS && + port_type == BNXT_ULP_INTF_TYPE_VF_REP) vnic_type = BNXT_ULP_VF_FUNC_VNIC; else vnic_type = BNXT_ULP_DRV_FUNC_VNIC; @@ -2234,7 +2249,8 @@ ulp_rte_pf_act_handler(const struct rte_flow_action *action_item __rte_unused, } /* Update the action properties */ ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type); - return ulp_rte_parser_act_port_set(params, ifindex); + return ulp_rte_parser_act_port_set(params, ifindex, + BNXT_ULP_DIR_INVALID); } /* Function to handle the parsing of RTE Flow action VF. */ @@ -2285,31 +2301,59 @@ ulp_rte_vf_act_handler(const struct rte_flow_action *action_item, /* Update the action properties */ ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type); - return ulp_rte_parser_act_port_set(params, ifindex); + return ulp_rte_parser_act_port_set(params, ifindex, + BNXT_ULP_DIR_INVALID); } -/* Function to handle the parsing of RTE Flow action port_id. */ +/* Parse actions PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */ int32_t -ulp_rte_port_id_act_handler(const struct rte_flow_action *act_item, - struct ulp_rte_parser_params *param) +ulp_rte_port_act_handler(const struct rte_flow_action *act_item, + struct ulp_rte_parser_params *param) { - const struct rte_flow_action_port_id *port_id = act_item->conf; + uint32_t ethdev_id; uint32_t ifindex; enum bnxt_ulp_intf_type intf_type; + enum bnxt_ulp_direction_type act_dir; - if (!port_id) { + if (!act_item->conf) { BNXT_TF_DBG(ERR, "ParseErr: Invalid Argument\n"); return BNXT_TF_RC_PARSE_ERR; } - if (port_id->original) { - BNXT_TF_DBG(ERR, - "ParseErr:Portid Original not supported\n"); - return BNXT_TF_RC_PARSE_ERR; + switch (act_item->type) { + case RTE_FLOW_ACTION_TYPE_PORT_ID: { + const struct rte_flow_action_port_id *port_id = act_item->conf; + + if (port_id->original) { + BNXT_TF_DBG(ERR, + "ParseErr:Portid Original not supported\n"); + return BNXT_TF_RC_PARSE_ERR; + } + ethdev_id = port_id->id; + act_dir = BNXT_ULP_DIR_INVALID; + break; + } + case RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR: { + const struct rte_flow_action_ethdev *ethdev = act_item->conf; + + ethdev_id = ethdev->port_id; + act_dir = BNXT_ULP_DIR_INGRESS; + break; + } + case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT: { + const struct rte_flow_action_ethdev *ethdev = act_item->conf; + + ethdev_id = ethdev->port_id; + act_dir = BNXT_ULP_DIR_EGRESS; + break; + } + default: + BNXT_TF_DBG(ERR, "Unknown port action\n"); + return BNXT_TF_RC_ERROR; } /* Get the port db ifindex */ - if (ulp_port_db_dev_port_to_ulp_index(param->ulp_ctx, port_id->id, + if (ulp_port_db_dev_port_to_ulp_index(param->ulp_ctx, ethdev_id, &ifindex)) { BNXT_TF_DBG(ERR, "Invalid port id\n"); return BNXT_TF_RC_ERROR; @@ -2324,7 +2368,7 @@ ulp_rte_port_id_act_handler(const struct rte_flow_action *act_item, /* Set the action port */ ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type); - return ulp_rte_parser_act_port_set(param, ifindex); + return ulp_rte_parser_act_port_set(param, ifindex, act_dir); } /* Function to handle the parsing of RTE Flow action phy_port. */ diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h index 0acb93946b..e4225d00f8 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h @@ -204,10 +204,10 @@ int32_t ulp_rte_vf_act_handler(const struct rte_flow_action *action_item, struct ulp_rte_parser_params *params); -/* Function to handle the parsing of RTE Flow action port_id. */ +/* Parse actions PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */ int32_t -ulp_rte_port_id_act_handler(const struct rte_flow_action *act_item, - struct ulp_rte_parser_params *params); +ulp_rte_port_act_handler(const struct rte_flow_action *act_item, + struct ulp_rte_parser_params *params); /* Function to handle the parsing of RTE Flow action phy_port. */ int32_t -- 2.20.1