memif: fix vpp to go link up immediately on admin up 49/30849/3
authorEd Warnicke <hagbard@gmail.com>
Tue, 19 Jan 2021 23:56:24 +0000 (17:56 -0600)
committerDamjan Marion <dmarion@me.com>
Wed, 20 Jan 2021 17:59:11 +0000 (17:59 +0000)
Type: improvement

Previously, memif would check every 3 seconds to see if an interface
had gone admin up.  Now it does as soon as admin up occurs.

Signed-off-by: Ed Warnicke <hagbard@gmail.com>
Change-Id: I808699cd5980fa162c34ac977f43d00ed6b67115
Signed-off-by: Ed Warnicke <hagbard@gmail.com>
src/plugins/memif/device.c
src/plugins/memif/memif.c
src/plugins/memif/private.h

index aa79f88..9debf2b 100644 (file)
@@ -474,22 +474,6 @@ memif_interface_rx_mode_change (vnet_main_t * vnm, u32 hw_if_index, u32 qid,
   return 0;
 }
 
-static clib_error_t *
-memif_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
-{
-  memif_main_t *mm = &memif_main;
-  vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index);
-  memif_if_t *mif = pool_elt_at_index (mm->interfaces, hw->dev_instance);
-  static clib_error_t *error = 0;
-
-  if (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
-    mif->flags |= MEMIF_IF_FLAG_ADMIN_UP;
-  else
-    mif->flags &= ~MEMIF_IF_FLAG_ADMIN_UP;
-
-  return error;
-}
-
 static clib_error_t *
 memif_subif_add_del_function (vnet_main_t * vnm,
                              u32 hw_if_index,
index bf09509..7f22883 100644 (file)
@@ -551,6 +551,8 @@ memif_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
        case MEMIF_PROCESS_EVENT_STOP:
          enabled = 0;
          continue;
+       case MEMIF_PROCESS_EVENT_ADMIN_UP_DOWN:
+         break;
        default:
          ASSERT (0);
        }
@@ -1079,6 +1081,24 @@ done:
   return rv;
 }
 
+clib_error_t *
+memif_interface_admin_up_down (vnet_main_t *vnm, u32 hw_if_index, u32 flags)
+{
+  memif_main_t *mm = &memif_main;
+  vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index);
+  memif_if_t *mif = pool_elt_at_index (mm->interfaces, hw->dev_instance);
+  static clib_error_t *error = 0;
+
+  if (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
+    mif->flags |= MEMIF_IF_FLAG_ADMIN_UP;
+  else
+    mif->flags &= ~MEMIF_IF_FLAG_ADMIN_UP;
+
+  vlib_process_signal_event (vnm->vlib_main, memif_process_node.index,
+                            MEMIF_PROCESS_EVENT_ADMIN_UP_DOWN, 0);
+  return error;
+}
+
 static clib_error_t *
 memif_init (vlib_main_t * vm)
 {
index 187888d..daa96d0 100644 (file)
@@ -259,6 +259,7 @@ typedef enum
 {
   MEMIF_PROCESS_EVENT_START = 1,
   MEMIF_PROCESS_EVENT_STOP = 2,
+  MEMIF_PROCESS_EVENT_ADMIN_UP_DOWN = 3,
 } memif_process_event_t;
 
 typedef struct
@@ -285,6 +286,8 @@ int memif_socket_filename_add_del (u8 is_add, u32 sock_id,
 int memif_create_if (vlib_main_t * vm, memif_create_if_args_t * args);
 int memif_delete_if (vlib_main_t * vm, memif_if_t * mif);
 clib_error_t *memif_plugin_api_hookup (vlib_main_t * vm);
+clib_error_t *memif_interface_admin_up_down (vnet_main_t *vnm, u32 hw_if_index,
+                                            u32 flags);
 
 static_always_inline void *
 memif_get_buffer (memif_if_t * mif, memif_ring_t * ring, u16 slot)