25 #define PLUGIN_LOG_DBG(...) \ 26 do {vlib_log_debug (vlib_plugin_main.logger, __VA_ARGS__);} while(0) 27 #define PLUGIN_LOG_ERR(...) \ 28 do {vlib_log_err (vlib_plugin_main.logger, __VA_ARGS__);} while(0) 29 #define PLUGIN_LOG_NOTICE(...) \ 30 do {vlib_log_notice (vlib_plugin_main.logger, __VA_ARGS__);} while(0) 32 char *vlib_plugin_path __attribute__ ((weak));
33 char *vlib_plugin_path =
"";
48 return dlsym (pi->
handle, symbol_name);
62 while (c && ++n < len);
92 char *version_required;
93 vlib_plugin_registration_t *reg;
109 reg = (vlib_plugin_registration_t *) data;
111 if (
vec_len (data) !=
sizeof (*reg))
113 PLUGIN_LOG_ERR (
"vlib_plugin_registration size mismatch in plugin %s\n",
119 reg->default_disabled = 1;
130 if (reg->default_disabled && pc->
is_enabled == 0)
136 else if (reg->default_disabled)
143 sizeof (reg->version_required));
145 if ((strlen (version_required) > 0) &&
146 (strncmp (vlib_plugin_app_version, version_required,
147 strlen (version_required))))
150 pi->
name, vlib_plugin_app_version,
151 reg->version_required);
163 if (reg->overrides[0])
165 const char *overrides = reg->overrides;
166 u8 *override_name_copy, *overridden_by_name_copy;
170 sp = ep = (
u8 *) overrides;
175 || (sp >= (
u8 *) overrides +
ARRAY_LEN (reg->overrides)))
177 if (*sp ==
' ' || *sp ==
',')
183 while (*ep && *ep !=
' ' && *ep !=
',' &&
184 ep < (
u8 *) overrides +
ARRAY_LEN (reg->overrides))
186 if (*ep ==
' ' || *ep ==
',')
189 override_name_copy =
extract (sp, ep);
199 overridden_by_name_copy =
format (0,
"%s%c", pi->
name, 0);
201 override_name_copy, overridden_by_name_copy);
203 sp = *ep ? ep + 1 : ep;
208 handle = dlopen ((
char *) pi->
filename, RTLD_LAZY);
219 reg = dlsym (pi->
handle,
"vlib_plugin_registration");
231 sizeof (reg->version));
238 h = dlsym (pi->
handle, reg->early_init);
255 PLUGIN_LOG_ERR (
"Plugin %s: early init function %s set but not found",
256 (
char *) pi->
name, reg->early_init);
259 if (reg->description)
307 return strcmp ((
char *) p1->
name, (
char *) p2->
name);
327 struct dirent *entry;
332 uword *not_loaded_indices = 0;
337 for (i = 0; i <
vec_len (plugin_path); i++)
339 dp = opendir ((
char *) plugin_path[i]);
344 while ((entry = readdir (dp)))
357 filename =
format (0,
"%s/%s%c", plugin_path[i], entry->d_name, 0);
360 char *ext = strrchr ((
const char *) filename,
'.');
362 if (!ext || (strcmp (ext,
".so") != 0) ||
363 stat ((
char *) filename, &statb) < 0)
371 if (!S_ISREG (statb.st_mode))
374 plugin_name =
format (0,
"%s%c", entry->d_name, 0);
381 pi->
name = plugin_name;
450 for (i = 0; i <
vec_len (not_loaded_indices); i++)
452 if (i < vec_len (not_loaded_indices) - 1)
454 if (not_loaded_indices[i + 1] == not_loaded_indices[i])
463 if (vec_len (not_loaded_indices) > 0)
465 for (i = vec_len (not_loaded_indices) - 1; i >= 0; i--)
541 s =
format (s,
" %-41s%-33s%s\n",
"Plugin",
"Version",
"Description");
548 pi = vec_elt_at_index (pm->plugin_info, value);
549 s = format (s,
"%3d. %-40s %-32s %s\n", index, key, pi->version,
550 (pi->reg && pi->reg->description) ?
551 pi->reg->description :
"");
565 .path =
"show plugins",
566 .short_help =
"show loaded plugins",
580 int skip_version_check = 0;
597 else if (
unformat (input,
"disable"))
599 else if (
unformat (input,
"skip-version-check"))
600 skip_version_check = 1;
609 if (is_enable && is_disable)
612 " for plugin '%s'", name);
639 if (
unformat (input,
"%s %v", &s, &v))
641 if (strncmp ((
const char *) s,
"plugins", 8) == 0)
664 if (
unformat (input,
"path %s", &s))
666 else if (
unformat (input,
"name-filter %s", &s))
668 else if (
unformat (input,
"vat-path %s", &s))
670 else if (
unformat (input,
"vat-name-filter %s", &s))
672 else if (
unformat (input,
"plugin default %U",
676 unformat (&sub_input,
"disable") ? 1 : 0;
679 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)
u8 * format_clib_error(u8 *s, va_list *va)
static clib_error_t * plugins_config(vlib_main_t *vm, unformat_input_t *input)
uword * plugin_overrides_by_name_hash
u8 * vat_plugin_name_filter
static int plugin_name_sort_cmp(void *a1, void *a2)
#define PLUGIN_LOG_ERR(...)
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)
#define PLUGIN_LOG_DBG(...)
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...)
vlib_log_class_t vlib_log_register_class_rate_limit(char *class, char *subclass, u32 limit)
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)
static int index_cmp(void *a1, void *a2)
sll srl srl sll sra u16x4 i
#define vec_free(V)
Free vector's memory (no header).
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,...)
uword unformat_vlib_cli_sub_input(unformat_input_t *i, va_list *args)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
#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 PLUGIN_LOG_NOTICE(...)
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)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
#define clib_error_free(e)
#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)
static u8 * extract(u8 *sp, u8 *ep)
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)