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/lookup_context.c | |
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/lookup_context.c')
-rw-r--r-- | src/plugins/acl/lookup_context.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/src/plugins/acl/lookup_context.c b/src/plugins/acl/lookup_context.c index 4af9847a3ba..e92642a690a 100644 --- a/src/plugins/acl/lookup_context.c +++ b/src/plugins/acl/lookup_context.c @@ -15,13 +15,23 @@ #include <plugins/acl/acl.h> #include <plugins/acl/fa_node.h> -#include <plugins/acl/public_inlines.h> #include <vlib/unix/plugin.h> +#include <plugins/acl/public_inlines.h> #include "hash_lookup.h" #include "elog_acl_trace.h" /* check if a given ACL exists */ -u8 acl_plugin_acl_exists (u32 acl_index); +static u8 +acl_plugin_acl_exists (u32 acl_index) +{ + acl_main_t *am = &acl_main; + + if (pool_is_free_index (am->acls, acl_index)) + return 0; + + return 1; +} + static u32 get_acl_user_id(acl_main_t *am, char *user_module_name, char *val1_label, char *val2_label) { @@ -64,7 +74,7 @@ static int acl_lc_index_valid(acl_main_t *am, u32 lc_index) * so you can identify yourself when creating the lookup contexts. */ -u32 acl_plugin_register_user_module (char *user_module_name, char *val1_label, char *val2_label) +static u32 acl_plugin_register_user_module (char *user_module_name, char *val1_label, char *val2_label) { acl_main_t *am = &acl_main; void *oldheap = acl_plugin_set_heap(); @@ -81,7 +91,7 @@ u32 acl_plugin_register_user_module (char *user_module_name, char *val1_label, c * If >= 0 - context id. If < 0 - error code. */ -int acl_plugin_get_lookup_context_index (u32 acl_user_id, u32 val1, u32 val2) +static int acl_plugin_get_lookup_context_index (u32 acl_user_id, u32 val1, u32 val2) { acl_main_t *am = &acl_main; acl_lookup_context_t *acontext; @@ -171,7 +181,7 @@ unapply_acl_vec(u32 lc_index, u32 *acls) * Release the lookup context index and destroy * any asssociated data structures. */ -void acl_plugin_put_lookup_context_index (u32 lc_index) +static void acl_plugin_put_lookup_context_index (u32 lc_index) { acl_main_t *am = &acl_main; @@ -199,7 +209,7 @@ void acl_plugin_put_lookup_context_index (u32 lc_index) * Prepare the sequential vector of ACL#s to lookup within a given context. * Any existing list will be overwritten. acl_list is a vector. */ -int acl_plugin_set_acl_vec_for_context (u32 lc_index, u32 *acl_list) +static int acl_plugin_set_acl_vec_for_context (u32 lc_index, u32 *acl_list) { int rv = 0; uword *seen_acl_bitmap = 0; @@ -274,13 +284,13 @@ void acl_plugin_lookup_context_notify_acl_change(u32 acl_num) /* Fill the 5-tuple from the packet */ -void acl_plugin_fill_5tuple (u32 lc_index, vlib_buffer_t * b0, int is_ip6, int is_input, +static 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) { - acl_plugin_fill_5tuple_inline(lc_index, b0, is_ip6, is_input, is_l2_path, p5tuple_pkt); + acl_plugin_fill_5tuple_inline(&acl_main, lc_index, b0, is_ip6, is_input, is_l2_path, p5tuple_pkt); } -int acl_plugin_match_5tuple (u32 lc_index, +static 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, @@ -288,7 +298,7 @@ int acl_plugin_match_5tuple (u32 lc_index, u32 * r_rule_match_p, u32 * trace_bitmap) { - return acl_plugin_match_5tuple_inline (lc_index, pkt_5tuple, is_ip6, r_action, r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); + return acl_plugin_match_5tuple_inline (&acl_main, lc_index, pkt_5tuple, is_ip6, r_action, r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); } @@ -341,3 +351,18 @@ acl_plugin_show_lookup_context (u32 lc_index) } })); } + +void * +acl_plugin_get_p_acl_main(void) +{ + return &acl_main; +} + +clib_error_t *acl_plugin_methods_vtable_init(acl_plugin_methods_t *m) +{ + m->p_acl_main = &acl_main; +#define _(name) m->name = acl_plugin_ ## name; clib_warning("Setting method " #name " to %p\n", acl_plugin_ ## name); + foreach_acl_plugin_exported_method_name +#undef _ + return 0; +} |