From patchwork Sun Jun 13 00:06:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 94133 X-Patchwork-Delegate: ajit.khaparde@broadcom.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 8D0B5A0C41; Sun, 13 Jun 2021 02:13:00 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DBCF841213; Sun, 13 Jun 2021 02:08:30 +0200 (CEST) Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.172]) by mails.dpdk.org (Postfix) with ESMTP id CBB7141212 for ; Sun, 13 Jun 2021 02:08:29 +0200 (CEST) Received: by mail-pg1-f172.google.com with SMTP id o9so5638045pgd.2 for ; Sat, 12 Jun 2021 17:08:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version; bh=YSIgF3WVGgd/ZyORNmw+cGB9aJmF/+035wm741vkeGA=; b=PUcR4Kga3kAaDC2ivhWtAX4wCBDG+3WvdNdEqQxyKlV0f8OGE9PKOCKWJFgU8eh2a0 YsXSTdtVRaoureDAjdTwFFtFdHMfFLDgcrVxwzJovhImWMqnAPpyhx+mxXClvjOdaxDE Qd956N3qxLvhd2TmncUcmId2HhM8M9lp9l6uI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version; bh=YSIgF3WVGgd/ZyORNmw+cGB9aJmF/+035wm741vkeGA=; b=P2LIVX/kqvdY/z1MpA/Kg2QHOG7xbx9dw0u18421ImaNLSsGgYZQIw3iDXo0Mexu0G N5J3p24xbX36mszC0vlMoZMvYiDYhKBRu2oVgC/dvWneUUoaiFu5Tx5+xe1Nx2rI932R AmKuhhumKLjuzmRnucj9ZMcx0OQVwyu1NRhmAS3x08l0XOU4hjVRkgjfpp+ykZlYshPV YCIOOU+As8RVvAxoBlg8iv6J2Gqqd2HA5kM2yu1w+JjD+kWFY2oST4jxMHe2jmKFjk4x tE0KzKz4xVYaC4eTREcSjDQJ60lmSZxZN37fD4xSdnYFWOQ1HDamPaVS6/cL5NbDOAED h8Iw== X-Gm-Message-State: AOAM532wUTQnKpOG031bnba/0MqsVqEDaYljJxnfeWx6lfJYNOyw8MIc wgB8Cp4s8HveWGjT8z8z77vRFxP6rLUPARDLVycy9IzMRqfm8FSBfY8/Dm9ir+IEqSif18dCaWM Hwa7GleIcPVLqne8sAbmsaCLOag8oU8DBU8WclPeBvBIqtuti7D2XDCDO2+TIJr0= X-Google-Smtp-Source: ABdhPJwGFsV++tstpNcAeS+U7ilLx9DYRnzX98ZwamoETe2Sjr8TtKmegxJ8DsMCD0fX6+D4df6Geg== X-Received: by 2002:a63:6bc1:: with SMTP id g184mr10466600pgc.116.1623542908414; Sat, 12 Jun 2021 17:08:28 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id gg22sm12774609pjb.17.2021.06.12.17.08.27 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 12 Jun 2021 17:08:27 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Venkat Duvvuru , Somnath Kotur Date: Sat, 12 Jun 2021 17:06:36 -0700 Message-Id: <20210613000652.28191-43-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20210613000652.28191-1-ajit.khaparde@broadcom.com> References: <20210530085929.29695-1-venkatkumar.duvvuru@broadcom.com> <20210613000652.28191-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [dpdk-dev] [PATCH v2 42/58] net/bnxt: add support for GRE flows 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: Venkat Duvvuru This patch does the following to support GRE flows: 1. RTE_FLOW_ITEM_TYPE_ANY & RTE_FLOW_ITEM_TYPE_GRE processing 2. Calculate the absolute function ID from the logical VF ID passed as part of RTE_FLOW_ACTION_TYPE_VF action. 3. Move bnxt_get_bp API to bnxt_ethdev.c Signed-off-by: Venkat Duvvuru Reviewed-by: Somnath Kotur Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/bnxt.h | 1 + drivers/net/bnxt/bnxt_ethdev.c | 26 +++++++ drivers/net/bnxt/tf_ulp/ulp_rte_parser.c | 75 ++++++++++++++++++- drivers/net/bnxt/tf_ulp/ulp_rte_parser.h | 9 +++ drivers/net/bnxt/tf_ulp/ulp_template_struct.h | 2 + 5 files changed, 110 insertions(+), 3 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index 532755467f..4286c99079 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -1027,6 +1027,7 @@ bnxt_ulp_create_vfr_default_rules(struct rte_eth_dev *vfr_ethdev); int32_t bnxt_ulp_delete_vfr_default_rules(struct bnxt_representor *vfr); uint16_t bnxt_get_vnic_id(uint16_t port, enum bnxt_ulp_intf_type type); +struct bnxt *bnxt_get_bp(uint16_t port); uint16_t bnxt_get_svif(uint16_t port_id, bool func_svif, enum bnxt_ulp_intf_type type); uint16_t bnxt_get_fw_func_id(uint16_t port, enum bnxt_ulp_intf_type type); diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index b77f12bbb4..eff4798167 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -4866,6 +4866,32 @@ static void bnxt_config_vf_req_fwd(struct bnxt *bp) BNXT_HWRM_CMD_TO_FORWARD(HWRM_OEM_CMD); } +struct bnxt * +bnxt_get_bp(uint16_t port) +{ + struct bnxt *bp; + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port)) { + PMD_DRV_LOG(ERR, "Invalid port %d\n", port); + return NULL; + } + + dev = &rte_eth_devices[port]; + if (!is_bnxt_supported(dev)) { + PMD_DRV_LOG(ERR, "Device %d not supported\n", port); + return NULL; + } + + bp = (struct bnxt *)dev->data->dev_private; + if (!BNXT_TRUFLOW_EN(bp)) { + PMD_DRV_LOG(ERR, "TRUFLOW not enabled\n"); + return NULL; + } + + return bp; +} + uint16_t bnxt_get_svif(uint16_t port_id, bool func_svif, enum bnxt_ulp_intf_type type) diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c index 3c45acd18f..1f5455a3f3 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c @@ -1008,6 +1008,9 @@ ulp_rte_ipv4_hdr_handler(const struct rte_flow_item *item, ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3, 1); } + if (proto == IPPROTO_GRE) + ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_T_GRE); + /* Update the field protocol hdr bitmap */ ulp_rte_l3_proto_type_update(params, proto, inner_flag); ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L3_HDR_CNT, ++cnt); @@ -1146,6 +1149,9 @@ ulp_rte_ipv6_hdr_handler(const struct rte_flow_item *item, ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_O_L3, 1); } + if (proto == IPPROTO_GRE) + ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_T_GRE); + /* Update the field protocol hdr bitmap */ ulp_rte_l3_proto_type_update(params, proto, inner_flag); ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L3_HDR_CNT, ++cnt); @@ -1420,6 +1426,57 @@ ulp_rte_vxlan_hdr_handler(const struct rte_flow_item *item, return BNXT_TF_RC_SUCCESS; } +/* Function to handle the parsing of RTE Flow item GRE Header. */ +int32_t +ulp_rte_gre_hdr_handler(const struct rte_flow_item *item, + struct ulp_rte_parser_params *params) +{ + const struct rte_flow_item_gre *gre_spec = item->spec; + const struct rte_flow_item_gre *gre_mask = item->mask; + struct ulp_rte_hdr_bitmap *hdr_bitmap = ¶ms->hdr_bitmap; + uint32_t idx = params->field_idx; + uint32_t size; + struct ulp_rte_hdr_field *field; + + if (!gre_spec && !gre_mask) { + BNXT_TF_DBG(ERR, "Parse Error: GRE item is invalid\n"); + return BNXT_TF_RC_ERROR; + } + + if (gre_spec) { + size = sizeof(gre_spec->c_rsvd0_ver); + field = ulp_rte_parser_fld_copy(¶ms->hdr_field[idx], + &gre_spec->c_rsvd0_ver, + size); + size = sizeof(gre_spec->protocol); + field = ulp_rte_parser_fld_copy(field, + &gre_spec->protocol, + size); + } + if (gre_mask) { + ulp_rte_prsr_mask_copy(params, &idx, + &gre_mask->c_rsvd0_ver, + sizeof(gre_mask->c_rsvd0_ver)); + ulp_rte_prsr_mask_copy(params, &idx, + &gre_mask->protocol, + sizeof(gre_mask->protocol)); + } + /* Add number of GRE header elements */ + params->field_idx += BNXT_ULP_PROTO_HDR_GRE_NUM; + + /* Update the hdr_bitmap with GRE */ + ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_T_GRE); + return BNXT_TF_RC_SUCCESS; +} + +/* Function to handle the parsing of RTE Flow item ANY. */ +int32_t +ulp_rte_item_any_handler(const struct rte_flow_item *item __rte_unused, + struct ulp_rte_parser_params *params __rte_unused) +{ + return BNXT_TF_RC_SUCCESS; +} + /* Function to handle the parsing of RTE Flow item void Header */ int32_t ulp_rte_void_hdr_handler(const struct rte_flow_item *item __rte_unused, @@ -1879,8 +1936,9 @@ ulp_rte_vf_act_handler(const struct rte_flow_action *action_item, struct ulp_rte_parser_params *params) { const struct rte_flow_action_vf *vf_action; - uint32_t ifindex; enum bnxt_ulp_intf_type intf_type; + uint32_t ifindex; + struct bnxt *bp; vf_action = action_item->conf; if (!vf_action) { @@ -1893,12 +1951,23 @@ ulp_rte_vf_act_handler(const struct rte_flow_action *action_item, return BNXT_TF_RC_PARSE_ERR; } - /* Check the port is VF port */ - if (ulp_port_db_dev_func_id_to_ulp_index(params->ulp_ctx, vf_action->id, + bp = bnxt_get_bp(params->port_id); + if (bp == NULL) { + BNXT_TF_DBG(ERR, "Invalid bp\n"); + return BNXT_TF_RC_ERROR; + } + + /* vf_action->id is a logical number which in this case is an + * offset from the first VF. So, to get the absolute VF id, the + * offset must be added to the absolute first vf id of that port. + */ + if (ulp_port_db_dev_func_id_to_ulp_index(params->ulp_ctx, + bp->first_vf_id + vf_action->id, &ifindex)) { BNXT_TF_DBG(ERR, "VF is not valid interface\n"); return BNXT_TF_RC_ERROR; } + /* Check the port is VF port */ intf_type = ulp_port_db_port_type_get(params->ulp_ctx, ifindex); if (intf_type != BNXT_ULP_INTF_TYPE_VF && intf_type != BNXT_ULP_INTF_TYPE_TRUSTED_VF) { diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h index 27a5131bb3..d78a333f3b 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h +++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h @@ -126,6 +126,15 @@ int32_t ulp_rte_vxlan_hdr_handler(const struct rte_flow_item *item, struct ulp_rte_parser_params *params); +/* Function to handle the parsing of RTE Flow item GRE Header. */ +int32_t +ulp_rte_gre_hdr_handler(const struct rte_flow_item *item, + struct ulp_rte_parser_params *params); + +int32_t +ulp_rte_item_any_handler(const struct rte_flow_item *item __rte_unused, + struct ulp_rte_parser_params *params __rte_unused); + /* Function to handle the parsing of RTE Flow item void Header. */ int32_t ulp_rte_void_hdr_handler(const struct rte_flow_item *item, diff --git a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h index 20a988a03a..0a5bb1762c 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_template_struct.h +++ b/drivers/net/bnxt/tf_ulp/ulp_template_struct.h @@ -27,6 +27,7 @@ #define BNXT_ULP_PROTO_HDR_UDP_NUM 4 #define BNXT_ULP_PROTO_HDR_TCP_NUM 9 #define BNXT_ULP_PROTO_HDR_VXLAN_NUM 4 +#define BNXT_ULP_PROTO_HDR_GRE_NUM 6 #define BNXT_ULP_PROTO_HDR_MAX 128 #define BNXT_ULP_PROTO_HDR_FIELD_SVIF_IDX 1 @@ -76,6 +77,7 @@ struct ulp_rte_parser_params { uint32_t parent_flow; uint32_t parent_fid; uint16_t func_id; + uint16_t port_id; uint32_t class_id; uint32_t act_tmpl; struct bnxt_ulp_context *ulp_ctx;