Fix vnet unit tests 53/6553/3
authorFilip Tehlar <ftehlar@cisco.com>
Wed, 26 Apr 2017 14:09:06 +0000 (16:09 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Wed, 3 May 2017 15:19:23 +0000 (15:19 +0000)
Change-Id: Ibe55e4399c6b78d83268d7c49ed498cab7bfdb43
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
13 files changed:
build-data/packages/vpp.mk
src/tests/vnet/lisp-cp/test_cp_serdes.c
src/tests/vnet/lisp-cp/test_lisp_types.c
src/tests/vnet/lisp-gpe/test.c [deleted file]
src/vlib/buffer.h
src/vnet.am
src/vnet/lisp-cp/control.c
src/vnet/lisp-cp/control.h
src/vnet/lisp-cp/lisp_msg_serdes.c
src/vnet/lisp-cp/lisp_types.c
src/vpp.am
src/vpp/api/test_client.c
src/vppinfra/test_tw_timer.c

index 64eb0d8..1acc59b 100644 (file)
@@ -30,3 +30,7 @@ ifeq ($($(PLATFORM)_uses_dpdk_mlx5_pmd),yes)
 vpp_configure_args += --with-dpdk-mlx5-pmd
 endif
 endif
+
+ifeq ($($(PLATFORM)_enable_tests),yes)
+vpp_configure_args += --enable-tests
+endif
index 0766bee..8e8c845 100644 (file)
@@ -21,9 +21,6 @@
 #include <vlibapi/api.h>
 #include <vnet/lisp-cp/packets.h>
 
-/* FIXME */
-#include <vlibapi/api_helper_macros.h>
-
 #define _assert(e)                    \
   error = CLIB_ERROR_ASSERT (e);      \
   if (error)                          \
@@ -489,6 +486,53 @@ done:
   return error;
 }
 
