[RFC,3/4] net/i40e: move testpmd commands

Message ID 20220513075718.18674-4-david.marchand@redhat.com (mailing list archive)
State Superseded, archived
Delegated to: Andrew Rybchenko
Headers
Series Split driver specific commands out of testpmd |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

David Marchand May 13, 2022, 7:57 a.m. UTC
  Move related specific testpmd commands into this driver directory.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 app/test-pmd/cmdline.c          | 665 --------------------------------
 drivers/net/i40e/i40e_testpmd.c | 655 +++++++++++++++++++++++++++++++
 drivers/net/i40e/meson.build    |   2 +
 3 files changed, 657 insertions(+), 665 deletions(-)
 create mode 100644 drivers/net/i40e/i40e_testpmd.c
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index ae4759fbfe..fee05c1a0c 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -637,21 +637,6 @@  static void cmd_help_long_parsed(void *parsed_result,
 			"set port (port_id) ptype_mask (ptype_mask)\n"
 			"    set packet types classification for a specific port\n\n"
 
-			"set port (port_id) queue-region region_id (value) "
-			"queue_start_index (value) queue_num (value)\n"
-			"    Set a queue region on a port\n\n"
-
-			"set port (port_id) queue-region region_id (value) "
-			"flowtype (value)\n"
-			"    Set a flowtype region index on a port\n\n"
-
-			"set port (port_id) queue-region UP (value) region_id (value)\n"
-			"    Set the mapping of User Priority to "
-			"queue region on a port\n\n"
-
-			"set port (port_id) queue-region flush (on|off)\n"
-			"    flush all queue region related configuration\n\n"
-
 			"show port meter cap (port_id)\n"
 			"    Show port meter capability information\n\n"
 
@@ -702,9 +687,6 @@  static void cmd_help_long_parsed(void *parsed_result,
 			"set port meter stats mask (port_id) (mtr_id) (stats_mask)\n"
 			"    meter update stats\n\n"
 
-			"show port (port_id) queue-region\n"
-			"    show all queue region related configuration info\n\n"
-
 			"set port (port_id) fec_mode auto|off|rs|baser\n"
 			"    set fec mode for a specific port\n\n"
 
@@ -912,13 +894,6 @@  static void cmd_help_long_parsed(void *parsed_result,
 			"filters:\n"
 			"--------\n\n"
 
-#ifdef RTE_NET_I40E
-			"flow_director_filter (port_id) mode raw (add|del|update)"
-			" flow (flow_id) (drop|fwd) queue (queue_id)"
-			" fd_id (fd_id_value) packet (packet file name)\n"
-			"    Add/Del a raw type flow director filter.\n\n"
-#endif
-
 			"flow_director_mask (port_id) mode IP vlan (vlan_value)"
 			" src_mask (ipv4_src) (ipv6_src) (src_port)"
 			" dst_mask (ipv4_dst) (ipv6_dst) (dst_port)\n"
@@ -9094,450 +9069,6 @@  cmdline_parse_inst_t cmd_dump_one = {
 	},
 };
 
-/* *** queue region set *** */
-struct cmd_queue_region_result {
-	cmdline_fixed_string_t set;
-	cmdline_fixed_string_t port;
-	portid_t port_id;
-	cmdline_fixed_string_t cmd;
-	cmdline_fixed_string_t region;
-	uint8_t  region_id;
-	cmdline_fixed_string_t queue_start_index;
-	uint8_t  queue_id;
-	cmdline_fixed_string_t queue_num;
-	uint8_t  queue_num_value;
-};
-
-static void
-cmd_queue_region_parsed(void *parsed_result,
-			__rte_unused struct cmdline *cl,
-			__rte_unused void *data)
-{
-	struct cmd_queue_region_result *res = parsed_result;
-	int ret = -ENOTSUP;
-#ifdef RTE_NET_I40E
-	struct rte_pmd_i40e_queue_region_conf region_conf;
-	enum rte_pmd_i40e_queue_region_op op_type;
-#endif
-
-	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
-		return;
-
-#ifdef RTE_NET_I40E
-	memset(&region_conf, 0, sizeof(region_conf));
-	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_SET;
-	region_conf.region_id = res->region_id;
-	region_conf.queue_num = res->queue_num_value;
-	region_conf.queue_start_index = res->queue_id;
-
-	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
-				op_type, &region_conf);
-#endif
-
-	switch (ret) {
-	case 0:
-		break;
-	case -ENOTSUP:
-		fprintf(stderr, "function not implemented or supported\n");
-		break;
-	default:
-		fprintf(stderr, "queue region config error: (%s)\n",
-			strerror(-ret));
-	}
-}
-
-cmdline_parse_token_string_t cmd_queue_region_set =
-TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
-		set, "set");
-cmdline_parse_token_string_t cmd_queue_region_port =
-	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, port, "port");
-cmdline_parse_token_num_t cmd_queue_region_port_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
-				port_id, RTE_UINT16);
-cmdline_parse_token_string_t cmd_queue_region_cmd =
-	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
-				 cmd, "queue-region");
-cmdline_parse_token_string_t cmd_queue_region_id =
-	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
-				region, "region_id");
-cmdline_parse_token_num_t cmd_queue_region_index =
-	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
-				region_id, RTE_UINT8);
-cmdline_parse_token_string_t cmd_queue_region_queue_start_index =
-	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
-				queue_start_index, "queue_start_index");
-cmdline_parse_token_num_t cmd_queue_region_queue_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
-				queue_id, RTE_UINT8);
-cmdline_parse_token_string_t cmd_queue_region_queue_num =
-	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
-				queue_num, "queue_num");
-cmdline_parse_token_num_t cmd_queue_region_queue_num_value =
-	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
-				queue_num_value, RTE_UINT8);
-
-cmdline_parse_inst_t cmd_queue_region = {
-	.f = cmd_queue_region_parsed,
-	.data = NULL,
-	.help_str = "set port <port_id> queue-region region_id <value> "
-		"queue_start_index <value> queue_num <value>: Set a queue region",
-	.tokens = {
-		(void *)&cmd_queue_region_set,
-		(void *)&cmd_queue_region_port,
-		(void *)&cmd_queue_region_port_id,
-		(void *)&cmd_queue_region_cmd,
-		(void *)&cmd_queue_region_id,
-		(void *)&cmd_queue_region_index,
-		(void *)&cmd_queue_region_queue_start_index,
-		(void *)&cmd_queue_region_queue_id,
-		(void *)&cmd_queue_region_queue_num,
-		(void *)&cmd_queue_region_queue_num_value,
-		NULL,
-	},
-};
-
-/* *** queue region and flowtype set *** */
-struct cmd_region_flowtype_result {
-	cmdline_fixed_string_t set;
-	cmdline_fixed_string_t port;
-	portid_t port_id;
-	cmdline_fixed_string_t cmd;
-	cmdline_fixed_string_t region;
-	uint8_t  region_id;
-	cmdline_fixed_string_t flowtype;
-	uint8_t  flowtype_id;
-};
-
-static void
-cmd_region_flowtype_parsed(void *parsed_result,
-			__rte_unused struct cmdline *cl,
-			__rte_unused void *data)
-{
-	struct cmd_region_flowtype_result *res = parsed_result;
-	int ret = -ENOTSUP;
-#ifdef RTE_NET_I40E
-	struct rte_pmd_i40e_queue_region_conf region_conf;
-	enum rte_pmd_i40e_queue_region_op op_type;
-#endif
-
-	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
-		return;
-
-#ifdef RTE_NET_I40E
-	memset(&region_conf, 0, sizeof(region_conf));
-
-	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_FLOWTYPE_SET;
-	region_conf.region_id = res->region_id;
-	region_conf.hw_flowtype = res->flowtype_id;
-
-	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
-			op_type, &region_conf);
-#endif
-
-	switch (ret) {
-	case 0:
-		break;
-	case -ENOTSUP:
-		fprintf(stderr, "function not implemented or supported\n");
-		break;
-	default:
-		fprintf(stderr, "region flowtype config error: (%s)\n",
-			strerror(-ret));
-	}
-}
-
-cmdline_parse_token_string_t cmd_region_flowtype_set =
-TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
-				set, "set");
-cmdline_parse_token_string_t cmd_region_flowtype_port =
-	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
-				port, "port");
-cmdline_parse_token_num_t cmd_region_flowtype_port_index =
-	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
-				port_id, RTE_UINT16);
-cmdline_parse_token_string_t cmd_region_flowtype_cmd =
-	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
-				cmd, "queue-region");
-cmdline_parse_token_string_t cmd_region_flowtype_index =
-	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
-				region, "region_id");
-cmdline_parse_token_num_t cmd_region_flowtype_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
-				region_id, RTE_UINT8);
-cmdline_parse_token_string_t cmd_region_flowtype_flow_index =
-	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
-				flowtype, "flowtype");
-cmdline_parse_token_num_t cmd_region_flowtype_flow_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
-				flowtype_id, RTE_UINT8);
-cmdline_parse_inst_t cmd_region_flowtype = {
-	.f = cmd_region_flowtype_parsed,
-	.data = NULL,
-	.help_str = "set port <port_id> queue-region region_id <value> "
-		"flowtype <value>: Set a flowtype region index",
-	.tokens = {
-		(void *)&cmd_region_flowtype_set,
-		(void *)&cmd_region_flowtype_port,
-		(void *)&cmd_region_flowtype_port_index,
-		(void *)&cmd_region_flowtype_cmd,
-		(void *)&cmd_region_flowtype_index,
-		(void *)&cmd_region_flowtype_id,
-		(void *)&cmd_region_flowtype_flow_index,
-		(void *)&cmd_region_flowtype_flow_id,
-		NULL,
-	},
-};
-
-/* *** User Priority (UP) to queue region (region_id) set *** */
-struct cmd_user_priority_region_result {
-	cmdline_fixed_string_t set;
-	cmdline_fixed_string_t port;
-	portid_t port_id;
-	cmdline_fixed_string_t cmd;
-	cmdline_fixed_string_t user_priority;
-	uint8_t  user_priority_id;
-	cmdline_fixed_string_t region;
-	uint8_t  region_id;
-};
-
-static void
-cmd_user_priority_region_parsed(void *parsed_result,
-			__rte_unused struct cmdline *cl,
-			__rte_unused void *data)
-{
-	struct cmd_user_priority_region_result *res = parsed_result;
-	int ret = -ENOTSUP;
-#ifdef RTE_NET_I40E
-	struct rte_pmd_i40e_queue_region_conf region_conf;
-	enum rte_pmd_i40e_queue_region_op op_type;
-#endif
-
-	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
-		return;
-
-#ifdef RTE_NET_I40E
-	memset(&region_conf, 0, sizeof(region_conf));
-	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_USER_PRIORITY_SET;
-	region_conf.user_priority = res->user_priority_id;
-	region_conf.region_id = res->region_id;
-
-	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
-				op_type, &region_conf);
-#endif
-
-	switch (ret) {
-	case 0:
-		break;
-	case -ENOTSUP:
-		fprintf(stderr, "function not implemented or supported\n");
-		break;
-	default:
-		fprintf(stderr, "user_priority region config error: (%s)\n",
-			strerror(-ret));
-	}
-}
-
-cmdline_parse_token_string_t cmd_user_priority_region_set =
-	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
-				set, "set");
-cmdline_parse_token_string_t cmd_user_priority_region_port =
-	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
-				port, "port");
-cmdline_parse_token_num_t cmd_user_priority_region_port_index =
-	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
-				port_id, RTE_UINT16);
-cmdline_parse_token_string_t cmd_user_priority_region_cmd =
-	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
-				cmd, "queue-region");
-cmdline_parse_token_string_t cmd_user_priority_region_UP =
-	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
-				user_priority, "UP");
-cmdline_parse_token_num_t cmd_user_priority_region_UP_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
-				user_priority_id, RTE_UINT8);
-cmdline_parse_token_string_t cmd_user_priority_region_region =
-	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
-				region, "region_id");
-cmdline_parse_token_num_t cmd_user_priority_region_region_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
-				region_id, RTE_UINT8);
-
-cmdline_parse_inst_t cmd_user_priority_region = {
-	.f = cmd_user_priority_region_parsed,
-	.data = NULL,
-	.help_str = "set port <port_id> queue-region UP <value> "
-		"region_id <value>: Set the mapping of User Priority (UP) "
-		"to queue region (region_id) ",
-	.tokens = {
-		(void *)&cmd_user_priority_region_set,
-		(void *)&cmd_user_priority_region_port,
-		(void *)&cmd_user_priority_region_port_index,
-		(void *)&cmd_user_priority_region_cmd,
-		(void *)&cmd_user_priority_region_UP,
-		(void *)&cmd_user_priority_region_UP_id,
-		(void *)&cmd_user_priority_region_region,
-		(void *)&cmd_user_priority_region_region_id,
-		NULL,
-	},
-};
-
-/* *** flush all queue region related configuration *** */
-struct cmd_flush_queue_region_result {
-	cmdline_fixed_string_t set;
-	cmdline_fixed_string_t port;
-	portid_t port_id;
-	cmdline_fixed_string_t cmd;
-	cmdline_fixed_string_t flush;
-	cmdline_fixed_string_t what;
-};
-
-static void
-cmd_flush_queue_region_parsed(void *parsed_result,
-			__rte_unused struct cmdline *cl,
-			__rte_unused void *data)
-{
-	struct cmd_flush_queue_region_result *res = parsed_result;
-	int ret = -ENOTSUP;
-#ifdef RTE_NET_I40E
-	struct rte_pmd_i40e_queue_region_conf region_conf;
-	enum rte_pmd_i40e_queue_region_op op_type;
-#endif
-
-	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
-		return;
-
-#ifdef RTE_NET_I40E
-	memset(&region_conf, 0, sizeof(region_conf));
-
-	if (strcmp(res->what, "on") == 0)
-		op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_ON;
-	else
-		op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_OFF;
-
-	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
-				op_type, &region_conf);
-#endif
-
-	switch (ret) {
-	case 0:
-		break;
-	case -ENOTSUP:
-		fprintf(stderr, "function not implemented or supported\n");
-		break;
-	default:
-		fprintf(stderr, "queue region config flush error: (%s)\n",
-			strerror(-ret));
-	}
-}
-
-cmdline_parse_token_string_t cmd_flush_queue_region_set =
-	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
-				set, "set");
-cmdline_parse_token_string_t cmd_flush_queue_region_port =
-	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
-				port, "port");
-cmdline_parse_token_num_t cmd_flush_queue_region_port_index =
-	TOKEN_NUM_INITIALIZER(struct cmd_flush_queue_region_result,
-				port_id, RTE_UINT16);
-cmdline_parse_token_string_t cmd_flush_queue_region_cmd =
-	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
-				cmd, "queue-region");
-cmdline_parse_token_string_t cmd_flush_queue_region_flush =
-	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
-				flush, "flush");
-cmdline_parse_token_string_t cmd_flush_queue_region_what =
-	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
-				what, "on#off");
-
-cmdline_parse_inst_t cmd_flush_queue_region = {
-	.f = cmd_flush_queue_region_parsed,
-	.data = NULL,
-	.help_str = "set port <port_id> queue-region flush on|off"
-		": flush all queue region related configuration",
-	.tokens = {
-		(void *)&cmd_flush_queue_region_set,
-		(void *)&cmd_flush_queue_region_port,
-		(void *)&cmd_flush_queue_region_port_index,
-		(void *)&cmd_flush_queue_region_cmd,
-		(void *)&cmd_flush_queue_region_flush,
-		(void *)&cmd_flush_queue_region_what,
-		NULL,
-	},
-};
-
-/* *** get all queue region related configuration info *** */
-struct cmd_show_queue_region_info {
-	cmdline_fixed_string_t show;
-	cmdline_fixed_string_t port;
-	portid_t port_id;
-	cmdline_fixed_string_t cmd;
-};
-
-static void
-cmd_show_queue_region_info_parsed(void *parsed_result,
-			__rte_unused struct cmdline *cl,
-			__rte_unused void *data)
-{
-	struct cmd_show_queue_region_info *res = parsed_result;
-	int ret = -ENOTSUP;
-#ifdef RTE_NET_I40E
-	struct rte_pmd_i40e_queue_regions rte_pmd_regions;
-	enum rte_pmd_i40e_queue_region_op op_type;
-#endif
-
-	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
-		return;
-
-#ifdef RTE_NET_I40E
-	memset(&rte_pmd_regions, 0, sizeof(rte_pmd_regions));
-
-	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_INFO_GET;
-
-	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
-					op_type, &rte_pmd_regions);
-
-	port_queue_region_info_display(res->port_id, &rte_pmd_regions);
-#endif
-
-	switch (ret) {
-	case 0:
-		break;
-	case -ENOTSUP:
-		fprintf(stderr, "function not implemented or supported\n");
-		break;
-	default:
-		fprintf(stderr, "queue region config info show error: (%s)\n",
-			strerror(-ret));
-	}
-}
-
-cmdline_parse_token_string_t cmd_show_queue_region_info_get =
-TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
-				show, "show");
-cmdline_parse_token_string_t cmd_show_queue_region_info_port =
-	TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
-				port, "port");
-cmdline_parse_token_num_t cmd_show_queue_region_info_port_index =
-	TOKEN_NUM_INITIALIZER(struct cmd_show_queue_region_info,
-				port_id, RTE_UINT16);
-cmdline_parse_token_string_t cmd_show_queue_region_info_cmd =
-	TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
-				cmd, "queue-region");
-
-cmdline_parse_inst_t cmd_show_queue_region_info_all = {
-	.f = cmd_show_queue_region_info_parsed,
-	.data = NULL,
-	.help_str = "show port <port_id> queue-region"
-		": show all queue region related configuration info",
-	.tokens = {
-		(void *)&cmd_show_queue_region_info_get,
-		(void *)&cmd_show_queue_region_info_port,
-		(void *)&cmd_show_queue_region_info_port_index,
-		(void *)&cmd_show_queue_region_info_cmd,
-		NULL,
-	},
-};
-
 /* *** Filters Control *** */
 
 #define IPV4_ADDR_TO_UINT(ip_addr, ip) \
