From: Jasvinder Singh <jasvinder.singh@intel.com>
To: dev@dpdk.org
Cc: cristian.dumitrescu@intel.com, jingjing.wu@intel.com,
pablo.de.lara.guarch@intel.com
Subject: [dpdk-dev] [PATCH v3 4/5] app/test-pmd: add CLI for TM nodes and hierarchy commit
Date: Wed, 20 Sep 2017 10:56:52 +0100 [thread overview]
Message-ID: <20170920095653.110750-4-jasvinder.singh@intel.com> (raw)
In-Reply-To: <20170920095653.110750-1-jasvinder.singh@intel.com>
Add following CLIs in testpmd application;
- commands to add TM hierarchy nodes (leaf and nonleaf).
- command for runtime update of node weight.
- command to commit the TM hierarchy
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
app/test-pmd/cmdline.c | 36 +++
app/test-pmd/cmdline_tm.c | 594 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 630 insertions(+)
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index c41974b..70a376a 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -680,6 +680,28 @@ static void cmd_help_long_parsed(void *parsed_result,
"del port tm node wred profile (port_id) (wred_profile_id)\n"
" Delete port tm node wred profile.\n\n"
+
+ "add port tm nonleaf node (port_id) (node_id) (parent_node_id)"
+ " (priority) (weight) (level_id) (shaper_profile_id)"
+ " (shared_shaper_id) (n_shared_shapers) (n_sp_priorities)\n"
+ " Add port tm nonleaf node.\n\n"
+
+ "add port tm leaf node (port_id) (node_id) (parent_node_id)"
+ " (priority) (weight) (level_id) (cman_mode)"
+ " (wred_profile_id)\n"
+ " Add port tm leaf node.\n\n"
+
+ "del port tm node (port_id) (node_id)\n"
+ " Delete port tm node.\n\n"
+
+#ifdef RTE_SCHED_SUBPORT_TC_OV
+ "set port tm node parent (port_id) (node_id) (parent_node_id)"
+ " (priority) (weight)\n"
+ " Set port tm node parent.\n\n"
+#endif
+ "port tm hierarchy commit (port_id) (clean_on_fail)\n"
+ " Commit tm hierarchy.\n\n"
+
#endif
, list_pkt_forwarding_modes()
);
@@ -14246,6 +14268,13 @@ extern cmdline_parse_inst_t cmd_del_port_tm_node_shared_shaper;
extern cmdline_parse_inst_t cmd_add_port_tm_node_wred_profile;
extern cmdline_parse_inst_t cmd_del_port_tm_node_wred_profile;
extern cmdline_parse_inst_t cmd_set_port_tm_node_shaper_profile;
+extern cmdline_parse_inst_t cmd_add_port_tm_nonleaf_node;
+extern cmdline_parse_inst_t cmd_add_port_tm_leaf_node;
+extern cmdline_parse_inst_t cmd_del_port_tm_node;
+#ifdef RTE_SCHED_SUBPORT_TC_OV
+extern cmdline_parse_inst_t cmd_set_port_tm_node_parent;
+#endif
+extern cmdline_parse_inst_t cmd_port_tm_hierarchy_commit;
#endif
/* *********************************************************************** */
@@ -14452,6 +14481,13 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_add_port_tm_node_wred_profile,
(cmdline_parse_inst_t *)&cmd_del_port_tm_node_wred_profile,
(cmdline_parse_inst_t *)&cmd_set_port_tm_node_shaper_profile,
+ (cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node,
+ (cmdline_parse_inst_t *)&cmd_add_port_tm_leaf_node,
+ (cmdline_parse_inst_t *)&cmd_del_port_tm_node,
+#ifdef RTE_SCHED_SUBPORT_TC_OV
+ (cmdline_parse_inst_t *)&cmd_set_port_tm_node_parent,
+#endif
+ (cmdline_parse_inst_t *)&cmd_port_tm_hierarchy_commit,
#endif
NULL,
};
diff --git a/app/test-pmd/cmdline_tm.c b/app/test-pmd/cmdline_tm.c
index 7d78549..b36326d 100644
--- a/app/test-pmd/cmdline_tm.c
+++ b/app/test-pmd/cmdline_tm.c
@@ -1603,3 +1603,597 @@ cmdline_parse_inst_t cmd_set_port_tm_node_shaper_profile = {
NULL,
},
};
+
+/* *** Add Port TM nonleaf node *** */
+struct cmd_add_port_tm_nonleaf_node_result {
+ cmdline_fixed_string_t add;
+ cmdline_fixed_string_t port;
+ cmdline_fixed_string_t tm;
+ cmdline_fixed_string_t nonleaf;
+ cmdline_fixed_string_t node;
+ uint8_t port_id;
+ uint32_t node_id;
+ int32_t parent_node_id;
+ uint32_t priority;
+ uint32_t weight;
+ uint32_t level_id;
+ uint32_t shaper_profile_id;
+ uint32_t shared_shaper_id;
+ uint32_t n_shared_shapers;
+ uint32_t n_sp_priorities;
+};
+
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_add =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_nonleaf_node_result, add, "add");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_port =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_nonleaf_node_result, port, "port");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_tm =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_nonleaf_node_result, tm, "tm");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_nonleaf =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_nonleaf_node_result, nonleaf, "nonleaf");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_node =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_nonleaf_node_result, node, "node");
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_port_id =
+ TOKEN_NUM_INITIALIZER(
+ struct cmd_add_port_tm_nonleaf_node_result,
+ port_id, UINT8);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_node_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ node_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_parent_node_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ parent_node_id, INT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_priority =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ priority, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_weight =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ weight, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_level_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ level_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_shaper_profile_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ shaper_profile_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_shared_shaper_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ shared_shaper_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_n_shared_shapers =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ n_shared_shapers, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_n_sp_priorities =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+ n_sp_priorities, UINT32);
+
+static void cmd_add_port_tm_nonleaf_node_parsed(void *parsed_result,
+ __attribute__((unused)) struct cmdline *cl,
+ __attribute__((unused)) void *data)
+{
+ struct cmd_add_port_tm_nonleaf_node_result *res = parsed_result;
+ struct rte_port *port;
+ struct rte_tm_error error;
+ struct rte_tm_node_params np;
+ uint32_t parent_node_id;
+ uint8_t port_id = res->port_id;
+ int ret;
+
+ if (port_id_is_invalid(port_id, ENABLED_WARN))
+ return;
+
+ port = &ports[port_id];
+
+ /* Port tm flag */
+ if (port->softport.tm_flag == 0) {
+ printf(" tm not enabled on port %u (error)\n", port_id);
+ return;
+ }
+
+ /* Forward mode: tm */
+ if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+ printf(" tm mode not enabled(error)\n");
+ return;
+ }
+
+ /* Port status */
+ if (port_is_started(port_id)) {
+ printf(" Port %u not stopped (error)\n", port_id);
+ return;
+ }
+
+ /* TM hierarchy status */
+ if (port->softport.tm.hierarchy_frozen == 1)
+ port->softport.tm.hierarchy_frozen = 0;
+
+ /* Node parameters */
+ if (res->parent_node_id < 0)
+ parent_node_id = UINT32_MAX;
+ else
+ parent_node_id = res->parent_node_id;
+
+ memset(&np, 0, sizeof(struct rte_tm_node_params));
+ np.shaper_profile_id = res->shaper_profile_id;
+ np.n_shared_shapers = res->n_shared_shapers;
+ np.shared_shaper_id = &res->shared_shaper_id;
+ np.nonleaf.n_sp_priorities = res->n_sp_priorities;
+ np.nonleaf.wfq_weight_mode = NULL;
+ np.stats_mask = RTE_TM_STATS_N_PKTS |
+ RTE_TM_STATS_N_BYTES |
+ RTE_TM_STATS_N_PKTS_GREEN_DROPPED |
+ RTE_TM_STATS_N_BYTES_GREEN_DROPPED;
+
+ ret = rte_tm_node_add(port_id, res->node_id, parent_node_id,
+ res->priority, res->weight, res->level_id,
+ &np, &error);
+ if (ret != 0) {
+ print_err_msg(&error);
+ return;
+ }
+}
+
+cmdline_parse_inst_t cmd_add_port_tm_nonleaf_node = {
+ .f = cmd_add_port_tm_nonleaf_node_parsed,
+ .data = NULL,
+ .help_str = "Add port tm nonleaf node",
+ .tokens = {
+ (void *)&cmd_add_port_tm_nonleaf_node_add,
+ (void *)&cmd_add_port_tm_nonleaf_node_port,
+ (void *)&cmd_add_port_tm_nonleaf_node_tm,
+ (void *)&cmd_add_port_tm_nonleaf_node_nonleaf,
+ (void *)&cmd_add_port_tm_nonleaf_node_node,
+ (void *)&cmd_add_port_tm_nonleaf_node_port_id,
+ (void *)&cmd_add_port_tm_nonleaf_node_node_id,
+ (void *)&cmd_add_port_tm_nonleaf_node_parent_node_id,
+ (void *)&cmd_add_port_tm_nonleaf_node_priority,
+ (void *)&cmd_add_port_tm_nonleaf_node_weight,
+ (void *)&cmd_add_port_tm_nonleaf_node_level_id,
+ (void *)&cmd_add_port_tm_nonleaf_node_shaper_profile_id,
+ (void *)&cmd_add_port_tm_nonleaf_node_shared_shaper_id,
+ (void *)&cmd_add_port_tm_nonleaf_node_n_shared_shapers,
+ (void *)&cmd_add_port_tm_nonleaf_node_n_sp_priorities,
+ NULL,
+ },
+};
+
+/* *** Add Port TM leaf node *** */
+struct cmd_add_port_tm_leaf_node_result {
+ cmdline_fixed_string_t add;
+ cmdline_fixed_string_t port;
+ cmdline_fixed_string_t tm;
+ cmdline_fixed_string_t leaf;
+ cmdline_fixed_string_t node;
+ uint8_t port_id;
+ uint32_t node_id;
+ int32_t parent_node_id;
+ uint32_t priority;
+ uint32_t weight;
+ uint32_t level_id;
+ uint32_t cman_mode;
+ uint32_t wred_profile_id;
+};
+
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_add =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_leaf_node_result, add, "add");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_port =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_leaf_node_result, port, "port");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_tm =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_leaf_node_result, tm, "tm");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_nonleaf =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_leaf_node_result, leaf, "leaf");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_node =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_add_port_tm_leaf_node_result, node, "node");
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_port_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ port_id, UINT8);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_node_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ node_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_parent_node_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ parent_node_id, INT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_priority =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ priority, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_weight =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ weight, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_level_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ level_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_cman_mode =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ cman_mode, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_wred_profile_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+ wred_profile_id, UINT32);
+
+static void cmd_add_port_tm_leaf_node_parsed(void *parsed_result,
+ __attribute__((unused)) struct cmdline *cl,
+ __attribute__((unused)) void *data)
+{
+ struct cmd_add_port_tm_leaf_node_result *res = parsed_result;
+ struct rte_port *port;
+ struct rte_tm_error error;
+ struct rte_tm_node_params np;
+ uint32_t parent_node_id;
+ uint8_t port_id = res->port_id;
+ int ret;
+
+ if (port_id_is_invalid(port_id, ENABLED_WARN))
+ return;
+
+ port = &ports[port_id];
+
+ /* Port tm flag */
+ if (port->softport.tm_flag == 0) {
+ printf(" tm not enabled on port %u (error)\n", port_id);
+ return;
+ }
+
+ /* Forward mode: tm */
+ if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+ printf(" tm mode not enabled(error)\n");
+ return;
+ }
+
+ /* Port status */
+ if (port_is_started(port_id)) {
+ printf(" Port %u not stopped (error)\n", port_id);
+ return;
+ }
+
+ /* TM hierarchy status */
+ if (port->softport.tm.hierarchy_frozen == 1)
+ port->softport.tm.hierarchy_frozen = 0;
+
+ /* Node parameters */
+ if (res->parent_node_id < 0)
+ parent_node_id = UINT32_MAX;
+ else
+ parent_node_id = res->parent_node_id;
+
+ memset(&np, 0, sizeof(struct rte_tm_node_params));
+ np.shaper_profile_id = RTE_TM_SHAPER_PROFILE_ID_NONE;
+ np.n_shared_shapers = 0;
+ np.leaf.cman = res->cman_mode;
+ np.leaf.wred.wred_profile_id = res->wred_profile_id;
+ np.stats_mask = RTE_TM_STATS_N_PKTS |
+ RTE_TM_STATS_N_BYTES |
+ RTE_TM_STATS_N_PKTS_GREEN_DROPPED |
+ RTE_TM_STATS_N_BYTES_GREEN_DROPPED |
+ RTE_TM_STATS_N_PKTS_QUEUED;
+
+ ret = rte_tm_node_add(port_id, res->node_id, parent_node_id,
+ res->priority, res->weight, res->level_id,
+ &np, &error);
+ if (ret != 0) {
+ print_err_msg(&error);
+ return;
+ }
+}
+
+cmdline_parse_inst_t cmd_add_port_tm_leaf_node = {
+ .f = cmd_add_port_tm_leaf_node_parsed,
+ .data = NULL,
+ .help_str = "Add port tm leaf node",
+ .tokens = {
+ (void *)&cmd_add_port_tm_leaf_node_add,
+ (void *)&cmd_add_port_tm_leaf_node_port,
+ (void *)&cmd_add_port_tm_leaf_node_tm,
+ (void *)&cmd_add_port_tm_leaf_node_nonleaf,
+ (void *)&cmd_add_port_tm_leaf_node_node,
+ (void *)&cmd_add_port_tm_leaf_node_port_id,
+ (void *)&cmd_add_port_tm_leaf_node_node_id,
+ (void *)&cmd_add_port_tm_leaf_node_parent_node_id,
+ (void *)&cmd_add_port_tm_leaf_node_priority,
+ (void *)&cmd_add_port_tm_leaf_node_weight,
+ (void *)&cmd_add_port_tm_leaf_node_level_id,
+ (void *)&cmd_add_port_tm_leaf_node_cman_mode,
+ (void *)&cmd_add_port_tm_leaf_node_wred_profile_id,
+ NULL,
+ },
+};
+
+/* *** Delete Port TM Node *** */
+struct cmd_del_port_tm_node_result {
+ cmdline_fixed_string_t del;
+ cmdline_fixed_string_t port;
+ cmdline_fixed_string_t tm;
+ cmdline_fixed_string_t node;
+ uint8_t port_id;
+ uint32_t node_id;
+};
+
+cmdline_parse_token_string_t cmd_del_port_tm_node_del =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_tm_node_result, del, "del");
+cmdline_parse_token_string_t cmd_del_port_tm_node_port =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_tm_node_result, port, "port");
+cmdline_parse_token_string_t cmd_del_port_tm_node_tm =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_tm_node_result, tm, "tm");
+cmdline_parse_token_string_t cmd_del_port_tm_node_node =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_del_port_tm_node_result, node, "node");
+cmdline_parse_token_num_t cmd_del_port_tm_node_port_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_del_port_tm_node_result,
+ port_id, UINT8);
+cmdline_parse_token_num_t cmd_del_port_tm_node_node_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_del_port_tm_node_result,
+ node_id, UINT32);
+
+static void cmd_del_port_tm_node_parsed(void *parsed_result,
+ __attribute__((unused)) struct cmdline *cl,
+ __attribute__((unused)) void *data)
+{
+ struct cmd_del_port_tm_node_result *res = parsed_result;
+ struct rte_port *port;
+ struct rte_tm_error error;
+ uint32_t node_id = res->node_id;
+ uint8_t port_id = res->port_id;
+ int ret;
+
+ if (port_id_is_invalid(port_id, ENABLED_WARN))
+ return;
+
+ port = &ports[port_id];
+
+ /* Port tm flag */
+ if (port->softport.tm_flag == 0) {
+ printf(" tm not enabled on port %u (error)\n", port_id);
+ return;
+ }
+
+ /* Forward mode: tm */
+ if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+ printf(" tm mode not enabled(error)\n");
+ return;
+ }
+
+ /* Port status */
+ if (port_is_started(port_id)) {
+ printf(" Port %u not stopped (error)\n", port_id);
+ return;
+ }
+
+ /* TM hierarchy status */
+ if (port->softport.tm.hierarchy_frozen == 1)
+ port->softport.tm.hierarchy_frozen = 0;
+
+ ret = rte_tm_node_delete(port_id, node_id, &error);
+ if (ret != 0) {
+ print_err_msg(&error);
+ return;
+ }
+}
+
+cmdline_parse_inst_t cmd_del_port_tm_node = {
+ .f = cmd_del_port_tm_node_parsed,
+ .data = NULL,
+ .help_str = "Delete port tm node",
+ .tokens = {
+ (void *)&cmd_del_port_tm_node_del,
+ (void *)&cmd_del_port_tm_node_port,
+ (void *)&cmd_del_port_tm_node_tm,
+ (void *)&cmd_del_port_tm_node_node,
+ (void *)&cmd_del_port_tm_node_port_id,
+ (void *)&cmd_del_port_tm_node_node_id,
+ NULL,
+ },
+};
+
+#ifdef RTE_SCHED_SUBPORT_TC_OV
+/* *** Update Port TM Node Parent *** */
+struct cmd_set_port_tm_node_parent_result {
+ cmdline_fixed_string_t set;
+ cmdline_fixed_string_t port;
+ cmdline_fixed_string_t tm;
+ cmdline_fixed_string_t node;
+ cmdline_fixed_string_t parent;
+ uint8_t port_id;
+ uint32_t node_id;
+ uint32_t parent_id;
+ uint32_t priority;
+ uint32_t weight;
+};
+
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_set =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_set_port_tm_node_parent_result, set, "set");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_port =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_set_port_tm_node_parent_result, port, "port");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_tm =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_set_port_tm_node_parent_result, tm, "tm");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_node =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_set_port_tm_node_parent_result, node, "node");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_parent =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_set_port_tm_node_parent_result, parent, "parent");
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_port_id =
+ TOKEN_NUM_INITIALIZER(
+ struct cmd_set_port_tm_node_parent_result, port_id, UINT8);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_node_id =
+ TOKEN_NUM_INITIALIZER(
+ struct cmd_set_port_tm_node_parent_result, node_id, UINT32);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_parent_id =
+ TOKEN_NUM_INITIALIZER(struct cmd_set_port_tm_node_parent_result,
+ parent_id, UINT32);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_priority =
+ TOKEN_NUM_INITIALIZER(struct cmd_set_port_tm_node_parent_result,
+ priority, UINT32);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_weight =
+ TOKEN_NUM_INITIALIZER(struct cmd_set_port_tm_node_parent_result,
+ weight, UINT32);
+
+static void cmd_set_port_tm_node_parent_parsed(void *parsed_result,
+ __attribute__((unused)) struct cmdline *cl,
+ __attribute__((unused)) void *data)
+{
+ struct cmd_set_port_tm_node_parent_result *res = parsed_result;
+ struct rte_port *port;
+ struct rte_tm_error error;
+ uint32_t node_id = res->node_id;
+ uint32_t parent_id = res->parent_id;
+ uint32_t priority = res->priority;
+ uint32_t weight = res->weight;
+ uint8_t port_id = res->port_id;
+ int ret;
+
+ if (port_id_is_invalid(port_id, ENABLED_WARN))
+ return;
+
+ port = &ports[port_id];
+
+ /* Port tm flag */
+ if (port->softport.tm_flag == 0) {
+ printf(" tm not enabled on port %u (error)\n", port_id);
+ return;
+ }
+
+ /* Forward mode: tm */
+ if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+ printf(" tm mode not enabled(error)\n");
+ return;
+ }
+
+ /* TM hierarchy status */
+ if (port->softport.tm.hierarchy_frozen == 0) {
+ printf(" hierarchy not frozen(error)\n");
+ return;
+ }
+
+ /* Port status */
+ if (!port_is_started(port_id)) {
+ printf(" Port %u not started (error)\n", port_id);
+ return;
+ }
+
+ ret = rte_tm_node_parent_update(port_id, node_id,
+ parent_id, priority, weight, &error);
+ if (ret != 0) {
+ print_err_msg(&error);
+ return;
+ }
+}
+
+cmdline_parse_inst_t cmd_set_port_tm_node_parent = {
+ .f = cmd_set_port_tm_node_parent_parsed,
+ .data = NULL,
+ .help_str = "Set port tm node parent",
+ .tokens = {
+ (void *)&cmd_set_port_tm_node_parent_set,
+ (void *)&cmd_set_port_tm_node_parent_port,
+ (void *)&cmd_set_port_tm_node_parent_tm,
+ (void *)&cmd_set_port_tm_node_parent_node,
+ (void *)&cmd_set_port_tm_node_parent_parent,
+ (void *)&cmd_set_port_tm_node_parent_port_id,
+ (void *)&cmd_set_port_tm_node_parent_node_id,
+ (void *)&cmd_set_port_tm_node_parent_parent_id,
+ (void *)&cmd_set_port_tm_node_parent_priority,
+ (void *)&cmd_set_port_tm_node_parent_weight,
+ NULL,
+ },
+};
+#endif
+
+/* *** Port TM Hierarchy Commit *** */
+struct cmd_port_tm_hierarchy_commit_result {
+ cmdline_fixed_string_t port;
+ cmdline_fixed_string_t tm;
+ cmdline_fixed_string_t hierarchy;
+ cmdline_fixed_string_t commit;
+ uint8_t port_id;
+ uint32_t clean_on_fail;
+};
+
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_port =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_port_tm_hierarchy_commit_result, port, "port");
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_tm =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_port_tm_hierarchy_commit_result, tm, "tm");
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_hierarchy =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_port_tm_hierarchy_commit_result,
+ hierarchy, "hierarchy");
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_commit =
+ TOKEN_STRING_INITIALIZER(
+ struct cmd_port_tm_hierarchy_commit_result, commit, "commit");
+cmdline_parse_token_num_t cmd_port_tm_hierarchy_commit_port_id =
+ TOKEN_NUM_INITIALIZER(
+ struct cmd_port_tm_hierarchy_commit_result,
+ port_id, UINT8);
+cmdline_parse_token_num_t cmd_port_tm_hierarchy_commit_clean_on_fail =
+ TOKEN_NUM_INITIALIZER(struct cmd_port_tm_hierarchy_commit_result,
+ clean_on_fail, UINT32);
+
+static void cmd_port_tm_hierarchy_commit_parsed(void *parsed_result,
+ __attribute__((unused)) struct cmdline *cl,
+ __attribute__((unused)) void *data)
+{
+ struct cmd_port_tm_hierarchy_commit_result *res = parsed_result;
+ struct rte_port *port;
+ struct rte_tm_error error;
+ uint32_t clean_on_fail = res->clean_on_fail;
+ uint8_t port_id = res->port_id;
+ int ret;
+
+ if (port_id_is_invalid(port_id, ENABLED_WARN))
+ return;
+
+ port = &ports[port_id];
+
+ /* Port tm flag */
+ if (port->softport.tm_flag == 0) {
+ printf(" tm not enabled on port %u (error)\n", port_id);
+ return;
+ }
+
+ /* Forward mode: tm */
+ if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+ printf(" tm mode not enabled(error)\n");
+ return;
+ }
+
+ /* Port status */
+ if (port_is_started(port_id)) {
+ printf(" Port %u not stopped (error)\n", port_id);
+ return;
+ }
+
+ ret = rte_tm_hierarchy_commit(port_id, clean_on_fail, &error);
+ if (ret != 0) {
+ print_err_msg(&error);
+ return;
+ }
+ /* Set TM hierarchy commit flag */
+ port->softport.tm.hierarchy_frozen = 1;
+}
+
+cmdline_parse_inst_t cmd_port_tm_hierarchy_commit = {
+ .f = cmd_port_tm_hierarchy_commit_parsed,
+ .data = NULL,
+ .help_str = "Set port tm node shaper profile",
+ .tokens = {
+ (void *)&cmd_port_tm_hierarchy_commit_port,
+ (void *)&cmd_port_tm_hierarchy_commit_tm,
+ (void *)&cmd_port_tm_hierarchy_commit_hierarchy,
+ (void *)&cmd_port_tm_hierarchy_commit_commit,
+ (void *)&cmd_port_tm_hierarchy_commit_port_id,
+ (void *)&cmd_port_tm_hierarchy_commit_clean_on_fail,
+ NULL,
+ },
+};
--
2.9.3
next prev parent reply other threads:[~2017-09-20 9:44 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-22 17:02 [dpdk-dev] [PATCH 1/2] app/testpmd: add traffic management forwarding mode Jasvinder Singh
2017-08-22 17:02 ` [dpdk-dev] [PATCH 2/2] app/testpmd: add CLI for tm mode Jasvinder Singh
2017-09-14 11:53 ` [dpdk-dev] [PATCH v2 1/2] app/testpmd: add traffic management forwarding mode Jasvinder Singh
2017-09-14 11:53 ` [dpdk-dev] [PATCH v2 2/2] app/testpmd: add CLI for tm mode Jasvinder Singh
2017-09-18 14:03 ` De Lara Guarch, Pablo
2017-09-19 15:06 ` Singh, Jasvinder
2017-09-18 13:54 ` [dpdk-dev] [PATCH v2 1/2] app/testpmd: add traffic management forwarding mode De Lara Guarch, Pablo
2017-09-19 15:04 ` Singh, Jasvinder
2017-09-20 9:56 ` [dpdk-dev] [PATCH v3 1/5] " Jasvinder Singh
2017-09-20 9:56 ` [dpdk-dev] [PATCH v3 2/5] app/test-pmd: add CLI for TM capability and stats Jasvinder Singh
2017-09-20 9:56 ` [dpdk-dev] [PATCH v3 3/5] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-09-20 9:56 ` Jasvinder Singh [this message]
2017-09-20 9:56 ` [dpdk-dev] [PATCH v3 5/5] app/test-pmd: add CLI for TM packet classification Jasvinder Singh
2017-09-22 16:35 ` [dpdk-dev] [PATCH v4 1/5] app/testpmd: add traffic management forwarding mode Jasvinder Singh
2017-09-22 16:35 ` [dpdk-dev] [PATCH v4 2/5] app/test-pmd: add CLI for TM capability and stats Jasvinder Singh
2017-09-29 12:38 ` [dpdk-dev] [PATCH v5 1/3] " Jasvinder Singh
2017-09-29 12:38 ` [dpdk-dev] [PATCH v5 2/3] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-09-29 12:38 ` [dpdk-dev] [PATCH v5 3/3] app/test-pmd: add CLI for TM nodes and hierarchy commit Jasvinder Singh
2017-10-09 19:07 ` [dpdk-dev] [PATCH v6 1/3] app/test-pmd: add CLI for TM capability and stats Jasvinder Singh
2017-10-09 19:07 ` [dpdk-dev] [PATCH v6 2/3] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-10-09 19:07 ` [dpdk-dev] [PATCH v6 3/3] app/test-pmd: add CLI for TM nodes and hierarchy commit Jasvinder Singh
2017-10-11 8:40 ` Pei, Yulong
2017-10-11 8:51 ` Singh, Jasvinder
2017-10-11 9:26 ` [dpdk-dev] [PATCH v7 1/3] app/test-pmd: add CLI for TM capability and stats Jasvinder Singh
2017-10-11 9:26 ` [dpdk-dev] [PATCH v7 2/3] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-10-13 2:33 ` Wu, Jingjing
2017-10-13 8:58 ` Singh, Jasvinder
2017-10-11 9:26 ` [dpdk-dev] [PATCH v7 3/3] app/test-pmd: add CLI for TM nodes and hierarchy commit Jasvinder Singh
2017-10-13 2:58 ` Wu, Jingjing
2017-10-13 10:50 ` Singh, Jasvinder
2017-10-12 20:55 ` [dpdk-dev] [PATCH v7 1/3] app/test-pmd: add CLI for TM capability and stats Thomas Monjalon
2017-10-13 2:34 ` Wu, Jingjing
2017-10-13 6:22 ` Pei, Yulong
2017-10-13 16:59 ` [dpdk-dev] [PATCH v8 " Jasvinder Singh
2017-10-13 16:59 ` [dpdk-dev] [PATCH v8 2/3] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-10-13 17:00 ` [dpdk-dev] [PATCH v8 3/3] app/test-pmd: add CLI for TM nodes and hierarchy commit Jasvinder Singh
2017-10-14 10:20 ` [dpdk-dev] [PATCH v9 1/3] app/test-pmd: add CLI for TM capability and stats Jasvinder Singh
2017-10-14 10:20 ` [dpdk-dev] [PATCH v9 2/3] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-10-14 10:20 ` [dpdk-dev] [PATCH v9 3/3] app/test-pmd: add CLI for TM nodes and hierarchy commit Jasvinder Singh
2017-10-16 10:18 ` Wu, Jingjing
2017-10-16 18:18 ` Singh, Jasvinder
2017-10-16 18:55 ` [dpdk-dev] [PATCH v10 1/3] app/test-pmd: add CLI for TM capability and stats Jasvinder Singh
2017-10-16 18:55 ` [dpdk-dev] [PATCH v10 2/3] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-10-16 18:55 ` [dpdk-dev] [PATCH v10 3/3] app/test-pmd: add CLI for TM nodes and hierarchy commit Jasvinder Singh
2017-10-17 8:44 ` [dpdk-dev] [PATCH v10 1/3] app/test-pmd: add CLI for TM capability and stats Wu, Jingjing
2017-10-20 14:08 ` Dumitrescu, Cristian
2017-09-22 16:35 ` [dpdk-dev] [PATCH v4 3/5] app/test-pmd: add CLI for shaper and wred profiles Jasvinder Singh
2017-09-22 16:35 ` [dpdk-dev] [PATCH v4 4/5] app/test-pmd: add CLI for TM nodes and hierarchy commit Jasvinder Singh
2017-09-22 16:35 ` [dpdk-dev] [PATCH v4 5/5] app/test-pmd: add CLI for TM packet classification Jasvinder Singh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170920095653.110750-4-jasvinder.singh@intel.com \
--to=jasvinder.singh@intel.com \
--cc=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=jingjing.wu@intel.com \
--cc=pablo.de.lara.guarch@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).