+static vlib_buffer_t *
+create_buffer (u8 * data, u32 data_len)
+{
+  vlib_buffer_t *b;
+
+  u8 *buf_data = clib_mem_alloc(500);
+  memset (buf_data, 0, 500);
+  b = (vlib_buffer_t *)buf_data;
+
+  u8 * p = vlib_buffer_put_uninit (b, data_len);
+  clib_memcpy (p, data, data_len);
+
+  return b;
+}
+
+static clib_error_t *
+test_lisp_parse_map_reply ()
+{
+  clib_error_t * error = 0;
+  u8 map_reply_data[] =
+    {
+      0x00, 0x00, 0x00, 0x01, /* type; rsvd; mapping count */
+      0x00, 0x00, 0x00, 0x00,
+    };
+  vlib_buffer_t *b = create_buffer (map_reply_data, sizeof (map_reply_data));
+  map_records_arg_t *mrecs = parse_map_reply (b);
+  _assert (0 == mrecs);
+  clib_mem_free (b);
+
+  u8 map_reply_data2[] =
+    {
+      0x00, 0x00, 0x00, 0x01, /* type; rsvd */
+      0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, /* nonce */
+
+      /* 1. record  - incomplete */
+      0x01, 0x02, 0x03, 0x04, /* record TTL */
+      0x01,                   /* locator count */
+    };
+  b = create_buffer (map_reply_data2, sizeof (map_reply_data2));
+  mrecs = parse_map_reply (b);
+  _assert (0 == mrecs);
+done:
+  clib_mem_free (b);
+  return error;
+}
+
 static clib_error_t *
 test_lisp_parse_lcaf ()
 {
@@ -610,6 +654,7 @@ done:
   _(lisp_msg_push_ecm)                    \
   _(lisp_msg_parse)                       \
   _(lisp_msg_parse_mapping_record)        \
+  _(lisp_parse_map_reply)                 \
   _(lisp_parse_lcaf)                      \
   _(lisp_map_register)
 
index fa34a3c..2157501 100644 (file)
@@ -18,9 +18,6 @@
 #include <vnet/lisp-cp/lisp_types.h>
 #include <vnet/lisp-cp/lisp_cp_messages.h>
 
-/* FIXME */
-#include <vlibapi/api_helper_macros.h>
-
 #define _assert(e)                    \
   error = CLIB_ERROR_ASSERT (e);      \
   if (error)                          \
@@ -265,7 +262,6 @@ 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;
@@ -276,13 +272,12 @@ static clib_error_t * test_write_mac_in_lcaf (void)
   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[] =
     {
@@ -290,20 +285,20 @@ 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)
 {
@@ -417,6 +412,32 @@ 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)
 {
@@ -537,6 +558,8 @@ done:
   _(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)
diff --git a/src/tests/vnet/lisp-gpe/test.c b/src/tests/vnet/lisp-gpe/test.c
deleted file mode 100644 (file)
index dde633a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-int main(int argc, char **argv) {
-    return 0;
-}
index 69c8c7c..18e2437 100644 (file)
@@ -205,6 +205,18 @@ vlib_buffer_advance (vlib_buffer_t * b, word l)
   b->current_length -= l;
 }
 
+/** \brief Check if there is enough space in buffer to advance
+
+    @param b - (vlib_buffer_t *) pointer to the buffer
+    @param l - (word) size to check
+    @return - 0 if there is less space than 'l' in buffer
+*/
+always_inline u8
+vlib_buffer_has_space (vlib_buffer_t * b, word l)
+{
+  return b->current_length >= l;
+}
+
 /** \brief Reset current header & length to state they were in when
     packet was received.
 
index 25b8461..9f3aedb 100644 (file)
@@ -662,19 +662,6 @@ nobase_include_HEADERS +=                  \
 
 API_FILES += vnet/lisp-gpe/lisp_gpe.api
 
-if ENABLE_TESTS
-TESTS += test_test
-
-test_test_SOURCES = tests/vnet/lisp-gpe/test.c
-
-test_test_CPPFLAGS = $(AM_CPPFLAGS) -DCLIB_DEBUG
-
-test_test_LDADD = $(LIBOBJS)
-
-noinst_PROGRAMS += $(TESTS)
-check_PROGRAMS += $(TESTS)
-endif
-
 ########################################
 # DHCP client
 ########################################
index 6408b29..c009330 100644 (file)
@@ -44,13 +44,6 @@ typedef struct
   u8 smr_invoked;
 } map_request_args_t;
 
-typedef struct
-{
-  u64 nonce;
-  u8 is_rloc_probe;
-  mapping_t *mappings;
-} map_records_arg_t;
-
 u8
 vnet_lisp_get_map_request_mode (void)
 {
@@ -3485,7 +3478,7 @@ done:
   vec_free (itr_rlocs);
 }
 
-static map_records_arg_t *
+map_records_arg_t *
 parse_map_reply (vlib_buffer_t * b)
 {
   locator_t probed;
@@ -3501,6 +3494,11 @@ parse_map_reply (vlib_buffer_t * b)
   mrep_hdr = vlib_buffer_get_current (b);
   a->nonce = MREP_NONCE (mrep_hdr);
   a->is_rloc_probe = MREP_RLOC_PROBE (mrep_hdr);
+  if (!vlib_buffer_has_space (b, sizeof (*mrep_hdr)))
+    {
+      clib_mem_free (a);
+      return 0;
+    }
   vlib_buffer_pull (b, sizeof (*mrep_hdr));
 
   for (i = 0; i < MREP_REC_COUNT (mrep_hdr); i++)
index eae8a18..cb98eb0 100644 (file)
@@ -273,6 +273,13 @@ typedef struct
   u8 key_id;
 } vnet_lisp_add_del_mapping_args_t;
 
+typedef struct
+{
+  u64 nonce;
+  u8 is_rloc_probe;
+  mapping_t *mappings;
+} map_records_arg_t;
+
 int
 vnet_lisp_map_cache_add_del (vnet_lisp_add_del_mapping_args_t * a,
                             u32 * map_index);
@@ -332,6 +339,8 @@ int vnet_lisp_map_register_enable_disable (u8 is_enable);
 u8 vnet_lisp_map_register_state_get (void);
 u8 vnet_lisp_rloc_probe_state_get (void);
 
+map_records_arg_t *parse_map_reply (vlib_buffer_t * b);
+
 always_inline mapping_t *
 lisp_get_petr_mapping (lisp_cp_main_t * lcm)
 {
index eee1885..6c0a721 100644 (file)
@@ -312,6 +312,8 @@ lisp_msg_parse_loc (vlib_buffer_t * b, locator_t * loc)
   if (len == ~0)
     return ~0;
 
+  if (!vlib_buffer_has_space (b, sizeof (len)))
+    return ~0;
   vlib_buffer_pull (b, len);
 
   return len;
@@ -326,6 +328,9 @@ lisp_msg_parse_mapping_record (vlib_buffer_t * b, gid_address_t * eid,
   int i = 0, len = 0, llen = 0;
 
   h = vlib_buffer_get_current (b);
+  if (!vlib_buffer_has_space (b, sizeof (mapping_record_hdr_t)))
+    return ~0;
+
   vlib_buffer_pull (b, sizeof (mapping_record_hdr_t));
 
   memset (eid, 0, sizeof (*eid));
@@ -333,6 +338,9 @@ lisp_msg_parse_mapping_record (vlib_buffer_t * b, gid_address_t * eid,
   if (len == ~0)
     return len;
 
+  if (!vlib_buffer_has_space (b, sizeof (len)))
+    return ~0;
+
   vlib_buffer_pull (b, len);
   if (GID_ADDR_IP_PREFIX == gid_address_type (eid))
     gid_address_ippref_len (eid) = MAP_REC_EID_PLEN (h);
index ad3a4bd..31a8008 100644 (file)
@@ -657,12 +657,19 @@ fid_addr_parse (u8 * p, fid_address_t * a)
       return ip_address_parse (p, afi, ip_addr);
 
     case FID_ADDR_NSH:
-      ASSERT (0);
       break;
     }
   return ~0;
 }
 
+#define INC(dst, exp)   \
+do {                    \
+  u16 _sum = (exp);     \
+  if ((u16)~0 == _sum)  \
+    return ~0;          \
+  dst += _sum;          \
+} while (0);
+
 u16
 sd_parse (u8 * p, void *a)
 {
@@ -677,8 +684,8 @@ sd_parse (u8 * p, void *a)
   sd_hdr = (lcaf_src_dst_hdr_t *) (p + size);
   size += sizeof (sd_hdr[0]);
 
-  size += fid_addr_parse (p + size, src);
-  size += fid_addr_parse (p + size, dst);
+  INC (size, fid_addr_parse (p + size, src));
+  INC (size, fid_addr_parse (p + size, dst));
 
   if (fid_addr_type (src) == FID_ADDR_IP_PREF)
     {
@@ -704,7 +711,7 @@ try_parse_src_dst_lcaf (u8 * p, gid_address_t * a)
   if (LCAF_SOURCE_DEST != lcaf_type (&lcaf))
     return ~0;
 
-  size += sd_parse (p + size, a);
+  INC (size, sd_parse (p + size, a));
   return size;
 }
 
@@ -724,13 +731,10 @@ vni_parse (u8 * p, void *a)
   u16 afi = clib_net_to_host_u16 (*((u16 *) (p + size)));
   if (LISP_AFI_LCAF == afi)
     {
-      u16 len = try_parse_src_dst_lcaf (p + size, g);
-      if ((u16) ~ 0 == len)
-       return ~0;
-      size += len;
+      INC (size, try_parse_src_dst_lcaf (p + size, g));
     }
   else
-    size += gid_address_parse (p + size, g);
+    INC (size, gid_address_parse (p + size, g));
 
   return size;
 }
@@ -757,7 +761,7 @@ lcaf_parse (void *offset, gid_address_t * addr)
       clib_warning ("Unsupported LCAF type: %u", type);
       return ~0;
     }
-  size += (*lcaf_parse_fcts[type]) (offset + size, lcaf);
+  INC (size, (*lcaf_parse_fcts[type]) (offset + size, lcaf));
   return sizeof (u16) + size;
 }
 
@@ -1419,10 +1423,9 @@ u32
 gid_address_parse (u8 * offset, gid_address_t * a)
 {
   lisp_afi_e afi;
-  int len = 0;
+  u16 len = 0;
 
-  if (!a)
-    return 0;
+  ASSERT (a);
 
   /* NOTE: since gid_address_parse may be called by vni_parse, we can't 0
    * the gid address here */
@@ -1458,7 +1461,7 @@ gid_address_parse (u8 * offset, gid_address_t * a)
       clib_warning ("LISP AFI %d not supported!", afi);
       return ~0;
     }
