flow: fix several crash issues 81/23681/4
authorChenmin Sun <[email protected]>
Thu, 21 Nov 2019 21:33:40 +0000 (05:33 +0800)
committerAndrew Yourtchenko <[email protected]>
Wed, 12 Aug 2020 07:43:03 +0000 (07:43 +0000)
Type: fix

This patch fixes crash issues(marked in brackets) in the below test cases

test flow enable index 0 1/1 -> [crash]
test flow disable index 0 1/1 -> [crash]

test flow add src-ip 192.168.8.8 proto udp redirect-to-queue 8
test flow enable index 0 1/1
test flow disable index 0 1/1 - [crash]

test flow add src-ip 192.168.8.8 proto udp redirect-to-queue 8
test flow enable index 0 1/1
test flow enable index 0 1/2
test flow del index 0 -> [crash]

Signed-off-by: Chenmin Sun <[email protected]>
Change-Id: I84bc6faa3d93a2cab4c82e8a876a8b1067257b62
(cherry picked from commit be2ad0b4743ed8a3875a5b6039c10c66eb07614c)

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

index c20632c..0c65e3a 100644 (file)
@@ -275,6 +275,11 @@ I: syslog
 M:     Matus Fabian <[email protected]>
 F:     src/vnet/syslog
 
+VNET FLOW
+I:     flow
+M:     Damjan Marion <[email protected]>
+F:     src/vnet/flow/
+
 Plugin - Access Control List (ACL) Based Forwarding
 I:     abf
 M:     Neale Ranns <[email protected]>
index 1b8b590..0a8cc45 100644 (file)
@@ -272,8 +272,6 @@ dpdk_flow_ops_fn (vnet_main_t * vnm, vnet_flow_dev_op_t op, u32 dev_instance,
 
   if (op == VNET_FLOW_DEV_OP_DEL_FLOW)
     {
-      ASSERT (*private_data >= vec_len (xd->flow_entries));
-
       fe = vec_elt_at_index (xd->flow_entries, *private_data);
 
       if ((rv = rte_flow_destroy (xd->device_index, fe->handle,
index 4d867fe..9b6a376 100644 (file)
@@ -96,6 +96,9 @@ vnet_flow_enable (vnet_main_t * vnm, u32 flow_index, u32 hw_if_index)
   uword private_data;
   int rv;
 
+  if (f == 0)
+    return VNET_FLOW_ERROR_NO_SUCH_ENTRY;
+
   if (!vnet_hw_interface_is_valid (vnm, hw_if_index))
     return VNET_FLOW_ERROR_NO_SUCH_INTERFACE;
 
@@ -137,6 +140,9 @@ vnet_flow_disable (vnet_main_t * vnm, u32 flow_index, u32 hw_if_index)
   uword *p;
   int rv;
 
+  if (f == 0)
+    return VNET_FLOW_ERROR_NO_SUCH_ENTRY;
+
   if (!vnet_hw_interface_is_valid (vnm, hw_if_index))
     return VNET_FLOW_ERROR_NO_SUCH_INTERFACE;