summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/dpdk/device/flow.c20
-rw-r--r--src/plugins/dpdk/device/init.c1
2 files changed, 17 insertions, 4 deletions
diff --git a/src/plugins/dpdk/device/flow.c b/src/plugins/dpdk/device/flow.c
index 3f9553105f8..1b8b5906b1c 100644
--- a/src/plugins/dpdk/device/flow.c
+++ b/src/plugins/dpdk/device/flow.c
@@ -41,6 +41,7 @@ dpdk_flow_add (dpdk_device_t * xd, vnet_flow_t * f, dpdk_flow_entry_t * fe)
struct rte_flow_item_udp udp[2] = { };
struct rte_flow_item_tcp tcp[2] = { };
struct rte_flow_action_mark mark = { 0 };
+ struct rte_flow_action_queue queue = { 0 };
struct rte_flow_item *item, *items = 0;
struct rte_flow_action *action, *actions = 0;
@@ -201,10 +202,21 @@ dpdk_flow_add (dpdk_device_t * xd, vnet_flow_t * f, dpdk_flow_entry_t * fe)
vec_add2 (actions, action, 1);
action->type = RTE_FLOW_ACTION_TYPE_PASSTHRU;
- vec_add2 (actions, action, 1);
- mark.id = fe->mark;
- action->type = RTE_FLOW_ACTION_TYPE_MARK;
- action->conf = &mark;
+ 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;
+ }
+
+ if (f->actions & VNET_FLOW_ACTION_MARK)
+ {
+ vec_add2 (actions, action, 1);
+ mark.id = fe->mark;
+ action->type = RTE_FLOW_ACTION_TYPE_MARK;
+ action->conf = &mark;
+ }
vec_add2 (actions, action, 1);
action->type = RTE_FLOW_ACTION_TYPE_END;
diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c
index eaeda32f3b7..13dc7deb119 100644
--- a/src/plugins/dpdk/device/init.c
+++ b/src/plugins/dpdk/device/init.c
@@ -392,6 +392,7 @@ dpdk_lib_init (dpdk_main_t * dm)
xd->port_type = port_type_from_speed_capa (&dev_info);
xd->supported_flow_actions = VNET_FLOW_ACTION_MARK |
VNET_FLOW_ACTION_REDIRECT_TO_NODE |
+ VNET_FLOW_ACTION_REDIRECT_TO_QUEUE |
VNET_FLOW_ACTION_BUFFER_ADVANCE |
VNET_FLOW_ACTION_COUNT | VNET_FLOW_ACTION_DROP;