summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vlib/unix/plugin.h26
-rw-r--r--src/vppinfra/clib.h3
2 files changed, 29 insertions, 0 deletions
diff --git a/src/vlib/unix/plugin.h b/src/vlib/unix/plugin.h
index d9801ec439a..52da7436e61 100644
--- a/src/vlib/unix/plugin.h
+++ b/src/vlib/unix/plugin.h
@@ -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__ */
/*
diff --git a/src/vppinfra/clib.h b/src/vppinfra/clib.h
index 33db3b203f9..0d059a0778b 100644
--- a/src/vppinfra/clib.h
+++ b/src/vppinfra/clib.h
@@ -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))