#include <vapi/vapi.hpp>
#include <vapi/vpe.api.vapi.hpp>
#include <vapi/interface.api.vapi.hpp>
-#include <vapi/stats.api.vapi.hpp>
#include <fake.api.vapi.hpp>
DEFINE_VAPI_MSG_IDS_VPE_API_JSON;
DEFINE_VAPI_MSG_IDS_INTERFACE_API_JSON;
-DEFINE_VAPI_MSG_IDS_STATS_API_JSON;
DEFINE_VAPI_MSG_IDS_FAKE_API_JSON;
static char *app_name = nullptr;
static const int max_outstanding_requests = 32;
static const int response_queue_size = 32;
+#define WAIT_FOR_RESPONSE(param, ret) \
+ do \
+ { \
+ ret = con.wait_for_response (param); \
+ } \
+ while (ret == VAPI_EAGAIN)
+
using namespace vapi;
void verify_show_version_reply (const Show_version_reply &r)
Show_version sv (con);
vapi_error_e rv = sv.execute ();
ck_assert_int_eq (VAPI_OK, rv);
- rv = con.wait_for_response (sv);
+ WAIT_FOR_RESPONSE (sv, rv);
ck_assert_int_eq (VAPI_OK, rv);
auto &r = sv.get_response ();
verify_show_version_reply (r);
memcpy (p.mac_address, mac_addresses[i], sizeof (p.mac_address));
auto e = cl.execute ();
ck_assert_int_eq (VAPI_OK, e);
- vapi_error_e rv = con.wait_for_response (cl);
+ vapi_error_e rv;
+ WAIT_FOR_RESPONSE (cl, rv);
ck_assert_int_eq (VAPI_OK, rv);
auto &rp = cl.get_response ().get_payload ();
ck_assert_int_eq (0, rp.retval);
{ // new context
bool seen[num_ifs] = {0};
Sw_interface_dump d (con);
- auto &p = d.get_request ().get_payload ();
- p.name_filter_valid = 0;
- memset (p.name_filter, 0, sizeof (p.name_filter));
+ d.get_request ().get_payload ();
auto rv = d.execute ();
ck_assert_int_eq (VAPI_OK, rv);
- rv = con.wait_for_response (d);
+ WAIT_FOR_RESPONSE (d, rv);
ck_assert_int_eq (VAPI_OK, rv);
auto &rs = d.get_result_set ();
for (auto &r : rs)
dl.get_request ().get_payload ().sw_if_index = sw_if_indexes[i];
auto rv = dl.execute ();
ck_assert_int_eq (VAPI_OK, rv);
- rv = con.wait_for_response (dl);
+ WAIT_FOR_RESPONSE (dl, rv);
ck_assert_int_eq (VAPI_OK, rv);
auto &response = dl.get_response ();
auto rp = response.get_payload ();
{ // new context
Sw_interface_dump d (con);
- auto &p = d.get_request ().get_payload ();
- p.name_filter_valid = 0;
- memset (p.name_filter, 0, sizeof (p.name_filter));
+ d.get_request ().get_payload ();
auto rv = d.execute ();
ck_assert_int_eq (VAPI_OK, rv);
- rv = con.wait_for_response (d);
+ WAIT_FOR_RESPONSE (d, rv);
ck_assert_int_eq (VAPI_OK, rv);
auto &rs = d.get_result_set ();
for (auto &r : rs)
Sw_interface_dump_cb<num_ifs> swdcb (ccbs);
Sw_interface_dump d (con, std::ref (swdcb));
- auto &p = d.get_request ().get_payload ();
- p.name_filter_valid = 0;
- memset (p.name_filter, 0, sizeof (p.name_filter));
+ d.get_request ().get_payload ();
auto rv = d.execute ();
ck_assert_int_eq (VAPI_OK, rv);
- rv = con.wait_for_response (d);
+ WAIT_FOR_RESPONSE (d, rv);
ck_assert_int_eq (VAPI_OK, rv);
ck_assert_int_ne (0, swdcb.called);
std::array<Delete_loopback_cb, num_ifs> dcbs;
{ // new context
Sw_interface_dump d (con);
- auto &p = d.get_request ().get_payload ();
- p.name_filter_valid = 0;
- memset (p.name_filter, 0, sizeof (p.name_filter));
+ d.get_request ().get_payload ();
auto rv = d.execute ();
ck_assert_int_eq (VAPI_OK, rv);
- rv = con.wait_for_response (d);
+ WAIT_FOR_RESPONSE (d, rv);
ck_assert_int_eq (VAPI_OK, rv);
auto &rs = d.get_result_set ();
for (auto &r : rs)
END_TEST;
-START_TEST (test_stats_1)
-{
- printf ("--- Receive single stats by waiting for response ---\n");
- Want_stats ws (con);
- auto &payload = ws.get_request ().get_payload ();
- payload.enable_disable = 1;
- payload.pid = getpid ();
- auto rv = ws.execute ();
- ck_assert_int_eq (VAPI_OK, rv);
- Event_registration<Vnet_interface_simple_counters> sc (con);
- rv = con.wait_for_response (sc);
- ck_assert_int_eq (VAPI_OK, rv);
- auto &rs = sc.get_result_set ();
- int count = 0;
- for (auto &r : rs)
- {
- printf ("simple counters: first_sw_if_index=%u\n",
- r.get_payload ().first_sw_if_index);
- ++count;
- }
- ck_assert_int_ne (0, count);
-}
-
-END_TEST;
-
-struct Vnet_interface_simple_counters_cb
-{
- Vnet_interface_simple_counters_cb () : called{0} {};
- int called;
- vapi_error_e
- operator() (Event_registration<Vnet_interface_simple_counters> &e)
- {
- ++called;
- auto &rs = e.get_result_set ();
- int count = 0;
- for (auto &r : rs)
- {
- printf ("simple counters: first_sw_if_index=%u\n",
- r.get_payload ().first_sw_if_index);
- ++count;
- }
- ck_assert_int_ne (0, count);
- return VAPI_OK;
- }
-};
-
-START_TEST (test_stats_2)
-{
- printf ("--- Receive single stats by getting a callback ---\n");
- Want_stats ws (con);
- auto &payload = ws.get_request ().get_payload ();
- payload.enable_disable = 1;
- payload.pid = getpid ();
- auto rv = ws.execute ();
- ck_assert_int_eq (VAPI_OK, rv);
- Vnet_interface_simple_counters_cb cb;
- Event_registration<Vnet_interface_simple_counters> sc (con, std::ref (cb));
- rv = con.wait_for_response (sc);
- ck_assert_int_eq (VAPI_OK, rv);
- ck_assert_int_ne (0, cb.called);
-}
-
-END_TEST;
-
-struct Vnet_interface_simple_counters_2_cb
-{
- Vnet_interface_simple_counters_2_cb () : called{0}, total{0} {};
- int called;
- int total;
- vapi_error_e
- operator() (Event_registration<Vnet_interface_simple_counters> &e)
- {
- ++called;
- auto &rs = e.get_result_set ();
- int count = 0;
- for (auto &r : rs)
- {
- printf ("simple counters: first_sw_if_index=%u\n",
- r.get_payload ().first_sw_if_index);
- ++count;
- }
- rs.free_all_responses ();
- ck_assert_int_ne (0, count);
- total += count;
- return VAPI_OK;
- }
-};
-
-START_TEST (test_stats_3)
-{
- printf (
- "--- Receive single stats by getting a callback - clear results ---\n");
- Want_stats ws (con);
- auto &payload = ws.get_request ().get_payload ();
- payload.enable_disable = 1;
- payload.pid = getpid ();
- auto rv = ws.execute ();
- ck_assert_int_eq (VAPI_OK, rv);
- Vnet_interface_simple_counters_2_cb cb;
- Event_registration<Vnet_interface_simple_counters> sc (con, std::ref (cb));
- for (int i = 0; i < 5; ++i)
- {
- rv = con.wait_for_response (sc);
- }
- ck_assert_int_eq (VAPI_OK, rv);
- ck_assert_int_eq (5, cb.called);
- ck_assert_int_eq (5, cb.total);
-}
-
-END_TEST;
-
-START_TEST (test_stats_4)
-{
- printf ("--- Receive multiple stats by waiting for response ---\n");
- Want_stats ws (con);
- auto &payload = ws.get_request ().get_payload ();
- payload.enable_disable = 1;
- payload.pid = getpid ();
- auto rv = ws.execute ();
- ck_assert_int_eq (VAPI_OK, rv);
- Event_registration<Vnet_interface_simple_counters> sc (con);
- Event_registration<Vnet_interface_combined_counters> cc (con);
- rv = con.wait_for_response (sc);
- ck_assert_int_eq (VAPI_OK, rv);
- rv = con.wait_for_response (cc);
- ck_assert_int_eq (VAPI_OK, rv);
- int count = 0;
- for (auto &r : sc.get_result_set ())
- {
- printf ("simple counters: first_sw_if_index=%u\n",
- r.get_payload ().first_sw_if_index);
- ++count;
- }
- ck_assert_int_ne (0, count);
- count = 0;
- for (auto &r : cc.get_result_set ())
- {
- printf ("combined counters: first_sw_if_index=%u\n",
- r.get_payload ().first_sw_if_index);
- ++count;
- }
- ck_assert_int_ne (0, count);
-}
-
-END_TEST;
-
START_TEST (test_unsupported)
{
printf ("--- Unsupported messages ---\n");
tcase_add_test (tc_cpp_api, test_show_version_2);
tcase_add_test (tc_cpp_api, test_loopbacks_1);
tcase_add_test (tc_cpp_api, test_loopbacks_2);
- tcase_add_test (tc_cpp_api, test_stats_1);
- tcase_add_test (tc_cpp_api, test_stats_2);
- tcase_add_test (tc_cpp_api, test_stats_3);
- tcase_add_test (tc_cpp_api, test_stats_4);
tcase_add_test (tc_cpp_api, test_unsupported);
suite_add_tcase (s, tc_cpp_api);