25 char *vlib_plugin_path __attribute__ ((weak));
26 char *vlib_plugin_path =
"";
41 return dlsym (pi->
handle, symbol_name);
55 while (c && ++n < len);
71 char *version_required;
72 vlib_plugin_registration_t *reg;
88 reg = (vlib_plugin_registration_t *) data;
90 if (
vec_len (data) !=
sizeof (*reg))
92 clib_warning (
"vlib_plugin_registration size mismatch in plugin %s\n",
98 reg->default_disabled = 1;
109 if (reg->default_disabled && pc->
is_enabled == 0)
115 else if (reg->default_disabled)
122 sizeof (reg->version_required));
124 if ((strlen (version_required) > 0) &&
125 (strncmp (vlib_plugin_app_version, version_required,
126 strlen (version_required))))
129 pi->
name, vlib_plugin_app_version, reg->version_required);
141 handle = dlopen ((
char *) pi->
filename, RTLD_LAZY);
152 reg = dlsym (pi->
handle,
"vlib_plugin_registration");
164 sizeof (reg->version));
171 h = dlsym (pi->
handle, reg->early_init);
184 clib_warning (
"Plugin %s: early init function %s set but not found",
185 (
char *) pi->
name, reg->early_init);
188 if (reg->description)
233 return strcmp ((
char *) p1->
name, (
char *) p2->
name);
240 struct dirent *entry;
245 u32 *load_fail_indices = 0;
250 for (i = 0; i <
vec_len (plugin_path); i++)
252 dp = opendir ((
char *) plugin_path[i]);
257 while ((entry = readdir (dp)))
270 filename =
format (0,
"%s/%s%c", plugin_path[i], entry->d_name, 0);
273 char *ext = strrchr ((
const char *) filename,
'.');
275 if (!ext || (strcmp (ext,
".so") != 0) ||
276 stat ((
char *) filename, &statb) < 0)
284 if (!S_ISREG (statb.st_mode))
287 plugin_name =
format (0,
"%s%c", entry->d_name, 0);
294 pi->
name = plugin_name;
335 if (vec_len (load_fail_indices) > 0)
337 for (i = vec_len (load_fail_indices) - 1; i >= 0; i--)
395 s =
format (s,
" %-41s%-33s%s\n",
"Plugin",
"Version",
"Description");
402 pi = vec_elt_at_index (pm->plugin_info, value);
403 s = format (s,
"%3d. %-40s %-32s %s\n", index, key, pi->version,
404 pi->reg->description ? pi->reg->description :
"");
418 .path =
"show plugins",
419 .short_help =
"show loaded plugins",
433 int skip_version_check = 0;
450 else if (
unformat (input,
"disable"))
452 else if (
unformat (input,
"skip-version-check"))
453 skip_version_check = 1;
462 if (is_enable && is_disable)
465 " for plugin '%s'", name);
492 if (
unformat (input,
"%s %v", &s, &v))
494 if (strncmp ((
const char *) s,
"plugins", 8) == 0)
517 if (
unformat (input,
"path %s", &s))
519 else if (
unformat (input,
"name-filter %s", &s))
521 else if (
unformat (input,
"vat-path %s", &s))
523 else if (
unformat (input,
"vat-name-filter %s", &s))
525 else if (
unformat (input,
"plugin default %U",
529 unformat (&sub_input,
"disable") ? 1 : 0;
532 else if (
unformat (input,
"plugin %s %U", &s,
u8 * vlib_get_vat_plugin_name_filter(void)
static void elf_main_free(elf_main_t *em)
static clib_error_t * plugins_config(vlib_main_t *vm, unformat_input_t *input)
u8 * vat_plugin_name_filter
static int plugin_name_sort_cmp(void *a1, void *a2)
u8 * vlib_get_vat_plugin_path(void)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
clib_error_t * vlib_plugin_config(vlib_main_t *vm, unformat_input_t *input)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
#define hash_set_mem(h, key, value)
uword * config_index_by_name
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
static int load_one_plugin(plugin_main_t *pm, plugin_info_t *pi, int from_early_init)
vlib_plugin_registration_t * reg
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define clib_error_return(e, args...)
int vlib_plugin_early_init(vlib_main_t *vm)
#define hash_create_string(elts, value_bytes)
#define hash_unset_mem(h, key)
#define VLIB_CONFIG_FUNCTION(x, n,...)
plugin_info_t * plugin_info
#define hash_foreach_mem(key_var, value_var, h, body)
#define vec_free(V)
Free vector's memory (no header).
#define clib_warning(format, args...)
clib_error_t * elf_read_file(elf_main_t *em, char *file_name)
char * vlib_plugin_app_version
static clib_error_t * config_one_plugin(vlib_main_t *vm, char *name, unformat_input_t *input)
#define VLIB_CLI_COMMAND(x,...)
#define vec_delete(V, N, M)
Delete N elements starting at element M.
static void * elf_get_section_contents(elf_main_t *em, uword section_index, uword elt_size)
#define clib_error_report(e)
int vlib_load_new_plugins(plugin_main_t *pm, int from_early_init)
void * vlib_get_plugin_symbol(char *plugin_name, char *symbol_name)
static u8 ** split_plugin_path(plugin_main_t *pm)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
uword unformat_vlib_cli_sub_input(unformat_input_t *i, va_list *args)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
#define hash_get_mem(h, key)
plugin_config_t * configs
clib_error_t * elf_get_section_by_name(elf_main_t *em, char *section_name, elf_section_t **result)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static char * str_array_to_vec(char *array, int len)
plugin_main_t vlib_plugin_main
uword * plugin_by_name_hash
u8 plugins_default_disable
static clib_error_t * vlib_plugins_show_cmd_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)