@@ -9562,194 +9093,6 @@  do { \
 	} \
 } while (0)
 
-#ifdef RTE_NET_I40E
-
-static uint16_t
-str2flowtype(char *string)
-{
-	uint8_t i = 0;
-	static const struct {
-		char str[32];
-		uint16_t type;
-	} flowtype_str[] = {
-		{"raw", RTE_ETH_FLOW_RAW},
-		{"ipv4", RTE_ETH_FLOW_IPV4},
-		{"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4},
-		{"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP},
-		{"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP},
-		{"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP},
-		{"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER},
-		{"ipv6", RTE_ETH_FLOW_IPV6},
-		{"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6},
-		{"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP},
-		{"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP},
-		{"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP},
-		{"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER},
-		{"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD},
-		{"ipv6-ex", RTE_ETH_FLOW_IPV6_EX},
-		{"ipv6-tcp-ex", RTE_ETH_FLOW_IPV6_TCP_EX},
-		{"ipv6-udp-ex", RTE_ETH_FLOW_IPV6_UDP_EX},
-		{"gtpu", RTE_ETH_FLOW_GTPU},
-	};
-
-	for (i = 0; i < RTE_DIM(flowtype_str); i++) {
-		if (!strcmp(flowtype_str[i].str, string))
-			return flowtype_str[i].type;
-	}
-
-	if (isdigit(string[0]) && atoi(string) > 0 && atoi(string) < 64)
-		return (uint16_t)atoi(string);
-
-	return RTE_ETH_FLOW_UNKNOWN;
-}
-
-/* *** deal with flow director filter *** */
-struct cmd_flow_director_result {
-	cmdline_fixed_string_t flow_director_filter;
-	portid_t port_id;
-	cmdline_fixed_string_t mode;
-	cmdline_fixed_string_t mode_value;
-	cmdline_fixed_string_t ops;
-	cmdline_fixed_string_t flow;
-	cmdline_fixed_string_t flow_type;
-	cmdline_fixed_string_t drop;
-	cmdline_fixed_string_t queue;
-	uint16_t  queue_id;
-	cmdline_fixed_string_t fd_id;
-	uint32_t  fd_id_value;
-	cmdline_fixed_string_t packet;
-	char filepath[];
-};
-
-static void
-cmd_flow_director_filter_parsed(void *parsed_result,
-			  __rte_unused struct cmdline *cl,
-			  __rte_unused void *data)
-{
-	struct cmd_flow_director_result *res = parsed_result;
-	int ret = 0;
-	struct rte_pmd_i40e_flow_type_mapping
-			mapping[RTE_PMD_I40E_FLOW_TYPE_MAX];
-	struct rte_pmd_i40e_pkt_template_conf conf;
-	uint16_t flow_type = str2flowtype(res->flow_type);
-	uint16_t i, port = res->port_id;
-	uint8_t add;
-
-	memset(&conf, 0, sizeof(conf));
-
-	if (flow_type == RTE_ETH_FLOW_UNKNOWN) {
-		fprintf(stderr, "Invalid flow type specified.\n");
-		return;
-	}
-	ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id,
-						 mapping);
-	if (ret)
-		return;
-	if (mapping[flow_type].pctype == 0ULL) {
-		fprintf(stderr, "Invalid flow type specified.\n");
-		return;
-	}
-	for (i = 0; i < RTE_PMD_I40E_PCTYPE_MAX; i++) {
-		if (mapping[flow_type].pctype & (1ULL << i)) {
-			conf.input.pctype = i;
-			break;
-		}
-	}
-
-	conf.input.packet = open_file(res->filepath,
-				&conf.input.length);
-	if (!conf.input.packet)
-		return;
-	if (!strcmp(res->drop, "drop"))
-		conf.action.behavior =
-			RTE_PMD_I40E_PKT_TEMPLATE_REJECT;
-	else
-		conf.action.behavior =
-			RTE_PMD_I40E_PKT_TEMPLATE_ACCEPT;
-	conf.action.report_status =
-			RTE_PMD_I40E_PKT_TEMPLATE_REPORT_ID;
-	conf.action.rx_queue = res->queue_id;
-	conf.soft_id = res->fd_id_value;
-	add  = strcmp(res->ops, "del") ? 1 : 0;
-	ret = rte_pmd_i40e_flow_add_del_packet_template(port,
-							&conf,
-							add);
-	if (ret < 0)
-		fprintf(stderr, "flow director config error: (%s)\n",
-			strerror(-ret));
-	close_file(conf.input.packet);
-}
-
-cmdline_parse_token_string_t cmd_flow_director_filter =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 flow_director_filter, "flow_director_filter");
-cmdline_parse_token_num_t cmd_flow_director_port_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
-			      port_id, RTE_UINT16);
-cmdline_parse_token_string_t cmd_flow_director_ops =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 ops, "add#del#update");
-cmdline_parse_token_string_t cmd_flow_director_flow =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 flow, "flow");
-cmdline_parse_token_string_t cmd_flow_director_flow_type =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-		flow_type, NULL);
-cmdline_parse_token_string_t cmd_flow_director_drop =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 drop, "drop#fwd");
-cmdline_parse_token_string_t cmd_flow_director_queue =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 queue, "queue");
-cmdline_parse_token_num_t cmd_flow_director_queue_id =
-	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
-			      queue_id, RTE_UINT16);
-cmdline_parse_token_string_t cmd_flow_director_fd_id =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 fd_id, "fd_id");
-cmdline_parse_token_num_t cmd_flow_director_fd_id_value =
-	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
-			      fd_id_value, RTE_UINT32);
-
-cmdline_parse_token_string_t cmd_flow_director_mode =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 mode, "mode");
-cmdline_parse_token_string_t cmd_flow_director_mode_raw =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 mode_value, "raw");
-cmdline_parse_token_string_t cmd_flow_director_packet =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 packet, "packet");
-cmdline_parse_token_string_t cmd_flow_director_filepath =
-	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
-				 filepath, NULL);
-
-cmdline_parse_inst_t cmd_add_del_raw_flow_director = {
-	.f = cmd_flow_director_filter_parsed,
-	.data = NULL,
-	.help_str = "flow_director_filter ... : Add or delete a raw flow "
-		"director entry on NIC",
-	.tokens = {
-		(void *)&cmd_flow_director_filter,
-		(void *)&cmd_flow_director_port_id,
-		(void *)&cmd_flow_director_mode,
-		(void *)&cmd_flow_director_mode_raw,
-		(void *)&cmd_flow_director_ops,
-		(void *)&cmd_flow_director_flow,
-		(void *)&cmd_flow_director_flow_type,
-		(void *)&cmd_flow_director_drop,
-		(void *)&cmd_flow_director_queue,
-		(void *)&cmd_flow_director_queue_id,
-		(void *)&cmd_flow_director_fd_id,
-		(void *)&cmd_flow_director_fd_id_value,
-		(void *)&cmd_flow_director_packet,
-		(void *)&cmd_flow_director_filepath,
-		NULL,
-	},
-};
-
-#endif /* RTE_NET_I40E */
-
 /* *** deal with flow director mask *** */
 struct cmd_flow_director_mask_result {
 	cmdline_fixed_string_t flow_director_mask;
@@ -16939,9 +16282,6 @@  static cmdline_parse_ctx_t builtin_ctx[] = {
 	(cmdline_parse_inst_t *)&cmd_cleanup_txq_mbufs,
 	(cmdline_parse_inst_t *)&cmd_dump,
 	(cmdline_parse_inst_t *)&cmd_dump_one,
-#ifdef RTE_NET_I40E
-	(cmdline_parse_inst_t *)&cmd_add_del_raw_flow_director,
-#endif
 	(cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask,
 	(cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask,
 	(cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask,
@@ -17023,11 +16363,6 @@  static cmdline_parse_ctx_t builtin_ctx[] = {
 	(cmdline_parse_inst_t *)&cmd_pctype_mapping_get,
 	(cmdline_parse_inst_t *)&cmd_pctype_mapping_reset,
 	(cmdline_parse_inst_t *)&cmd_pctype_mapping_update,
-	(cmdline_parse_inst_t *)&cmd_queue_region,
-	(cmdline_parse_inst_t *)&cmd_region_flowtype,
-	(cmdline_parse_inst_t *)&cmd_user_priority_region,
-	(cmdline_parse_inst_t *)&cmd_flush_queue_region,
-	(cmdline_parse_inst_t *)&cmd_show_queue_region_info_all,
 	(cmdline_parse_inst_t *)&cmd_show_port_tm_cap,
 	(cmdline_parse_inst_t *)&cmd_show_port_tm_level_cap,
 	(cmdline_parse_inst_t *)&cmd_show_port_tm_node_cap,
diff --git a/drivers/net/i40e/i40e_testpmd.c b/drivers/net/i40e/i40e_testpmd.c
new file mode 100644
index 0000000000..09cd4ff72d
--- /dev/null
+++ b/drivers/net/i40e/i40e_testpmd.c
@@ -0,0 +1,655 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation.
+ */
+#include <rte_pmd_i40e.h>
+
+#include <cmdline_parse_num.h>
+#include <cmdline_parse_string.h>
+
+#include "testpmd.h"
+
+/* *** queue region set *** */
+struct cmd_queue_region_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	portid_t port_id;
+	cmdline_fixed_string_t cmd;
+	cmdline_fixed_string_t region;
+	uint8_t  region_id;
+	cmdline_fixed_string_t queue_start_index;
+	uint8_t  queue_id;
+	cmdline_fixed_string_t queue_num;
+	uint8_t  queue_num_value;
+};
+
+static void
+cmd_queue_region_parsed(void *parsed_result,
+			__rte_unused struct cmdline *cl,
+			__rte_unused void *data)
+{
+	struct cmd_queue_region_result *res = parsed_result;
+	int ret = -ENOTSUP;
+	struct rte_pmd_i40e_queue_region_conf region_conf;
+	enum rte_pmd_i40e_queue_region_op op_type;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+
+	memset(&region_conf, 0, sizeof(region_conf));
+	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_SET;
+	region_conf.region_id = res->region_id;
+	region_conf.queue_num = res->queue_num_value;
+	region_conf.queue_start_index = res->queue_id;
+
+	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
+				op_type, &region_conf);
+	switch (ret) {
+	case 0:
+		break;
+	case -ENOTSUP:
+		fprintf(stderr, "function not implemented or supported\n");
+		break;
+	default:
+		fprintf(stderr, "queue region config error: (%s)\n",
+			strerror(-ret));
+	}
+}
+
+cmdline_parse_token_string_t cmd_queue_region_set =
+TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
+		set, "set");
+cmdline_parse_token_string_t cmd_queue_region_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result, port, "port");
+cmdline_parse_token_num_t cmd_queue_region_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
+				port_id, RTE_UINT16);
+cmdline_parse_token_string_t cmd_queue_region_cmd =
+	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
+				 cmd, "queue-region");
+cmdline_parse_token_string_t cmd_queue_region_id =
+	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
+				region, "region_id");
+cmdline_parse_token_num_t cmd_queue_region_index =
+	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
+				region_id, RTE_UINT8);
+cmdline_parse_token_string_t cmd_queue_region_queue_start_index =
+	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
+				queue_start_index, "queue_start_index");
+cmdline_parse_token_num_t cmd_queue_region_queue_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
+				queue_id, RTE_UINT8);
+cmdline_parse_token_string_t cmd_queue_region_queue_num =
+	TOKEN_STRING_INITIALIZER(struct cmd_queue_region_result,
+				queue_num, "queue_num");
+cmdline_parse_token_num_t cmd_queue_region_queue_num_value =
+	TOKEN_NUM_INITIALIZER(struct cmd_queue_region_result,
+				queue_num_value, RTE_UINT8);
+
+cmdline_parse_inst_t cmd_queue_region = {
+	.f = cmd_queue_region_parsed,
+	.data = NULL,
+	.help_str = "set port <port_id> queue-region region_id <value> "
+		"queue_start_index <value> queue_num <value>: Set a queue region",
+	.tokens = {
+		(void *)&cmd_queue_region_set,
+		(void *)&cmd_queue_region_port,
+		(void *)&cmd_queue_region_port_id,
+		(void *)&cmd_queue_region_cmd,
+		(void *)&cmd_queue_region_id,
+		(void *)&cmd_queue_region_index,
+		(void *)&cmd_queue_region_queue_start_index,
+		(void *)&cmd_queue_region_queue_id,
+		(void *)&cmd_queue_region_queue_num,
+		(void *)&cmd_queue_region_queue_num_value,
+		NULL,
+	},
+};
+
+/* *** queue region and flowtype set *** */
+struct cmd_region_flowtype_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	portid_t port_id;
+	cmdline_fixed_string_t cmd;
+	cmdline_fixed_string_t region;
+	uint8_t  region_id;
+	cmdline_fixed_string_t flowtype;
+	uint8_t  flowtype_id;
+};
+
+static void
+cmd_region_flowtype_parsed(void *parsed_result,
+			__rte_unused struct cmdline *cl,
+			__rte_unused void *data)
+{
+	struct cmd_region_flowtype_result *res = parsed_result;
+	int ret = -ENOTSUP;
+	struct rte_pmd_i40e_queue_region_conf region_conf;
+	enum rte_pmd_i40e_queue_region_op op_type;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+
+	memset(&region_conf, 0, sizeof(region_conf));
+
+	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_FLOWTYPE_SET;
+	region_conf.region_id = res->region_id;
+	region_conf.hw_flowtype = res->flowtype_id;
+
+	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
+			op_type, &region_conf);
+	switch (ret) {
+	case 0:
+		break;
+	case -ENOTSUP:
+		fprintf(stderr, "function not implemented or supported\n");
+		break;
+	default:
+		fprintf(stderr, "region flowtype config error: (%s)\n",
+			strerror(-ret));
+	}
+}
+
+cmdline_parse_token_string_t cmd_region_flowtype_set =
+TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
+				set, "set");
+cmdline_parse_token_string_t cmd_region_flowtype_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
+				port, "port");
+cmdline_parse_token_num_t cmd_region_flowtype_port_index =
+	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
+				port_id, RTE_UINT16);
+cmdline_parse_token_string_t cmd_region_flowtype_cmd =
+	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
+				cmd, "queue-region");
+cmdline_parse_token_string_t cmd_region_flowtype_index =
+	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
+				region, "region_id");
+cmdline_parse_token_num_t cmd_region_flowtype_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
+				region_id, RTE_UINT8);
+cmdline_parse_token_string_t cmd_region_flowtype_flow_index =
+	TOKEN_STRING_INITIALIZER(struct cmd_region_flowtype_result,
+				flowtype, "flowtype");
+cmdline_parse_token_num_t cmd_region_flowtype_flow_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_region_flowtype_result,
+				flowtype_id, RTE_UINT8);
+cmdline_parse_inst_t cmd_region_flowtype = {
+	.f = cmd_region_flowtype_parsed,
+	.data = NULL,
+	.help_str = "set port <port_id> queue-region region_id <value> "
+		"flowtype <value>: Set a flowtype region index",
+	.tokens = {
+		(void *)&cmd_region_flowtype_set,
+		(void *)&cmd_region_flowtype_port,
+		(void *)&cmd_region_flowtype_port_index,
+		(void *)&cmd_region_flowtype_cmd,
+		(void *)&cmd_region_flowtype_index,
+		(void *)&cmd_region_flowtype_id,
+		(void *)&cmd_region_flowtype_flow_index,
+		(void *)&cmd_region_flowtype_flow_id,
+		NULL,
+	},
+};
+
+/* *** User Priority (UP) to queue region (region_id) set *** */
+struct cmd_user_priority_region_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	portid_t port_id;
+	cmdline_fixed_string_t cmd;
+	cmdline_fixed_string_t user_priority;
+	uint8_t  user_priority_id;
+	cmdline_fixed_string_t region;
+	uint8_t  region_id;
+};
+
+static void
+cmd_user_priority_region_parsed(void *parsed_result,
+			__rte_unused struct cmdline *cl,
+			__rte_unused void *data)
+{
+	struct cmd_user_priority_region_result *res = parsed_result;
+	int ret = -ENOTSUP;
+	struct rte_pmd_i40e_queue_region_conf region_conf;
+	enum rte_pmd_i40e_queue_region_op op_type;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+
+	memset(&region_conf, 0, sizeof(region_conf));
+	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_USER_PRIORITY_SET;
+	region_conf.user_priority = res->user_priority_id;
+	region_conf.region_id = res->region_id;
+
+	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
+				op_type, &region_conf);
+	switch (ret) {
+	case 0:
+		break;
+	case -ENOTSUP:
+		fprintf(stderr, "function not implemented or supported\n");
+		break;
+	default:
+		fprintf(stderr, "user_priority region config error: (%s)\n",
+			strerror(-ret));
+	}
+}
+
+cmdline_parse_token_string_t cmd_user_priority_region_set =
+	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
+				set, "set");
+cmdline_parse_token_string_t cmd_user_priority_region_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
+				port, "port");
+cmdline_parse_token_num_t cmd_user_priority_region_port_index =
+	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
+				port_id, RTE_UINT16);
+cmdline_parse_token_string_t cmd_user_priority_region_cmd =
+	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
+				cmd, "queue-region");
+cmdline_parse_token_string_t cmd_user_priority_region_UP =
+	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
+				user_priority, "UP");
+cmdline_parse_token_num_t cmd_user_priority_region_UP_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
+				user_priority_id, RTE_UINT8);
+cmdline_parse_token_string_t cmd_user_priority_region_region =
+	TOKEN_STRING_INITIALIZER(struct cmd_user_priority_region_result,
+				region, "region_id");
+cmdline_parse_token_num_t cmd_user_priority_region_region_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_user_priority_region_result,
+				region_id, RTE_UINT8);
+
+cmdline_parse_inst_t cmd_user_priority_region = {
+	.f = cmd_user_priority_region_parsed,
+	.data = NULL,
+	.help_str = "set port <port_id> queue-region UP <value> "
+		"region_id <value>: Set the mapping of User Priority (UP) "
+		"to queue region (region_id) ",
+	.tokens = {
+		(void *)&cmd_user_priority_region_set,
+		(void *)&cmd_user_priority_region_port,
+		(void *)&cmd_user_priority_region_port_index,
+		(void *)&cmd_user_priority_region_cmd,
+		(void *)&cmd_user_priority_region_UP,
+		(void *)&cmd_user_priority_region_UP_id,
+		(void *)&cmd_user_priority_region_region,
+		(void *)&cmd_user_priority_region_region_id,
+		NULL,
+	},
+};
+
+/* *** flush all queue region related configuration *** */
+struct cmd_flush_queue_region_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	portid_t port_id;
+	cmdline_fixed_string_t cmd;
+	cmdline_fixed_string_t flush;
+	cmdline_fixed_string_t what;
+};
+
+static void
+cmd_flush_queue_region_parsed(void *parsed_result,
+			__rte_unused struct cmdline *cl,
+			__rte_unused void *data)
+{
+	struct cmd_flush_queue_region_result *res = parsed_result;
+	int ret = -ENOTSUP;
+	struct rte_pmd_i40e_queue_region_conf region_conf;
+	enum rte_pmd_i40e_queue_region_op op_type;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+
+	memset(&region_conf, 0, sizeof(region_conf));
+
+	if (strcmp(res->what, "on") == 0)
+		op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_ON;
+	else
+		op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_ALL_FLUSH_OFF;
+
+	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
+				op_type, &region_conf);
+	switch (ret) {
+	case 0:
+		break;
+	case -ENOTSUP:
+		fprintf(stderr, "function not implemented or supported\n");
+		break;
+	default:
+		fprintf(stderr, "queue region config flush error: (%s)\n",
+			strerror(-ret));
+	}
+}
+
+cmdline_parse_token_string_t cmd_flush_queue_region_set =
+	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
+				set, "set");
+cmdline_parse_token_string_t cmd_flush_queue_region_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
+				port, "port");
+cmdline_parse_token_num_t cmd_flush_queue_region_port_index =
+	TOKEN_NUM_INITIALIZER(struct cmd_flush_queue_region_result,
+				port_id, RTE_UINT16);
+cmdline_parse_token_string_t cmd_flush_queue_region_cmd =
+	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
+				cmd, "queue-region");
+cmdline_parse_token_string_t cmd_flush_queue_region_flush =
+	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
+				flush, "flush");
+cmdline_parse_token_string_t cmd_flush_queue_region_what =
+	TOKEN_STRING_INITIALIZER(struct cmd_flush_queue_region_result,
+				what, "on#off");
+
+cmdline_parse_inst_t cmd_flush_queue_region = {
+	.f = cmd_flush_queue_region_parsed,
+	.data = NULL,
+	.help_str = "set port <port_id> queue-region flush on|off"
+		": flush all queue region related configuration",
+	.tokens = {
+		(void *)&cmd_flush_queue_region_set,
+		(void *)&cmd_flush_queue_region_port,
+		(void *)&cmd_flush_queue_region_port_index,
+		(void *)&cmd_flush_queue_region_cmd,
+		(void *)&cmd_flush_queue_region_flush,
+		(void *)&cmd_flush_queue_region_what,
+		NULL,
+	},
+};
+
+/* *** get all queue region related configuration info *** */
+struct cmd_show_queue_region_info {
+	cmdline_fixed_string_t show;
+	cmdline_fixed_string_t port;
+	portid_t port_id;
+	cmdline_fixed_string_t cmd;
+};
+
+static void
+cmd_show_queue_region_info_parsed(void *parsed_result,
+			__rte_unused struct cmdline *cl,
+			__rte_unused void *data)
+{
+	struct cmd_show_queue_region_info *res = parsed_result;
+	int ret = -ENOTSUP;
+	struct rte_pmd_i40e_queue_regions rte_pmd_regions;
+	enum rte_pmd_i40e_queue_region_op op_type;
+
+	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+		return;
+
+	memset(&rte_pmd_regions, 0, sizeof(rte_pmd_regions));
+
+	op_type = RTE_PMD_I40E_RSS_QUEUE_REGION_INFO_GET;
+
+	ret = rte_pmd_i40e_rss_queue_region_conf(res->port_id,
+					op_type, &rte_pmd_regions);
+
+	port_queue_region_info_display(res->port_id, &rte_pmd_regions);
+	switch (ret) {
+	case 0:
+		break;
+	case -ENOTSUP:
+		fprintf(stderr, "function not implemented or supported\n");
+		break;
+	default:
+		fprintf(stderr, "queue region config info show error: (%s)\n",
+			strerror(-ret));
+	}
+}
+
+cmdline_parse_token_string_t cmd_show_queue_region_info_get =
+TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
+				show, "show");
+cmdline_parse_token_string_t cmd_show_queue_region_info_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
+				port, "port");
+cmdline_parse_token_num_t cmd_show_queue_region_info_port_index =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_queue_region_info,
+				port_id, RTE_UINT16);
+cmdline_parse_token_string_t cmd_show_queue_region_info_cmd =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_queue_region_info,
+				cmd, "queue-region");
+
+cmdline_parse_inst_t cmd_show_queue_region_info_all = {
+	.f = cmd_show_queue_region_info_parsed,
+	.data = NULL,
+	.help_str = "show port <port_id> queue-region"
+		": show all queue region related configuration info",
+	.tokens = {
+		(void *)&cmd_show_queue_region_info_get,
+		(void *)&cmd_show_queue_region_info_port,
+		(void *)&cmd_show_queue_region_info_port_index,
+		(void *)&cmd_show_queue_region_info_cmd,
+		NULL,
+	},
+};
+
+static uint16_t
+str2flowtype(char *string)
+{
+	uint8_t i = 0;
+	static const struct {
+		char str[32];
+		uint16_t type;
+	} flowtype_str[] = {
+		{"raw", RTE_ETH_FLOW_RAW},
+		{"ipv4", RTE_ETH_FLOW_IPV4},
+		{"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4},
+		{"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP},
+		{"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP},
+		{"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP},
+		{"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER},
+		{"ipv6", RTE_ETH_FLOW_IPV6},
+		{"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6},
+		{"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP},
+		{"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP},
+		{"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP},
+		{"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER},
+		{"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD},
+		{"ipv6-ex", RTE_ETH_FLOW_IPV6_EX},
+		{"ipv6-tcp-ex", RTE_ETH_FLOW_IPV6_TCP_EX},
+		{"ipv6-udp-ex", RTE_ETH_FLOW_IPV6_UDP_EX},
+		{"gtpu", RTE_ETH_FLOW_GTPU},
+	};
+
+	for (i = 0; i < RTE_DIM(flowtype_str); i++) {
+		if (!strcmp(flowtype_str[i].str, string))
+			return flowtype_str[i].type;
+	}
+
+	if (isdigit(string[0]) && atoi(string) > 0 && atoi(string) < 64)
+		return (uint16_t)atoi(string);
+
+	return RTE_ETH_FLOW_UNKNOWN;
+}
+
+/* *** deal with flow director filter *** */
+struct cmd_flow_director_result {
+	cmdline_fixed_string_t flow_director_filter;
+	portid_t port_id;
+	cmdline_fixed_string_t mode;
+	cmdline_fixed_string_t mode_value;
+	cmdline_fixed_string_t ops;
+	cmdline_fixed_string_t flow;
+	cmdline_fixed_string_t flow_type;
+	cmdline_fixed_string_t drop;
+	cmdline_fixed_string_t queue;
+	uint16_t  queue_id;
+	cmdline_fixed_string_t fd_id;
+	uint32_t  fd_id_value;
+	cmdline_fixed_string_t packet;
+	char filepath[];
+};
+
+static void
+cmd_flow_director_filter_parsed(void *parsed_result,
+			  __rte_unused struct cmdline *cl,
+			  __rte_unused void *data)
+{
+	struct cmd_flow_director_result *res = parsed_result;
+	int ret = 0;
+	struct rte_pmd_i40e_flow_type_mapping
+			mapping[RTE_PMD_I40E_FLOW_TYPE_MAX];
+	struct rte_pmd_i40e_pkt_template_conf conf;
+	uint16_t flow_type = str2flowtype(res->flow_type);
+	uint16_t i, port = res->port_id;
+	uint8_t add;
+
+	memset(&conf, 0, sizeof(conf));
+
+	if (flow_type == RTE_ETH_FLOW_UNKNOWN) {
+		fprintf(stderr, "Invalid flow type specified.\n");
+		return;
+	}
+	ret = rte_pmd_i40e_flow_type_mapping_get(res->port_id,
+						 mapping);
+	if (ret)
+		return;
+	if (mapping[flow_type].pctype == 0ULL) {
+		fprintf(stderr, "Invalid flow type specified.\n");
+		return;
+	}
+	for (i = 0; i < RTE_PMD_I40E_PCTYPE_MAX; i++) {
+		if (mapping[flow_type].pctype & (1ULL << i)) {
+			conf.input.pctype = i;
+			break;
+		}
+	}
+
+	conf.input.packet = open_file(res->filepath,
+				&conf.input.length);
+	if (!conf.input.packet)
+		return;
+	if (!strcmp(res->drop, "drop"))
+		conf.action.behavior =
+			RTE_PMD_I40E_PKT_TEMPLATE_REJECT;
+	else
+		conf.action.behavior =
+			RTE_PMD_I40E_PKT_TEMPLATE_ACCEPT;
+	conf.action.report_status =
+			RTE_PMD_I40E_PKT_TEMPLATE_REPORT_ID;
+	conf.action.rx_queue = res->queue_id;
+	conf.soft_id = res->fd_id_value;
+	add  = strcmp(res->ops, "del") ? 1 : 0;
+	ret = rte_pmd_i40e_flow_add_del_packet_template(port,
+							&conf,
+							add);
+	if (ret < 0)
+		fprintf(stderr, "flow director config error: (%s)\n",
+			strerror(-ret));
+	close_file(conf.input.packet);
+}
+
+cmdline_parse_token_string_t cmd_flow_director_filter =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 flow_director_filter, "flow_director_filter");
+cmdline_parse_token_num_t cmd_flow_director_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+			      port_id, RTE_UINT16);
+cmdline_parse_token_string_t cmd_flow_director_ops =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 ops, "add#del#update");
+cmdline_parse_token_string_t cmd_flow_director_flow =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 flow, "flow");
+cmdline_parse_token_string_t cmd_flow_director_flow_type =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+		flow_type, NULL);
+cmdline_parse_token_string_t cmd_flow_director_drop =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 drop, "drop#fwd");
+cmdline_parse_token_string_t cmd_flow_director_queue =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 queue, "queue");
+cmdline_parse_token_num_t cmd_flow_director_queue_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+			      queue_id, RTE_UINT16);
+cmdline_parse_token_string_t cmd_flow_director_fd_id =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 fd_id, "fd_id");
+cmdline_parse_token_num_t cmd_flow_director_fd_id_value =
+	TOKEN_NUM_INITIALIZER(struct cmd_flow_director_result,
+			      fd_id_value, RTE_UINT32);
+
+cmdline_parse_token_string_t cmd_flow_director_mode =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 mode, "mode");
+cmdline_parse_token_string_t cmd_flow_director_mode_raw =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 mode_value, "raw");
+cmdline_parse_token_string_t cmd_flow_director_packet =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 packet, "packet");
+cmdline_parse_token_string_t cmd_flow_director_filepath =
+	TOKEN_STRING_INITIALIZER(struct cmd_flow_director_result,
+				 filepath, NULL);
+
+cmdline_parse_inst_t cmd_add_del_raw_flow_director = {
+	.f = cmd_flow_director_filter_parsed,
+	.data = NULL,
+	.help_str = "flow_director_filter ... : Add or delete a raw flow "
+		"director entry on NIC",
+	.tokens = {
+		(void *)&cmd_flow_director_filter,
+		(void *)&cmd_flow_director_port_id,
+		(void *)&cmd_flow_director_mode,
+		(void *)&cmd_flow_director_mode_raw,
+		(void *)&cmd_flow_director_ops,
+		(void *)&cmd_flow_director_flow,
+		(void *)&cmd_flow_director_flow_type,
+		(void *)&cmd_flow_director_drop,
+		(void *)&cmd_flow_director_queue,
+		(void *)&cmd_flow_director_queue_id,
+		(void *)&cmd_flow_director_fd_id,
+		(void *)&cmd_flow_director_fd_id_value,
+		(void *)&cmd_flow_director_packet,
+		(void *)&cmd_flow_director_filepath,
+		NULL,
+	},
+};
+
+static struct testpmd_cmdline_parser driver_parser = {
+	.ctx = (cmdline_parse_ctx_t[]) {
+		(cmdline_parse_inst_t *)&cmd_queue_region,
+		(cmdline_parse_inst_t *)&cmd_region_flowtype,
+		(cmdline_parse_inst_t *)&cmd_user_priority_region,
+		(cmdline_parse_inst_t *)&cmd_flush_queue_region,
+		(cmdline_parse_inst_t *)&cmd_show_queue_region_info_all,
+		(cmdline_parse_inst_t *)&cmd_add_del_raw_flow_director,
+		NULL
+	},
+	.help = {
+		"set port (port_id) queue-region region_id (value) "
+		"queue_start_index (value) queue_num (value)\n"
+		"    Set a queue region on a port\n",
+
+		"set port (port_id) queue-region region_id (value) "
+		"flowtype (value)\n"
+		"    Set a flowtype region index on a port\n",
+
+		"set port (port_id) queue-region UP (value) region_id (value)\n"
+		"    Set the mapping of User Priority to "
+		"queue region on a port\n",
+
+		"set port (port_id) queue-region flush (on|off)\n"
+		"    flush all queue region related configuration\n",
+
+		"show port (port_id) queue-region\n"
+		"    show all queue region related configuration info\n",
+
+		"flow_director_filter (port_id) mode raw (add|del|update)"
+		" flow (flow_id) (drop|fwd) queue (queue_id)"
+		" fd_id (fd_id_value) packet (packet file name)\n"
+		"    Add/Del a raw type flow director filter.\n",
+
+		NULL
+	},
+};
+
+RTE_INIT(i40e_testpmd)
+{
+	testpmd_add_commands(&driver_parser);
+}
diff --git a/drivers/net/i40e/meson.build b/drivers/net/i40e/meson.build
index efc5f93e35..b282ec7213 100644
--- a/drivers/net/i40e/meson.build
+++ b/drivers/net/i40e/meson.build
@@ -21,6 +21,8 @@  sources = files(
         'rte_pmd_i40e.c',
 )
 
+testpmd_sources = files('i40e_testpmd.c')
+
 deps += ['hash']
 includes += include_directories('base')