aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp-api/vapi/vapi_c_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vpp-api/vapi/vapi_c_test.c')
-rw-r--r--src/vpp-api/vapi/vapi_c_test.c168
1 files changed, 139 insertions, 29 deletions
diff --git a/src/vpp-api/vapi/vapi_c_test.c b/src/vpp-api/vapi/vapi_c_test.c
index efa6a735611..7a0e462e40a 100644
--- a/src/vpp-api/vapi/vapi_c_test.c
+++ b/src/vpp-api/vapi/vapi_c_test.c
@@ -24,8 +24,11 @@
#include <check.h>
#include <vppinfra/string.h>
#include <vapi/vapi.h>
+#include <vapi/memclnt.api.vapi.h>
+#include <vapi/vlib.api.vapi.h>
#include <vapi/vpe.api.vapi.h>
#include <vapi/interface.api.vapi.h>
+#include <vapi/mss_clamp.api.vapi.h>
#include <vapi/l2.api.vapi.h>
#include <fake.api.vapi.h>
@@ -34,11 +37,13 @@
DEFINE_VAPI_MSG_IDS_VPE_API_JSON;
DEFINE_VAPI_MSG_IDS_INTERFACE_API_JSON;
+DEFINE_VAPI_MSG_IDS_MSS_CLAMP_API_JSON;
DEFINE_VAPI_MSG_IDS_L2_API_JSON;
DEFINE_VAPI_MSG_IDS_FAKE_API_JSON;
static char *app_name = NULL;
static char *api_prefix = NULL;
+static bool use_uds = false;
static const int max_outstanding_requests = 64;
static const int response_queue_size = 32;
@@ -61,8 +66,9 @@ START_TEST (test_invalid_values)
ck_assert_ptr_eq (NULL, sv);
rv = vapi_send (ctx, sv);
ck_assert_int_eq (VAPI_EINVAL, rv);
- rv = vapi_connect (ctx, app_name, api_prefix, max_outstanding_requests,
- response_queue_size, VAPI_MODE_BLOCKING, true);
+ rv =
+ vapi_connect_ex (ctx, app_name, api_prefix, max_outstanding_requests,
+ response_queue_size, VAPI_MODE_BLOCKING, true, use_uds);
ck_assert_int_eq (VAPI_OK, rv);
rv = vapi_send (ctx, NULL);
ck_assert_int_eq (VAPI_EINVAL, rv);
@@ -363,8 +369,9 @@ START_TEST (test_connect)
vapi_ctx_t ctx;
vapi_error_e rv = vapi_ctx_alloc (&ctx);
ck_assert_int_eq (VAPI_OK, rv);
- rv = vapi_connect (ctx, app_name, api_prefix, max_outstanding_requests,
- response_queue_size, VAPI_MODE_BLOCKING, true);
+ rv =
+ vapi_connect_ex (ctx, app_name, api_prefix, max_outstanding_requests,
+ response_queue_size, VAPI_MODE_BLOCKING, true, use_uds);
ck_assert_int_eq (VAPI_OK, rv);
rv = vapi_disconnect (ctx);
ck_assert_int_eq (VAPI_OK, rv);
@@ -380,8 +387,9 @@ setup_blocking (void)
{
vapi_error_e rv = vapi_ctx_alloc (&ctx);
ck_assert_int_eq (VAPI_OK, rv);
- rv = vapi_connect (ctx, app_name, api_prefix, max_outstanding_requests,
- response_queue_size, VAPI_MODE_BLOCKING, true);
+ rv =
+ vapi_connect_ex (ctx, app_name, api_prefix, max_outstanding_requests,
+ response_queue_size, VAPI_MODE_BLOCKING, true, use_uds);
ck_assert_int_eq (VAPI_OK, rv);
}
@@ -390,8 +398,9 @@ setup_nonblocking (void)
{
vapi_error_e rv = vapi_ctx_alloc (&ctx);
ck_assert_int_eq (VAPI_OK, rv);
- rv = vapi_connect (ctx, app_name, api_prefix, max_outstanding_requests,
- response_queue_size, VAPI_MODE_NONBLOCKING, true);
+ rv = vapi_connect_ex (ctx, app_name, api_prefix, max_outstanding_requests,
+ response_queue_size, VAPI_MODE_NONBLOCKING, true,
+ use_uds);
ck_assert_int_eq (VAPI_OK, rv);
}
@@ -479,6 +488,48 @@ sw_interface_dump_cb (struct vapi_ctx_s *ctx, void *callback_ctx,
return VAPI_OK;
}
+vapi_error_e
+vapi_mss_clamp_enable_disable_reply_cb (
+ struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last,
+ vapi_payload_mss_clamp_enable_disable_reply *reply)
+{
+ bool *x = callback_ctx;
+ *x = true;
+ return VAPI_OK;
+}
+
+vapi_error_e
+vapi_mss_clamp_get_reply_cb (struct vapi_ctx_s *ctx, void *callback_ctx,
+ vapi_error_e rv, bool is_last,
+ vapi_payload_mss_clamp_get_reply *reply)
+{
+ int *counter = callback_ctx;
+ ck_assert_int_gt (*counter, 0); // make sure details were called first
+ ++*counter;
+ ck_assert_int_eq (is_last, true);
+ printf ("Got mss clamp reply error %d\n", rv);
+ ck_assert_int_eq (rv, VAPI_OK);
+ printf ("counter is %d", *counter);
+ return VAPI_OK;
+}
+
+vapi_error_e
+vapi_mss_clamp_get_details_cb (struct vapi_ctx_s *ctx, void *callback_ctx,
+ vapi_error_e rv, bool is_last,
+ vapi_payload_mss_clamp_details *details)
+{
+ int *counter = callback_ctx;
+ ++*counter;
+ if (!is_last)
+ {
+ printf ("Got ipv4 mss clamp to %u for sw_if_index %u\n",
+ details->ipv4_mss, details->sw_if_index);
+ ck_assert_int_eq (details->ipv4_mss, 1000 + details->sw_if_index);
+ }
+ printf ("counter is %d", *counter);
+ return VAPI_OK;
+}
+
START_TEST (test_loopbacks_1)
{
printf ("--- Create/delete loopbacks using blocking API ---\n");
@@ -501,8 +552,11 @@ START_TEST (test_loopbacks_1)
for (i = 0; i < num_ifs; ++i)
{
vapi_msg_create_loopback *cl = vapi_alloc_create_loopback (ctx);
- memcpy (cl->payload.mac_address, mac_addresses[i],
- sizeof (cl->payload.mac_address));
+ int j;
+ for (j = 0; j < 6; ++j)
+ {
+ cl->payload.mac_address[j] = mac_addresses[i][j];
+ }
vapi_error_e rv =
vapi_create_loopback (ctx, cl, loopback_create_cb, &clcs[i]);
ck_assert_int_eq (VAPI_OK, rv);
@@ -516,6 +570,37 @@ START_TEST (test_loopbacks_1)
mac_addresses[i][3], mac_addresses[i][4], mac_addresses[i][5],
sw_if_indexes[i]);
}
+
+ { // new context
+ for (int i = 0; i < num_ifs; ++i)
+ {
+ vapi_msg_mss_clamp_enable_disable *mc =
+ vapi_alloc_mss_clamp_enable_disable (ctx);
+ mc->payload.sw_if_index = sw_if_indexes[i];
+ mc->payload.ipv4_mss = 1000 + sw_if_indexes[i];
+ mc->payload.ipv4_direction = MSS_CLAMP_DIR_RX;
+ bool reply_ctx = false;
+ printf ("Set ipv4 mss clamp to %u for sw_if_index %u\n",
+ mc->payload.ipv4_mss, mc->payload.sw_if_index);
+ vapi_error_e rv = vapi_mss_clamp_enable_disable (
+ ctx, mc, vapi_mss_clamp_enable_disable_reply_cb, &reply_ctx);
+ ck_assert_int_eq (VAPI_OK, rv);
+ ck_assert_int_eq (reply_ctx, true);
+ }
+ }
+
+ { // new context
+ int counter = 0;
+ vapi_msg_mss_clamp_get *msg = vapi_alloc_mss_clamp_get (ctx);
+ msg->payload.sw_if_index = ~0;
+ vapi_error_e rv =
+ vapi_mss_clamp_get (ctx, msg, vapi_mss_clamp_get_reply_cb, &counter,
+ vapi_mss_clamp_get_details_cb, &counter);
+ printf ("counter is %d", counter);
+ ck_assert_int_eq (VAPI_OK, rv);
+ ck_assert_int_eq (counter, num_ifs + 1);
+ }
+
bool seen[num_ifs];
sw_interface_dump_ctx dctx = { false, num_ifs, sw_if_indexes, seen, 0 };
vapi_msg_sw_interface_dump *dump;
@@ -525,7 +610,7 @@ START_TEST (test_loopbacks_1)
{
dctx.last_called = false;
clib_memset (&seen, 0, sizeof (seen));
- dump = vapi_alloc_sw_interface_dump (ctx);
+ dump = vapi_alloc_sw_interface_dump (ctx, 0);
while (VAPI_EAGAIN ==
(rv =
vapi_sw_interface_dump (ctx, dump, sw_interface_dump_cb,
@@ -554,7 +639,7 @@ START_TEST (test_loopbacks_1)
}
dctx.last_called = false;
clib_memset (&seen, 0, sizeof (seen));
- dump = vapi_alloc_sw_interface_dump (ctx);
+ dump = vapi_alloc_sw_interface_dump (ctx, 0);
while (VAPI_EAGAIN ==
(rv =
vapi_sw_interface_dump (ctx, dump, sw_interface_dump_cb, &dctx)))
@@ -580,7 +665,8 @@ START_TEST (test_show_version_3)
;
ck_assert_int_eq (VAPI_OK, rv);
ck_assert_int_eq (0, called);
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
ck_assert_int_eq (1, called);
called = 0;
@@ -614,14 +700,16 @@ START_TEST (test_show_version_4)
ck_assert_int_eq (0, contexts[j]);
}
}
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
for (i = 0; i < num_req; ++i)
{
ck_assert_int_eq (1, contexts[i]);
}
clib_memset (contexts, 0, sizeof (contexts));
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
for (i = 0; i < num_req; ++i)
{
@@ -654,15 +742,19 @@ START_TEST (test_loopbacks_2)
for (i = 0; i < num_ifs; ++i)
{
vapi_msg_create_loopback *cl = vapi_alloc_create_loopback (ctx);
- memcpy (cl->payload.mac_address, mac_addresses[i],
- sizeof (cl->payload.mac_address));
+ int j;
+ for (j = 0; j < 6; ++j)
+ {
+ cl->payload.mac_address[j] = mac_addresses[i][j];
+ }
while (VAPI_EAGAIN ==
(rv =
vapi_create_loopback (ctx, cl, loopback_create_cb, &clcs[i])))
;
ck_assert_int_eq (VAPI_OK, rv);
}
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
for (i = 0; i < num_ifs; ++i)
{
@@ -676,7 +768,7 @@ START_TEST (test_loopbacks_2)
bool seen[num_ifs];
clib_memset (&seen, 0, sizeof (seen));
sw_interface_dump_ctx dctx = { false, num_ifs, sw_if_indexes, seen, 0 };
- vapi_msg_sw_interface_dump *dump = vapi_alloc_sw_interface_dump (ctx);
+ vapi_msg_sw_interface_dump *dump = vapi_alloc_sw_interface_dump (ctx, 0);
while (VAPI_EAGAIN ==
(rv =
vapi_sw_interface_dump (ctx, dump, sw_interface_dump_cb, &dctx)))
@@ -687,7 +779,8 @@ START_TEST (test_loopbacks_2)
}
clib_memset (&seen, 0, sizeof (seen));
ck_assert_int_eq (false, dctx.last_called);
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
for (i = 0; i < num_ifs; ++i)
{
@@ -705,7 +798,8 @@ START_TEST (test_loopbacks_2)
;
ck_assert_int_eq (VAPI_OK, rv);
}
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
for (i = 0; i < num_ifs; ++i)
{
@@ -714,12 +808,13 @@ START_TEST (test_loopbacks_2)
}
clib_memset (&seen, 0, sizeof (seen));
dctx.last_called = false;
- dump = vapi_alloc_sw_interface_dump (ctx);
+ dump = vapi_alloc_sw_interface_dump (ctx, 0);
while (VAPI_EAGAIN ==
(rv =
vapi_sw_interface_dump (ctx, dump, sw_interface_dump_cb, &dctx)))
;
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
for (i = 0; i < num_ifs; ++i)
{
@@ -758,7 +853,8 @@ START_TEST (test_show_version_5)
int called = 0;
vapi_set_generic_event_cb (ctx, generic_cb, &called);
ck_assert_int_eq (VAPI_OK, rv);
- rv = vapi_dispatch_one (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch_one (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
ck_assert_int_eq (1, called);
sv = vapi_alloc_show_version (ctx);
@@ -768,7 +864,8 @@ START_TEST (test_show_version_5)
;
ck_assert_int_eq (VAPI_OK, rv);
vapi_clear_generic_event_cb (ctx);
- rv = vapi_dispatch_one (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch_one (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
ck_assert_int_eq (1, called); /* needs to remain unchanged */
}
@@ -805,7 +902,8 @@ START_TEST (test_no_response_1)
(rv = vapi_show_version (ctx, sv, show_version_cb, &called)))
;
ck_assert_int_eq (VAPI_OK, rv);
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
ck_assert_int_eq (2, called);
}
@@ -829,14 +927,15 @@ START_TEST (test_no_response_2)
{
printf ("--- Simulate no response to dump message ---\n");
vapi_error_e rv;
- vapi_msg_sw_interface_dump *dump = vapi_alloc_sw_interface_dump (ctx);
+ vapi_msg_sw_interface_dump *dump = vapi_alloc_sw_interface_dump (ctx, 0);
dump->header._vl_msg_id = ~0; /* malformed ID causes vpp to drop the msg */
int no_called = 0;
while (VAPI_EAGAIN ==
(rv = vapi_sw_interface_dump (ctx, dump, no_msg_cb, &no_called)))
;
ck_assert_int_eq (VAPI_OK, rv);
- rv = vapi_dispatch (ctx);
+ while (VAPI_EAGAIN == (rv = vapi_dispatch (ctx)))
+ ;
ck_assert_int_eq (VAPI_OK, rv);
ck_assert_int_eq (1, no_called);
}
@@ -910,6 +1009,7 @@ START_TEST (test_api_strings)
/* Assert nul terminator NOT present */
ck_assert_int_eq (vec_len (vstr), strlen (str));
vec_free (vstr);
+ free (dump);
}
END_TEST;
@@ -970,13 +1070,23 @@ test_suite (void)
int
main (int argc, char *argv[])
{
- if (3 != argc)
+ if (4 != argc)
{
printf ("Invalid argc==`%d'\n", argc);
return EXIT_FAILURE;
}
app_name = argv[1];
api_prefix = argv[2];
+ if (!strcmp (argv[3], "shm"))
+ use_uds = 0;
+ else if (!strcmp (argv[3], "uds"))
+ use_uds = 1;
+ else
+ {
+ printf ("Unrecognised required argument '%s', expected 'uds' or 'shm'.",
+ argv[3]);
+ return EXIT_FAILURE;
+ }
printf ("App name: `%s', API prefix: `%s'\n", app_name, api_prefix);
int number_failed;