From: Chenmin Sun Date: Tue, 15 Oct 2019 12:36:16 +0000 (+0800) Subject: flow: Add 'drop' and 'redirect-to-queue' actions support X-Git-Tag: v20.05-rc0~614 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=e8c9f4f1c07f41986c50a744eee8ed4897178fda 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 Change-Id: I567bb77cb401c9bd1309ecabe802fe9de88c746b --- diff --git a/MAINTAINERS b/MAINTAINERS index 652d76a2e1f..20c7e3ca04c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -274,6 +274,11 @@ I: geneve M: N/A F: src/vnet/geneve/ +VNET FLOW +I: flow +M: Damjan Marion +F: src/vnet/flow/ + Plugin - Access Control List (ACL) Based Forwarding I: abf M: Neale Ranns 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)) ;