X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fip_pipeline%2Fcli.c;h=c9587f5661745c545a600b919380f1978b1d8924;hb=1d20a073fa5e;hp=5a32632f0c7b82ad7393c3dcddb90d4319b82e26;hpb=d0d306c7f2a1fba9816eb148da74ade7ff0a3c46;p=dpdk.git diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c index 5a32632f0c..c9587f5661 100644 --- a/examples/ip_pipeline/cli.c +++ b/examples/ip_pipeline/cli.c @@ -138,6 +138,8 @@ cmd_link(char **tokens, struct link *link; char *name; + memset(&p, 0, sizeof(p)); + if ((n_tokens < 13) || (n_tokens > 14 + LINK_RXQ_RSS_MAX)) { snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]); return; @@ -651,6 +653,7 @@ cmd_kni(char **tokens, char *name; struct kni *kni; + memset(&p, 0, sizeof(p)); if ((n_tokens != 6) && (n_tokens != 8)) { snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]); return; @@ -805,7 +808,8 @@ cmd_port_in_action_profile(char **tokens, uint32_t i; if (n_tokens < t0 + 22) { - snprintf(out, out_size, MSG_ARG_MISMATCH, "port in action profile balance"); + snprintf(out, out_size, MSG_ARG_MISMATCH, + "port in action profile balance"); return; } @@ -862,6 +866,7 @@ cmd_port_in_action_profile(char **tokens, * ipv4 | ipv6 * offset * fwd + * [balance offset mask outoffset ] * [meter srtcm | trtcm * tc * stats none | pkts | bytes | both] @@ -931,6 +936,47 @@ cmd_table_action_profile(char **tokens, p.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD; t0 = 8; + if ((t0 < n_tokens) && (strcmp(tokens[t0], "balance") == 0)) { + if (n_tokens < t0 + 7) { + snprintf(out, out_size, MSG_ARG_MISMATCH, "table action profile balance"); + return; + } + + if (strcmp(tokens[t0 + 1], "offset") != 0) { + snprintf(out, out_size, MSG_ARG_NOT_FOUND, "offset"); + return; + } + + if (parser_read_uint32(&p.lb.key_offset, tokens[t0 + 2]) != 0) { + snprintf(out, out_size, MSG_ARG_INVALID, "key_offset"); + return; + } + + if (strcmp(tokens[t0 + 3], "mask") != 0) { + snprintf(out, out_size, MSG_ARG_NOT_FOUND, "mask"); + return; + } + + p.lb.key_size = RTE_PORT_IN_ACTION_LB_KEY_SIZE_MAX; + if (parse_hex_string(tokens[t0 + 4], p.lb.key_mask, &p.lb.key_size) != 0) { + snprintf(out, out_size, MSG_ARG_INVALID, "key_mask"); + return; + } + + if (strcmp(tokens[t0 + 5], "outoffset") != 0) { + snprintf(out, out_size, MSG_ARG_NOT_FOUND, "outoffset"); + return; + } + + if (parser_read_uint32(&p.lb.out_offset, tokens[t0 + 6]) != 0) { + snprintf(out, out_size, MSG_ARG_INVALID, "out_offset"); + return; + } + + p.action_mask |= 1LLU << RTE_TABLE_ACTION_LB; + t0 += 7; + } /* balance */ + if ((t0 < n_tokens) && (strcmp(tokens[t0], "meter") == 0)) { if (n_tokens < t0 + 6) { snprintf(out, out_size, MSG_ARG_MISMATCH, @@ -1847,12 +1893,6 @@ cmd_pipeline_table(char **tokens, t0 += 6; } else if (strcmp(tokens[t0], "stub") == 0) { - if (n_tokens < t0 + 1) { - snprintf(out, out_size, MSG_ARG_MISMATCH, - "pipeline table stub"); - return; - } - p.match_type = TABLE_STUB; t0 += 1; @@ -2271,8 +2311,7 @@ cmd_pipeline_table_stats(char **tokens, * priority * ipv4 | ipv6 * - * | array - * pos + * | array * | hash * raw * | ipv4_5tuple @@ -2789,6 +2828,31 @@ parse_table_action_fwd(char **tokens, return 0; } +static uint32_t +parse_table_action_balance(char **tokens, + uint32_t n_tokens, + struct table_rule_action *a) +{ + uint32_t i; + + if ((n_tokens == 0) || (strcmp(tokens[0], "balance") != 0)) + return 0; + + tokens++; + n_tokens--; + + if (n_tokens < RTE_TABLE_ACTION_LB_TABLE_SIZE) + return 0; + + for (i = 0; i < RTE_TABLE_ACTION_LB_TABLE_SIZE; i++) + if (parser_read_uint32(&a->lb.out[i], tokens[i]) != 0) + return 0; + + a->action_mask |= 1 << RTE_TABLE_ACTION_LB; + return 1 + RTE_TABLE_ACTION_LB_TABLE_SIZE; + +} + static int parse_policer_action(char *token, enum rte_table_action_policer *a) { @@ -3222,6 +3286,20 @@ parse_table_action(char **tokens, n_tokens -= n; } + if (n_tokens && (strcmp(tokens[0], "balance") == 0)) { + uint32_t n; + + n = parse_table_action_balance(tokens, n_tokens, a); + if (n == 0) { + snprintf(out, out_size, MSG_ARG_INVALID, + "action balance"); + return 0; + } + + tokens += n; + n_tokens -= n; + } + if (n_tokens && (strcmp(tokens[0], "meter") == 0)) { uint32_t n; @@ -4077,6 +4155,7 @@ load_dscp_table(struct rte_table_action_dscp_table *dscp_table, if (parse_tokenize_string(line, tokens, &n_tokens)) { *line_number = l; + fclose(f); return -EINVAL; } @@ -4091,6 +4170,7 @@ load_dscp_table(struct rte_table_action_dscp_table *dscp_table, (tc_queue_id >= RTE_TABLE_ACTION_TC_QUEUE_MAX) || (strlen(tokens[2]) != 1)) { *line_number = l; + fclose(f); return -EINVAL; } @@ -4112,6 +4192,7 @@ load_dscp_table(struct rte_table_action_dscp_table *dscp_table, default: *line_number = l; + fclose(f); return -EINVAL; }