* limitations under the License.
*/
#include "vat.h"
+#include <dlfcn.h>
#include "plugin.h"
#include <signal.h>
#include <limits.h>
return 0;
}
-vlib_main_t vlib_global_main;
-vlib_main_t **vlib_mains;
+/* *INDENT-OFF* */
+
+vlib_global_main_t vlib_global_main;
+
void
vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...)
{
clib_warning ("BUG");
}
-
static u8 *
format_api_error (u8 * s, va_list * args)
{
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 */
return;
*p = 0;
- s = format (0, "%s/lib/" CLIB_TARGET_TRIPLET "/vpp_api_test_plugins:"
- "%s/lib/vpp_api_test_plugins", path, path);
+ s = format (0, "%s/" CLIB_LIB_DIR "/vpp_api_test_plugins", path, path);
vec_add1 (s, 0);
vat_plugin_path = (char *) s;
}
}
}
+static inline clib_error_t *
+call_init_exit_functions_internal (vlib_main_t *vm,
+ _vlib_init_function_list_elt_t **headp,
+ int call_once, int do_sort, int is_global)
+{
+ vlib_global_main_t *vgm = vlib_get_global_main ();
+ clib_error_t *error = 0;
+ _vlib_init_function_list_elt_t *i;
+
+ ASSERT (is_global == 1);
+
+#if 0
+ /* Not worth copying the topological sort code */
+ if (do_sort && (error = vlib_sort_init_exit_functions (headp)))
+ return (error);
+#endif
+
+ i = *headp;
+ while (i)
+ {
+ if (call_once && !hash_get (vgm->init_functions_called, i->f))
+ {
+ if (call_once)
+ hash_set1 (vgm->init_functions_called, i->f);
+ error = i->f (vm);
+ if (error)
+ return error;
+ }
+ i = i->next_init_function;
+ }
+ return error;
+}
+
+clib_error_t *
+vlib_call_init_exit_functions (vlib_main_t *vm,
+ _vlib_init_function_list_elt_t **headp,
+ int call_once, int is_global)
+{
+ return call_init_exit_functions_internal (vm, headp, call_once,
+ 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)
{
+ vlib_global_main_t *vgm = vlib_get_global_main ();
vat_main_t *vam = &vat_main;
unformat_input_t _argv, *a = &_argv;
u8 **input_files = 0;
u8 json_output = 0;
int i;
f64 timeout;
+ clib_error_t *error;
+ vlib_main_t *vm;
clib_mem_init_thread_safe (0, 128 << 20);
+ vlib_main_init ();
+ vm = vlib_get_first_main ();
clib_macro_init (&vam->macro_main);
clib_macro_add_builtin (&vam->macro_main, "current_file",
vam->json_output = json_output;
- if (!json_output)
- api_sw_interface_dump (vam);
-
vec_validate (vam->inbuf, 4096);
load_features ();
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);
+
+ /* Execute plugin init and api_init functions */
+ error = vlib_call_init_exit_functions (vm, &vgm->init_function_registrations,
+ 1 /* call once */, 1 /* is_global*/);
+
+ if (error)
+ clib_error_report (error);
+
+ error =
+ vlib_call_init_exit_functions (vm, &vgm->api_init_function_registrations,
+ 1 /* call_once */, 1 /* is_global */);
+
+ if (error)
+ clib_error_report (error);
+
for (i = 0; i < vec_len (input_files); i++)
{
vam->ifp = fopen ((char *) input_files[i], "r");