Call a plugin init function by name

Use this macro to arrange init function ordering between friend
plugins.  Fails in the usual manner if the plugin doesn't exist, or if
the init function symbol is AWOL.

clib_error_t *
thisplug_init (vlib_main_t *vm)
{
  clib_error_t *error = 0;

  if ((error = vlib_plugin_init_function ("otherplug.so", otherplug_init)))
     return error;

  <etc>
  return error;
}
VLIB_INIT_FUNCTION(thisplug_init);

Change-Id: Ideecaf46bc0b1546e85096e54be8ddef87946565
Signed-off-by: Dave Barach <dave@barachs.net>
This commit is contained in:
Dave Barach
2017-11-18 08:43:06 -05:00
committed by Florin Coras
parent 1d6d085d35
commit cabbee7d8c
2 changed files with 29 additions and 0 deletions

View File

@@ -115,6 +115,32 @@ void *vlib_get_plugin_symbol (char *plugin_name, char *symbol_name);
vlib_plugin_registration_t vlib_plugin_registration \
__attribute__((__section__(".vlib_plugin_registration")))
/* Call a plugin init function: used for init function dependencies. */
#define vlib_call_plugin_init_function(vm,p,x) \
({ \
clib_error_t *(*_f)(vlib_main_t *); \
uword *_fptr = 0; \
clib_error_t * _error = 0; \
_fptr= vlib_get_plugin_symbol \
(p, CLIB_STRING_MACRO(_vlib_init_function_##x)); \
if (_fptr == 0) \
{ \
_error = clib_error_return \
(0, "Plugin %s and/or symbol %s not found.", \
p, CLIB_STRING_MACRO(_vlib_init_function_##x)); \
} \
else \
{ \
_f = (void *)(_fptr[0]); \
} \
if (_fptr && ! hash_get (vm->init_functions_called, _f)) \
{ \
hash_set1 (vm->init_functions_called, _f); \
_error = _f (vm); \
} \
_error; \
})
#endif /* __included_plugin_h__ */
/*

View File

@@ -78,6 +78,9 @@
#define CLIB_PACKED(x) x __attribute__ ((packed))
#define CLIB_UNUSED(x) x __attribute__ ((unused))
/* Make a string from the macro's argument */
#define CLIB_STRING_MACRO(x) #x
#define __clib_unused __attribute__ ((unused))
#define __clib_weak __attribute__ ((weak))
#define __clib_packed __attribute__ ((packed))