-  return len;
+  return (len == (u16) ~ 0) ? ~0 : len;
 }
 
 void
index 8cdc60d..d8b3e4e 100644 (file)
@@ -100,7 +100,6 @@ bin_test_ha_SOURCES = \
 
 bin_test_ha_LDADD = \
   libvlibmemoryclient.la \
-  libvlibapi.la \
   libsvm.la \
   libvppinfra.la \
   -lpthread -lm -lrt
index 551bdab..231b3c1 100644 (file)
@@ -541,13 +541,6 @@ static void vl_api_create_loopback_instance_reply_t_handler
           ntohl (mp->retval), ntohl (mp->sw_if_index));
 }
 
-static void
-vl_api_sr_tunnel_add_del_reply_t_handler (vl_api_sr_tunnel_add_del_reply_t *
-                                         mp)
-{
-  fformat (stdout, "sr tunnel add/del reply %d\n", ntohl (mp->retval));
-}
-
 static void vl_api_l2_patch_add_del_reply_t_handler
   (vl_api_l2_patch_add_del_reply_t * mp)
 {
@@ -949,7 +942,6 @@ add_ip4_neighbor (test_main_t * tm, int add_del)
   mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
   mp->client_index = tm->my_client_index;
   mp->context = 0xdeadbeef;
-  mp->vrf_id = ntohl (11);
   mp->sw_if_index = ntohl (6);
   mp->is_add = add_del;
 
@@ -972,7 +964,6 @@ add_ip6_neighbor (test_main_t * tm, int add_del)
   mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
   mp->client_index = tm->my_client_index;
   mp->context = 0xdeadbeef;
-  mp->vrf_id = ntohl (11);
   mp->sw_if_index = ntohl (6);
   mp->is_add = add_del;
   mp->is_ipv6 = 1;
@@ -1055,9 +1046,7 @@ dhcp_set_proxy (test_main_t * tm, int ipv6)
   mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_CONFIG);
   mp->client_index = tm->my_client_index;
   mp->context = 0xdeadbeef;
