vpp-swan: fix function to get sw_if_index 04/39204/3
authorGabriel Oginski <gabrielx.oginski@intel.com>
Thu, 6 Jul 2023 09:18:45 +0000 (09:18 +0000)
committerFan Zhang <fanzhang.oss@gmail.com>
Wed, 19 Jul 2023 02:31:21 +0000 (02:31 +0000)
In the current implementation there is a bug in the function
responsible for getting software interface index by the name of the
interface. Incorrect function is used to send the API message, also
the handler with replied message is incorrect.

The fix changes function to send dump message and also adds handler
with replied message in the correct way.

Type: fix
Signed-off-by: Gabriel Oginski <gabrielx.oginski@intel.com>
Change-Id: Id1a3ba2ce7e92d216907f344431b9e2acb1d5572

extras/strongswan/vpp_sswan/kernel_vpp_ipsec.c

index 38d3951..a48bd57 100644 (file)
@@ -669,10 +669,14 @@ get_sw_if_index (char *interface)
 {
   char *out = NULL;
   int out_len, name_filter_len = 0, msg_len = 0;
-  vl_api_sw_interface_dump_t *mp;
-  vl_api_sw_interface_details_t *rmp;
+  int num, i;
+  vl_api_sw_interface_dump_t *mp = NULL;
+  vl_api_sw_interface_details_t *rmp = NULL;
   uint32_t sw_if_index = ~0;
 
+  if (interface == NULL)
+    goto error;
+
   name_filter_len = strlen (interface);
   msg_len = sizeof (*mp) + name_filter_len;
   mp = vl_msg_api_alloc (msg_len);
@@ -683,7 +687,7 @@ get_sw_if_index (char *interface)
   mp->name_filter.length = htonl (name_filter_len);
   memcpy ((char *) mp->name_filter.buf, interface, name_filter_len);
 
-  if (vac->send (vac, (char *) mp, msg_len, &out, &out_len))
+  if (vac->send_dump (vac, (char *) mp, msg_len, &out, &out_len))
     {
       goto error;
     }
@@ -691,14 +695,27 @@ get_sw_if_index (char *interface)
     {
       goto error;
     }
+  num = out_len / sizeof (*rmp);
   rmp = (vl_api_sw_interface_details_t *) out;
-  sw_if_index = ntohl (rmp->sw_if_index);
+  for (i = 0; i < num; i++)
+    {
+      if (strlen (rmp->interface_name) &&
+         streq (interface, rmp->interface_name))
+       {
+         sw_if_index = ntohl (rmp->sw_if_index);
+         break;
+       }
+      rmp += 1;
+    }
 
 error:
-  free (out);
-  vl_msg_api_free (mp);
+  if (out)
+    free (out);
+  if (mp)
+    vl_msg_api_free (mp);
   return sw_if_index;
 }
+
 /**
  * (Un)-install a security policy database
  */