flow: Add 'drop' and 'redirect-to-queue' actions support
Type: feature
Add 'drop' and 'redirect-to-queue' support in
'test-flow' command and DPDK plugin
Signed-off-by: Chenmin Sun <chenmin.sun@intel.com>
Change-Id: I567bb77cb401c9bd1309ecabe802fe9de88c746b
diff --git a/MAINTAINERS b/MAINTAINERS
index 652d76a..20c7e3c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -274,6 +274,11 @@
M: N/A
F: src/vnet/geneve/
+VNET FLOW
+I: flow
+M: Damjan Marion <damarion@cisco.com>
+F: src/vnet/flow/
+
Plugin - Access Control List (ACL) Based Forwarding
I: abf
M: Neale Ranns <nranns@cisco.com>
diff --git a/src/plugins/dpdk/device/flow.c b/src/plugins/dpdk/device/flow.c
index 1b8b590..cea96fd 100644
--- a/src/plugins/dpdk/device/flow.c
+++ b/src/plugins/dpdk/device/flow.c
@@ -44,6 +44,7 @@
struct rte_flow_action_queue queue = { 0 };
struct rte_flow_item *item, *items = 0;
struct rte_flow_action *action, *actions = 0;
+ bool fate = false;
enum
{
@@ -199,15 +200,31 @@
item->type = RTE_FLOW_ITEM_TYPE_END;
/* Actions */
- vec_add2 (actions, action, 1);
- action->type = RTE_FLOW_ACTION_TYPE_PASSTHRU;
-
+ /* Only one 'fate' can be assigned */
if (f->actions & VNET_FLOW_ACTION_REDIRECT_TO_QUEUE)
{
vec_add2 (actions, action, 1);
queue.index = f->redirect_queue;
action->type = RTE_FLOW_ACTION_TYPE_QUEUE;
action->conf = &queue;
+ fate = true;
+ }
+ if (f->actions & VNET_FLOW_ACTION_DROP)
+ {
+ vec_add2 (actions, action, 1);
+ action->type = RTE_FLOW_ACTION_TYPE_DROP;
+ if (fate == true)
+ {
+ rv = VNET_FLOW_ERROR_INTERNAL;
+ goto done;
+ }
+ else
+ fate = true;
+ }
+ if (fate == false)
+ {
+ vec_add2 (actions, action, 1);
+ action->type = RTE_FLOW_ACTION_TYPE_PASSTHRU;
}
if (f->actions & VNET_FLOW_ACTION_MARK)
diff --git a/src/vnet/flow/flow_cli.c b/src/vnet/flow/flow_cli.c
index 0e10c90..5481aa3 100644
--- a/src/vnet/flow/flow_cli.c
+++ b/src/vnet/flow/flow_cli.c
@@ -323,6 +323,11 @@
else if (unformat (line_input, "buffer-advance %d",
&flow.buffer_advance))
flow.actions |= VNET_FLOW_ACTION_BUFFER_ADVANCE;
+ else if (unformat (line_input, "redirect-to-queue %d",
+ &flow.redirect_queue))
+ flow.actions |= VNET_FLOW_ACTION_REDIRECT_TO_QUEUE;
+ else if (unformat (line_input, "drop"))
+ flow.actions |= VNET_FLOW_ACTION_DROP;
else if (unformat (line_input, "%U", unformat_vnet_hw_interface, vnm,
&hw_if_index))
;