diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/dpdk/device/flow.c | 23 | ||||
-rw-r--r-- | src/vnet/flow/flow_cli.c | 5 |
2 files changed, 25 insertions, 3 deletions
diff --git a/src/plugins/dpdk/device/flow.c b/src/plugins/dpdk/device/flow.c index 1b8b5906b1c..cea96fd82b2 100644 --- a/src/plugins/dpdk/device/flow.c +++ b/src/plugins/dpdk/device/flow.c @@ -44,6 +44,7 @@ dpdk_flow_add (dpdk_device_t * xd, vnet_flow_t * f, dpdk_flow_entry_t * fe) 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 @@ dpdk_flow_add (dpdk_device_t * xd, vnet_flow_t * f, dpdk_flow_entry_t * fe) 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 0e10c90f55b..5481aa303fe 100644 --- a/src/vnet/flow/flow_cli.c +++ b/src/vnet/flow/flow_cli.c @@ -323,6 +323,11 @@ test_flow (vlib_main_t * vm, unformat_input_t * input, 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)) ; |