[dpdk-dev,v4,43/49] ip_pipeline: add cli for load balance action

Message ID 20180329183208.103844-44-jasvinder.singh@intel.com (mailing list archive)
State Accepted, archived
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail apply issues

Commit Message

Jasvinder Singh March 29, 2018, 6:32 p.m. UTC
  Add command for load balance action.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
 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(-)
  

Patch

diff --git a/examples/ip_pipeline/action.c b/examples/ip_pipeline/action.c
index 9db6dba..1659876 100644
--- a/examples/ip_pipeline/action.c
+++ b/examples/ip_pipeline/action.c
@@ -177,6 +177,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)) {
 		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 98b5032..417200e 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 6f51d92..22c7f5a 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 <ip_offset>
  *  fwd
+ *  [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]
  *  [meter srtcm | trtcm
  *      tc <n_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 50aecab..a953a29 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 8728db9..fa85cf6 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,