c11 safe string handling support
[vpp.git] / src / tests / vnet / lisp-cp / test_lisp_types.c
index 5d910f6..ff25a3f 100644 (file)
 #include <vnet/lisp-cp/lisp_types.h>
 #include <vnet/lisp-cp/lisp_cp_messages.h>
 
-/* FIXME */
-#include <vlibapi/api_helper_macros.h>
-vpe_api_main_t vpe_api_main;
-
 #define _assert(e)                    \
   error = CLIB_ERROR_ASSERT (e);      \
   if (error)                          \
@@ -94,7 +90,7 @@ static clib_error_t * test_gid_parse_ip_pref ()
 {
   clib_error_t * error = 0;
   gid_address_t _gid_addr, * gid_addr = &_gid_addr;
-  gid_address_t _gid_addr_copy, * gid_addr_copy = &_gid_addr_copy;
+  gid_address_t _gid_addr_copy, * copy = &_gid_addr_copy;
   u8 data[] =
     {
       0x00, 0x01,             /* AFI = IPv4 */
@@ -103,8 +99,8 @@ static clib_error_t * test_gid_parse_ip_pref ()
 
   u32 len = gid_address_parse (data, gid_addr);
   _assert (6 == len);
-  gid_address_copy (gid_addr_copy, gid_addr);
-  _assert (0 == gid_address_cmp (gid_addr_copy, gid_addr));
+  gid_address_copy (copy, gid_addr);
+  _assert (0 == gid_address_cmp (copy, gid_addr));
 done:
   return error;
 }
@@ -131,14 +127,82 @@ done:
   return error;
 }
 
+static clib_error_t *
+test_gid_write_nsh (void)
+{
+  clib_error_t * error = 0;
+
+  u8 * b = clib_mem_alloc(500);
+  clib_memset(b, 0, 500);
+
+  gid_address_t g =
+    {
+      .vni = 0,
+      .nsh.spi = 0x112233,
+      .nsh.si = 0x42,
+      .type = GID_ADDR_NSH,
+    };
+
+  u16 len = gid_address_put (b, &g);
+
+  u8 expected[] =
+    {
+      0x40, 0x03, 0x00, 0x00, /* AFI = LCAF*/
+      0x11, 0x00, 0x00, 0x04, /* type = SPI LCAF, length = 4 */
+
+      /* Service Path ID, Service index */
+      0x11, 0x22, 0x33, 0x42, /* SPI, SI */
+    };
+
+  _assert (sizeof (expected) == len);
+  _assert (0 == memcmp (expected, b, len));
+done:
+  clib_mem_free (b);
+  return error;
+}
+
+static clib_error_t *
+test_gid_parse_nsh ()
+{
+  clib_error_t * error = 0;
+  gid_address_t _gid_addr, * gid_addr = &_gid_addr;
+  gid_address_t _gid_addr_copy, * copy = &_gid_addr_copy;
+
+  clib_memset (gid_addr, 0, sizeof (gid_addr[0]));
+  clib_memset (copy, 0, sizeof (copy[0]));
+
+  u8 data[] =
+    {
+      0x40, 0x03, 0x00, 0x00, /* AFI = LCAF*/
+      0x11, 0x00, 0x00, 0x04, /* type = SPI LCAF, length = 4 */
+
+      /* Service Path ID, Service index */
+      0x55, 0x99, 0x42, 0x09, /* SPI, SI */
+    };
+
+  u32 len = gid_address_parse (data, gid_addr);
+  _assert (sizeof (data) == len);
+  gid_address_copy (copy, gid_addr);
+  _assert (0 == gid_address_cmp (gid_addr, copy));
+  _assert (GID_ADDR_NSH == gid_address_type (copy));
+  _assert (0 == gid_address_vni (copy));
+  _assert (gid_address_nsh_spi (copy) == 0x559942);
+  _assert (gid_address_nsh_si (copy) == 0x09);
+
+done:
+  gid_address_free (copy);
+  gid_address_free (gid_addr);
+  return error;
+}
+
 static clib_error_t * test_gid_parse_lcaf ()
 {
   clib_error_t * error = 0;
   gid_address_t _gid_addr, * gid_addr = &_gid_addr;
   gid_address_t _gid_addr_copy, * gid_addr_copy = &_gid_addr_copy;
 
-  memset (gid_addr, 0, sizeof (gid_addr[0]));
-  memset (gid_addr_copy, 0, sizeof (gid_addr_copy[0]));
+  clib_memset (gid_addr, 0, sizeof (gid_addr[0]));
+  clib_memset (gid_addr_copy, 0, sizeof (gid_addr_copy[0]));
 
   u8 data[] =
     {
@@ -177,8 +241,8 @@ static clib_error_t * test_gid_parse_lcaf_complex ()
   gid_address_t _gid_addr, * gid_addr = &_gid_addr;
   gid_address_t _gid_addr_copy, * gid_addr_copy = &_gid_addr_copy;
 
-  memset (gid_addr, 0, sizeof (gid_addr[0]));
-  memset (gid_addr_copy, 0, sizeof (gid_addr_copy[0]));
+  clib_memset (gid_addr, 0, sizeof (gid_addr[0]));
+  clib_memset (gid_addr_copy, 0, sizeof (gid_addr_copy[0]));
 
   u8 data[] =
     {
@@ -266,24 +330,22 @@ done:
 }
 #endif
 
-#if 0 /* uncomment this once VNI is supported */
 static clib_error_t * test_write_mac_in_lcaf (void)
 {
   clib_error_t * error = 0;
 
   u8 * b = clib_mem_alloc(500);
-  memset(b, 0, 500);
+  clib_memset(b, 0, 500);
 
   gid_address_t g =
     {
       .mac = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6},
-      .vni = 0x30,
+      .vni = 0x01020304,
       .vni_mask = 0x10,
       .type = GID_ADDR_MAC,
     };
 
   u16 len = gid_address_put (b, &g);
-  _assert (8 == len);
 
   u8 expected[] =
     {
@@ -291,27 +353,27 @@ static clib_error_t * test_write_mac_in_lcaf (void)
       0x00,                   /* reserved1 */
       0x00,                   /* flags */
       0x02,                   /* LCAF type = Instance ID */
-      0x20,                   /* IID/VNI mask len */
-      0x00, 0x0a,             /* length */
+      0x10,                   /* IID/IID mask len */
+      0x00, 0x0c,             /* length */
       0x01, 0x02, 0x03, 0x04, /* Instance ID / VNI */
 
-      0x00, 0x06,             /* AFI = MAC */
+      0x40, 0x05,             /* AFI = MAC */
       0x01, 0x02, 0x03, 0x04,
       0x05, 0x06              /* MAC */
-    }
+    };
+  _assert (sizeof (expected) == len);
   _assert (0 == memcmp (expected, b, len));
 done:
   clib_mem_free (b);
   return error;
 }
