From 802755dca3bbf541d07aecd594bb35fe95541989 Mon Sep 17 00:00:00 2001 From: Jasvinder Singh Date: Thu, 29 Mar 2018 19:32:02 +0100 Subject: [PATCH] examples/ip_pipeline: add load balance action command Add command for load balance action. Signed-off-by: Cristian Dumitrescu Signed-off-by: Jasvinder Singh --- examples/ip_pipeline/action.c | 11 +++++ examples/ip_pipeline/action.h | 1 + examples/ip_pipeline/cli.c | 84 ++++++++++++++++++++++++++++++++- examples/ip_pipeline/pipeline.h | 1 + examples/ip_pipeline/thread.c | 22 +++++++++ 5 files changed, 118 insertions(+), 1 deletion(-) diff --git a/examples/ip_pipeline/action.c b/examples/ip_pipeline/action.c index 20e222c80e..2cedb2461e 100644 --- a/examples/ip_pipeline/action.c +++ b/examples/ip_pipeline/action.c @@ -202,6 +202,17 @@ table_action_profile_create(const char *name, } } + if (params->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) { + status = rte_table_action_profile_action_register(ap, + RTE_TABLE_ACTION_LB, + ¶ms->lb); + + if (status) { + rte_table_action_profile_free(ap); + return NULL; + } + } + if (params->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) { status = rte_table_action_profile_action_register(ap, RTE_TABLE_ACTION_MTR, diff --git a/examples/ip_pipeline/action.h b/examples/ip_pipeline/action.h index 98b50322f3..417200e863 100644 --- a/examples/ip_pipeline/action.h +++ b/examples/ip_pipeline/action.h @@ -46,6 +46,7 @@ port_in_action_profile_create(const char *name, struct table_action_profile_params { uint64_t action_mask; struct rte_table_action_common_config common; + struct rte_table_action_lb_config lb; struct rte_table_action_mtr_config mtr; struct rte_table_action_tm_config tm; struct rte_table_action_encap_config encap; diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c index 5a32632f0c..fa371b3344 100644 --- a/examples/ip_pipeline/cli.c +++ b/examples/ip_pipeline/cli.c @@ -805,7 +805,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 +863,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 +933,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, @@ -2789,6 +2832,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_KEY_SIZE_MAX) + return 0; + + for (i = 0; i < RTE_TABLE_ACTION_LB_KEY_SIZE_MAX; 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_KEY_SIZE_MAX; + +} + static int parse_policer_action(char *token, enum rte_table_action_policer *a) { @@ -3222,6 +3290,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; diff --git a/examples/ip_pipeline/pipeline.h b/examples/ip_pipeline/pipeline.h index 50aecab328..a953a29fa8 100644 --- a/examples/ip_pipeline/pipeline.h +++ b/examples/ip_pipeline/pipeline.h @@ -260,6 +260,7 @@ struct table_rule_match { struct table_rule_action { uint64_t action_mask; struct rte_table_action_fwd_params fwd; + struct rte_table_action_lb_params lb; struct rte_table_action_mtr_params mtr; struct rte_table_action_tm_params tm; struct rte_table_action_encap_params encap; diff --git a/examples/ip_pipeline/thread.c b/examples/ip_pipeline/thread.c index 8728db9426..fa85cf637f 100644 --- a/examples/ip_pipeline/thread.c +++ b/examples/ip_pipeline/thread.c @@ -2031,6 +2031,18 @@ pipeline_msg_handle_table_rule_add(struct pipeline_data *p, } } + if (action->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) { + status = rte_table_action_apply(a, + data_in, + RTE_TABLE_ACTION_LB, + &action->lb); + + if (status) { + rsp->status = -1; + return rsp; + } + } + if (action->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) { status = rte_table_action_apply(a, data_in, @@ -2243,6 +2255,16 @@ pipeline_msg_handle_table_rule_add_bulk(struct pipeline_data *p, goto fail; } + if (act->action_mask & (1LLU << RTE_TABLE_ACTION_LB)) { + status = rte_table_action_apply(a, + data_in, + RTE_TABLE_ACTION_LB, + &act->lb); + + if (status) + goto fail; + } + if (act->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) { status = rte_table_action_apply(a, data_in,