diff options
Diffstat (limited to 'src/vpp-api/vapi/vapi_c_test.c')
-rw-r--r-- | src/vpp-api/vapi/vapi_c_test.c | 168 |
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; |