summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFilip Tehlar <ftehlar@cisco.com>2017-04-26 16:09:06 +0200
committerFlorin Coras <florin.coras@gmail.com>2017-05-03 15:19:23 +0000
commit816f437d943688f67d61fb6b9708eff59432b2ee (patch)
tree565bddb5ad81b00eae739c4438ecb67042dd4218
parentafc47aa36f44d3f865c6e1e48f41eded366a85ac (diff)
Fix vnet unit tests
Change-Id: Ibe55e4399c6b78d83268d7c49ed498cab7bfdb43 Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
-rw-r--r--build-data/packages/vpp.mk4
-rw-r--r--src/tests/vnet/lisp-cp/test_cp_serdes.c51
-rw-r--r--src/tests/vnet/lisp-cp/test_lisp_types.c45
-rw-r--r--src/tests/vnet/lisp-gpe/test.c18
-rw-r--r--src/vlib/buffer.h12
-rw-r--r--src/vnet.am13
-rw-r--r--src/vnet/lisp-cp/control.c14
-rw-r--r--src/vnet/lisp-cp/control.h9
-rw-r--r--src/vnet/lisp-cp/lisp_msg_serdes.c8
-rw-r--r--src/vnet/lisp-cp/lisp_types.c31
-rw-r--r--src/vpp.am1
-rw-r--r--src/vpp/api/test_client.c11
-rw-r--r--src/vppinfra/test_tw_timer.c8
13 files changed, 142 insertions, 83 deletions
diff --git a/build-data/packages/vpp.mk b/build-data/packages/vpp.mk
index 64eb0d89..1acc59b2 100644
--- a/build-data/packages/vpp.mk
+++ b/build-data/packages/vpp.mk
@@ -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
diff --git a/src/tests/vnet/lisp-cp/test_cp_serdes.c b/src/tests/vnet/lisp-cp/test_cp_serdes.c
index 0766bee1..8e8c8455 100644
--- a/src/tests/vnet/lisp-cp/test_cp_serdes.c
+++ b/src/tests/vnet/lisp-cp/test_cp_serdes.c
@@ -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)
diff --git a/src/tests/vnet/lisp-cp/test_lisp_types.c b/src/tests/vnet/lisp-cp/test_lisp_types.c
index fa34a3c6..21575015 100644
--- a/src/tests/vnet/lisp-cp/test_lisp_types.c
+++ b/src/tests/vnet/lisp-cp/test_lisp_types.c
@@ -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)
{
@@ -418,6 +413,32 @@ done:
}
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;
@@ -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
index dde633ae..00000000
--- a/src/tests/vnet/lisp-gpe/test.c
+++ /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;
-}
diff --git a/src/vlib/buffer.h b/src/vlib/buffer.h
index 69c8c7cc..18e2437d 100644
--- a/src/vlib/buffer.h
+++ b/src/vlib/buffer.h
@@ -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.
diff --git a/src/vnet.am b/src/vnet.am
index 25b84616..9f3aedba 100644
--- a/src/vnet.am
+++ b/src/vnet.am
@@ -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
########################################
diff --git a/src/vnet/lisp-cp/control.c b/src/vnet/lisp-cp/control.c
index 6408b297..c0093301 100644
--- a/src/vnet/lisp-cp/control.c
+++ b/src/vnet/lisp-cp/control.c
@@ -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++)
diff --git a/src/vnet/lisp-cp/control.h b/src/vnet/lisp-cp/control.h
index eae8a184..cb98eb09 100644
--- a/src/vnet/lisp-cp/control.h
+++ b/src/vnet/lisp-cp/control.h
@@ -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)
{
diff --git a/src/vnet/lisp-cp/lisp_msg_serdes.c b/src/vnet/lisp-cp/lisp_msg_serdes.c
index eee1885c..6c0a7219 100644
--- a/src/vnet/lisp-cp/lisp_msg_serdes.c
+++ b/src/vnet/lisp-cp/lisp_msg_serdes.c
@@ -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);
diff --git a/src/vnet/lisp-cp/lisp_types.c b/src/vnet/lisp-cp/lisp_types.c
index ad3a4bdf..31a80081 100644
--- a/src/vnet/lisp-cp/lisp_types.c
+++ b/src/vnet/lisp-cp/lisp_types.c
@@ -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
diff --git a/src/vpp.am b/src/vpp.am
index 8cdc60d9..d8b3e4ec 100644
--- a/src/vpp.am
+++ b/src/vpp.am
@@ -100,7 +100,6 @@ bin_test_ha_SOURCES = \
bin_test_ha_LDADD = \
libvlibmemoryclient.la \
- libvlibapi.la \
libsvm.la \
libvppinfra.la \
-lpthread -lm -lrt
diff --git a/src/vpp/api/test_client.c b/src/vpp/api/test_client.c
index 551bdab9..231b3c18 100644
--- a/src/vpp/api/test_client.c
+++ b/src/vpp/api/test_client.c
@@ -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;
diff --git a/src/vppinfra/test_tw_timer.c b/src/vppinfra/test_tw_timer.c
index a0287b89..26499509 100644
--- a/src/vppinfra/test_tw_timer.c
+++ b/src/vppinfra/test_tw_timer.c
@@ -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