examples/ip_pipeline: add load balance action command

Add command for load balance action.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
This commit is contained in:
Jasvinder Singh 2018-03-29 19:32:02 +01:00 committed by Cristian Dumitrescu
parent d0d306c7f2
commit 802755dca3
5 changed files with 118 additions and 1 deletions

View File

@ -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,
&params->lb);
if (status) {
rte_table_action_profile_free(ap);
return NULL;
}
}
if (params->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) { if (params->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
status = rte_table_action_profile_action_register(ap, status = rte_table_action_profile_action_register(ap,
RTE_TABLE_ACTION_MTR, RTE_TABLE_ACTION_MTR,

View File

@ -46,6 +46,7 @@ port_in_action_profile_create(const char *name,
struct table_action_profile_params { struct table_action_profile_params {
uint64_t action_mask; uint64_t action_mask;
struct rte_table_action_common_config common; 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_mtr_config mtr;
struct rte_table_action_tm_config tm; struct rte_table_action_tm_config tm;
struct rte_table_action_encap_config encap; struct rte_table_action_encap_config encap;

View File

@ -805,7 +805,8 @@ cmd_port_in_action_profile(char **tokens,
uint32_t i; uint32_t i;
if (n_tokens < t0 + 22) { 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; return;
} }
@ -862,6 +863,7 @@ cmd_port_in_action_profile(char **tokens,
* ipv4 | ipv6 * ipv4 | ipv6
* offset <ip_offset> * offset <ip_offset>
* fwd * fwd
* [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]
* [meter srtcm | trtcm * [meter srtcm | trtcm
* tc <n_tc> * tc <n_tc>
* stats none | pkts | bytes | both] * stats none | pkts | bytes | both]
@ -931,6 +933,47 @@ cmd_table_action_profile(char **tokens,
p.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD; p.action_mask |= 1LLU << RTE_TABLE_ACTION_FWD;
t0 = 8; 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 ((t0 < n_tokens) && (strcmp(tokens[t0], "meter") == 0)) {
if (n_tokens < t0 + 6) { if (n_tokens < t0 + 6) {
snprintf(out, out_size, MSG_ARG_MISMATCH, snprintf(out, out_size, MSG_ARG_MISMATCH,
@ -2789,6 +2832,31 @@ parse_table_action_fwd(char **tokens,
return 0; 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 static int
parse_policer_action(char *token, enum rte_table_action_policer *a) parse_policer_action(char *token, enum rte_table_action_policer *a)
{ {
@ -3222,6 +3290,20 @@ parse_table_action(char **tokens,
n_tokens -= n; 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)) { if (n_tokens && (strcmp(tokens[0], "meter") == 0)) {
uint32_t n; uint32_t n;

View File

@ -260,6 +260,7 @@ struct table_rule_match {
struct table_rule_action { struct table_rule_action {
uint64_t action_mask; uint64_t action_mask;
struct rte_table_action_fwd_params fwd; 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_mtr_params mtr;
struct rte_table_action_tm_params tm; struct rte_table_action_tm_params tm;
struct rte_table_action_encap_params encap; struct rte_table_action_encap_params encap;

View File

@ -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)) { if (action->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
status = rte_table_action_apply(a, status = rte_table_action_apply(a,
data_in, data_in,
@ -2243,6 +2255,16 @@ pipeline_msg_handle_table_rule_add_bulk(struct pipeline_data *p,
goto fail; 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)) { if (act->action_mask & (1LLU << RTE_TABLE_ACTION_MTR)) {
status = rte_table_action_apply(a, status = rte_table_action_apply(a,
data_in, data_in,