flow: Add 'drop' and 'redirect-to-queue' actions support 27/22727/3
authorChenmin Sun <chenmin.sun@intel.com>
Tue, 15 Oct 2019 12:36:16 +0000 (20:36 +0800)
committerDamjan Marion <dmarion@me.com>
Wed, 16 Oct 2019 18:34:51 +0000 (18:34 +0000)
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

MAINTAINERS
src/plugins/dpdk/device/flow.c
src/vnet/flow/flow_cli.c

index 652d76a..20c7e3c 100644 (file)
@@ -274,6 +274,11 @@ I: geneve
 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>
index 1b8b590..cea96fd 100644 (file)
@@ -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)
index 0e10c90..5481aa3 100644 (file)
@@ -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))
        ;