-  mp->vrf_id = ntohl (0);
   mp->is_ipv6 = ipv6;
-  mp->insert_circuit_id = 1;
   mp->is_add = 1;
   mp->dhcp_server[0] = 0x20;
   mp->dhcp_server[1] = 0x01;
index a0287b8..2649950 100644 (file)
@@ -138,7 +138,7 @@ test2_single (tw_timer_test_main_t * tm)
 
   tw_timer_wheel_init_2t_1w_2048sl (&tm->single_wheel,
                                    expired_timer_single_callback,
-                                   1.0 /* timer interval */ );
+                                   1.0 /* timer interval */ , ~0);
 
   /* Prime offset */
   initial_wheel_offset = 757;
@@ -266,7 +266,7 @@ test2_double (tw_timer_test_main_t * tm)
 
   tw_timer_wheel_init_16t_2w_512sl (&tm->double_wheel,
                                    expired_timer_double_callback,
-                                   1.0 /* timer interval */ );
+                                   1.0 /* timer interval */ , ~0);
 
   /* Prime offset */
   initial_wheel_offset = 757;
@@ -387,7 +387,7 @@ test1_single (tw_timer_test_main_t * tm)
 
   tw_timer_wheel_init_2t_1w_2048sl (&tm->single_wheel,
                                    expired_timer_single_callback,
-                                   1.0 /* timer interval */ );
+                                   1.0 /* timer interval */ , ~0);
 
   /*
    * Prime offset, to make sure that the wheel starts in a
@@ -454,7 +454,7 @@ test1_double (tw_timer_test_main_t * tm)
 
   tw_timer_wheel_init_16t_2w_512sl (&tm->double_wheel,
                                    expired_timer_double_callback,
-                                   1.0 /* timer interval */ );
+                                   1.0 /* timer interval */ , ~0);
 
   /*
    * Prime offset, to make sure that the wheel starts in a