memif: memif linkstate can't become up 20/34320/7
authorDaniel Béreš <daniel.beres@pantheon.tech>
Wed, 3 Nov 2021 08:55:04 +0000 (08:55 +0000)
committerDamjan Marion <dmarion@me.com>
Tue, 9 Nov 2021 09:54:34 +0000 (09:54 +0000)
Admin down implies Link down but nothing came with admin up.

Ticket: VPP-1959
Type: fix
Change-Id: I43725329ae7918659c73d703280c25de5f0b1d14
Signed-off-by: Daniel Béreš <daniel.beres@pantheon.tech>
src/plugins/memif/memif.c
test/test_memif.py

index 886721a..4d662fa 100644 (file)
@@ -1086,7 +1086,14 @@ memif_interface_admin_up_down (vnet_main_t *vnm, u32 hw_if_index, u32 flags)
   static clib_error_t *error = 0;
 
   if (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
-    mif->flags |= MEMIF_IF_FLAG_ADMIN_UP;
+    {
+      if (mif->flags & MEMIF_IF_FLAG_CONNECTED)
+       {
+         vnet_hw_interface_set_flags (vnm, mif->hw_if_index,
+                                      VNET_HW_INTERFACE_FLAG_LINK_UP);
+       }
+      mif->flags |= MEMIF_IF_FLAG_ADMIN_UP;
+    }
   else
     mif->flags &= ~MEMIF_IF_FLAG_ADMIN_UP;
 
index fc7cf9b..bf1c10a 100644 (file)
@@ -303,6 +303,46 @@ class TestMemif(VppTestCase):
 
         route.remove_vpp_config()
 
+    def test_memif_admin_up_down_up(self):
+        """ Memif admin up/down/up """
+        memif = VppMemif(
+            self,
+            VppEnum.vl_api_memif_role_t.MEMIF_ROLE_API_SLAVE,
+            VppEnum.vl_api_memif_mode_t.MEMIF_MODE_API_ETHERNET,
+            ring_size=1024,
+            buffer_size=2048,
+            secret="abc")
+
+        remote_socket = VppSocketFilename(self.remote_test, 1,
+                                          "%s/memif.sock" % self.tempdir)
+        remote_socket.add_vpp_config()
+
+        remote_memif = VppMemif(
+            self.remote_test,
+            VppEnum.vl_api_memif_role_t.MEMIF_ROLE_API_MASTER,
+            VppEnum.vl_api_memif_mode_t.MEMIF_MODE_API_ETHERNET,
+            socket_id=1,
+            ring_size=1024,
+            buffer_size=2048,
+            secret="abc")
+
+        memif.add_vpp_config()
+        remote_memif.add_vpp_config()
+
+        memif.admin_up()
+        remote_memif.admin_up()
+        memif.admin_down()
+        remote_memif.admin_down()
+        memif.admin_up()
+        remote_memif.admin_up()
+
+        self._connect_test_one_interface(memif)
+        self._connect_test_one_interface(remote_memif)
+
+        memif.remove_vpp_config()
+        remote_memif.remove_vpp_config()
+        remote_socket.remove_vpp_config()
+
 
 if __name__ == '__main__':
     unittest.main(testRunner=VppTestRunner)