interface: add api test file
Type: improvement Signed-off-by: Filip Tehlar <ftehlar@cisco.com> Change-Id: Ib07029204ecf12bf2adb5a39afa54bc98fb81f34
This commit is contained in:
@ -52,7 +52,6 @@ api_arping (vat_main_t *vam)
|
||||
arping_args_t args = { 0 };
|
||||
int ret;
|
||||
unformat_input_t *input = vam->input;
|
||||
vnet_main_t *vnm = vnet_get_main ();
|
||||
f64 interval = ARPING_DEFAULT_INTERVAL;
|
||||
vl_api_control_ping_t *mp_ping;
|
||||
arping_test_main_t *atm = &arping_test_main;
|
||||
@ -76,8 +75,7 @@ api_arping (vat_main_t *vam)
|
||||
return -99;
|
||||
}
|
||||
|
||||
if (!unformat_user (input, unformat_vnet_sw_interface, vnm,
|
||||
&args.sw_if_index))
|
||||
if (!unformat_user (input, api_unformat_sw_if_index, vam, &args.sw_if_index))
|
||||
{
|
||||
errmsg ("unknown interface `%U'", format_unformat_error, input);
|
||||
return -99;
|
||||
|
@ -90,24 +90,6 @@ static void vl_api_gtpu_add_del_tunnel_reply_t_handler
|
||||
}
|
||||
}
|
||||
|
||||
static uword
|
||||
api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
|
||||
{
|
||||
vat_main_t *vam = va_arg (*args, vat_main_t *);
|
||||
u32 *result = va_arg (*args, u32 *);
|
||||
u8 *if_name;
|
||||
uword *p;
|
||||
|
||||
if (!unformat (input, "%s", &if_name))
|
||||
return 0;
|
||||
|
||||
p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
|
||||
if (p == 0)
|
||||
return 0;
|
||||
*result = p[0];
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uword
|
||||
api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
|
||||
{
|
||||
|
@ -57,6 +57,8 @@
|
||||
|
||||
#include <vlibmemory/memclnt.api_enum.h>
|
||||
#include <vlibmemory/memclnt.api_types.h>
|
||||
#include <vlibmemory/memclnt.api_tojson.h>
|
||||
#include <vlibmemory/memclnt.api_fromjson.h>
|
||||
|
||||
#define vl_endianfun /* define message structures */
|
||||
#include <vlibmemory/memclnt.api.h>
|
||||
@ -170,23 +172,6 @@ errmsg (char *fmt, ...)
|
||||
}
|
||||
|
||||
#if VPP_API_TEST_BUILTIN == 0
|
||||
static uword
|
||||
api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
|
||||
{
|
||||
vat_main_t *vam = va_arg (*args, vat_main_t *);
|
||||
u32 *result = va_arg (*args, u32 *);
|
||||
u8 *if_name;
|
||||
uword *p;
|
||||
|
||||
if (!unformat (input, "%s", &if_name))
|
||||
return 0;
|
||||
|
||||
p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
|
||||
if (p == 0)
|
||||
return 0;
|
||||
*result = p[0];
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Parse an IP4 address %d.%d.%d.%d. */
|
||||
uword
|
||||
@ -644,6 +629,48 @@ format_hex_bytes (u8 * s, va_list * va)
|
||||
return s;
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_control_ping_reply_t_handler (vl_api_control_ping_reply_t *mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
i32 retval = ntohl (mp->retval);
|
||||
if (vam->async_mode)
|
||||
{
|
||||
vam->async_errors += (retval < 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
vam->retval = retval;
|
||||
vam->result_ready = 1;
|
||||
}
|
||||
if (vam->socket_client_main)
|
||||
vam->socket_client_main->control_pings_outstanding--;
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_control_ping_reply_t_handler_json (vl_api_control_ping_reply_t *mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
i32 retval = ntohl (mp->retval);
|
||||
|
||||
if (VAT_JSON_NONE != vam->json_tree.type)
|
||||
{
|
||||
vat_json_print (vam->ofp, &vam->json_tree);
|
||||
vat_json_free (&vam->json_tree);
|
||||
vam->json_tree.type = VAT_JSON_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* just print [] */
|
||||
vat_json_init_array (&vam->json_tree);
|
||||
vat_json_print (vam->ofp, &vam->json_tree);
|
||||
vam->json_tree.type = VAT_JSON_NONE;
|
||||
}
|
||||
|
||||
vam->retval = retval;
|
||||
vam->result_ready = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate boilerplate reply handlers, which
|
||||
* dig the return value out of the xxx_reply_t API message,
|
||||
@ -693,6 +720,7 @@ foreach_standard_reply_retval_handler;
|
||||
|
||||
#define foreach_vpe_api_reply_msg \
|
||||
_ (GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
|
||||
_ (CONTROL_PING_REPLY, control_ping_reply)
|
||||
|
||||
#define foreach_standalone_reply_msg \
|
||||
|
||||
@ -706,10 +734,23 @@ typedef struct
|
||||
case L2_VTR_ ## op: \
|
||||
return "" # op;
|
||||
|
||||
int
|
||||
api_sw_interface_dump (vat_main_t *vam)
|
||||
static const char *
|
||||
str_vtr_op (u32 vtr_op)
|
||||
{
|
||||
return 0;
|
||||
switch (vtr_op)
|
||||
{
|
||||
STR_VTR_OP_CASE (DISABLED);
|
||||
STR_VTR_OP_CASE (PUSH_1);
|
||||
STR_VTR_OP_CASE (PUSH_2);
|
||||
STR_VTR_OP_CASE (POP_1);
|
||||
STR_VTR_OP_CASE (POP_2);
|
||||
STR_VTR_OP_CASE (TRANSLATE_1_1);
|
||||
STR_VTR_OP_CASE (TRANSLATE_1_2);
|
||||
STR_VTR_OP_CASE (TRANSLATE_2_1);
|
||||
STR_VTR_OP_CASE (TRANSLATE_2_2);
|
||||
}
|
||||
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
uword
|
||||
@ -2299,12 +2340,10 @@ help (vat_main_t * vam)
|
||||
|
||||
print (vam->ofp, "Help is available for the following:");
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
hash_foreach_pair (p, vam->function_by_name,
|
||||
({
|
||||
vec_add1 (cmds, (u8 *)(p->key));
|
||||
}));
|
||||
/* *INDENT-ON* */
|
||||
|
||||
vec_sort_with_function (cmds, cmd_cmp);
|
||||
|
||||
@ -2377,14 +2416,11 @@ dump_macro_table (vat_main_t * vam)
|
||||
int i;
|
||||
hash_pair_t *p;
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
|
||||
({
|
||||
vec_add2 (sort_me, sm, 1);
|
||||
sm->name = (u8 *)(p->key);
|
||||
sm->value = (u8 *) (p->value[0]);
|
||||
}));
|
||||
/* *INDENT-ON* */
|
||||
hash_foreach_pair (p, vam->macro_main.the_value_table_hash, ({
|
||||
vec_add2 (sort_me, sm, 1);
|
||||
sm->name = (u8 *) (p->key);
|
||||
sm->value = (u8 *) (p->value[0]);
|
||||
}));
|
||||
|
||||
vec_sort_with_function (sort_me, macro_sort_cmp);
|
||||
|
||||
@ -2420,14 +2456,12 @@ dump_msg_api_table (vat_main_t * vam)
|
||||
hash_pair_t *hp;
|
||||
int i;
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
|
||||
({
|
||||
vec_add2 (nses, ns, 1);
|
||||
ns->name = (u8 *)(hp->key);
|
||||
ns->value = (u32) hp->value[0];
|
||||
}));
|
||||
/* *INDENT-ON* */
|
||||
|
||||
vec_sort_with_function (nses, value_sort_cmp);
|
||||
|
||||
@ -2580,29 +2614,107 @@ exec (vat_main_t *vam)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
name_sort_cmp (void *a1, void *a2)
|
||||
{
|
||||
name_sort_t *n1 = a1;
|
||||
name_sort_t *n2 = a2;
|
||||
|
||||
return strcmp ((char *) n1->name, (char *) n2->name);
|
||||
}
|
||||
|
||||
static int
|
||||
dump_interface_table (vat_main_t *vam)
|
||||
{
|
||||
hash_pair_t *p;
|
||||
name_sort_t *nses = 0, *ns;
|
||||
|
||||
if (vam->json_output)
|
||||
{
|
||||
clib_warning (
|
||||
"JSON output supported only for VPE API calls and dump_stats_table");
|
||||
return -99;
|
||||
}
|
||||
|
||||
hash_foreach_pair (p, vam->sw_if_index_by_interface_name, ({
|
||||
vec_add2 (nses, ns, 1);
|
||||
ns->name = (u8 *) (p->key);
|
||||
ns->value = (u32) p->value[0];
|
||||
}));
|
||||
|
||||
vec_sort_with_function (nses, name_sort_cmp);
|
||||
|
||||
print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
|
||||
vec_foreach (ns, nses)
|
||||
{
|
||||
print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
|
||||
}
|
||||
vec_free (nses);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
dump_sub_interface_table (vat_main_t *vam)
|
||||
{
|
||||
const sw_interface_subif_t *sub = NULL;
|
||||
|
||||
if (vam->json_output)
|
||||
{
|
||||
clib_warning (
|
||||
"JSON output supported only for VPE API calls and dump_stats_table");
|
||||
return -99;
|
||||
}
|
||||
|
||||
print (vam->ofp, "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
|
||||
"Interface", "sw_if_index", "sub id", "dot1ad", "tags", "outer id",
|
||||
"inner id", "exact", "default", "outer any", "inner any");
|
||||
|
||||
vec_foreach (sub, vam->sw_if_subif_table)
|
||||
{
|
||||
print (vam->ofp, "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
|
||||
sub->interface_name, sub->sw_if_index, sub->sub_id,
|
||||
sub->sub_dot1ad ? "dot1ad" : "dot1q", sub->sub_number_of_tags,
|
||||
sub->sub_outer_vlan_id, sub->sub_inner_vlan_id,
|
||||
sub->sub_exact_match, sub->sub_default,
|
||||
sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
|
||||
if (sub->vtr_op != L2_VTR_DISABLED)
|
||||
{
|
||||
print (vam->ofp,
|
||||
" vlan-tag-rewrite - op: %-14s [ dot1q: %d "
|
||||
"tag1: %d tag2: %d ]",
|
||||
str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q, sub->vtr_tag1,
|
||||
sub->vtr_tag2);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* List of API message constructors, CLI names map to api_xxx */
|
||||
#define foreach_vpe_api_msg \
|
||||
_(get_first_msg_id, "client <name>") \
|
||||
_(sock_init_shm, "size <nnn>") \
|
||||
/* List of command functions, CLI names map directly to functions */
|
||||
#define foreach_cli_function \
|
||||
_(comment, "usage: comment <ignore-rest-of-line>") \
|
||||
_(dump_macro_table, "usage: dump_macro_table ") \
|
||||
_(dump_msg_api_table, "usage: dump_msg_api_table") \
|
||||
_(elog_setup, "usage: elog_setup [nevents, default 128K]") \
|
||||
_(elog_disable, "usage: elog_disable") \
|
||||
_(elog_enable, "usage: elog_enable") \
|
||||
_(elog_save, "usage: elog_save <filename>") \
|
||||
_(get_msg_id, "usage: get_msg_id name_and_crc") \
|
||||
_(echo, "usage: echo <message>") \
|
||||
_(help, "usage: help") \
|
||||
_(q, "usage: quit") \
|
||||
_(quit, "usage: quit") \
|
||||
_(search_node_table, "usage: search_node_table <name>...") \
|
||||
_(set, "usage: set <variable-name> <value>") \
|
||||
_(script, "usage: script <file-name>") \
|
||||
_(statseg, "usage: statseg") \
|
||||
_(unset, "usage: unset <variable-name>")
|
||||
#define foreach_cli_function \
|
||||
_ (comment, "usage: comment <ignore-rest-of-line>") \
|
||||
_ (dump_interface_table, "usage: dump_interface_table") \
|
||||
_ (dump_sub_interface_table, "usage: dump_sub_interface_table") \
|
||||
_ (dump_macro_table, "usage: dump_macro_table ") \
|
||||
_ (dump_msg_api_table, "usage: dump_msg_api_table") \
|
||||
_ (elog_setup, "usage: elog_setup [nevents, default 128K]") \
|
||||
_ (elog_disable, "usage: elog_disable") \
|
||||
_ (elog_enable, "usage: elog_enable") \
|
||||
_ (elog_save, "usage: elog_save <filename>") \
|
||||
_ (get_msg_id, "usage: get_msg_id name_and_crc") \
|
||||
_ (echo, "usage: echo <message>") \
|
||||
_ (help, "usage: help") \
|
||||
_ (q, "usage: quit") \
|
||||
_ (quit, "usage: quit") \
|
||||
_ (search_node_table, "usage: search_node_table <name>...") \
|
||||
_ (set, "usage: set <variable-name> <value>") \
|
||||
_ (script, "usage: script <file-name>") \
|
||||
_ (statseg, "usage: statseg") \
|
||||
_ (unset, "usage: unset <variable-name>")
|
||||
|
||||
#define _(N,n) \
|
||||
static void vl_api_##n##_t_handler_uni \
|
||||
|
@ -13,6 +13,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "vat.h"
|
||||
#include <dlfcn.h>
|
||||
#include "plugin.h"
|
||||
#include <signal.h>
|
||||
#include <limits.h>
|
||||
@ -181,7 +182,7 @@ do_one_file (vat_main_t * vam)
|
||||
if (vam->regenerate_interface_table)
|
||||
{
|
||||
vam->regenerate_interface_table = 0;
|
||||
api_sw_interface_dump (vam);
|
||||
vam->api_sw_interface_dump (vam);
|
||||
}
|
||||
|
||||
/* Hack to pick up new client index after memfd_segment_create pivot */
|
||||
@ -380,6 +381,30 @@ vlib_call_init_exit_functions (vlib_main_t *vm,
|
||||
1 /* do_sort */, is_global);
|
||||
}
|
||||
|
||||
static void
|
||||
vat_register_interface_dump (vat_main_t *vam)
|
||||
{
|
||||
void *handle;
|
||||
plugin_info_t *pi;
|
||||
|
||||
vec_foreach (pi, vat_plugin_main.plugin_info)
|
||||
{
|
||||
handle = dlsym (pi->handle, "api_sw_interface_dump");
|
||||
if (handle)
|
||||
{
|
||||
vam->api_sw_interface_dump = handle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!vam->api_sw_interface_dump)
|
||||
{
|
||||
fformat (stderr,
|
||||
"sw_interface_dump not found in interface_test plugin!\n");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
@ -484,9 +509,6 @@ main (int argc, char **argv)
|
||||
|
||||
vam->json_output = json_output;
|
||||
|
||||
if (!json_output)
|
||||
api_sw_interface_dump (vam);
|
||||
|
||||
vec_validate (vam->inbuf, 4096);
|
||||
|
||||
load_features ();
|
||||
@ -494,6 +516,11 @@ main (int argc, char **argv)
|
||||
vam->current_file = (u8 *) "plugin-init";
|
||||
vat_plugin_init (vam);
|
||||
|
||||
vat_register_interface_dump (vam);
|
||||
|
||||
if (!json_output)
|
||||
vam->api_sw_interface_dump (vam);
|
||||
|
||||
/* Set up the init function hash table */
|
||||
vgm->init_functions_called = hash_create (0, 0);
|
||||
|
||||
|
@ -33,6 +33,8 @@
|
||||
#include <vlib/unix/unix.h>
|
||||
#include <vlibapi/api.h>
|
||||
#include <vlibmemory/api.h>
|
||||
#include <vlibmemory/memclnt.api_enum.h>
|
||||
#include <vlibmemory/memclnt.api_types.h>
|
||||
|
||||
#include "vat/json_format.h"
|
||||
|
||||
@ -232,6 +234,8 @@ typedef struct
|
||||
|
||||
struct vat_registered_features_t *feature_function_registrations;
|
||||
|
||||
int (*api_sw_interface_dump) ();
|
||||
|
||||
/* Convenience */
|
||||
vlib_main_t *vlib_main;
|
||||
} vat_main_t;
|
||||
@ -295,6 +299,25 @@ static void __vlib_add_config_function_##x (void) \
|
||||
.function = x, \
|
||||
}
|
||||
|
||||
#if VPP_API_TEST_BUILTIN == 0
|
||||
static_always_inline uword
|
||||
api_unformat_sw_if_index (unformat_input_t *input, va_list *args)
|
||||
{
|
||||
vat_main_t *vam = va_arg (*args, vat_main_t *);
|
||||
u32 *result = va_arg (*args, u32 *);
|
||||
u8 *if_name;
|
||||
uword *p;
|
||||
|
||||
if (!unformat (input, "%s", &if_name))
|
||||
return 0;
|
||||
|
||||
p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
|
||||
if (p == 0)
|
||||
return 0;
|
||||
*result = p[0];
|
||||
return 1;
|
||||
}
|
||||
#endif /* VPP_API_TEST_BUILTIN */
|
||||
|
||||
#endif /* __included_vat_h__ */
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
/* For control ping */
|
||||
#define vl_endianfun
|
||||
#include <vlibmemory/vlib.api.h>
|
||||
#include <vlibmemory/memclnt.api.h>
|
||||
#undef vl_endianfun
|
||||
|
||||
static inline void
|
||||
|
@ -65,13 +65,16 @@ do { \
|
||||
#define PING(_tm, mp_ping) \
|
||||
do \
|
||||
{ \
|
||||
if (!(_tm)->ping_id) \
|
||||
(_tm)->ping_id = \
|
||||
vl_msg_api_get_msg_index ((u8 *) (VL_API_CONTROL_PING_CRC)); \
|
||||
mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping)); \
|
||||
mp_ping->_vl_msg_id = htons ((_tm)->ping_id); \
|
||||
socket_client_main_t *scm = vam->socket_client_main; \
|
||||
if (scm && scm->socket_enable) \
|
||||
mp_ping = vl_socket_client_msg_alloc (sizeof (*mp_ping)); \
|
||||
else \
|
||||
mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping)); \
|
||||
mp_ping->_vl_msg_id = htons (VL_API_CONTROL_PING + 1); \
|
||||
mp_ping->client_index = vam->my_client_index; \
|
||||
vam->result_ready = 0; \
|
||||
if (scm) \
|
||||
scm->control_pings_outstanding++; \
|
||||
} \
|
||||
while (0);
|
||||
|
||||
|
@ -207,3 +207,28 @@ autoreply define memclnt_keepalive
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
};
|
||||
|
||||
/** \brief Control ping from client to api server request
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
*/
|
||||
define control_ping
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
};
|
||||
|
||||
/** \brief Control ping from the client to the server response
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param retval - return code for the request
|
||||
@param vpe_pid - the pid of the vpe, returned by the server
|
||||
*/
|
||||
define control_ping_reply
|
||||
{
|
||||
u32 context;
|
||||
i32 retval;
|
||||
u32 client_index;
|
||||
u32 vpe_pid;
|
||||
};
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <vlib/unix/unix.h>
|
||||
#include <vlibapi/api.h>
|
||||
#include <vlibmemory/api.h>
|
||||
#include <vlibapi/api_helper_macros.h>
|
||||
|
||||
/**
|
||||
* @file
|
||||
@ -131,9 +132,20 @@ vl_api_api_versions_t_handler (vl_api_api_versions_t *mp)
|
||||
vl_api_send_msg (reg, (u8 *) rmp);
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_control_ping_t_handler (vl_api_control_ping_t *mp)
|
||||
{
|
||||
vl_api_control_ping_reply_t *rmp;
|
||||
int rv = 0;
|
||||
|
||||
REPLY_MACRO2 (VL_API_CONTROL_PING_REPLY,
|
||||
({ rmp->vpe_pid = ntohl (getpid ()); }));
|
||||
}
|
||||
|
||||
#define foreach_vlib_api_msg \
|
||||
_ (GET_FIRST_MSG_ID, get_first_msg_id) \
|
||||
_ (API_VERSIONS, api_versions)
|
||||
_ (API_VERSIONS, api_versions) \
|
||||
_ (CONTROL_PING, control_ping)
|
||||
|
||||
/*
|
||||
* vl_api_init
|
||||
@ -141,6 +153,7 @@ vl_api_api_versions_t_handler (vl_api_api_versions_t *mp)
|
||||
static int
|
||||
vlib_api_init (void)
|
||||
{
|
||||
api_main_t *am = vlibapi_get_main ();
|
||||
vl_msg_api_msg_config_t cfg;
|
||||
vl_msg_api_msg_config_t *c = &cfg;
|
||||
|
||||
@ -175,6 +188,9 @@ vlib_api_init (void)
|
||||
foreach_vlib_api_msg;
|
||||
#undef _
|
||||
|
||||
am->is_mp_safe[VL_API_CONTROL_PING] = 1;
|
||||
am->is_mp_safe[VL_API_CONTROL_PING_REPLY] = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -243,32 +243,8 @@ define get_f64_increment_by_one_reply
|
||||
f64 f64_value;
|
||||
};
|
||||
|
||||
/** \brief Control ping from client to api server request
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
*/
|
||||
define control_ping
|
||||
{
|
||||
u32 client_index;
|
||||
u32 context;
|
||||
};
|
||||
|
||||
/** \brief Control ping from the client to the server response
|
||||
@param client_index - opaque cookie to identify the sender
|
||||
@param context - sender context, to match reply w/ request
|
||||
@param retval - return code for the request
|
||||
@param vpe_pid - the pid of the vpe, returned by the server
|
||||
*/
|
||||
define control_ping_reply
|
||||
{
|
||||
u32 context;
|
||||
i32 retval;
|
||||
u32 client_index;
|
||||
u32 vpe_pid;
|
||||
};
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* eval: (c-set-style "gnu")
|
||||
* End:
|
||||
*/
|
||||
*/
|
||||
|
@ -329,16 +329,6 @@ vl_api_get_f64_increment_by_one_t_handler (
|
||||
}));
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_control_ping_t_handler (vl_api_control_ping_t *mp)
|
||||
{
|
||||
vl_api_control_ping_reply_t *rmp;
|
||||
int rv = 0;
|
||||
|
||||
REPLY_MACRO2 (VL_API_CONTROL_PING_REPLY,
|
||||
({ rmp->vpe_pid = ntohl (getpid ()); }));
|
||||
}
|
||||
|
||||
#include <vlibmemory/vlib.api.c>
|
||||
static clib_error_t *
|
||||
vlib_apis_hookup (vlib_main_t *vm)
|
||||
@ -351,9 +341,6 @@ vlib_apis_hookup (vlib_main_t *vm)
|
||||
msg_id_base = setup_message_id_table ();
|
||||
|
||||
am->is_mp_safe[VL_API_GET_NODE_GRAPH] = 1;
|
||||
am->is_mp_safe[VL_API_CONTROL_PING] = 1;
|
||||
am->is_mp_safe[VL_API_CONTROL_PING_REPLY] = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -449,31 +449,6 @@ api_get_node_graph (vat_main_t *vam)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
vl_api_control_ping_reply_t_handler (vl_api_control_ping_reply_t *mp)
|
||||
{
|
||||
vat_main_t *vam = &vat_main;
|
||||
i32 retval = ntohl (mp->retval);
|
||||
if (vam->async_mode)
|
||||
{
|
||||
vam->async_errors += (retval < 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
vam->retval = retval;
|
||||
vam->result_ready = 1;
|
||||
}
|
||||
if (vam->socket_client_main)
|
||||
vam->socket_client_main->control_pings_outstanding--;
|
||||
}
|
||||
|
||||
static int
|
||||
api_control_ping (vat_main_t *vam)
|
||||
{
|
||||
// not yet implemented
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define VL_API_LOCAL_SETUP_MESSAGE_ID_TABLE local_setup_message_id_table
|
||||
static void
|
||||
local_setup_message_id_table (vat_main_t *vam)
|
||||
|
@ -1522,6 +1522,7 @@ add_vpp_library (vatclient
|
||||
)
|
||||
|
||||
add_vat_test_library(vnet
|
||||
interface_test.c
|
||||
ip/ip_test.c
|
||||
arp/arp_test.c
|
||||
ip6-nd/ip6_nd_test.c
|
||||
|
1170
src/vnet/interface_test.c
Normal file
1170
src/vnet/interface_test.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -40,7 +40,6 @@ typedef struct
|
||||
{
|
||||
/* API message ID base */
|
||||
u16 msg_id_base;
|
||||
u32 ping_id;
|
||||
vat_main_t *vat_main;
|
||||
} ip_test_main_t;
|
||||
|
||||
@ -100,7 +99,7 @@ increment_address (vl_api_address_t *a)
|
||||
static uword
|
||||
unformat_fib_path (unformat_input_t *input, va_list *args)
|
||||
{
|
||||
vnet_main_t *vnm = va_arg (*args, vnet_main_t *);
|
||||
vat_main_t *vam = va_arg (*args, vat_main_t *);
|
||||
vl_api_fib_path_t *path = va_arg (*args, vl_api_fib_path_t *);
|
||||
u32 weight, preference;
|
||||
mpls_label_t out_label;
|
||||
@ -114,14 +113,14 @@ unformat_fib_path (unformat_input_t *input, va_list *args)
|
||||
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (input, "%U %U", unformat_vl_api_ip4_address,
|
||||
&path->nh.address.ip4, unformat_vnet_sw_interface, vnm,
|
||||
&path->nh.address.ip4, api_unformat_sw_if_index, vam,
|
||||
&path->sw_if_index))
|
||||
{
|
||||
path->proto = FIB_API_PATH_NH_PROTO_IP4;
|
||||
}
|
||||
else if (unformat (input, "%U %U", unformat_vl_api_ip6_address,
|
||||
&path->nh.address.ip6, unformat_vnet_sw_interface,
|
||||
vnm, &path->sw_if_index))
|
||||
&path->nh.address.ip6, api_unformat_sw_if_index, vam,
|
||||
&path->sw_if_index))
|
||||
{
|
||||
path->proto = FIB_API_PATH_NH_PROTO_IP6;
|
||||
}
|
||||
@ -238,7 +237,6 @@ unformat_fib_path (unformat_input_t *input, va_list *args)
|
||||
static int
|
||||
api_ip_route_add_del (vat_main_t *vam)
|
||||
{
|
||||
vnet_main_t *vnm = vnet_get_main ();
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_ip_route_add_del_t *mp;
|
||||
u32 vrf_id = 0;
|
||||
@ -274,7 +272,7 @@ api_ip_route_add_del (vat_main_t *vam)
|
||||
is_multipath = 1;
|
||||
else if (unformat (i, "seed %d", &random_seed))
|
||||
;
|
||||
else if (unformat (i, "via %U", unformat_fib_path, vnm,
|
||||
else if (unformat (i, "via %U", unformat_fib_path, vam,
|
||||
&paths[path_count]))
|
||||
{
|
||||
path_count++;
|
||||
@ -704,7 +702,6 @@ vl_api_ip_punt_redirect_v2_details_t_handler (
|
||||
static int
|
||||
api_ip_address_dump (vat_main_t *vam)
|
||||
{
|
||||
vnet_main_t *vnm = vnet_get_main ();
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_ip_address_dump_t *mp;
|
||||
vl_api_control_ping_t *mp_ping;
|
||||
@ -718,8 +715,7 @@ api_ip_address_dump (vat_main_t *vam)
|
||||
{
|
||||
if (unformat (i, "sw_if_index %d", &sw_if_index))
|
||||
sw_if_index_set = 1;
|
||||
else if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
|
||||
&sw_if_index))
|
||||
else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
|
||||
sw_if_index_set = 1;
|
||||
else if (unformat (i, "ipv4"))
|
||||
ipv4_set = 1;
|
||||
@ -1022,7 +1018,6 @@ vl_api_ip_reassembly_get_reply_t_handler (vl_api_ip_reassembly_get_reply_t *mp)
|
||||
int
|
||||
api_ip_source_and_port_range_check_interface_add_del (vat_main_t *vam)
|
||||
{
|
||||
vnet_main_t *vnm = vnet_get_main ();
|
||||
unformat_input_t *input = vam->input;
|
||||
vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
|
||||
u32 sw_if_index = ~0;
|
||||
@ -1034,8 +1029,7 @@ api_ip_source_and_port_range_check_interface_add_del (vat_main_t *vam)
|
||||
|
||||
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (input, "%U", unformat_vnet_sw_interface, vnm,
|
||||
&sw_if_index))
|
||||
if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
|
||||
;
|
||||
else if (unformat (input, "sw_if_index %d", &sw_if_index))
|
||||
;
|
||||
@ -1214,7 +1208,6 @@ api_ip_mroute_dump (vat_main_t *vam)
|
||||
static int
|
||||
api_sw_interface_ip6_enable_disable (vat_main_t *vam)
|
||||
{
|
||||
vnet_main_t *vnm = vnet_get_main ();
|
||||
unformat_input_t *i = vam->input;
|
||||
vl_api_sw_interface_ip6_enable_disable_t *mp;
|
||||
u32 sw_if_index;
|
||||
@ -1224,7 +1217,7 @@ api_sw_interface_ip6_enable_disable (vat_main_t *vam)
|
||||
|
||||
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (i, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
|
||||
if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
|
||||
sw_if_index_set = 1;
|
||||
else if (unformat (i, "sw_if_index %d", &sw_if_index))
|
||||
sw_if_index_set = 1;
|
||||
|
@ -38,6 +38,8 @@
|
||||
|
||||
#include <vlibmemory/vlib.api_enum.h>
|
||||
#include <vlibmemory/vlib.api_types.h>
|
||||
#include <vlibmemory/memclnt.api_enum.h>
|
||||
#include <vlibmemory/memclnt.api_types.h>
|
||||
|
||||
#include <vpp/api/vpe.api_enum.h>
|
||||
#include <vpp/api/vpe.api_types.h>
|
||||
|
@ -31,8 +31,8 @@
|
||||
#include <vlibapi/api_common.h>
|
||||
#include <vlibmemory/memory_client.h>
|
||||
|
||||
#include <vapi/vlib.api.vapi.h>
|
||||
#include <vapi/memclnt.api.vapi.h>
|
||||
#include <vapi/vlib.api.vapi.h>
|
||||
|
||||
/* we need to use control pings for some stuff and because we're forced to put
|
||||
* the code in headers, we need a way to be able to grab the ids of these
|
||||
|
@ -705,7 +705,7 @@ def gen_json_unified_header(parser, logger, j, io, name):
|
||||
print("#ifdef __cplusplus")
|
||||
print("extern \"C\" {")
|
||||
print("#endif")
|
||||
if name == "vlib.api.vapi.h":
|
||||
if name == "memclnt.api.vapi.h":
|
||||
print("")
|
||||
print("static inline vapi_error_e vapi_send_with_control_ping "
|
||||
"(vapi_ctx_t ctx, void * msg, u32 context);")
|
||||
|
@ -24,6 +24,8 @@
|
||||
#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/l2.api.vapi.h>
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <assert.h>
|
||||
#include <setjmp.h>
|
||||
#include <check.h>
|
||||
#include <vapi/memclnt.api.vapi.h>
|
||||
#include <vapi/vapi.hpp>
|
||||
#include <vapi/vpe.api.vapi.hpp>
|
||||
#include <vapi/interface.api.vapi.hpp>
|
||||
|
@ -1,4 +1,6 @@
|
||||
#include "vat.h"
|
||||
#include <dlfcn.h>
|
||||
#include <vat/plugin.h>
|
||||
|
||||
vat_main_t vat_main;
|
||||
|
||||
@ -93,6 +95,30 @@ vat_plugin_hash_create (void)
|
||||
vam->help_by_name = hash_create_string (0, sizeof (uword));
|
||||
}
|
||||
|
||||
static void
|
||||
vat_register_interface_dump (vat_main_t *vam)
|
||||
{
|
||||
void *handle;
|
||||
plugin_info_t *pi;
|
||||
|
||||
vec_foreach (pi, vat_plugin_main.plugin_info)
|
||||
{
|
||||
handle = dlsym (pi->handle, "api_sw_interface_dump");
|
||||
if (handle)
|
||||
{
|
||||
vam->api_sw_interface_dump = handle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!vam->api_sw_interface_dump)
|
||||
{
|
||||
fformat (stderr,
|
||||
"sw_interface_dump not found in interface_test plugin!\n");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
maybe_register_api_client (vat_main_t * vam)
|
||||
{
|
||||
@ -130,7 +156,8 @@ maybe_register_api_client (vat_main_t * vam)
|
||||
am->shmem_hdr->application_restarts);
|
||||
|
||||
vam->vl_input_queue = am->shmem_hdr->vl_input_queue;
|
||||
api_sw_interface_dump (vam);
|
||||
vat_register_interface_dump (vam);
|
||||
vam->api_sw_interface_dump (vam);
|
||||
}
|
||||
|
||||
static clib_error_t *
|
||||
@ -234,7 +261,7 @@ api_command_fn (vlib_main_t * vm,
|
||||
if (vam->regenerate_interface_table)
|
||||
{
|
||||
vam->regenerate_interface_table = 0;
|
||||
api_sw_interface_dump (vam);
|
||||
vam->api_sw_interface_dump (vam);
|
||||
}
|
||||
unformat_free (vam->input);
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user