X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Fcmdline_mtr.c;h=eff2473e7b8f7453a3635491f2c048a1b68df670;hb=2d084f69aa268634fa7ccefa52c980c1e17e17d0;hp=4d9bfde78d332aa0ecf55f02fb926dc30ece4fbe;hpb=c5a3860f36902e1701817b0961bf99a5c96ede3a;p=dpdk.git diff --git a/app/test-pmd/cmdline_mtr.c b/app/test-pmd/cmdline_mtr.c index 4d9bfde78d..eff2473e7b 100644 --- a/app/test-pmd/cmdline_mtr.c +++ b/app/test-pmd/cmdline_mtr.c @@ -37,6 +37,8 @@ print_err_msg(struct rte_mtr_error *error) [RTE_MTR_ERROR_TYPE_STATS] = "stats", [RTE_MTR_ERROR_TYPE_SHARED] = "shared meter", + [RTE_MTR_ERROR_TYPE_METER_POLICY_ID] = "meter policy id", + [RTE_MTR_ERROR_TYPE_METER_POLICY] = "meter policy null", }; const char *errstr; @@ -56,6 +58,12 @@ print_err_msg(struct rte_mtr_error *error) error->type); } +void +print_mtr_err_msg(struct rte_mtr_error *error) +{ + print_err_msg(error); +} + static int parse_uint(uint64_t *value, const char *str) { @@ -146,53 +154,6 @@ parse_meter_color_str(char *c_str, uint32_t *use_prev_meter_color, return 0; } -static int -string_to_policer_action(char *s) -{ - if ((strcmp(s, "G") == 0) || (strcmp(s, "g") == 0)) - return MTR_POLICER_ACTION_COLOR_GREEN; - - if ((strcmp(s, "Y") == 0) || (strcmp(s, "y") == 0)) - return MTR_POLICER_ACTION_COLOR_YELLOW; - - if ((strcmp(s, "R") == 0) || (strcmp(s, "r") == 0)) - return MTR_POLICER_ACTION_COLOR_RED; - - 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_COLOR_GREEN] = action; - g_color = 1; - } else if (y_color == 0 && (action_mask & 0x2)) { - actions[RTE_COLOR_YELLOW] = action; - y_color = 1; - } else - actions[RTE_COLOR_RED] = action; - } - return 0; -} - static int parse_multi_token_string(char *t_str, uint16_t *port_id, uint32_t *mtr_id, enum rte_color **dscp_table) @@ -302,10 +263,6 @@ static void cmd_show_port_meter_cap_parsed(void *parsed_result, 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.srtcm_rfc2697_byte_mode_supported %" PRId32 "\n", cap.srtcm_rfc2697_byte_mode_supported); printf("cap.srtcm_rfc2697_packet_mode_supported %" PRId32 "\n", @@ -756,6 +713,7 @@ struct cmd_create_port_meter_result { uint16_t port_id; uint32_t mtr_id; uint32_t profile_id; + uint32_t policy_id; cmdline_fixed_string_t meter_enable; cmdline_fixed_string_t g_action; cmdline_fixed_string_t y_action; @@ -783,6 +741,9 @@ cmdline_parse_token_num_t cmd_create_port_meter_mtr_id = cmdline_parse_token_num_t cmd_create_port_meter_profile_id = TOKEN_NUM_INITIALIZER( struct cmd_create_port_meter_result, profile_id, RTE_UINT32); +cmdline_parse_token_num_t cmd_create_port_meter_policy_id = + TOKEN_NUM_INITIALIZER( + struct cmd_create_port_meter_result, policy_id, RTE_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"); @@ -826,7 +787,7 @@ static void cmd_create_port_meter_parsed(void *parsed_result, /* Meter params */ memset(¶ms, 0, sizeof(struct rte_mtr_params)); params.meter_profile_id = res->profile_id; - + params.meter_policy_id = res->policy_id; /* Parse meter input color string params */ ret = parse_meter_color_str(c_str, &use_prev_meter_color, &dscp_table); if (ret) { @@ -841,13 +802,6 @@ static void cmd_create_port_meter_parsed(void *parsed_result, params.meter_enable = 1; else params.meter_enable = 0; - - params.action[RTE_COLOR_GREEN] = - string_to_policer_action(res->g_action); - params.action[RTE_COLOR_YELLOW] = - string_to_policer_action(res->y_action); - params.action[RTE_COLOR_RED] = - string_to_policer_action(res->r_action); params.stats_mask = res->statistics_mask; ret = rte_mtr_create(port_id, mtr_id, ¶ms, shared, &error); @@ -862,7 +816,6 @@ cmdline_parse_inst_t cmd_create_port_meter = { .f = cmd_create_port_meter_parsed, .data = NULL, .help_str = "create port meter (yes|no) " - "(R|Y|G|D) (R|Y|G|D) (R|Y|G|D) " " " "[ ...]", .tokens = { @@ -872,10 +825,8 @@ cmdline_parse_inst_t cmd_create_port_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_policy_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, @@ -1005,6 +956,71 @@ cmdline_parse_inst_t cmd_disable_port_meter = { }, }; +/* *** Delete Port Meter Policy Object *** */ +struct cmd_del_port_meter_policy_result { + cmdline_fixed_string_t del; + cmdline_fixed_string_t port; + cmdline_fixed_string_t meter; + cmdline_fixed_string_t policy; + uint16_t port_id; + uint32_t policy_id; +}; + +cmdline_parse_token_string_t cmd_del_port_meter_policy_del = + TOKEN_STRING_INITIALIZER( + struct cmd_del_port_meter_policy_result, del, "del"); +cmdline_parse_token_string_t cmd_del_port_meter_policy_port = + TOKEN_STRING_INITIALIZER( + struct cmd_del_port_meter_policy_result, port, "port"); +cmdline_parse_token_string_t cmd_del_port_meter_policy_meter = + TOKEN_STRING_INITIALIZER( + struct cmd_del_port_meter_policy_result, meter, "meter"); +cmdline_parse_token_string_t cmd_del_port_meter_policy_policy = + TOKEN_STRING_INITIALIZER( + struct cmd_del_port_meter_policy_result, policy, "policy"); +cmdline_parse_token_num_t cmd_del_port_meter_policy_port_id = + TOKEN_NUM_INITIALIZER( + struct cmd_del_port_meter_policy_result, port_id, RTE_UINT16); +cmdline_parse_token_num_t cmd_del_port_meter_policy_policy_id = + TOKEN_NUM_INITIALIZER( + struct cmd_del_port_meter_policy_result, policy_id, RTE_UINT32); + +static void cmd_del_port_meter_policy_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_del_port_meter_policy_result *res = parsed_result; + struct rte_mtr_error error; + uint32_t policy_id = res->policy_id; + uint16_t port_id = res->port_id; + int ret; + + if (port_id_is_invalid(port_id, ENABLED_WARN)) + return; + + /* Delete Meter Policy*/ + ret = rte_mtr_meter_policy_delete(port_id, policy_id, &error); + if (ret != 0) { + print_err_msg(&error); + return; + } +} + +cmdline_parse_inst_t cmd_del_port_meter_policy = { + .f = cmd_del_port_meter_policy_parsed, + .data = NULL, + .help_str = "Delete port meter policy", + .tokens = { + (void *)&cmd_del_port_meter_policy_del, + (void *)&cmd_del_port_meter_policy_port, + (void *)&cmd_del_port_meter_policy_meter, + (void *)&cmd_del_port_meter_policy_policy, + (void *)&cmd_del_port_meter_policy_port_id, + (void *)&cmd_del_port_meter_policy_policy_id, + NULL, + }, +}; + /* *** Delete Port Meter Object *** */ struct cmd_del_port_meter_result { cmdline_fixed_string_t del; @@ -1215,121 +1231,6 @@ cmdline_parse_inst_t cmd_set_port_meter_dscp_table = { }, }; -/* *** Set Port Meter Policer Action *** */ -struct cmd_set_port_meter_policer_action_result { - cmdline_fixed_string_t set; - cmdline_fixed_string_t port; - cmdline_fixed_string_t meter; - cmdline_fixed_string_t policer; - cmdline_fixed_string_t action; - uint16_t port_id; - uint32_t mtr_id; - uint32_t action_mask; - cmdline_multi_string_t policer_action; -}; - -cmdline_parse_token_string_t cmd_set_port_meter_policer_action_set = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_meter_policer_action_result, set, "set"); -cmdline_parse_token_string_t cmd_set_port_meter_policer_action_port = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_meter_policer_action_result, port, "port"); -cmdline_parse_token_string_t cmd_set_port_meter_policer_action_meter = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_meter_policer_action_result, meter, - "meter"); -cmdline_parse_token_string_t cmd_set_port_meter_policer_action_policer = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_meter_policer_action_result, policer, - "policer"); -cmdline_parse_token_string_t cmd_set_port_meter_policer_action_action = - TOKEN_STRING_INITIALIZER( - struct cmd_set_port_meter_policer_action_result, action, - "action"); -cmdline_parse_token_num_t cmd_set_port_meter_policer_action_port_id = - TOKEN_NUM_INITIALIZER( - struct cmd_set_port_meter_policer_action_result, port_id, - RTE_UINT16); -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, - RTE_UINT32); -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, - RTE_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, TOKEN_STRING_MULTI); - -static void cmd_set_port_meter_policer_action_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, - __rte_unused void *data) -{ - struct cmd_set_port_meter_policer_action_result *res = parsed_result; - 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 *p_str = res->policer_action; - int ret; - - if (port_id_is_invalid(port_id, ENABLED_WARN)) - return; - - /* 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_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, - action_mask, actions, &error); - if (ret != 0) { - free(actions); - print_err_msg(&error); - return; - } - - free(actions); -} - -cmdline_parse_inst_t cmd_set_port_meter_policer_action = { - .f = cmd_set_port_meter_policer_action_parsed, - .data = NULL, - .help_str = "set port meter policer action " - " [ ]", - .tokens = { - (void *)&cmd_set_port_meter_policer_action_set, - (void *)&cmd_set_port_meter_policer_action_port, - (void *)&cmd_set_port_meter_policer_action_meter, - (void *)&cmd_set_port_meter_policer_action_policer, - (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_action_mask, - (void *)&cmd_set_port_meter_policer_action_policer_action, - NULL, - }, -}; - /* *** Set Port Meter Stats Mask *** */ struct cmd_set_port_meter_stats_mask_result { cmdline_fixed_string_t set;