diff options
author | Andrew Yourtchenko <ayourtch@gmail.com> | 2018-05-15 17:25:50 +0200 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2018-06-20 13:37:21 +0000 |
commit | 22f9fb1286d2469819cfcef68ffdc258f4d52c24 (patch) | |
tree | ed8b86ab0fedcb78c9cc83f98f417f61747736bc /src/plugins/acl/public_inlines.h | |
parent | 285434a858d2b53b15c572ad491b9ca3b40fcef3 (diff) |
acl-plugin: acl-as-a-service: VPP-1248: fix the error if exports.h included in more than one C file
Including the exports.h from multiple .c files belonging to a single plugin results in an error.
Rework the approach to require the table of function pointers to be filled in by
the initialization function.
Since the inline functions are compiled in the "caller" context,
there is no knowledge about the acl_main structure used by the ACL
plugin. To help with that, the signature of inline functions is slightly
different, taking the p_acl_main pointer as the first parameter.
That pointer is filled into the .p_acl_main field of the method
table during the initialization - since the calling of non-inline variants
would have required filling the method table, this should give
minimal headaches during the use and switch between the two methods.
Change-Id: Icb70695efa23579c46c716944838766cebc8573e
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
Diffstat (limited to 'src/plugins/acl/public_inlines.h')
-rw-r--r-- | src/plugins/acl/public_inlines.h | 154 |
1 files changed, 15 insertions, 139 deletions
diff --git a/src/plugins/acl/public_inlines.h b/src/plugins/acl/public_inlines.h index b358f640ffb..f7d7abbec0a 100644 --- a/src/plugins/acl/public_inlines.h +++ b/src/plugins/acl/public_inlines.h @@ -18,128 +18,12 @@ #include <stdint.h> +#include <vlib/unix/plugin.h> #include <plugins/acl/acl.h> #include <plugins/acl/fa_node.h> #include <plugins/acl/hash_lookup_private.h> - -/* check if a given ACL exists */ - -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS - -/* - * Define a pointer to the acl_main which will be filled during the initialization. - */ -acl_main_t *p_acl_main = 0; - -/* - * If the file is included more than once, the symbol collision will make the problem obvious. - * If the include is done only once, it is just a lonely null var - * sitting around. - */ -void *ERROR_ACL_PLUGIN_EXPORTS_FILE_MUST_BE_INCLUDED_ONLY_IN_ONE_PLACE = 0; - -u8 (*acl_plugin_acl_exists) (u32 acl_index); -#else -u8 acl_plugin_acl_exists (u32 acl_index); -#endif - - -/* - * If you are using ACL plugin, get this unique ID first, - * so you can identify yourself when creating the lookup contexts. - */ - -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS -u32 (*acl_plugin_register_user_module) (char *caller_module_string, char *val1_label, char *val2_label); -#else -u32 acl_plugin_register_user_module (char *caller_module_string, char *val1_label, char *val2_label); -#endif - -/* - * Allocate a new lookup context index. - * Supply the id assigned to your module during registration, - * and two values of your choice identifying instances - * of use within your module. They are useful for debugging. - */ -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS -int (*acl_plugin_get_lookup_context_index) (u32 acl_user_id, u32 val1, u32 val2); -#else -int acl_plugin_get_lookup_context_index (u32 acl_user_id, u32 val1, u32 val2); -#endif - -/* - * Release the lookup context index and destroy - * any asssociated data structures. - */ -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS -void (*acl_plugin_put_lookup_context_index) (u32 lc_index); -#else -void acl_plugin_put_lookup_context_index (u32 lc_index); -#endif - -/* - * Prepare the sequential vector of ACL#s to lookup within a given context. - * Any existing list will be overwritten. acl_list is a vector. - */ -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS -int (*acl_plugin_set_acl_vec_for_context) (u32 lc_index, u32 *acl_list); -#else -int acl_plugin_set_acl_vec_for_context (u32 lc_index, u32 *acl_list); -#endif - -/* Fill the 5-tuple from the packet */ - -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS -void (*acl_plugin_fill_5tuple) (u32 lc_index, vlib_buffer_t * b0, int is_ip6, int is_input, - int is_l2_path, fa_5tuple_opaque_t * p5tuple_pkt); -#else -void acl_plugin_fill_5tuple (u32 lc_index, vlib_buffer_t * b0, int is_ip6, int is_input, - int is_l2_path, fa_5tuple_opaque_t * p5tuple_pkt); -#endif - -#ifdef ACL_PLUGIN_DEFINED_BELOW_IN_FILE -static inline -void acl_plugin_fill_5tuple_inline (u32 lc_index, vlib_buffer_t * b0, int is_ip6, int is_input, - int is_l2_path, fa_5tuple_opaque_t * p5tuple_pkt) { - /* FIXME: normally the inlined version of filling in the 5-tuple. But for now just call the non-inlined version */ - acl_plugin_fill_5tuple(lc_index, b0, is_ip6, is_input, is_l2_path, p5tuple_pkt); -} -#endif - - -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS -int (*acl_plugin_match_5tuple) (u32 lc_index, - fa_5tuple_opaque_t * pkt_5tuple, - int is_ip6, u8 * r_action, - u32 * r_acl_pos_p, - u32 * r_acl_match_p, - u32 * r_rule_match_p, - u32 * trace_bitmap); -#else -int acl_plugin_match_5tuple (u32 lc_index, - fa_5tuple_opaque_t * pkt_5tuple, - int is_ip6, u8 * r_action, - u32 * r_acl_pos_p, - u32 * r_acl_match_p, - u32 * r_rule_match_p, - u32 * trace_bitmap); -#endif - -#ifdef ACL_PLUGIN_DEFINED_BELOW_IN_FILE -static inline int -acl_plugin_match_5tuple_inline (u32 lc_index, - fa_5tuple_opaque_t * pkt_5tuple, - int is_ip6, u8 * r_action, - u32 * r_acl_pos_p, - u32 * r_acl_match_p, - u32 * r_rule_match_p, - u32 * trace_bitmap) { - return acl_plugin_match_5tuple(lc_index, pkt_5tuple, is_ip6, r_action, r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); -} -#endif - -#ifdef ACL_PLUGIN_EXTERNAL_EXPORTS +#include <plugins/acl/exported_types.h> #define LOAD_SYMBOL_FROM_PLUGIN_TO(p, s, st) \ ({ \ @@ -151,22 +35,14 @@ acl_plugin_match_5tuple_inline (u32 lc_index, #define LOAD_SYMBOL(s) LOAD_SYMBOL_FROM_PLUGIN_TO("acl_plugin.so", s, s) -static inline clib_error_t * acl_plugin_exports_init (void) -{ - LOAD_SYMBOL_FROM_PLUGIN_TO("acl_plugin.so", acl_main, p_acl_main); - LOAD_SYMBOL(acl_plugin_acl_exists); - LOAD_SYMBOL(acl_plugin_register_user_module); - LOAD_SYMBOL(acl_plugin_get_lookup_context_index); - LOAD_SYMBOL(acl_plugin_put_lookup_context_index); - LOAD_SYMBOL(acl_plugin_set_acl_vec_for_context); - LOAD_SYMBOL(acl_plugin_fill_5tuple); - LOAD_SYMBOL(acl_plugin_match_5tuple); - return 0; -} - -#endif +static inline clib_error_t * acl_plugin_exports_init (acl_plugin_methods_t *m) +{ + acl_plugin_methods_vtable_init_fn_t mvi; + LOAD_SYMBOL_FROM_PLUGIN_TO("acl_plugin.so", acl_plugin_methods_vtable_init, mvi); + return (mvi(m)); +} always_inline void * get_ptr_to_offset (vlib_buffer_t * b0, int offset) @@ -367,7 +243,7 @@ acl_fill_5tuple (acl_main_t * am, u32 sw_if_index0, vlib_buffer_t * b0, int is_i } always_inline void -acl_plugin_fill_5tuple_inline (u32 lc_index, vlib_buffer_t * b0, int is_ip6, +acl_plugin_fill_5tuple_inline (void *p_acl_main, u32 lc_index, vlib_buffer_t * b0, int is_ip6, int is_input, int is_l2_path, fa_5tuple_opaque_t * p5tuple_pkt) { acl_main_t *am = p_acl_main; @@ -539,7 +415,7 @@ single_acl_match_5tuple (acl_main_t * am, u32 acl_index, fa_5tuple_t * pkt_5tupl } always_inline int -acl_plugin_single_acl_match_5tuple (u32 acl_index, fa_5tuple_t * pkt_5tuple, +acl_plugin_single_acl_match_5tuple (void *p_acl_main, u32 acl_index, fa_5tuple_t * pkt_5tuple, int is_ip6, u8 * r_action, u32 * r_acl_match_p, u32 * r_rule_match_p, u32 * trace_bitmap) { @@ -549,7 +425,7 @@ acl_plugin_single_acl_match_5tuple (u32 acl_index, fa_5tuple_t * pkt_5tuple, } always_inline int -linear_multi_acl_match_5tuple (u32 lc_index, fa_5tuple_t * pkt_5tuple, +linear_multi_acl_match_5tuple (void *p_acl_main, u32 lc_index, fa_5tuple_t * pkt_5tuple, int is_ip6, u8 *r_action, u32 *acl_pos_p, u32 * acl_match_p, u32 * rule_match_p, u32 * trace_bitmap) { @@ -702,7 +578,7 @@ multi_acl_match_get_applied_ace_index(acl_main_t *am, fa_5tuple_t *match) } always_inline int -hash_multi_acl_match_5tuple (u32 lc_index, fa_5tuple_t * pkt_5tuple, +hash_multi_acl_match_5tuple (void *p_acl_main, u32 lc_index, fa_5tuple_t * pkt_5tuple, int is_ip6, u8 *action, u32 *acl_pos_p, u32 * acl_match_p, u32 * rule_match_p, u32 * trace_bitmap) { @@ -724,7 +600,7 @@ hash_multi_acl_match_5tuple (u32 lc_index, fa_5tuple_t * pkt_5tuple, always_inline int -acl_plugin_match_5tuple_inline (u32 lc_index, +acl_plugin_match_5tuple_inline (void *p_acl_main, u32 lc_index, fa_5tuple_opaque_t * pkt_5tuple, int is_ip6, u8 * r_action, u32 * r_acl_pos_p, @@ -736,10 +612,10 @@ acl_plugin_match_5tuple_inline (u32 lc_index, fa_5tuple_t * pkt_5tuple_internal = (fa_5tuple_t *)pkt_5tuple; pkt_5tuple_internal->pkt.lc_index = lc_index; if (am->use_hash_acl_matching) { - return hash_multi_acl_match_5tuple(lc_index, pkt_5tuple_internal, is_ip6, r_action, + return hash_multi_acl_match_5tuple(p_acl_main, lc_index, pkt_5tuple_internal, is_ip6, r_action, r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); } else { - return linear_multi_acl_match_5tuple(lc_index, pkt_5tuple_internal, is_ip6, r_action, + return linear_multi_acl_match_5tuple(p_acl_main, lc_index, pkt_5tuple_internal, is_ip6, r_action, r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); } } |