DPDK patches and discussions
 help / color / mirror / Atom feed
From: Beilei Xing <beilei.xing@intel.com>
To: wenzhuo.lu@intel.com, jingjing.wu@intel.com
Cc: dev@dpdk.org
Subject: [dpdk-dev] [PATCH] app/testpmd: support bitmask for RSS and FDIR
Date: Mon,  6 Aug 2018 13:45:35 +0800	[thread overview]
Message-ID: <1533534335-119817-1-git-send-email-beilei.xing@intel.com> (raw)

This patch adds bitmask support for RSS, FDIR
and FDIR flexible payload.

Signed-off-by: Beilei Xing <beilei.xing@intel.com>
---
 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 <port_id> pctype <pctype_id> hash_inset|"
-		    "fdir_inset|fdir_flx_inset get|set|clear field <field_idx>",
+		    "fdir_inset|fdir_flx_inset set field <field_idx> "
+		    "mask <mask_val>",
 	.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 <port_id> pctype <pctype_id> hash_inset|"
+		    "fdir_inset|fdir_flx_inset get|clear field <field_idx>",
+	.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) \
-- 
2.5.5

             reply	other threads:[~2018-08-06  5:47 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-06  5:45 Beilei Xing [this message]
2018-08-06  9:30 ` Thomas Monjalon
2018-08-10  2:31   ` Xing, Beilei
2018-08-10  8:58     ` Thomas Monjalon
2018-08-13  7:29       ` Xing, Beilei
2018-08-10  3:45 ` Jerin Jacob
2018-08-10  7:37   ` Xing, Beilei
2018-08-10 12:08     ` Jerin Jacob

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1533534335-119817-1-git-send-email-beilei.xing@intel.com \
    --to=beilei.xing@intel.com \
    --cc=dev@dpdk.org \
    --cc=jingjing.wu@intel.com \
    --cc=wenzhuo.lu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).