-#endif
 
 static clib_error_t * test_mac_address_write (void)
 {
   clib_error_t * error = 0;
 
   u8 * b = clib_mem_alloc(500);
-  memset(b, 0, 500);
+  clib_memset(b, 0, 500);
 
   gid_address_t g =
     {
@@ -339,7 +401,7 @@ test_src_dst_with_vni_serdes (void)
 {
   clib_error_t * error = 0;
   u8 * b = clib_mem_alloc (500);
-  memset (b, 0, 500);
+  clib_memset (b, 0, 500);
 
   fid_address_t src =
     {
@@ -410,7 +472,7 @@ test_src_dst_with_vni_serdes (void)
   _assert (0 == memcmp (expected_data, b, sizeof (expected_data)));
 
   gid_address_t p;
-  memset (&p, 0, sizeof (p));
+  clib_memset (&p, 0, sizeof (p));
   _assert (write_len == gid_address_parse (b, &p));
   _assert (0 == gid_address_cmp (&g, &p));
 done:
@@ -418,13 +480,39 @@ done:
   return error;
 }
 
+static clib_error_t *
+test_src_dst_deser_bad_afi (void)
+{
+  clib_error_t * error = 0;
+
+  u8 expected_data[] =
+    {
+      0x40, 0x03, 0x00, 0x00,  /* AFI = LCAF, reserved1, flags */
+      0x0c, 0x00, 0x00, 0x14,  /* LCAF type = source/dest key, rsvd, length */
+      0x00, 0x00, 0x00, 0x00,  /* reserved; source-ML, Dest-ML */
+
+      0xde, 0xad,              /* AFI = bad value */
+      0x11, 0x22, 0x33, 0x44,
+      0x55, 0x66,              /* source */
+
+      0x40, 0x05,              /* AFI = MAC */
+      0x10, 0x21, 0x32, 0x43,
+      0x54, 0x65,              /* destination */
+    };
+
+  gid_address_t p;
+  _assert (~0 == gid_address_parse (expected_data, &p));
+done:
+  return error;
+}
+
 static clib_error_t *
 test_src_dst_serdes (void)
 {
   clib_error_t * error = 0;
 
   u8 * b = clib_mem_alloc (500);
-  memset (b, 0, 500);
+  clib_memset (b, 0, 500);
 
   fid_address_t src =
     {
@@ -476,7 +564,7 @@ test_src_dst_serdes (void)
   _assert (0 == memcmp (expected_data, b, sizeof (expected_data)));
 
   gid_address_t p;
-  memset (&p, 0, sizeof (p));
+  clib_memset (&p, 0, sizeof (p));
   _assert (write_len == gid_address_parse (b, &p));
   _assert (0 == gid_address_cmp (&g, &p));
 done:
@@ -490,7 +578,7 @@ static clib_error_t * test_gid_address_write (void)
   ip_prefix_t ippref_data, * ippref = &ippref_data;
 
   u8 * b = clib_mem_alloc(500);
-  memset(b, 0, 500);
+  clib_memset(b, 0, 500);
 
   ip_prefix_version (ippref) = IP4;
   ip_prefix_len (ippref) = 9;
@@ -535,9 +623,13 @@ done:
   _(gid_parse_ip_pref)                    \
   _(gid_parse_mac)                        \
   _(gid_parse_lcaf)                       \
+  _(gid_parse_nsh)                        \
+  _(gid_write_nsh)                        \
   _(mac_address_write)                    \
   _(gid_address_write)                    \
   _(src_dst_serdes)                       \
+  _(write_mac_in_lcaf)                    \
+  _(src_dst_deser_bad_afi)                \
   _(src_dst_with_vni_serdes)
 
 int run_tests (void)