All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] app/testpmd: metering and policing CLI clean up
@ 2017-11-20 16:39 Jasvinder Singh
  2017-11-20 16:39 ` [PATCH 2/3] app/testpmd: add CLI for metering and policing API Jasvinder Singh
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Jasvinder Singh @ 2017-11-20 16:39 UTC (permalink / raw)
  To: dev; +Cc: cristian.dumitrescu, jingjing.wu, john.mcnamara

This patch updates the metering and policing CLIs as follows:
- change name of set port meter CLI to create port meter and add meter
  enable option, dscp table entries arguments, action mask, policer actions
  and previous meter color option as an input color
- set the right metering algorithm in add meter profile CLIs related to
  srtcm(rfc2697) and trtcm(rfc2698,rfc4115)
- change clear flag type from uint32_t to string in show meter stats CLI

Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
 app/test-pmd/cmdline.c     |  12 +-
 app/test-pmd/cmdline_mtr.c | 329 ++++++++++++++++++++++++++++++++-------------
 app/test-pmd/cmdline_mtr.h |   2 +-
 3 files changed, 248 insertions(+), 95 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index f71d963..2672d05 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -698,7 +698,7 @@ static void cmd_help_long_parsed(void *parsed_result,
 			"set port (port_id) queue-region flush (on|off)\n"
 			"    flush all queue region related configuration\n\n"
 
-			"add port meter profile srtcm_rfc2697 (port_id) (profile_id) (cir) (cbs) (ebs) (color_aware)\n"
+			"add port meter profile srtcm_rfc2697 (port_id) (profile_id) (cir) (cbs) (ebs)\n"
 			"    meter profile add - srtcm rfc 2697\n\n"
 
 			"add port meter profile trtcm_rfc2698 (port_id) (profile_id) (cir) (pir) (cbs) (pbs)\n"
@@ -710,7 +710,10 @@ static void cmd_help_long_parsed(void *parsed_result,
 			"del port meter profile (port_id) (profile_id)\n"
 			"    meter profile delete\n\n"
 
-			"set port meter (port_id) (mtr_id) (profile_id) (g_action) (y_action) (r_action) (stats_mask) (shared)\n"
+			"create port meter (port_id) (mtr_id) (profile_id) (meter_enable)\n"
+			"(g_action) (y_action) (r_action) (stats_mask) (shared)\n"
+			"(use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\n"
+			"(dscp_tbl_entry63)]\n"
 			"    meter create\n\n"
 
 			"del port meter (port_id) (mtr_id)\n"
@@ -719,7 +722,8 @@ static void cmd_help_long_parsed(void *parsed_result,
 			"set port meter profile (port_id) (mtr_id) (profile_id)\n"
 			"    meter update meter profile\n\n"
 
-			"set port meter policer action (port_id) (mtr_id) (color) (action)\n"
+			"set port meter policer action (port_id) (mtr_id) (action_mask)\n"
+			"(action0) [(action1) (action2)]\n"
 			"    meter update policer action\n\n"
 
 			"set port meter stats mask (port_id) (mtr_id) (stats_mask)\n"
@@ -15688,7 +15692,7 @@ cmdline_parse_ctx_t main_ctx[] = {
 	(cmdline_parse_inst_t *)&cmd_add_port_meter_profile_srtcm,
 	(cmdline_parse_inst_t *)&cmd_add_port_meter_profile_trtcm,
 	(cmdline_parse_inst_t *)&cmd_del_port_meter_profile,
-	(cmdline_parse_inst_t *)&cmd_set_port_meter,
+	(cmdline_parse_inst_t *)&cmd_create_port_meter,
 	(cmdline_parse_inst_t *)&cmd_del_port_meter,
 	(cmdline_parse_inst_t *)&cmd_set_port_meter_profile,
 	(cmdline_parse_inst_t *)&cmd_set_port_meter_policer_action,
diff --git a/app/test-pmd/cmdline_mtr.c b/app/test-pmd/cmdline_mtr.c
index d8d806d..8c85bf0 100644
--- a/app/test-pmd/cmdline_mtr.c
+++ b/app/test-pmd/cmdline_mtr.c
@@ -42,6 +42,9 @@
 #include "testpmd.h"
 #include "cmdline_mtr.h"
 
+#define PARSE_DELIMITER				" \f\n\r\t\v"
+#define MAX_DSCP_TABLE_ENTRIES		64
+
 /** Display Meter Error Message */
 static void
 print_err_msg(struct rte_mtr_error *error)
@@ -83,23 +86,137 @@ print_err_msg(struct rte_mtr_error *error)
 }
 
 static int
+parse_uint(uint64_t *value, const char *str)
+{
+	char *next = NULL;
+	uint64_t n;
+
+	errno = 0;
+	/* Parse number string */
+	n = strtol(str, &next, 10);
+	if (errno != 0 || str == next || *next != '\0')
+		return -1;
+
+	*value = n;
+
+	return 0;
+}
+
+static int
+parse_dscp_table_entries(char *str, enum rte_mtr_color *dscp_table)
+{
+	char *token;
+	int i = 0;
+
+	token = strtok_r(str, PARSE_DELIMITER, &str);
+	if (token == NULL)
+		return 0;
+
+	/* Allocate memory for dscp table */
+	dscp_table = (enum rte_mtr_color *)malloc(MAX_DSCP_TABLE_ENTRIES *
+		sizeof(enum rte_mtr_color));
+
+	while (1) {
+		if (strcmp(token, "G") == 0 ||
+			strcmp(token, "g") == 0)
+			dscp_table[i++] = RTE_MTR_GREEN;
+		else if (strcmp(token, "Y") == 0 ||
+			strcmp(token, "y") == 0)
+			dscp_table[i++] = RTE_MTR_YELLOW;
+		else if (strcmp(token, "R") == 0 ||
+			strcmp(token, "r") == 0)
+			dscp_table[i++] = RTE_MTR_RED;
+		else {
+			free(dscp_table);
+			return -1;
+		}
+		if (i == MAX_DSCP_TABLE_ENTRIES)
+			break;
+
+		token = strtok_r(str, PARSE_DELIMITER, &str);
+		if (token == NULL)
+			return -1;
+	}
+	return 0;
+}
+
+static int
+parse_meter_color_str(char *c_str, uint32_t *use_prev_meter_color,
+	enum rte_mtr_color *dscp_table)
+{
+	char *token;
+	uint64_t previous_mtr_color = 0;
+	int ret;
+
+	/* First token: use previous meter color */
+	token = strtok_r(c_str, PARSE_DELIMITER, &c_str);
+	if (token ==  NULL)
+		return -1;
+
+	ret = parse_uint(&previous_mtr_color, token);
+	if (ret != 0)
+		return -1;
+
+	/* Check if previous meter color to be used */
+	if (previous_mtr_color) {
+		*use_prev_meter_color = previous_mtr_color;
+		return 0;
+	}
+
+	/* Parse dscp table entries */
+	ret = parse_dscp_table_entries(c_str, dscp_table);
+	if (ret != 0)
+		return -1;
+
+	return 0;
+}
+
+static int
 string_to_policer_action(char *s)
 {
-	if (strcmp(s, "G") == 0)
+	if ((strcmp(s, "G") == 0) || (strcmp(s, "g") == 0))
 		return MTR_POLICER_ACTION_COLOR_GREEN;
 
-	if (strcmp(s, "Y") == 0)
+	if ((strcmp(s, "Y") == 0) || (strcmp(s, "y") == 0))
 		return MTR_POLICER_ACTION_COLOR_YELLOW;
 
-	if (strcmp(s, "R") == 0)
+	if ((strcmp(s, "R") == 0) || (strcmp(s, "r") == 0))
 		return MTR_POLICER_ACTION_COLOR_RED;
 
-	if (strcmp(s, "D") == 0)
+	if ((strcmp(s, "D") == 0) || (strcmp(s, "d") == 0))
 		return MTR_POLICER_ACTION_DROP;
 
 	return -1;
 }
 
+static int
+parse_policer_action_string(char *p_str, uint32_t action_mask,
+	enum rte_mtr_policer_action actions[])
+{
+	char *token;
+	int count = __builtin_popcount(action_mask);
+	int g_color = 0, y_color = 0, action, i;
+
+	for (i = 0; i < count; i++) {
+		token = strtok_r(p_str, PARSE_DELIMITER, &p_str);
+		if (token ==  NULL)
+			return -1;
+
+		action = string_to_policer_action(token);
+		if (action == -1)
+			return -1;
+
+		if (g_color == 0 && (action_mask & 0x1)) {
+			actions[RTE_MTR_GREEN] = action;
+			g_color = 1;
+		} else if (y_color == 0 && (action_mask & 0x2)) {
+			actions[RTE_MTR_YELLOW] = action;
+			y_color = 1;
+		} else
+			actions[RTE_MTR_RED] = action;
+	}
+	return 0;
+}
 /* *** Add Port Meter Profile srtcm_rfc2697 *** */
 struct cmd_add_port_meter_profile_srtcm_result {
 	cmdline_fixed_string_t add;
@@ -112,7 +229,6 @@ struct cmd_add_port_meter_profile_srtcm_result {
 	uint64_t cir;
 	uint64_t cbs;
 	uint64_t ebs;
-	uint8_t color_aware;
 };
 
 cmdline_parse_token_string_t cmd_add_port_meter_profile_srtcm_add =
@@ -171,7 +287,7 @@ static void cmd_add_port_meter_profile_srtcm_parsed(void *parsed_result,
 
 	/* Private shaper profile params */
 	memset(&mp, 0, sizeof(struct rte_mtr_meter_profile));
-	mp.alg = 0;
+	mp.alg = RTE_MTR_SRTCM_RFC2697;
 	mp.srtcm_rfc2697.cir = res->cir;
 	mp.srtcm_rfc2697.cbs = res->cbs;
 	mp.srtcm_rfc2697.ebs = res->ebs;
@@ -277,7 +393,7 @@ static void cmd_add_port_meter_profile_trtcm_parsed(void *parsed_result,
 
 	/* Private shaper profile params */
 	memset(&mp, 0, sizeof(struct rte_mtr_meter_profile));
-	mp.alg = 0;
+	mp.alg = RTE_MTR_TRTCM_RFC2698;
 	mp.trtcm_rfc2698.cir = res->cir;
 	mp.trtcm_rfc2698.pir = res->pir;
 	mp.trtcm_rfc2698.cbs = res->cbs;
@@ -389,7 +505,7 @@ static void cmd_add_port_meter_profile_trtcm_rfc4115_parsed(
 
 	/* Private shaper profile params */
 	memset(&mp, 0, sizeof(struct rte_mtr_meter_profile));
-	mp.alg = 0;
+	mp.alg = RTE_MTR_TRTCM_RFC4115;
 	mp.trtcm_rfc4115.cir = res->cir;
 	mp.trtcm_rfc4115.eir = res->eir;
 	mp.trtcm_rfc4115.cbs = res->cbs;
@@ -493,65 +609,75 @@ cmdline_parse_inst_t cmd_del_port_meter_profile = {
 };
 
 /* *** Create Port Meter Object *** */
-struct cmd_set_port_meter_result {
-	cmdline_fixed_string_t set;
+struct cmd_create_port_meter_result {
+	cmdline_fixed_string_t create;
 	cmdline_fixed_string_t port;
 	cmdline_fixed_string_t meter;
 	uint16_t port_id;
 	uint32_t mtr_id;
 	uint32_t profile_id;
+	cmdline_fixed_string_t meter_enable;
 	cmdline_fixed_string_t g_action;
 	cmdline_fixed_string_t y_action;
 	cmdline_fixed_string_t r_action;
 	uint64_t statistics_mask;
 	uint32_t shared;
+	cmdline_multi_string_t meter_input_color;
 };
 
-cmdline_parse_token_string_t cmd_set_port_meter_set =
+cmdline_parse_token_string_t cmd_create_port_meter_create =
 	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_result, set, "set");
-cmdline_parse_token_string_t cmd_set_port_meter_port =
+		struct cmd_create_port_meter_result, create, "create");
+cmdline_parse_token_string_t cmd_create_port_meter_port =
 	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_result, port, "port");
-cmdline_parse_token_string_t cmd_set_port_meter_meter =
+		struct cmd_create_port_meter_result, port, "port");
+cmdline_parse_token_string_t cmd_create_port_meter_meter =
 	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_result, meter, "meter");
-cmdline_parse_token_num_t cmd_set_port_meter_port_id =
+		struct cmd_create_port_meter_result, meter, "meter");
+cmdline_parse_token_num_t cmd_create_port_meter_port_id =
 	TOKEN_NUM_INITIALIZER(
-		struct cmd_set_port_meter_result, port_id, UINT16);
-cmdline_parse_token_num_t cmd_set_port_meter_mtr_id =
+		struct cmd_create_port_meter_result, port_id, UINT16);
+cmdline_parse_token_num_t cmd_create_port_meter_mtr_id =
 	TOKEN_NUM_INITIALIZER(
-		struct cmd_set_port_meter_result, mtr_id, UINT32);
-cmdline_parse_token_num_t cmd_set_port_meter_profile_id =
+		struct cmd_create_port_meter_result, mtr_id, UINT32);
+cmdline_parse_token_num_t cmd_create_port_meter_profile_id =
 	TOKEN_NUM_INITIALIZER(
-		struct cmd_set_port_meter_result, profile_id, UINT32);
-cmdline_parse_token_string_t cmd_set_port_meter_g_action =
-	TOKEN_STRING_INITIALIZER(struct cmd_set_port_meter_result,
-		g_action, "R#Y#G#D");
-cmdline_parse_token_string_t cmd_set_port_meter_y_action =
-	TOKEN_STRING_INITIALIZER(struct cmd_set_port_meter_result,
-		y_action, "R#Y#G#D");
-cmdline_parse_token_string_t cmd_set_port_meter_r_action =
-	TOKEN_STRING_INITIALIZER(struct cmd_set_port_meter_result,
-		r_action, "R#Y#G#D");
-cmdline_parse_token_num_t cmd_set_port_meter_statistics_mask =
-	TOKEN_NUM_INITIALIZER(struct cmd_set_port_meter_result,
+		struct cmd_create_port_meter_result, profile_id, UINT32);
+cmdline_parse_token_string_t cmd_create_port_meter_meter_enable =
+	TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result,
+		meter_enable, "yes#no");
+cmdline_parse_token_string_t cmd_create_port_meter_g_action =
+	TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result,
+		g_action, "R#Y#G#D#r#y#g#d");
+cmdline_parse_token_string_t cmd_create_port_meter_y_action =
+	TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result,
+		y_action, "R#Y#G#D#r#y#g#d");
+cmdline_parse_token_string_t cmd_create_port_meter_r_action =
+	TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result,
+		r_action, "R#Y#G#D#r#y#g#d");
+cmdline_parse_token_num_t cmd_create_port_meter_statistics_mask =
+	TOKEN_NUM_INITIALIZER(struct cmd_create_port_meter_result,
 		statistics_mask, UINT64);
-cmdline_parse_token_num_t cmd_set_port_meter_shared =
-	TOKEN_NUM_INITIALIZER(struct cmd_set_port_meter_result,
+cmdline_parse_token_num_t cmd_create_port_meter_shared =
+	TOKEN_NUM_INITIALIZER(struct cmd_create_port_meter_result,
 		shared, UINT32);
+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);
 
-static void cmd_set_port_meter_parsed(void *parsed_result,
+static void cmd_create_port_meter_parsed(void *parsed_result,
 	__attribute__((unused)) struct cmdline *cl,
 	__attribute__((unused)) void *data)
 {
-	struct cmd_set_port_meter_result *res = parsed_result;
+	struct cmd_create_port_meter_result *res = parsed_result;
 	struct rte_mtr_error error;
 	struct rte_mtr_params params;
 	uint32_t mtr_id = res->mtr_id;
 	uint32_t shared = res->shared;
+	uint32_t use_prev_meter_color = 0;
 	uint16_t port_id = res->port_id;
-
+	enum rte_mtr_color *dscp_table = NULL;
+	char *c_str = res->meter_input_color;
 	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
@@ -560,9 +686,22 @@ static void cmd_set_port_meter_parsed(void *parsed_result,
 	/* Meter params */
 	memset(&params, 0, sizeof(struct rte_mtr_params));
 	params.meter_profile_id = res->profile_id;
-	params.use_prev_mtr_color = 1;
-	params.dscp_table = NULL;
-	params.meter_enable = 1;
+
+	/* Parse meter input color string params */
+	ret = parse_meter_color_str(c_str, &use_prev_meter_color, dscp_table);
+	if (ret) {
+		printf(" Meter input color params string parse error\n");
+		return;
+	}
+
+	params.use_prev_mtr_color = use_prev_meter_color;
+	params.dscp_table = dscp_table;
+
+	if (strcmp(res->meter_enable, "yes") == 0)
+		params.meter_enable = 1;
+	else
+		params.meter_enable = 0;
+
 	params.action[RTE_MTR_GREEN] =
 		string_to_policer_action(res->g_action);
 	params.action[RTE_MTR_YELLOW] =
@@ -573,27 +712,30 @@ static void cmd_set_port_meter_parsed(void *parsed_result,
 
 	ret = rte_mtr_create(port_id, mtr_id, &params, shared, &error);
 	if (ret != 0) {
+		free(dscp_table);
 		print_err_msg(&error);
 		return;
 	}
 }
 
-cmdline_parse_inst_t cmd_set_port_meter = {
-	.f = cmd_set_port_meter_parsed,
+cmdline_parse_inst_t cmd_create_port_meter = {
+	.f = cmd_create_port_meter_parsed,
 	.data = NULL,
-	.help_str = "Set port meter",
+	.help_str = "Create port meter",
 	.tokens = {
-		(void *)&cmd_set_port_meter_set,
-		(void *)&cmd_set_port_meter_port,
-		(void *)&cmd_set_port_meter_meter,
-		(void *)&cmd_set_port_meter_port_id,
-		(void *)&cmd_set_port_meter_mtr_id,
-		(void *)&cmd_set_port_meter_profile_id,
-		(void *)&cmd_set_port_meter_g_action,
-		(void *)&cmd_set_port_meter_y_action,
-		(void *)&cmd_set_port_meter_r_action,
-		(void *)&cmd_set_port_meter_statistics_mask,
-		(void *)&cmd_set_port_meter_shared,
+		(void *)&cmd_create_port_meter_create,
+		(void *)&cmd_create_port_meter_port,
+		(void *)&cmd_create_port_meter_meter,
+		(void *)&cmd_create_port_meter_port_id,
+		(void *)&cmd_create_port_meter_mtr_id,
+		(void *)&cmd_create_port_meter_profile_id,
+		(void *)&cmd_create_port_meter_meter_enable,
+		(void *)&cmd_create_port_meter_g_action,
+		(void *)&cmd_create_port_meter_y_action,
+		(void *)&cmd_create_port_meter_r_action,
+		(void *)&cmd_create_port_meter_statistics_mask,
+		(void *)&cmd_create_port_meter_shared,
+		(void *)&cmd_create_port_meter_input_color,
 		NULL,
 	},
 };
@@ -741,8 +883,8 @@ struct cmd_set_port_meter_policer_action_result {
 	cmdline_fixed_string_t action;
 	uint16_t port_id;
 	uint32_t mtr_id;
-	cmdline_fixed_string_t color;
-	cmdline_fixed_string_t policer_action;
+	uint32_t action_mask;
+	cmdline_multi_string_t policer_action;
 };
 
 cmdline_parse_token_string_t cmd_set_port_meter_policer_action_set =
@@ -771,56 +913,60 @@ cmdline_parse_token_num_t cmd_set_port_meter_policer_action_mtr_id =
 	TOKEN_NUM_INITIALIZER(
 		struct cmd_set_port_meter_policer_action_result, mtr_id,
 		UINT32);
-cmdline_parse_token_string_t cmd_set_port_meter_policer_action_color =
-	TOKEN_STRING_INITIALIZER(
-		struct cmd_set_port_meter_policer_action_result, color,
-		"G#Y#R");
+cmdline_parse_token_num_t cmd_set_port_meter_policer_action_action_mask =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_meter_policer_action_result, action_mask,
+		UINT32);
 cmdline_parse_token_string_t cmd_set_port_meter_policer_action_policer_action =
 	TOKEN_STRING_INITIALIZER(
 		struct cmd_set_port_meter_policer_action_result,
-		policer_action, "G#Y#R#D");
+		policer_action, TOKEN_STRING_MULTI);
 
 static void cmd_set_port_meter_policer_action_parsed(void *parsed_result,
 	__attribute__((unused)) struct cmdline *cl,
 	__attribute__((unused)) void *data)
 {
 	struct cmd_set_port_meter_policer_action_result *res = parsed_result;
-	enum rte_mtr_color color;
-	enum rte_mtr_policer_action action[RTE_MTR_COLORS];
+	enum rte_mtr_policer_action *actions;
 	struct rte_mtr_error error;
 	uint32_t mtr_id = res->mtr_id;
+	uint32_t action_mask = res->action_mask;
 	uint16_t port_id = res->port_id;
-	char *c = res->color;
-	char *a = res->policer_action;
+	char *p_str = res->policer_action;
 	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
 
-	/* Color */
-	if (strcmp(c, "G") == 0)
-		color = RTE_MTR_GREEN;
-	else if (strcmp(c, "Y") == 0)
-		color = RTE_MTR_YELLOW;
-	else
-		color = RTE_MTR_RED;
-
-	/* Action */
-	if (strcmp(a, "G") == 0)
-		action[color] = MTR_POLICER_ACTION_COLOR_GREEN;
-	else if (strcmp(a, "Y") == 0)
-		action[color] = MTR_POLICER_ACTION_COLOR_YELLOW;
-	else if (strcmp(a, "R") == 0)
-		action[color] = MTR_POLICER_ACTION_COLOR_RED;
-	else
-		action[color] = MTR_POLICER_ACTION_DROP;
+	/* Check: action mask */
+	if (action_mask == 0 || (action_mask & (~0x7UL))) {
+		printf(" Policer action mask not correct (error)\n");
+		return;
+	}
+
+	/* Allocate memory for policer actions */
+	actions = (enum rte_mtr_policer_action *)malloc(RTE_MTR_COLORS *
+		sizeof(enum rte_mtr_policer_action));
+	if (actions == NULL) {
+		printf("Memory for policer actions not allocated (error)\n");
+		return;
+	}
+	/* Parse policer action string */
+	ret = parse_policer_action_string(p_str, action_mask, actions);
+	if (ret) {
+		printf(" Policer action string parse error\n");
+		free(actions);
+		return;
+	}
 
 	ret = rte_mtr_policer_actions_update(port_id, mtr_id,
-		1 << color, action, &error);
+		action_mask, actions, &error);
 	if (ret != 0) {
 		print_err_msg(&error);
 		return;
 	}
+
+	free(actions);
 }
 
 cmdline_parse_inst_t cmd_set_port_meter_policer_action = {
@@ -835,7 +981,7 @@ cmdline_parse_inst_t cmd_set_port_meter_policer_action = {
 		(void *)&cmd_set_port_meter_policer_action_action,
 		(void *)&cmd_set_port_meter_policer_action_port_id,
 		(void *)&cmd_set_port_meter_policer_action_mtr_id,
-		(void *)&cmd_set_port_meter_policer_action_color,
+		(void *)&cmd_set_port_meter_policer_action_action_mask,
 		(void *)&cmd_set_port_meter_policer_action_policer_action,
 		NULL,
 	},
@@ -925,7 +1071,7 @@ struct cmd_show_port_meter_stats_result {
 	cmdline_fixed_string_t stats;
 	uint16_t port_id;
 	uint32_t mtr_id;
-	uint32_t clear;
+	cmdline_fixed_string_t clear;
 };
 
 cmdline_parse_token_string_t cmd_show_port_meter_stats_show =
@@ -946,9 +1092,9 @@ cmdline_parse_token_num_t cmd_show_port_meter_stats_port_id =
 cmdline_parse_token_num_t cmd_show_port_meter_stats_mtr_id =
 	TOKEN_NUM_INITIALIZER(
 		struct cmd_show_port_meter_stats_result, mtr_id, UINT32);
-cmdline_parse_token_num_t cmd_show_port_meter_stats_clear =
-	TOKEN_NUM_INITIALIZER(
-		struct cmd_show_port_meter_stats_result, clear, UINT32);
+cmdline_parse_token_string_t cmd_show_port_meter_stats_clear =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_meter_stats_result, clear, "yes#no");
 
 static void cmd_show_port_meter_stats_parsed(void *parsed_result,
 	__attribute__((unused)) struct cmdline *cl,
@@ -959,13 +1105,16 @@ static void cmd_show_port_meter_stats_parsed(void *parsed_result,
 	uint64_t stats_mask = 0;
 	struct rte_mtr_error error;
 	uint32_t mtr_id = res->mtr_id;
-	uint32_t clear = res->clear;
+	uint32_t clear = 0;
 	uint16_t port_id = res->port_id;
 	int ret;
 
 	if (port_id_is_invalid(port_id, ENABLED_WARN))
 		return;
 
+	if (strcmp(res->clear, "yes") == 0)
+		clear = 1;
+
 	memset(&stats, 0, sizeof(struct rte_mtr_stats));
 	ret = rte_mtr_stats_read(port_id, mtr_id, &stats,
 		&stats_mask, clear, &error);
diff --git a/app/test-pmd/cmdline_mtr.h b/app/test-pmd/cmdline_mtr.h
index 5d599ef..2a91264 100644
--- a/app/test-pmd/cmdline_mtr.h
+++ b/app/test-pmd/cmdline_mtr.h
@@ -39,7 +39,7 @@ extern cmdline_parse_inst_t cmd_add_port_meter_profile_srtcm;
 extern cmdline_parse_inst_t cmd_add_port_meter_profile_trtcm;
 extern cmdline_parse_inst_t cmd_add_port_meter_profile_trtcm_rfc4115;
 extern cmdline_parse_inst_t cmd_del_port_meter_profile;
-extern cmdline_parse_inst_t cmd_set_port_meter;
+extern cmdline_parse_inst_t cmd_create_port_meter;
 extern cmdline_parse_inst_t cmd_del_port_meter;
 extern cmdline_parse_inst_t cmd_set_port_meter_profile;
 extern cmdline_parse_inst_t cmd_set_port_meter_policer_action;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/3] app/testpmd: add CLI for metering and policing API
  2017-11-20 16:39 [PATCH 1/3] app/testpmd: metering and policing CLI clean up Jasvinder Singh
@ 2017-11-20 16:39 ` Jasvinder Singh
  2018-01-07 14:37   ` Wu, Jingjing
  2017-11-20 16:39 ` [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd Jasvinder Singh
  2018-01-07 14:25 ` [PATCH 1/3] app/testpmd: metering and policing CLI clean up Wu, Jingjing
  2 siblings, 1 reply; 10+ messages in thread
From: Jasvinder Singh @ 2017-11-20 16:39 UTC (permalink / raw)
  To: dev; +Cc: cristian.dumitrescu, jingjing.wu, john.mcnamara

Add following CLIs to testpmd application;
- show port metering and policing capabilities.
- enable/disable meter of the MTR object.
- update the MTR object dscp table entries.

Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
 app/test-pmd/cmdline.c     |  17 +++
 app/test-pmd/cmdline_mtr.c | 325 +++++++++++++++++++++++++++++++++++++++++++++
 app/test-pmd/cmdline_mtr.h |   4 +
 3 files changed, 346 insertions(+)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 2672d05..cfd8fcf 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -698,6 +698,9 @@ static void cmd_help_long_parsed(void *parsed_result,
 			"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"
+
 			"add port meter profile srtcm_rfc2697 (port_id) (profile_id) (cir) (cbs) (ebs)\n"
 			"    meter profile add - srtcm rfc 2697\n\n"
 
@@ -716,12 +719,22 @@ static void cmd_help_long_parsed(void *parsed_result,
 			"(dscp_tbl_entry63)]\n"
 			"    meter create\n\n"
 
+			"enable port meter (port_id) (mtr_id)\n"
+			"    meter enable\n\n"
+
+			"disable port meter (port_id) (mtr_id)\n"
+			"    meter disable\n\n"
+
 			"del port meter (port_id) (mtr_id)\n"
 			"    meter delete\n\n"
 
 			"set port meter profile (port_id) (mtr_id) (profile_id)\n"
 			"    meter update meter profile\n\n"
 
+			"set port meter dscp table (port_id) (mtr_id) [(dscp_tbl_entry0)\n"
+			"(dscp_tbl_entry1)...(dscp_tbl_entry63)]\n"
+			"    update meter dscp table entries\n\n"
+
 			"set port meter policer action (port_id) (mtr_id) (action_mask)\n"
 			"(action0) [(action1) (action2)]\n"
 			"    meter update policer action\n\n"
@@ -15689,12 +15702,16 @@ cmdline_parse_ctx_t main_ctx[] = {
 	(cmdline_parse_inst_t *)&cmd_set_hash_input_set,
 	(cmdline_parse_inst_t *)&cmd_set_fdir_input_set,
 	(cmdline_parse_inst_t *)&cmd_flow,
+	(cmdline_parse_inst_t *)&cmd_show_port_meter_cap,
 	(cmdline_parse_inst_t *)&cmd_add_port_meter_profile_srtcm,
 	(cmdline_parse_inst_t *)&cmd_add_port_meter_profile_trtcm,
 	(cmdline_parse_inst_t *)&cmd_del_port_meter_profile,
 	(cmdline_parse_inst_t *)&cmd_create_port_meter,
+	(cmdline_parse_inst_t *)&cmd_enable_port_meter,
+	(cmdline_parse_inst_t *)&cmd_disable_port_meter,
 	(cmdline_parse_inst_t *)&cmd_del_port_meter,
 	(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_policer_action,
 	(cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask,
 	(cmdline_parse_inst_t *)&cmd_show_port_meter_stats,
diff --git a/app/test-pmd/cmdline_mtr.c b/app/test-pmd/cmdline_mtr.c
index 8c85bf0..5fe55d3 100644
--- a/app/test-pmd/cmdline_mtr.c
+++ b/app/test-pmd/cmdline_mtr.c
@@ -217,6 +217,137 @@ parse_policer_action_string(char *p_str, uint32_t action_mask,
 	}
 	return 0;
 }
+
+static int
+parse_multi_token_string(char *t_str, uint16_t *port_id,
+	uint32_t *mtr_id, enum rte_mtr_color *dscp_table)
+{
+	char *token;
+	uint64_t val;
+	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_dscp_table_entries(t_str, dscp_table);
+	if (ret != 0)
+		return -1;
+
+	return 0;
+}
+
+/* *** Show Port Meter Capabilities *** */
+struct cmd_show_port_meter_cap_result {
+	cmdline_fixed_string_t show;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t meter;
+	cmdline_fixed_string_t cap;
+	uint16_t port_id;
+};
+
+cmdline_parse_token_string_t cmd_show_port_meter_cap_show =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_meter_cap_result, show, "show");
+cmdline_parse_token_string_t cmd_show_port_meter_cap_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_meter_cap_result, port, "port");
+cmdline_parse_token_string_t cmd_show_port_meter_cap_meter =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_meter_cap_result, meter, "meter");
+cmdline_parse_token_string_t cmd_show_port_meter_cap_cap =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_meter_cap_result, cap, "cap");
+cmdline_parse_token_num_t cmd_show_port_meter_cap_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_show_port_meter_cap_result, port_id, UINT16);
+
+static void cmd_show_port_meter_cap_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_show_port_meter_cap_result *res = parsed_result;
+	struct rte_mtr_capabilities cap;
+	struct rte_mtr_error error;
+	uint16_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	memset(&cap, 0, sizeof(struct rte_mtr_capabilities));
+	ret = rte_mtr_capabilities_get(port_id, &cap, &error);
+	if (ret) {
+		print_err_msg(&error);
+		return;
+	}
+
+	printf("\n****   Port Meter Object Capabilities ****\n\n");
+	printf("cap.n_max %" PRIu32 "\n", cap.n_max);
+	printf("cap.n_shared_max %" PRIu32 "\n", cap.n_shared_max);
+	printf("cap.identical %" PRId32 "\n", cap.identical);
+	printf("cap.shared_identical %" PRId32 "\n",
+		cap.shared_identical);
+	printf("cap.shared_n_flows_per_mtr_max %" PRIu32 "\n",
+		cap.shared_n_flows_per_mtr_max);
+	printf("cap.chaining_n_mtrs_per_flow_max %" PRIu32 "\n",
+		cap.chaining_n_mtrs_per_flow_max);
+	printf("cap.chaining_use_prev_mtr_color_supported %" PRId32 "\n",
+		cap.chaining_use_prev_mtr_color_supported);
+	printf("cap.chaining_use_prev_mtr_color_enforced %" PRId32 "\n",
+		cap.chaining_use_prev_mtr_color_enforced);
+	printf("cap.meter_srtcm_rfc2697_n_max %" PRIu32 "\n",
+		cap.meter_srtcm_rfc2697_n_max);
+	printf("cap.meter_trtcm_rfc2698_n_max %" PRIu32 "\n",
+		cap.meter_trtcm_rfc2698_n_max);
+	printf("cap.meter_trtcm_rfc4115_n_max %" PRIu32 "\n",
+		cap.meter_trtcm_rfc4115_n_max);
+	printf("cap.meter_rate_max %" PRIu64 "\n", cap.meter_rate_max);
+	printf("cap.color_aware_srtcm_rfc2697_supported %" PRId32 "\n",
+		cap.color_aware_srtcm_rfc2697_supported);
+	printf("cap.color_aware_trtcm_rfc2698_supported %" PRId32 "\n",
+		cap.color_aware_trtcm_rfc2698_supported);
+	printf("cap.color_aware_trtcm_rfc4115_supported %" PRId32 "\n",
+		cap.color_aware_trtcm_rfc4115_supported);
+	printf("cap.policer_action_recolor_supported %" PRId32 "\n",
+		cap.policer_action_recolor_supported);
+	printf("cap.policer_action_drop_supported %" PRId32 "\n",
+		cap.policer_action_drop_supported);
+	printf("cap.stats_mask %" PRIx64 "\n", cap.stats_mask);
+}
+
+cmdline_parse_inst_t cmd_show_port_meter_cap = {
+	.f = cmd_show_port_meter_cap_parsed,
+	.data = NULL,
+	.help_str = "Show port meter cap",
+	.tokens = {
+		(void *)&cmd_show_port_meter_cap_show,
+		(void *)&cmd_show_port_meter_cap_port,
+		(void *)&cmd_show_port_meter_cap_meter,
+		(void *)&cmd_show_port_meter_cap_cap,
+		(void *)&cmd_show_port_meter_cap_port_id,
+		NULL,
+	},
+};
+
 /* *** Add Port Meter Profile srtcm_rfc2697 *** */
 struct cmd_add_port_meter_profile_srtcm_result {
 	cmdline_fixed_string_t add;
@@ -740,6 +871,128 @@ cmdline_parse_inst_t cmd_create_port_meter = {
 	},
 };
 
+/* *** Enable Meter of MTR Object  *** */
+struct cmd_enable_port_meter_result {
+	cmdline_fixed_string_t enable;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t meter;
+	uint16_t port_id;
+	uint32_t mtr_id;
+};
+
+cmdline_parse_token_string_t cmd_enable_port_meter_enable =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_enable_port_meter_result, enable, "enable");
+cmdline_parse_token_string_t cmd_enable_port_meter_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_enable_port_meter_result, port, "port");
+cmdline_parse_token_string_t cmd_enable_port_meter_meter =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_enable_port_meter_result, meter, "meter");
+cmdline_parse_token_num_t cmd_enable_port_meter_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_enable_port_meter_result, port_id, UINT16);
+cmdline_parse_token_num_t cmd_enable_port_meter_mtr_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_enable_port_meter_result, mtr_id, UINT32);
+
+static void cmd_enable_port_meter_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_enable_port_meter_result *res = parsed_result;
+	struct rte_mtr_error error;
+	uint32_t mtr_id = res->mtr_id;
+	uint16_t port_id = res->port_id;
+
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	/* Enable Meter */
+	ret = rte_mtr_meter_enable(port_id, mtr_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_enable_port_meter = {
+	.f = cmd_enable_port_meter_parsed,
+	.data = NULL,
+	.help_str = "Enable port meter",
+	.tokens = {
+		(void *)&cmd_enable_port_meter_enable,
+		(void *)&cmd_enable_port_meter_port,
+		(void *)&cmd_enable_port_meter_meter,
+		(void *)&cmd_enable_port_meter_port_id,
+		(void *)&cmd_enable_port_meter_mtr_id,
+		NULL,
+	},
+};
+
+/* *** Disable Meter of MTR Object  *** */
+struct cmd_disable_port_meter_result {
+	cmdline_fixed_string_t disable;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t meter;
+	uint16_t port_id;
+	uint32_t mtr_id;
+};
+
+cmdline_parse_token_string_t cmd_disable_port_meter_disable =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_disable_port_meter_result, disable, "disable");
+cmdline_parse_token_string_t cmd_disable_port_meter_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_disable_port_meter_result, port, "port");
+cmdline_parse_token_string_t cmd_disable_port_meter_meter =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_disable_port_meter_result, meter, "meter");
+cmdline_parse_token_num_t cmd_disable_port_meter_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_disable_port_meter_result, port_id, UINT16);
+cmdline_parse_token_num_t cmd_disable_port_meter_mtr_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_disable_port_meter_result, mtr_id, UINT32);
+
+static void cmd_disable_port_meter_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_disable_port_meter_result *res = parsed_result;
+	struct rte_mtr_error error;
+	uint32_t mtr_id = res->mtr_id;
+	uint16_t port_id = res->port_id;
+
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	/* Disable Meter */
+	ret = rte_mtr_meter_disable(port_id, mtr_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_disable_port_meter = {
+	.f = cmd_disable_port_meter_parsed,
+	.data = NULL,
+	.help_str = "Disable port meter",
+	.tokens = {
+		(void *)&cmd_disable_port_meter_disable,
+		(void *)&cmd_disable_port_meter_port,
+		(void *)&cmd_disable_port_meter_meter,
+		(void *)&cmd_disable_port_meter_port_id,
+		(void *)&cmd_disable_port_meter_mtr_id,
+		NULL,
+	},
+};
+
 /* *** Delete Port Meter Object *** */
 struct cmd_del_port_meter_result {
 	cmdline_fixed_string_t del;
@@ -874,6 +1127,78 @@ cmdline_parse_inst_t cmd_set_port_meter_profile = {
 	},
 };
 
+/* *** Set Port Meter DSCP Table *** */
+struct cmd_set_port_meter_dscp_table_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t meter;
+	cmdline_fixed_string_t dscp_table;
+	cmdline_multi_string_t token_string;
+};
+
+cmdline_parse_token_string_t cmd_set_port_meter_dscp_table_set =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_meter_dscp_table_result, set, "set");
+cmdline_parse_token_string_t cmd_set_port_meter_dscp_table_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_meter_dscp_table_result, port, "port");
+cmdline_parse_token_string_t cmd_set_port_meter_dscp_table_meter =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_meter_dscp_table_result, meter, "meter");
+cmdline_parse_token_string_t cmd_set_port_meter_dscp_table_dscp_table =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_meter_dscp_table_result,
+		dscp_table, "dscp table");
+cmdline_parse_token_string_t cmd_set_port_meter_dscp_table_token_string =
+	TOKEN_STRING_INITIALIZER(struct cmd_set_port_meter_dscp_table_result,
+		token_string, TOKEN_STRING_MULTI);
+
+static void cmd_set_port_meter_dscp_table_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_set_port_meter_dscp_table_result *res = parsed_result;
+	struct rte_mtr_error error;
+	enum rte_mtr_color *dscp_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_string(t_str, &port_id, &mtr_id, dscp_table);
+	if (ret) {
+		printf(" Multi token string parse error\n");
+		return;
+	}
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	/* Update Meter DSCP Table*/
+	ret = rte_mtr_meter_dscp_table_update(port_id, mtr_id,
+		dscp_table, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+	free(dscp_table);
+}
+
+cmdline_parse_inst_t cmd_set_port_meter_dscp_table = {
+	.f = cmd_set_port_meter_dscp_table_parsed,
+	.data = NULL,
+	.help_str = "Update port meter dscp table",
+	.tokens = {
+		(void *)&cmd_set_port_meter_dscp_table_set,
+		(void *)&cmd_set_port_meter_dscp_table_port,
+		(void *)&cmd_set_port_meter_dscp_table_meter,
+		(void *)&cmd_set_port_meter_dscp_table_dscp_table,
+		(void *)&cmd_set_port_meter_dscp_table_token_string,
+		NULL,
+	},
+};
+
 /* *** Set Port Meter Policer Action *** */
 struct cmd_set_port_meter_policer_action_result {
 	cmdline_fixed_string_t set;
diff --git a/app/test-pmd/cmdline_mtr.h b/app/test-pmd/cmdline_mtr.h
index 2a91264..89abfd3 100644
--- a/app/test-pmd/cmdline_mtr.h
+++ b/app/test-pmd/cmdline_mtr.h
@@ -35,13 +35,17 @@
 #define _CMDLINE_MTR_H_
 
 /* Traffic Metering and Policing */
+extern cmdline_parse_inst_t cmd_show_port_meter_cap;
 extern cmdline_parse_inst_t cmd_add_port_meter_profile_srtcm;
 extern cmdline_parse_inst_t cmd_add_port_meter_profile_trtcm;
 extern cmdline_parse_inst_t cmd_add_port_meter_profile_trtcm_rfc4115;
 extern cmdline_parse_inst_t cmd_del_port_meter_profile;
 extern cmdline_parse_inst_t cmd_create_port_meter;
+extern cmdline_parse_inst_t cmd_enable_port_meter;
+extern cmdline_parse_inst_t cmd_disable_port_meter;
 extern cmdline_parse_inst_t cmd_del_port_meter;
 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_policer_action;
 extern cmdline_parse_inst_t cmd_set_port_meter_stats_mask;
 extern cmdline_parse_inst_t cmd_show_port_meter_stats;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd
  2017-11-20 16:39 [PATCH 1/3] app/testpmd: metering and policing CLI clean up Jasvinder Singh
  2017-11-20 16:39 ` [PATCH 2/3] app/testpmd: add CLI for metering and policing API Jasvinder Singh
@ 2017-11-20 16:39 ` Jasvinder Singh
  2017-12-11 11:18   ` Marko Kovacevic
                     ` (2 more replies)
  2018-01-07 14:25 ` [PATCH 1/3] app/testpmd: metering and policing CLI clean up Wu, Jingjing
  2 siblings, 3 replies; 10+ messages in thread
From: Jasvinder Singh @ 2017-11-20 16:39 UTC (permalink / raw)
  To: dev; +Cc: cristian.dumitrescu, jingjing.wu, john.mcnamara

Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
 doc/guides/testpmd_app_ug/testpmd_funcs.rst | 173 ++++++++++++++++++++++++++++
 1 file changed, 173 insertions(+)

diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 9789139..a8b7913 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -2068,6 +2068,179 @@ For example, to set the high bit in the register from the example above::
    testpmd> write regbit 0 0xEE00 31 1
    port 0 PCI register at offset 0xEE00: 0x8000000A (2147483658)
 
+Traffic Metering and Policing
+-----------------------------
+
+The following section shows functions for configuring traffic metering and
+policing on the ethernet device through the use of generic ethdev API.
+
+show port traffic management capability
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Show traffic metering and policing capability of the port::
+
+   testpmd> show port meter cap (port_id)
+
+add port meter profile (srTCM rfc2967)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Add meter profile (srTCM rfc2697) to the ethernet device::
+
+   testpmd> add port meter profile srtcm_rfc2697 (port_id) (profile_id) \
+   (cir) (cbs) (ebs)
+
+where:
+
+* ``profile_id``: ID for the meter profile.
+* ``cir``: Committed Information Rate (CIR) (bytes/second).
+* ``cbs``: Committed Burst Size (CBS) (bytes).
+* ``ebs``: Excess Burst Size (EBS) (bytes).
+
+add port meter profile (trTCM rfc2968)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Add meter profile (srTCM rfc2698) to the ethernet device::
+
+   testpmd> add port meter profile trtcm_rfc2698 (port_id) (profile_id) \
+   (cir) (pir) (cbs) (pbs)
+
+where:
+
+* ``profile_id``: ID for the meter profile.
+* ``cir``: Committed information rate (bytes/second).
+* ``pir``: Peak information rate (bytes/second).
+* ``cbs``: Committed burst size (bytes).
+* ``pbs``: Peak burst size (bytes).
+
+add port meter profile (trTCM rfc4115)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Add meter profile (trTCM rfc4115) to the ethernet device::
+
+   testpmd> add port meter profile trtcm_rfc4115 (port_id) (profile_id) \
+   (cir) (eir) (cbs) (ebs)
+
+where:
+
+* ``profile_id``: ID for the meter profile.
+* ``cir``: Committed information rate (bytes/second).
+* ``eir``: Excess information rate (bytes/second).
+* ``cbs``: Committed burst size (bytes).
+* ``ebs``: Excess burst size (bytes).
+
+delete port meter profile
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Delete meter profile from the ethernet device::
+
+   testpmd> del port meter profile (port_id) (profile_id)
+
+create port meter
+~~~~~~~~~~~~~~~~~
+
+Create new meter object for the ethernet device::
+
+   testpmd> create port meter (port_id) (mtr_id) (profile_id) \
+   (meter_enable) (g_action) (y_action) (r_action) (stats_mask) (shared) \
+   (use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\
+   (dscp_tbl_entry63)]
+
+where:
+
+* ``mtr_id``: meter object ID.
+* ``profile_id``: ID for the meter profile.
+* ``meter_enable``: When this parameter has a non-zero value, the meter object
+  gets enabled at the time of creation, otherwise remains disabled.
+* ``g_action``: Policer action for the packet with green color.
+* ``y_action``: Policer action for the packet with yellow color.
+* ``r_action``: Policer action for the packet with red color.
+* ``stats_mask``: Mask of statistics counter types to be enabled for the
+  meter object.
+* ``shared``:  When this parameter has a non-zero value, the meter object is
+  shared by multiple flows. Otherwise, meter object is used by single flow.
+* ``use_pre_meter_color``: When this parameter has a non-zero value, the
+  input color for the current meter object is determined by the latest meter
+  object in the same flow. Otherwise, the current meter object uses the
+  *dscp_table* to determine the input color.
+* ``dscp_tbl_entryx``: DSCP table entry x providing meter providing input
+  color, 0 <= x <= 63.
+
+enable port meter
+~~~~~~~~~~~~~~~~~
+
+Enable meter for the ethernet device::
+
+   testpmd> enable port meter (port_id) (mtr_id)
+
+disable port meter
+~~~~~~~~~~~~~~~~~~
+
+Disable meter for the ethernet device::
+
+   testpmd> disable port meter (port_id) (mtr_id)
+
+delete port meter
+~~~~~~~~~~~~~~~~~
+
+Delete meter for the ethernet device::
+
+   testpmd> del port meter (port_id) (mtr_id)
+
+Set port meter profile
+~~~~~~~~~~~~~~~~~~~~~~
+
+Set meter profile for the ethernet device::
+
+   testpmd> set port meter profile (port_id) (mtr_id) (profile_id)
+
+set port meter dscp table
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Set meter dscp table for the ethernet device::
+
+   testpmd> set port meter dscp table (port_id) (mtr_id) [(dscp_tbl_entry0) \
+   (dscp_tbl_entry1)...(dscp_tbl_entry63)]
+
+set port meter policer action
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Set meter policer action for the ethernet device::
+
+   testpmd> set port meter policer action (port_id) (mtr_id) (action_mask) \
+   (action0) [(action1) (action1)]
+
+where:
+
+* ``action_mask``: Bit mask indicating which policer actions need to be
+  updated. One or more policer actions can be updated in a single function
+  invocation. To update the policer action associated with color C, bit
+  (1 << C) needs to be set in *action_mask* and element at position C
+  in the *actions* array needs to be valid.
+* ``actionx``: Policer action for the color x,
+  RTE_MTR_GREEN <= x < RTE_MTR_COLORS
+
+set port meter stats mask
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Set meter stats mask for the ethernet device::
+
+   testpmd> set port meter stats mask (port_id) (mtr_id) (stats_mask)
+
+where:
+
+* ``stats_mask``: Bit mask indicating statistics counter types to be enabled.
+
+show port meter stats
+~~~~~~~~~~~~~~~~~~~~~
+
+Show meter stats of the ethernet device::
+
+   testpmd> show port meter stats (port_id) (mtr_id) (clear)
+
+where:
+
+* ``clear``: Flag that indicates whether the statistics counters should
+  be cleared (i.e. set to zero) immediately after they have been read or not.
 
 Traffic Management
 ------------------
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd
  2017-11-20 16:39 ` [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd Jasvinder Singh
@ 2017-12-11 11:18   ` Marko Kovacevic
  2017-12-11 11:22   ` Mcnamara, John
  2017-12-11 11:31   ` Mcnamara, John
  2 siblings, 0 replies; 10+ messages in thread
From: Marko Kovacevic @ 2017-12-11 11:18 UTC (permalink / raw)
  To: Jasvinder Singh; +Cc: cristian.dumitrescu, jingjing.wu, john.mcnamara, dev



On 20/11/2017 16:39, Jasvinder Singh wrote:
> Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
     Acked-by: Marko Kovacevic <marko.kovacevic@intel.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd
  2017-11-20 16:39 ` [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd Jasvinder Singh
  2017-12-11 11:18   ` Marko Kovacevic
@ 2017-12-11 11:22   ` Mcnamara, John
  2017-12-11 11:31   ` Mcnamara, John
  2 siblings, 0 replies; 10+ messages in thread
From: Mcnamara, John @ 2017-12-11 11:22 UTC (permalink / raw)
  To: Singh, Jasvinder, dev; +Cc: Dumitrescu, Cristian, Wu, Jingjing



> -----Original Message-----
> From: Singh, Jasvinder
> Sent: Monday, November 20, 2017 4:39 PM
> To: dev@dpdk.org
> Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Mcnamara, John <john.mcnamara@intel.com>
> Subject: [PATCH 3/3] doc: add description of traffic metering and policing
> funcs in testpmd
> 
> Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>


Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd
  2017-11-20 16:39 ` [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd Jasvinder Singh
  2017-12-11 11:18   ` Marko Kovacevic
  2017-12-11 11:22   ` Mcnamara, John
@ 2017-12-11 11:31   ` Mcnamara, John
  2 siblings, 0 replies; 10+ messages in thread
From: Mcnamara, John @ 2017-12-11 11:31 UTC (permalink / raw)
  To: Singh, Jasvinder, dev; +Cc: Dumitrescu, Cristian, Wu, Jingjing

Note, there is a devtools/check-git-log.sh warning on the commit subject. Maybe use
something like this instead, if you update the patchset, or the maintainer can fix
inline:

doc: add metering and policing funcs to testpmd docs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] app/testpmd: metering and policing CLI clean up
  2017-11-20 16:39 [PATCH 1/3] app/testpmd: metering and policing CLI clean up Jasvinder Singh
  2017-11-20 16:39 ` [PATCH 2/3] app/testpmd: add CLI for metering and policing API Jasvinder Singh
  2017-11-20 16:39 ` [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd Jasvinder Singh
@ 2018-01-07 14:25 ` Wu, Jingjing
  2018-01-08 10:25   ` Singh, Jasvinder
  2018-01-09 23:56   ` Thomas Monjalon
  2 siblings, 2 replies; 10+ messages in thread
From: Wu, Jingjing @ 2018-01-07 14:25 UTC (permalink / raw)
  To: Singh, Jasvinder, dev; +Cc: Dumitrescu, Cristian, Mcnamara, John



> -----Original Message-----
> From: Singh, Jasvinder
> Sent: Tuesday, November 21, 2017 12:39 AM
> To: dev@dpdk.org
> Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Mcnamara, John <john.mcnamara@intel.com>
> Subject: [PATCH 1/3] app/testpmd: metering and policing CLI clean up
> 
> This patch updates the metering and policing CLIs as follows:
> - change name of set port meter CLI to create port meter and add meter
>   enable option, dscp table entries arguments, action mask, policer actions
>   and previous meter color option as an input color
> - set the right metering algorithm in add meter profile CLIs related to
>   srtcm(rfc2697) and trtcm(rfc2698,rfc4115)
> - change clear flag type from uint32_t to string in show meter stats CLI
> 
> Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>

With minor comment: 

> +static int
> +parse_dscp_table_entries(char *str, enum rte_mtr_color *dscp_table)
> +{
> +	char *token;
> +	int i = 0;
> +
> +	token = strtok_r(str, PARSE_DELIMITER, &str);
> +	if (token == NULL)
> +		return 0;
> +
> +	/* Allocate memory for dscp table */
> +	dscp_table = (enum rte_mtr_color *)malloc(MAX_DSCP_TABLE_ENTRIES *
> +		sizeof(enum rte_mtr_color));
> +
> +	while (1) {
> +		if (strcmp(token, "G") == 0 ||
> +			strcmp(token, "g") == 0)
> +			dscp_table[i++] = RTE_MTR_GREEN;
> +		else if (strcmp(token, "Y") == 0 ||
> +			strcmp(token, "y") == 0)
> +			dscp_table[i++] = RTE_MTR_YELLOW;
> +		else if (strcmp(token, "R") == 0 ||
> +			strcmp(token, "r") == 0)
> +			dscp_table[i++] = RTE_MTR_RED;
> +		else {
> +			free(dscp_table);
> +			return -1;
> +		}
> +		if (i == MAX_DSCP_TABLE_ENTRIES)
> +			break;
Is that meaning the size dscp table must be 64, can it be less than 64?

Thanks
Jingjing

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/3] app/testpmd: add CLI for metering and policing API
  2017-11-20 16:39 ` [PATCH 2/3] app/testpmd: add CLI for metering and policing API Jasvinder Singh
@ 2018-01-07 14:37   ` Wu, Jingjing
  0 siblings, 0 replies; 10+ messages in thread
From: Wu, Jingjing @ 2018-01-07 14:37 UTC (permalink / raw)
  To: Singh, Jasvinder, dev; +Cc: Dumitrescu, Cristian, Mcnamara, John



> -----Original Message-----
> From: Singh, Jasvinder
> Sent: Tuesday, November 21, 2017 12:39 AM
> To: dev@dpdk.org
> Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; Mcnamara, John <john.mcnamara@intel.com>
> Subject: [PATCH 2/3] app/testpmd: add CLI for metering and policing API
> 
> Add following CLIs to testpmd application;
> - show port metering and policing capabilities.
> - enable/disable meter of the MTR object.
> - update the MTR object dscp table entries.
> 
> Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] app/testpmd: metering and policing CLI clean up
  2018-01-07 14:25 ` [PATCH 1/3] app/testpmd: metering and policing CLI clean up Wu, Jingjing
@ 2018-01-08 10:25   ` Singh, Jasvinder
  2018-01-09 23:56   ` Thomas Monjalon
  1 sibling, 0 replies; 10+ messages in thread
From: Singh, Jasvinder @ 2018-01-08 10:25 UTC (permalink / raw)
  To: Wu, Jingjing, dev; +Cc: Dumitrescu, Cristian, Mcnamara, John



> -----Original Message-----
> From: Wu, Jingjing
> Sent: Sunday, January 7, 2018 2:25 PM
> To: Singh, Jasvinder <jasvinder.singh@intel.com>; dev@dpdk.org
> Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>
> Subject: RE: [PATCH 1/3] app/testpmd: metering and policing CLI clean up
> 
> 
> 
> > -----Original Message-----
> > From: Singh, Jasvinder
> > Sent: Tuesday, November 21, 2017 12:39 AM
> > To: dev@dpdk.org
> > Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Wu, Jingjing
> > <jingjing.wu@intel.com>; Mcnamara, John <john.mcnamara@intel.com>
> > Subject: [PATCH 1/3] app/testpmd: metering and policing CLI clean up
> >
> > This patch updates the metering and policing CLIs as follows:
> > - change name of set port meter CLI to create port meter and add meter
> >   enable option, dscp table entries arguments, action mask, policer actions
> >   and previous meter color option as an input color
> > - set the right metering algorithm in add meter profile CLIs related to
> >   srtcm(rfc2697) and trtcm(rfc2698,rfc4115)
> > - change clear flag type from uint32_t to string in show meter stats
> > CLI
> >
> > Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
> Acked-by: Jingjing Wu <jingjing.wu@intel.com>
> 
> With minor comment:
> 
> > +static int
> > +parse_dscp_table_entries(char *str, enum rte_mtr_color *dscp_table) {
> > +	char *token;
> > +	int i = 0;
> > +
> > +	token = strtok_r(str, PARSE_DELIMITER, &str);
> > +	if (token == NULL)
> > +		return 0;
> > +
> > +	/* Allocate memory for dscp table */
> > +	dscp_table = (enum rte_mtr_color
> *)malloc(MAX_DSCP_TABLE_ENTRIES *
> > +		sizeof(enum rte_mtr_color));
> > +
> > +	while (1) {
> > +		if (strcmp(token, "G") == 0 ||
> > +			strcmp(token, "g") == 0)
> > +			dscp_table[i++] = RTE_MTR_GREEN;
> > +		else if (strcmp(token, "Y") == 0 ||
> > +			strcmp(token, "y") == 0)
> > +			dscp_table[i++] = RTE_MTR_YELLOW;
> > +		else if (strcmp(token, "R") == 0 ||
> > +			strcmp(token, "r") == 0)
> > +			dscp_table[i++] = RTE_MTR_RED;
> > +		else {
> > +			free(dscp_table);
> > +			return -1;
> > +		}
> > +		if (i == MAX_DSCP_TABLE_ENTRIES)
> > +			break;
> Is that meaning the size dscp table must be 64, can it be less than 64?

The DSCP field is represented by 6 bits in the byte long TOS field of the IP header. Therefore, DSCP table should be have 64 entries for the packets classification.

> Thanks
> Jingjing

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] app/testpmd: metering and policing CLI clean up
  2018-01-07 14:25 ` [PATCH 1/3] app/testpmd: metering and policing CLI clean up Wu, Jingjing
  2018-01-08 10:25   ` Singh, Jasvinder
@ 2018-01-09 23:56   ` Thomas Monjalon
  1 sibling, 0 replies; 10+ messages in thread
From: Thomas Monjalon @ 2018-01-09 23:56 UTC (permalink / raw)
  To: Singh, Jasvinder; +Cc: dev, Wu, Jingjing, Dumitrescu, Cristian, Mcnamara, John

> > This patch updates the metering and policing CLIs as follows:
> > - change name of set port meter CLI to create port meter and add meter
> >   enable option, dscp table entries arguments, action mask, policer actions
> >   and previous meter color option as an input color
> > - set the right metering algorithm in add meter profile CLIs related to
> >   srtcm(rfc2697) and trtcm(rfc2698,rfc4115)
> > - change clear flag type from uint32_t to string in show meter stats CLI
> > 
> > Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
> Acked-by: Jingjing Wu <jingjing.wu@intel.com>

Series applied, thanks

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2018-01-09 23:57 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-20 16:39 [PATCH 1/3] app/testpmd: metering and policing CLI clean up Jasvinder Singh
2017-11-20 16:39 ` [PATCH 2/3] app/testpmd: add CLI for metering and policing API Jasvinder Singh
2018-01-07 14:37   ` Wu, Jingjing
2017-11-20 16:39 ` [PATCH 3/3] doc: add description of traffic metering and policing funcs in testpmd Jasvinder Singh
2017-12-11 11:18   ` Marko Kovacevic
2017-12-11 11:22   ` Mcnamara, John
2017-12-11 11:31   ` Mcnamara, John
2018-01-07 14:25 ` [PATCH 1/3] app/testpmd: metering and policing CLI clean up Wu, Jingjing
2018-01-08 10:25   ` Singh, Jasvinder
2018-01-09 23:56   ` Thomas Monjalon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.