From patchwork Mon Aug 6 05:45:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 43593 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1D4DC1B555; Mon, 6 Aug 2018 07:47:14 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id C90391B552 for ; Mon, 6 Aug 2018 07:47:11 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Aug 2018 22:47:10 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,451,1526367600"; d="scan'208";a="77778402" Received: from unknown (HELO dpdk9.sh.intel.com) ([10.67.118.52]) by fmsmga004.fm.intel.com with ESMTP; 05 Aug 2018 22:45:23 -0700 From: Beilei Xing To: wenzhuo.lu@intel.com, jingjing.wu@intel.com Cc: dev@dpdk.org Date: Mon, 6 Aug 2018 13:45:35 +0800 Message-Id: <1533534335-119817-1-git-send-email-beilei.xing@intel.com> X-Mailer: git-send-email 2.5.5 Subject: [dpdk-dev] [PATCH] app/testpmd: support bitmask for RSS and FDIR X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" This patch adds bitmask support for RSS, FDIR and FDIR flexible payload. Signed-off-by: Beilei Xing --- app/test-pmd/cmdline.c | 199 +++++++++++++++++++++++++--- doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 +- 2 files changed, 187 insertions(+), 20 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 589121d..a227554 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -902,7 +902,12 @@ static void cmd_help_long_parsed(void *parsed_result, " Update a flow type to pctype mapping item on a port\n\n" "port config (port_id) pctype (pctype_id) hash_inset|" - "fdir_inset|fdir_flx_inset get|set|clear field\n" + "fdir_inset|fdir_flx_inset set field\n" + " (field_idx) mask (mask_val)\n" + " Set RSS|FDIR|FDIR_FLX input set for some pctype\n\n" + + "port config (port_id) pctype (pctype_id) hash_inset|" + "fdir_inset|fdir_flx_inset get|clear field\n" " (field_idx)\n" " Configure RSS|FDIR|FDIR_FLX input set for some pctype\n\n" @@ -15707,9 +15712,11 @@ struct cmd_cfg_input_set_result { cmdline_fixed_string_t pctype; uint8_t pctype_id; cmdline_fixed_string_t inset_type; - cmdline_fixed_string_t opt; + cmdline_fixed_string_t set; cmdline_fixed_string_t field; uint8_t field_idx; + cmdline_fixed_string_t mask; + uint16_t mask_val; }; static void @@ -15722,6 +15729,7 @@ cmd_cfg_input_set_parsed( struct cmd_cfg_input_set_result *res = parsed_result; enum rte_pmd_i40e_inset_type inset_type = INSET_NONE; struct rte_pmd_i40e_inset inset; + uint8_t i; #endif int ret = -ENOTSUP; @@ -15744,25 +15752,26 @@ cmd_cfg_input_set_parsed( return; } - if (!strcmp(res->opt, "get")) { - ret = rte_pmd_i40e_inset_field_get(inset.inset, + ret = rte_pmd_i40e_inset_field_set(&inset.inset, res->field_idx); - if (ret) - printf("Field index %d is enabled.\n", res->field_idx); - else - printf("Field index %d is disabled.\n", res->field_idx); - return; - } else if (!strcmp(res->opt, "set")) - ret = rte_pmd_i40e_inset_field_set(&inset.inset, - res->field_idx); - else if (!strcmp(res->opt, "clear")) - ret = rte_pmd_i40e_inset_field_clear(&inset.inset, - res->field_idx); if (ret) { printf("Failed to configure input set field.\n"); return; } + for (i = 0; i < 2; i++) { + if (!inset.mask[i].mask || + inset.mask[i].field_idx == res->field_idx) { + inset.mask[i].field_idx = res->field_idx; + inset.mask[i].mask = res->mask_val; + break; + } + } + if (i == 2) { + printf("exceed maximal number of bitmasks.\n"); + return; + } + ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id, &inset, inset_type); if (ret) { @@ -15794,21 +15803,28 @@ cmdline_parse_token_string_t cmd_cfg_input_set_inset_type = TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, inset_type, "hash_inset#fdir_inset#fdir_flx_inset"); -cmdline_parse_token_string_t cmd_cfg_input_set_opt = +cmdline_parse_token_string_t cmd_cfg_input_set_set = TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, - opt, "get#set#clear"); + set, "set"); cmdline_parse_token_string_t cmd_cfg_input_set_field = TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, field, "field"); cmdline_parse_token_num_t cmd_cfg_input_set_field_idx = TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result, field_idx, UINT8); +cmdline_parse_token_string_t cmd_cfg_input_set_mask = + TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result, + mask, "mask"); +cmdline_parse_token_num_t cmd_cfg_input_set_mask_val = + TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result, + mask_val, UINT16); cmdline_parse_inst_t cmd_cfg_input_set = { .f = cmd_cfg_input_set_parsed, .data = NULL, .help_str = "port config pctype hash_inset|" - "fdir_inset|fdir_flx_inset get|set|clear field ", + "fdir_inset|fdir_flx_inset set field " + "mask ", .tokens = { (void *)&cmd_cfg_input_set_port, (void *)&cmd_cfg_input_set_cfg, @@ -15816,9 +15832,153 @@ cmdline_parse_inst_t cmd_cfg_input_set = { (void *)&cmd_cfg_input_set_pctype, (void *)&cmd_cfg_input_set_pctype_id, (void *)&cmd_cfg_input_set_inset_type, - (void *)&cmd_cfg_input_set_opt, + (void *)&cmd_cfg_input_set_set, (void *)&cmd_cfg_input_set_field, (void *)&cmd_cfg_input_set_field_idx, + (void *)&cmd_cfg_input_set_mask, + (void *)&cmd_cfg_input_set_mask_val, + NULL, + }, +}; + +/* Get field info or clear some field */ +struct cmd_get_clr_input_set_result { + cmdline_fixed_string_t port; + cmdline_fixed_string_t cfg; + portid_t port_id; + cmdline_fixed_string_t pctype; + uint8_t pctype_id; + cmdline_fixed_string_t inset_type; + cmdline_fixed_string_t opt; + cmdline_fixed_string_t field; + uint8_t field_idx; +}; + +static void +cmd_get_clr_input_set_parsed( + void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_get_clr_input_set_result *res = parsed_result; +#ifdef RTE_LIBRTE_I40E_PMD + enum rte_pmd_i40e_inset_type inset_type = INSET_NONE; + struct rte_pmd_i40e_inset inset; + uint8_t i; +#endif + int ret = -ENOTSUP; + + if (res->port_id > nb_ports) { + printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + return; + } + + if (!all_ports_stopped()) { + printf("Please stop all ports first\n"); + return; + } + +#ifdef RTE_LIBRTE_I40E_PMD + if (!strcmp(res->inset_type, "hash_inset")) + inset_type = INSET_HASH; + else if (!strcmp(res->inset_type, "fdir_inset")) + inset_type = INSET_FDIR; + else if (!strcmp(res->inset_type, "fdir_flx_inset")) + inset_type = INSET_FDIR_FLX; + ret = rte_pmd_i40e_inset_get(res->port_id, res->pctype_id, + &inset, inset_type); + if (ret) { + printf("Failed to get input set.\n"); + return; + } + + if (!strcmp(res->opt, "get")) { + ret = rte_pmd_i40e_inset_field_get(inset.inset, + res->field_idx); + if (ret) { + printf("Field index %d is enabled.\n", res->field_idx); + for (i = 0; i < 2; i++) { + if (inset.mask[i].field_idx == res->field_idx) { + printf("Mask is: 0x%x\n", + inset.mask[i].mask); + break; + } + } + } else { + printf("Field index %d is disabled.\n", res->field_idx); + } + return; + } else if (!strcmp(res->opt, "clear")) { + ret = rte_pmd_i40e_inset_field_clear(&inset.inset, + res->field_idx); + if (ret) { + printf("Failed to clear input set field.\n"); + return; + } + for (i = 0; i < 2; i++) { + if (inset.mask[i].field_idx == res->field_idx) { + inset.mask[i].mask = 0; + break; + } + } + } + + ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id, + &inset, inset_type); + if (ret) { + printf("Failed to configure input set.\n"); + return; + } +#endif + + if (ret == -ENOTSUP) + printf("Function not supported\n"); +} + +cmdline_parse_token_string_t cmd_get_clr_input_set_port = + TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result, + port, "port"); +cmdline_parse_token_string_t cmd_get_clr_input_set_cfg = + TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result, + cfg, "config"); +cmdline_parse_token_num_t cmd_get_clr_input_set_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_get_clr_input_set_result, + port_id, UINT16); +cmdline_parse_token_string_t cmd_get_clr_input_set_pctype = + TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result, + pctype, "pctype"); +cmdline_parse_token_num_t cmd_get_clr_input_set_pctype_id = + TOKEN_NUM_INITIALIZER(struct cmd_get_clr_input_set_result, + pctype_id, UINT8); +cmdline_parse_token_string_t cmd_get_clr_input_set_inset_type = + TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result, + inset_type, + "hash_inset#fdir_inset#fdir_flx_inset"); +cmdline_parse_token_string_t cmd_get_clr_input_set_opt = + TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result, + opt, "get#clear"); +cmdline_parse_token_string_t cmd_get_clr_input_set_field = + TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result, + field, "field"); +cmdline_parse_token_num_t cmd_get_clr_input_set_field_idx = + TOKEN_NUM_INITIALIZER(struct cmd_get_clr_input_set_result, + field_idx, UINT8); + +cmdline_parse_inst_t cmd_get_clr_input_set = { + .f = cmd_get_clr_input_set_parsed, + .data = NULL, + .help_str = "port config pctype hash_inset|" + "fdir_inset|fdir_flx_inset get|clear field ", + .tokens = { + (void *)&cmd_get_clr_input_set_port, + (void *)&cmd_get_clr_input_set_cfg, + (void *)&cmd_get_clr_input_set_port_id, + (void *)&cmd_get_clr_input_set_pctype, + (void *)&cmd_get_clr_input_set_pctype_id, + (void *)&cmd_get_clr_input_set_inset_type, + (void *)&cmd_get_clr_input_set_opt, + (void *)&cmd_get_clr_input_set_field, + (void *)&cmd_get_clr_input_set_field_idx, NULL, }, }; @@ -17819,6 +17979,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_ddp_get_list, (cmdline_parse_inst_t *)&cmd_ddp_get_info, (cmdline_parse_inst_t *)&cmd_cfg_input_set, + (cmdline_parse_inst_t *)&cmd_get_clr_input_set, (cmdline_parse_inst_t *)&cmd_clear_input_set, (cmdline_parse_inst_t *)&cmd_show_vf_stats, (cmdline_parse_inst_t *)&cmd_clear_vf_stats, diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index dde205a..670f81c 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -1989,7 +1989,13 @@ port config input set Config RSS/FDIR/FDIR flexible payload input set for some pctype:: testpmd> port config (port_id) pctype (pctype_id) \ (hash_inset|fdir_inset|fdir_flx_inset) \ - (get|set|clear) field (field_idx) + set field (field_idx) mask (mask_val) + +Get some field info or clear some field of RSS/FDIR/FDIR flexible +payload input set for some pctype:: + testpmd> port config (port_id) pctype (pctype_id) \ + (hash_inset|fdir_inset|fdir_flx_inset) \ + (get|clear) field (field_idx) Clear RSS/FDIR/FDIR flexible payload input set for some pctype:: testpmd> port config (port_id) pctype (pctype_id) \