From patchwork Tue Mar 1 09:00:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Kumar Kori X-Patchwork-Id: 108419 X-Patchwork-Delegate: jerinj@marvell.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 B7682A034F; Tue, 1 Mar 2022 10:01:05 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 94D7B40DF6; Tue, 1 Mar 2022 10:01:05 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id CF852407FF for ; Tue, 1 Mar 2022 10:01:03 +0100 (CET) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 2218xXZq006008 for ; Tue, 1 Mar 2022 01:01:03 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=KVR7F14lbu6u8POREjDcg9uc9R2GmfcuWvyZlYVRyhM=; b=R3Eqd2pwA4/2IFHJJR1eTW+sBPHNEt5o9UDWYGe8GbhkmY0enJ0KWfSwUkEczuciMEgW zqORMYczVVhC0uucEVAifCArLwwJV6RgISP3nLIL2AYTbmzYkOisUiMoL0w4NjNQc9ix 1exntlYnJ7yrdxg8Q6FsHlkfpGkWNJ+VptJE2Qlet4BqlEFPpH2ht8HU7eD5oY5UJ3vH kkRtJrIxKd5RMpChADUlPKpmxLj1GjSp1ekZhKtSB84S9L0npZcnsxkt4fU8lruT69mM dznPUJaTrxVyvaMCkU1kn1RUAfCY3AiGpjNU03ATBKQ81Vzy2JbEGGM5IqHAMpCxFERD Ww== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3ehgf4009s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Tue, 01 Mar 2022 01:01:02 -0800 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 1 Mar 2022 01:01:01 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 1 Mar 2022 01:01:01 -0800 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id 9C2A53F707F; Tue, 1 Mar 2022 01:00:59 -0800 (PST) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: Subject: [PATCH v1 1/3] common/cnxk: update precolor table setup for VLAN Date: Tue, 1 Mar 2022 14:30:53 +0530 Message-ID: <20220301090056.1042866-1-skori@marvell.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Proofpoint-GUID: oDamxWEZMtBDf2yDyET_sLv_kGV0sNld X-Proofpoint-ORIG-GUID: oDamxWEZMtBDf2yDyET_sLv_kGV0sNld X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.64.514 definitions=2022-02-28_10,2022-02-26_01,2022-02-23_01 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: Sunil Kumar Kori As per new spec in DPDK, VLAN priority is supported for precoloring of input packet. Signed-off-by: Sunil Kumar Kori --- drivers/common/cnxk/roc_nix.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h index 5e6eb58c0c..e92363f7f3 100644 --- a/drivers/common/cnxk/roc_nix.h +++ b/drivers/common/cnxk/roc_nix.h @@ -42,6 +42,12 @@ enum roc_nix_bpf_level_flag { ROC_NIX_BPF_LEVEL_F_TOP = BIT(2), }; +enum roc_nix_bpf_precolor_tbl_size { + ROC_NIX_BPF_PRECOLOR_TBL_SIZE_GEN = 16, + ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN = 16, + ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP = 64, +}; + enum roc_nix_bpf_pc_mode { ROC_NIX_BPF_PC_MODE_VLAN_INNER, ROC_NIX_BPF_PC_MODE_VLAN_OUTER, From patchwork Tue Mar 1 09:00:54 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Kumar Kori X-Patchwork-Id: 108420 X-Patchwork-Delegate: jerinj@marvell.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 4BB38A034F; Tue, 1 Mar 2022 10:01:11 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7541C41C25; Tue, 1 Mar 2022 10:01:07 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 6E78541233 for ; Tue, 1 Mar 2022 10:01:06 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 2217Zk5w014315 for ; Tue, 1 Mar 2022 01:01:05 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=FkTJLleYP4rxDHEXVciMAnYl2CIBw3HjdQltQBMKlII=; b=cf76eyR/9rVQ83dsoRMO219dzd8iKiF3X1ZPbbMdE9KBAPuKL1KbO5/m5oTvQNR+ouJY jwXeiad7pFhv4FrinxS7IG6NGFNbPjN4TKnsQ6NHbGDLVZRTRsZhU4up3+8E38lnqIYl FP/Zx+dRayr4dRzIXdZYSdGeDX9qPZLoSSKErFp1HEn4xFMZ/943e7tRPgE10B4pY83s qfhniDvFlCZFVjh5/5e4uXoExL6DKQWCzMR1QSeK6/Mj2qSr0Ad+Bsb/fHab9SLXqhll WJs3e/sfwWbGlT2OeONo5xNQ4aM2zsHB1G3Pe3ol/aTb1+AejRYxnJ64IaLfN4JE2ebP Ng== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3ehf7v0abv-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Tue, 01 Mar 2022 01:01:05 -0800 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 1 Mar 2022 01:01:03 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.18 via Frontend Transport; Tue, 1 Mar 2022 01:01:03 -0800 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id D80695B696A; Tue, 1 Mar 2022 01:01:01 -0800 (PST) From: To: Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao CC: Subject: [PATCH v1 2/3] net/cnxk: support ops to update precolor VLAN table Date: Tue, 1 Mar 2022 14:30:54 +0530 Message-ID: <20220301090056.1042866-2-skori@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220301090056.1042866-1-skori@marvell.com> References: <20220301090056.1042866-1-skori@marvell.com> MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: fBYsn0ixHBDAJEA4X63kw7XxAFXr7Gbu X-Proofpoint-GUID: fBYsn0ixHBDAJEA4X63kw7XxAFXr7Gbu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.64.514 definitions=2022-02-28_10,2022-02-26_01,2022-02-23_01 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: Sunil Kumar Kori Implement API to update VLAN table for pre-coloring for incoming packet per nixlf for CN10K platform. Signed-off-by: Sunil Kumar Kori --- drivers/net/cnxk/cnxk_ethdev.h | 2 +- drivers/net/cnxk/cnxk_ethdev_mtr.c | 214 +++++++++++++++++++++++++---- 2 files changed, 188 insertions(+), 28 deletions(-) diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h index ccdf496860..7c7e013c42 100644 --- a/drivers/net/cnxk/cnxk_ethdev.h +++ b/drivers/net/cnxk/cnxk_ethdev.h @@ -409,7 +409,7 @@ struct cnxk_eth_dev { uint64_t clk_delta; /* Ingress policer */ - enum roc_nix_bpf_color precolor_tbl[ROC_NIX_BPF_PRE_COLOR_MAX]; + enum roc_nix_bpf_color precolor_tbl[ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP]; struct cnxk_mtr_profiles mtr_profiles; struct cnxk_mtr_policy mtr_policy; struct cnxk_mtr mtr; diff --git a/drivers/net/cnxk/cnxk_ethdev_mtr.c b/drivers/net/cnxk/cnxk_ethdev_mtr.c index c8183aa12d..1d6a4807d5 100644 --- a/drivers/net/cnxk/cnxk_ethdev_mtr.c +++ b/drivers/net/cnxk/cnxk_ethdev_mtr.c @@ -48,7 +48,13 @@ static struct rte_mtr_capabilities mtr_capa = { RTE_MTR_STATS_N_PKTS_RED | RTE_MTR_STATS_N_PKTS_DROPPED | RTE_MTR_STATS_N_BYTES_GREEN | RTE_MTR_STATS_N_BYTES_YELLOW | RTE_MTR_STATS_N_BYTES_RED | - RTE_MTR_STATS_N_BYTES_DROPPED}; + RTE_MTR_STATS_N_BYTES_DROPPED, + .methods_mask = RTE_MTR_INPUT_COLOR_METHOD_COLOR_BLIND | + RTE_MTR_INPUT_COLOR_METHOD_VLAN | + RTE_MTR_INPUT_COLOR_METHOD_DSCP | + RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN | + RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP, + .separate_input_color_table_per_port = true}; static struct cnxk_meter_node * nix_mtr_find(struct cnxk_eth_dev *dev, uint32_t meter_id) @@ -470,6 +476,7 @@ cnxk_nix_mtr_create(struct rte_eth_dev *eth_dev, uint32_t mtr_id, struct cnxk_mtr_profile_node *profile; struct cnxk_mtr_policy_node *policy; struct cnxk_mtr *fm = &dev->mtr; + enum rte_color *table = NULL; struct cnxk_meter_node *mtr; int i; @@ -521,18 +528,49 @@ cnxk_nix_mtr_create(struct rte_eth_dev *eth_dev, uint32_t mtr_id, mtr->is_next = false; mtr->level = ROC_NIX_BPF_LEVEL_IDX_INVALID; - if (params->dscp_table) { - mtr->params.dscp_table = - plt_zmalloc(ROC_NIX_BPF_PRE_COLOR_MAX, ROC_ALIGN); - if (mtr->params.dscp_table == NULL) { + switch (params->input_color_method) { + case RTE_MTR_INPUT_COLOR_METHOD_DSCP: + case RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP: + table = (enum rte_color *) + plt_zmalloc(sizeof(enum rte_color) * + ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP, ROC_ALIGN); + if (table == NULL) { plt_free(mtr); return -rte_mtr_error_set(error, ENOMEM, RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL, "Memory alloc failed."); } + if (params->dscp_table) { + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; i++) + table[i] = params->dscp_table[i]; - for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++) - mtr->params.dscp_table[i] = params->dscp_table[i]; + mtr->params.dscp_table = table; + } + break; + case RTE_MTR_INPUT_COLOR_METHOD_VLAN: + case RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN: + table = (enum rte_color *) + plt_zmalloc(sizeof(enum rte_color) * + ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN, ROC_ALIGN); + if (table == NULL) { + plt_free(mtr); + return -rte_mtr_error_set(error, ENOMEM, + RTE_MTR_ERROR_TYPE_UNSPECIFIED, + NULL, "Memory alloc failed."); + } + if (params->vlan_table) { + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; i++) + table[i] = params->vlan_table[i]; + + mtr->params.vlan_table = table; + } + break; + default: + plt_free(table); + plt_free(mtr); + return -rte_mtr_error_set(error, ENOMEM, + RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL, + "Invalid input color method"); } profile->ref_cnt++; @@ -619,7 +657,13 @@ cnxk_nix_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t mtr_id, mtr->policy->ref_cnt--; mtr->profile->ref_cnt--; TAILQ_REMOVE(fm, mtr, next); - plt_free(mtr->params.dscp_table); + + if (mtr->params.input_color_method == RTE_MTR_INPUT_COLOR_METHOD_DSCP) + plt_free(mtr->params.dscp_table); + else if (mtr->params.input_color_method == + RTE_MTR_INPUT_COLOR_METHOD_VLAN) + plt_free(mtr->params.vlan_table); + plt_free(mtr); exit: @@ -689,7 +733,7 @@ cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id, enum rte_color *dscp_table, struct rte_mtr_error *error) { - enum roc_nix_bpf_color nix_dscp_tbl[ROC_NIX_BPF_PRE_COLOR_MAX]; + enum roc_nix_bpf_color nix_dscp_tbl[ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP]; enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN, ROC_NIX_BPF_COLOR_YELLOW, ROC_NIX_BPF_COLOR_RED}; @@ -707,16 +751,22 @@ cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id, } if (!dscp_table) { - for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++) + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; i++) nix_dscp_tbl[i] = ROC_NIX_BPF_COLOR_GREEN; } else { - for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++) + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; i++) nix_dscp_tbl[i] = color_map[dscp_table[i]]; } - table.count = ROC_NIX_BPF_PRE_COLOR_MAX; - table.mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER; - for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++) + table.count = ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; + + if (mtr->params.input_color_method == + RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP) + table.mode = ROC_NIX_BPF_PC_MODE_DSCP_INNER; + else + table.mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER; + + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; i++) table.color[i] = nix_dscp_tbl[i]; rc = roc_nix_bpf_pre_color_tbl_setup(nix, mtr->bpf_id, @@ -727,13 +777,69 @@ cnxk_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id, goto exit; } - for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++) + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; i++) dev->precolor_tbl[i] = nix_dscp_tbl[i]; exit: return rc; } +static int +cnxk_nix_mtr_vlan_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id, + enum rte_color *vlan_table, + struct rte_mtr_error *error) +{ + enum roc_nix_bpf_color nix_vlan_tbl[ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN]; + enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN, + ROC_NIX_BPF_COLOR_YELLOW, + ROC_NIX_BPF_COLOR_RED}; + struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev); + struct roc_nix_bpf_precolor table; + struct roc_nix *nix = &dev->nix; + struct cnxk_meter_node *mtr; + int rc, i; + + mtr = nix_mtr_find(dev, mtr_id); + if (mtr == NULL) { + return -rte_mtr_error_set(error, ENOENT, + RTE_MTR_ERROR_TYPE_MTR_ID, NULL, + "Meter object not found"); + } + + if (!vlan_table) { + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; i++) + nix_vlan_tbl[i] = ROC_NIX_BPF_COLOR_GREEN; + } else { + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; i++) + nix_vlan_tbl[i] = color_map[vlan_table[i]]; + } + + table.count = ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; + + if (mtr->params.input_color_method == + RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN) + table.mode = ROC_NIX_BPF_PC_MODE_VLAN_INNER; + else + table.mode = ROC_NIX_BPF_PC_MODE_VLAN_OUTER; + + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; i++) + table.color[i] = nix_vlan_tbl[i]; + + rc = roc_nix_bpf_pre_color_tbl_setup(nix, mtr->bpf_id, + lvl_map[mtr->level], &table); + if (rc) { + rte_mtr_error_set(error, rc, RTE_MTR_ERROR_TYPE_UNSPECIFIED, + NULL, NULL); + goto exit; + } + + for (i = 0; i < ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; i++) + dev->precolor_tbl[i] = nix_vlan_tbl[i]; + +exit: + return rc; +} + static int cnxk_nix_mtr_stats_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id, uint64_t stats_mask, struct rte_mtr_error *error) @@ -870,6 +976,7 @@ const struct rte_mtr_ops nix_mtr_ops = { .meter_enable = cnxk_nix_mtr_enable, .meter_disable = cnxk_nix_mtr_disable, .meter_dscp_table_update = cnxk_nix_mtr_dscp_table_update, + .meter_vlan_table_update = cnxk_nix_mtr_vlan_table_update, .stats_update = cnxk_nix_mtr_stats_update, .stats_read = cnxk_nix_mtr_stats_read, }; @@ -1041,6 +1148,9 @@ nix_mtr_level_update(struct rte_eth_dev *eth_dev, uint32_t id, uint32_t level) static void nix_mtr_config_map(struct cnxk_meter_node *mtr, struct roc_nix_bpf_cfg *cfg) { + enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN, + ROC_NIX_BPF_COLOR_YELLOW, + ROC_NIX_BPF_COLOR_RED}; enum roc_nix_bpf_algo alg_map[] = { ROC_NIX_BPF_ALGO_NONE, ROC_NIX_BPF_ALGO_2697, ROC_NIX_BPF_ALGO_2698, ROC_NIX_BPF_ALGO_4115}; @@ -1049,6 +1159,28 @@ nix_mtr_config_map(struct cnxk_meter_node *mtr, struct roc_nix_bpf_cfg *cfg) cfg->alg = alg_map[profile->profile.alg]; cfg->lmode = profile->profile.packet_mode; + cfg->icolor = color_map[mtr->params.default_input_color]; + + switch (mtr->params.input_color_method) { + case RTE_MTR_INPUT_COLOR_METHOD_DSCP: + cfg->pc_mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER; + cfg->tnl_ena = false; + break; + case RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP: + cfg->pc_mode = ROC_NIX_BPF_PC_MODE_DSCP_INNER; + cfg->tnl_ena = true; + break; + case RTE_MTR_INPUT_COLOR_METHOD_VLAN: + cfg->pc_mode = ROC_NIX_BPF_PC_MODE_VLAN_OUTER; + cfg->tnl_ena = false; + break; + case RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN: + cfg->pc_mode = ROC_NIX_BPF_PC_MODE_VLAN_INNER; + cfg->tnl_ena = true; + break; + default: + break; + } switch (cfg->alg) { case ROC_NIX_BPF_ALGO_2697: @@ -1090,23 +1222,51 @@ nix_mtr_config_map(struct cnxk_meter_node *mtr, struct roc_nix_bpf_cfg *cfg) } static void -nix_dscp_table_map(struct cnxk_meter_node *mtr, - struct roc_nix_bpf_precolor *tbl) +nix_precolor_table_map(struct cnxk_meter_node *mtr, + struct roc_nix_bpf_precolor *tbl) { enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN, ROC_NIX_BPF_COLOR_YELLOW, ROC_NIX_BPF_COLOR_RED}; int i; - tbl->count = ROC_NIX_BPF_PRE_COLOR_MAX; - tbl->mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER; - - for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++) - tbl->color[i] = ROC_NIX_BPF_COLOR_GREEN; - - if (mtr->params.dscp_table) { - for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++) - tbl->color[i] = color_map[mtr->params.dscp_table[i]]; + switch (mtr->params.input_color_method) { + case RTE_MTR_INPUT_COLOR_METHOD_DSCP: + case RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP: + tbl->count = ROC_NIX_BPF_PRECOLOR_TBL_SIZE_DSCP; + tbl->mode = (mtr->params.input_color_method == + RTE_MTR_INPUT_COLOR_METHOD_DSCP) ? + ROC_NIX_BPF_PC_MODE_DSCP_OUTER : + ROC_NIX_BPF_PC_MODE_DSCP_INNER; + + for (i = 0; i < tbl->count; i++) + tbl->color[i] = ROC_NIX_BPF_COLOR_GREEN; + + if (mtr->params.dscp_table) { + for (i = 0; i < tbl->count; i++) + tbl->color[i] = + color_map[mtr->params.dscp_table[i]]; + } + break; + case RTE_MTR_INPUT_COLOR_METHOD_VLAN: + case RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN: + tbl->count = ROC_NIX_BPF_PRECOLOR_TBL_SIZE_VLAN; + tbl->mode = (mtr->params.input_color_method == + RTE_MTR_INPUT_COLOR_METHOD_VLAN) ? + ROC_NIX_BPF_PC_MODE_VLAN_OUTER : + ROC_NIX_BPF_PC_MODE_VLAN_INNER; + + for (i = 0; i < tbl->count; i++) + tbl->color[i] = ROC_NIX_BPF_COLOR_GREEN; + + if (mtr->params.vlan_table) { + for (i = 0; i < tbl->count; i++) + tbl->color[i] = + color_map[mtr->params.vlan_table[i]]; + } + break; + default: + break; } } @@ -1245,7 +1405,7 @@ nix_mtr_configure(struct rte_eth_dev *eth_dev, uint32_t id) memset(&tbl, 0, sizeof(struct roc_nix_bpf_precolor)); - nix_dscp_table_map(mtr[i], &tbl); + nix_precolor_table_map(mtr[i], &tbl); rc = roc_nix_bpf_pre_color_tbl_setup(nix, mtr[i]->bpf_id, lvl_map[mtr[i]->level], &tbl); From patchwork Tue Mar 1 09:00:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sunil Kumar Kori X-Patchwork-Id: 108421 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 7BF8DA034F; Tue, 1 Mar 2022 10:01:18 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DF69E41233; Tue, 1 Mar 2022 10:01:09 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 3CBED407FF for ; Tue, 1 Mar 2022 10:01:08 +0100 (CET) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 2218xGCj005167; Tue, 1 Mar 2022 01:01:07 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=1blwcoAnVmmTsP+2n0s/2il1AteOXitQVK4QLRWMdw4=; b=ZQWKVySXIr7DPmgUhJ/OXKMRrP23Pqmvn4J/W/CLK8sysxKcYr5IVzWYGfRHnIcvVMx/ etNBqt5ib/YNu2ClXK8r/PZ9twuTsJuVbr/8yapbXBYJ/sRT0HoThnAhfkMcWSvxa5sf u8icSoAs6PUhfGfrk7Q8MtZK2uwVSY9PHuc78ViMnngo6olAt5U+DfZEDGbDA9OxydJL OpwrBkyoGsu/a+KWMJyV/uoRzGeWCpzOe0dy0YVvcr6dbl1aZr5zjdLJWtSd6qQZr0iP QQ28o/KvOme7LdZc2II/F+8F36YvspaEKYVd9lC+b2lNKC1czVopM3TPX/H1pqd7sMkr sQ== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3ehgf4009y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Tue, 01 Mar 2022 01:01:07 -0800 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 1 Mar 2022 01:01:05 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 1 Mar 2022 01:01:05 -0800 Received: from localhost.localdomain (unknown [10.28.34.25]) by maili.marvell.com (Postfix) with ESMTP id 1421E3F707F; Tue, 1 Mar 2022 01:01:03 -0800 (PST) From: To: Xiaoyun Li , Aman Singh , Yuying Zhang CC: , Sunil Kumar Kori Subject: [PATCH v1 3/3] app/testpmd: support different input color method Date: Tue, 1 Mar 2022 14:30:55 +0530 Message-ID: <20220301090056.1042866-3-skori@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220301090056.1042866-1-skori@marvell.com> References: <20220301090056.1042866-1-skori@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: bfVAhy20rWej-E_-2-fuiC2wxszqbAzk X-Proofpoint-ORIG-GUID: bfVAhy20rWej-E_-2-fuiC2wxszqbAzk X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.64.514 definitions=2022-02-28_10,2022-02-26_01,2022-02-23_01 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: Sunil Kumar Kori Support for input coloring is added based on VLAN. Patch adds support for the same. Signed-off-by: Sunil Kumar Kori --- app/test-pmd/cmdline.c | 1 + app/test-pmd/cmdline_mtr.c | 348 ++++++++++++++++++++++++++++++++++++- app/test-pmd/cmdline_mtr.h | 1 + 3 files changed, 342 insertions(+), 8 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 7ab0575e64..163e9c3fc9 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -17974,6 +17974,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_del_port_meter_policy, (cmdline_parse_inst_t *)&cmd_set_port_meter_profile, (cmdline_parse_inst_t *)&cmd_set_port_meter_dscp_table, + (cmdline_parse_inst_t *)&cmd_set_port_meter_vlan_table, (cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask, (cmdline_parse_inst_t *)&cmd_show_port_meter_stats, (cmdline_parse_inst_t *)&cmd_mcast_addr, diff --git a/app/test-pmd/cmdline_mtr.c b/app/test-pmd/cmdline_mtr.c index ad7ef6ad98..7532d454ae 100644 --- a/app/test-pmd/cmdline_mtr.c +++ b/app/test-pmd/cmdline_mtr.c @@ -14,6 +14,7 @@ #include "cmdline_mtr.h" #define PARSE_DELIMITER " \f\n\r\t\v" +#define MAX_VLAN_TABLE_ENTRIES 16 #define MAX_DSCP_TABLE_ENTRIES 64 /** Display Meter Error Message */ @@ -82,6 +83,125 @@ parse_uint(uint64_t *value, const char *str) return 0; } +static int +parse_input_color_table_entries(char *str, enum rte_color **dscp_table, + enum rte_color **vlan_table) +{ + enum rte_color *vlan, *dscp; + char *token; + int i = 0; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) + return 0; + + /* Allocate memory for dscp table */ + dscp = (enum rte_color *)malloc(MAX_DSCP_TABLE_ENTRIES * + sizeof(enum rte_color)); + if (dscp == NULL) + return -1; + + while (1) { + if (strcmp(token, "G") == 0 || strcmp(token, "g") == 0) + dscp[i++] = RTE_COLOR_GREEN; + else if (strcmp(token, "Y") == 0 || strcmp(token, "y") == 0) + dscp[i++] = RTE_COLOR_YELLOW; + else if (strcmp(token, "R") == 0 || strcmp(token, "r") == 0) + dscp[i++] = RTE_COLOR_RED; + else { + free(dscp); + return -1; + } + if (i == MAX_DSCP_TABLE_ENTRIES) + break; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) { + free(dscp); + return -1; + } + } + + *dscp_table = dscp; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) + return 0; + + /* Allocate memory for vlan tables */ + vlan = (enum rte_color *)malloc(MAX_VLAN_TABLE_ENTRIES * + sizeof(enum rte_color)); + if (vlan == NULL) + return -1; + + i = 0; + while (1) { + if (strcmp(token, "G") == 0 || strcmp(token, "g") == 0) + vlan[i++] = RTE_COLOR_GREEN; + else if (strcmp(token, "Y") == 0 || strcmp(token, "y") == 0) + vlan[i++] = RTE_COLOR_YELLOW; + else if (strcmp(token, "R") == 0 || strcmp(token, "r") == 0) + vlan[i++] = RTE_COLOR_RED; + else { + free(vlan); + return -1; + } + if (i == MAX_VLAN_TABLE_ENTRIES) + break; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) { + free(vlan); + return -1; + } + } + + *vlan_table = vlan; + return 0; +} + +static int +parse_vlan_table_entries(char *str, enum rte_color **vlan_table) +{ + char *token; + int i = 0; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) + return 0; + + /* Allocate memory for vlan table */ + *vlan_table = (enum rte_color *)malloc(MAX_VLAN_TABLE_ENTRIES * + sizeof(enum rte_color)); + if (*vlan_table == NULL) + return -1; + + while (1) { + if (strcmp(token, "G") == 0 || + strcmp(token, "g") == 0) + (*vlan_table)[i++] = RTE_COLOR_GREEN; + else if (strcmp(token, "Y") == 0 || + strcmp(token, "y") == 0) + (*vlan_table)[i++] = RTE_COLOR_YELLOW; + else if (strcmp(token, "R") == 0 || + strcmp(token, "r") == 0) + (*vlan_table)[i++] = RTE_COLOR_RED; + else { + free(*vlan_table); + return -1; + } + if (i == MAX_VLAN_TABLE_ENTRIES) + break; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) { + free(*vlan_table); + return -1; + } + } + return 0; +} + static int parse_dscp_table_entries(char *str, enum rte_color **dscp_table) { @@ -124,9 +244,59 @@ parse_dscp_table_entries(char *str, enum rte_color **dscp_table) return 0; } +static int +parse_input_color_method(char *str, uint64_t *input_color_method) +{ + char *token; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) + return 0; + + if (strcmp(token, "blind") == 0) + *input_color_method = RTE_MTR_INPUT_COLOR_METHOD_COLOR_BLIND; + else if (strcmp(token, "vlan") == 0) + *input_color_method = RTE_MTR_INPUT_COLOR_METHOD_VLAN; + else if (strcmp(token, "dscp") == 0) + *input_color_method = RTE_MTR_INPUT_COLOR_METHOD_DSCP; + else if (strcmp(token, "vlan_dscp") == 0) + *input_color_method = RTE_MTR_INPUT_COLOR_METHOD_VLAN_DSCP; + else if (strcmp(token, "inner_vlan") == 0) + *input_color_method = RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN; + else if (strcmp(token, "inner_dscp") == 0) + *input_color_method = RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP; + else if (strcmp(token, "inner_vlan_dscp") == 0) + *input_color_method = RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN_DSCP; + else + return -1; + + return 0; +} + +static int +parse_default_input_color_str(char *str, uint64_t *def_inp_color) +{ + char *token; + + token = strtok_r(str, PARSE_DELIMITER, &str); + if (token == NULL) + return 0; + + if ((strcmp(token, "G") == 0) || (strcmp(token, "g") == 0)) + *def_inp_color = RTE_COLOR_GREEN; + else if ((strcmp(token, "Y") == 0) || (strcmp(token, "y") == 0)) + *def_inp_color = RTE_COLOR_YELLOW; + else if ((strcmp(token, "R") == 0) || (strcmp(token, "r") == 0)) + *def_inp_color = RTE_COLOR_RED; + else + return -1; + + return 0; +} + static int parse_meter_color_str(char *c_str, uint32_t *use_prev_meter_color, - enum rte_color **dscp_table) + enum rte_color **vlan_table, enum rte_color **dscp_table) { char *token; uint64_t previous_mtr_color = 0; @@ -147,8 +317,7 @@ parse_meter_color_str(char *c_str, uint32_t *use_prev_meter_color, return 0; } - /* Parse dscp table entries */ - ret = parse_dscp_table_entries(c_str, dscp_table); + ret = parse_input_color_table_entries(c_str, dscp_table, vlan_table); if (ret != 0) return -1; @@ -192,6 +361,43 @@ parse_multi_token_string(char *t_str, uint16_t *port_id, return 0; } +static int +parse_multi_token_vlan_str(char *t_str, uint16_t *port_id, uint32_t *mtr_id, + enum rte_color **vlan_table) +{ + uint64_t val; + char *token; + int ret; + + /* First token: port id */ + token = strtok_r(t_str, PARSE_DELIMITER, &t_str); + if (token == NULL) + return -1; + + ret = parse_uint(&val, token); + if (ret != 0 || val > UINT16_MAX) + return -1; + + *port_id = val; + + /* Second token: meter id */ + token = strtok_r(t_str, PARSE_DELIMITER, &t_str); + if (token == NULL) + return 0; + + ret = parse_uint(&val, token); + if (ret != 0 || val > UINT32_MAX) + return -1; + + *mtr_id = val; + + ret = parse_vlan_table_entries(t_str, vlan_table); + if (ret != 0) + return -1; + + return 0; +} + /* *** Show Port Meter Capabilities *** */ struct cmd_show_port_meter_cap_result { cmdline_fixed_string_t show; @@ -277,6 +483,9 @@ static void cmd_show_port_meter_cap_parsed(void *parsed_result, printf("cap.trtcm_rfc4115_packet_mode_supported %" PRId32 "\n", cap.trtcm_rfc4115_packet_mode_supported); printf("cap.stats_mask %" PRIx64 "\n", cap.stats_mask); + printf("cap.methods_mask 0x%" PRIx64 "\n", cap.methods_mask); + printf("cap.separate_input_color_table_per_port %" PRId32 "\n", + cap.separate_input_color_table_per_port); } cmdline_parse_inst_t cmd_show_port_meter_cap = { @@ -721,6 +930,8 @@ struct cmd_create_port_meter_result { cmdline_fixed_string_t r_action; uint64_t statistics_mask; uint32_t shared; + cmdline_fixed_string_t input_color_method; + cmdline_fixed_string_t default_input_color; cmdline_multi_string_t meter_input_color; }; @@ -763,6 +974,12 @@ cmdline_parse_token_num_t cmd_create_port_meter_statistics_mask = cmdline_parse_token_num_t cmd_create_port_meter_shared = TOKEN_NUM_INITIALIZER(struct cmd_create_port_meter_result, shared, RTE_UINT32); +cmdline_parse_token_string_t cmd_create_port_meter_input_color_method = + TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result, + input_color_method, "blind#vlan#dscp#vlan_dscp#inner_vlan#inner_dscp#inner_vlan_dscp"); +cmdline_parse_token_string_t cmd_create_port_meter_default_input_color = + TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result, + default_input_color, "R#Y#G#r#y#g"); cmdline_parse_token_string_t cmd_create_port_meter_input_color = TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result, meter_input_color, TOKEN_STRING_MULTI); @@ -778,7 +995,12 @@ static void cmd_create_port_meter_parsed(void *parsed_result, uint32_t shared = res->shared; uint32_t use_prev_meter_color = 0; uint16_t port_id = res->port_id; + uint64_t input_color_method = 0; + uint64_t def_inp_color = 0; enum rte_color *dscp_table = NULL; + enum rte_color *vlan_table = NULL; + char *def_color_str = res->default_input_color; + char *method_str = res->input_color_method; char *c_str = res->meter_input_color; int ret; @@ -789,16 +1011,48 @@ static void cmd_create_port_meter_parsed(void *parsed_result, memset(¶ms, 0, sizeof(struct rte_mtr_params)); params.meter_profile_id = res->profile_id; params.meter_policy_id = res->policy_id; + + /* Parse meter input color method string params */ + ret = parse_input_color_method(method_str, &input_color_method); + if (ret) { + fprintf(stderr, + " Meter input color method is invalid\n"); + return; + } + + /* Parse meter default input color string params */ + ret = parse_default_input_color_str(def_color_str, &def_inp_color); + if (ret) { + fprintf(stderr, + " Meter default input color is invalid\n"); + return; + } + /* Parse meter input color string params */ - ret = parse_meter_color_str(c_str, &use_prev_meter_color, &dscp_table); + ret = parse_meter_color_str(c_str, &use_prev_meter_color, &vlan_table, + &dscp_table); if (ret) { fprintf(stderr, " Meter input color params string parse error\n"); return; } + params.input_color_method = input_color_method; params.use_prev_mtr_color = use_prev_meter_color; - params.dscp_table = dscp_table; + + if (input_color_method & RTE_MTR_INPUT_COLOR_METHOD_VLAN || + input_color_method & RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN) + params.vlan_table = vlan_table; + else if (input_color_method & RTE_MTR_INPUT_COLOR_METHOD_DSCP || + input_color_method & RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP) + params.dscp_table = dscp_table; + else if (input_color_method & RTE_MTR_INPUT_COLOR_METHOD_VLAN_DSCP || + input_color_method & RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN_DSCP) { + params.vlan_table = vlan_table; + params.dscp_table = dscp_table; + } + + params.default_input_color = def_inp_color; if (strcmp(res->meter_enable, "yes") == 0) params.meter_enable = 1; @@ -817,9 +1071,12 @@ static void cmd_create_port_meter_parsed(void *parsed_result, cmdline_parse_inst_t cmd_create_port_meter = { .f = cmd_create_port_meter_parsed, .data = NULL, - .help_str = "create port meter (yes|no) " - " " - "[ ...]", + .help_str = "create port meter " + "(yes|no) " + "(blind|vlan|dscp|vlan_dscp|inner_vlan|inner_dscp|inner_vlan_dscp) " + "(g|y|r) " + "[ ... ]" + "[ ... ]", .tokens = { (void *)&cmd_create_port_meter_create, (void *)&cmd_create_port_meter_port, @@ -831,6 +1088,8 @@ cmdline_parse_inst_t cmd_create_port_meter = { (void *)&cmd_create_port_meter_meter_enable, (void *)&cmd_create_port_meter_statistics_mask, (void *)&cmd_create_port_meter_shared, + (void *)&cmd_create_port_meter_input_color_method, + (void *)&cmd_create_port_meter_default_input_color, (void *)&cmd_create_port_meter_input_color, NULL, }, @@ -1233,6 +1492,79 @@ cmdline_parse_inst_t cmd_set_port_meter_dscp_table = { }, }; +/* *** Set Port Meter VLAN Table *** */ +struct cmd_set_port_meter_vlan_table_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t port; + cmdline_fixed_string_t meter; + cmdline_fixed_string_t vlan_table; + cmdline_multi_string_t token_string; +}; + +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_set = + TOKEN_STRING_INITIALIZER( + struct cmd_set_port_meter_vlan_table_result, set, "set"); +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_port = + TOKEN_STRING_INITIALIZER( + struct cmd_set_port_meter_vlan_table_result, port, "port"); +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_meter = + TOKEN_STRING_INITIALIZER( + struct cmd_set_port_meter_vlan_table_result, meter, "meter"); +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_vlan_table = + TOKEN_STRING_INITIALIZER( + struct cmd_set_port_meter_vlan_table_result, + vlan_table, "vlan table"); +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_token_string = + TOKEN_STRING_INITIALIZER(struct cmd_set_port_meter_vlan_table_result, + token_string, TOKEN_STRING_MULTI); + +static void cmd_set_port_meter_vlan_table_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_set_port_meter_vlan_table_result *res = parsed_result; + struct rte_mtr_error error; + enum rte_color *vlan_table = NULL; + char *t_str = res->token_string; + uint32_t mtr_id = 0; + uint16_t port_id; + int ret; + + /* Parse string */ + ret = parse_multi_token_vlan_str(t_str, &port_id, &mtr_id, &vlan_table); + if (ret) { + fprintf(stderr, " Multi token string parse error\n"); + return; + } + + if (port_id_is_invalid(port_id, ENABLED_WARN)) + goto free_table; + + /* Update Meter VLAN Table*/ + ret = rte_mtr_meter_vlan_table_update(port_id, mtr_id, + vlan_table, &error); + if (ret != 0) + print_err_msg(&error); + +free_table: + free(vlan_table); +} + +cmdline_parse_inst_t cmd_set_port_meter_vlan_table = { + .f = cmd_set_port_meter_vlan_table_parsed, + .data = NULL, + .help_str = "set port meter vlan table " + "[ ... ]", + .tokens = { + (void *)&cmd_set_port_meter_vlan_table_set, + (void *)&cmd_set_port_meter_vlan_table_port, + (void *)&cmd_set_port_meter_vlan_table_meter, + (void *)&cmd_set_port_meter_vlan_table_vlan_table, + (void *)&cmd_set_port_meter_vlan_table_token_string, + NULL, + }, +}; + /* *** Set Port Meter Stats Mask *** */ struct cmd_set_port_meter_stats_mask_result { cmdline_fixed_string_t set; diff --git a/app/test-pmd/cmdline_mtr.h b/app/test-pmd/cmdline_mtr.h index 2415fc16c3..e11cd6a23b 100644 --- a/app/test-pmd/cmdline_mtr.h +++ b/app/test-pmd/cmdline_mtr.h @@ -19,6 +19,7 @@ extern cmdline_parse_inst_t cmd_del_port_meter; extern cmdline_parse_inst_t cmd_del_port_meter_policy; extern cmdline_parse_inst_t cmd_set_port_meter_profile; extern cmdline_parse_inst_t cmd_set_port_meter_dscp_table; +extern cmdline_parse_inst_t cmd_set_port_meter_vlan_table; extern cmdline_parse_inst_t cmd_set_port_meter_stats_mask; extern cmdline_parse_inst_t cmd_show_port_meter_stats; void print_mtr_err_msg(struct rte_mtr_error *error);