diff options
-rw-r--r-- | src/plugins/unittest/api_fuzz_test.c | 8 | ||||
-rw-r--r-- | src/vlibapi/api.h | 4 | ||||
-rw-r--r-- | src/vlibapi/api_common.h | 1 | ||||
-rw-r--r-- | src/vlibapi/api_shared.c | 161 | ||||
-rw-r--r-- | src/vlibmemory/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/vlibmemory/memory_api.c | 147 |
6 files changed, 153 insertions, 170 deletions
diff --git a/src/plugins/unittest/api_fuzz_test.c b/src/plugins/unittest/api_fuzz_test.c index 113835300bb..9cf767a5ccd 100644 --- a/src/plugins/unittest/api_fuzz_test.c +++ b/src/plugins/unittest/api_fuzz_test.c @@ -27,7 +27,7 @@ static u32 fuzz_seed = 0xdeaddabe; static u16 fuzz_first; static u16 fuzz_cli_first, fuzz_cli_last; -extern void (*vl_msg_api_fuzz_hook) (u16, void *); +extern void (*vl_mem_api_fuzz_hook) (u16, void *); static void fuzz_hook (u16 id, void *the_msg) @@ -114,10 +114,10 @@ test_api_fuzz_command_fn (vlib_main_t * vm, if (fuzz_first == 0xFFFF) { - vl_msg_api_fuzz_hook = 0; + vl_mem_api_fuzz_hook = 0; return clib_error_return (0, "fuzz_first is ~0, fuzzing disabled"); } - vl_msg_api_fuzz_hook = fuzz_hook; + vl_mem_api_fuzz_hook = fuzz_hook; vlib_cli_output (vm, "Fuzzing enabled: first %d, skip cli range %d - %d", (u32) fuzz_first, (u32) fuzz_cli_first, @@ -172,7 +172,7 @@ api_fuzz_api_init (vlib_main_t * vm) (0, "Couldn't find 'memclnt_keepalive_reply' ID"); } /* Turn on fuzzing */ - vl_msg_api_fuzz_hook = fuzz_hook; + vl_mem_api_fuzz_hook = fuzz_hook; return 0; } diff --git a/src/vlibapi/api.h b/src/vlibapi/api.h index d05395a213c..d290301f8d4 100644 --- a/src/vlibapi/api.h +++ b/src/vlibapi/api.h @@ -105,10 +105,6 @@ int vl_msg_api_trace_onoff (api_main_t * am, vl_api_trace_which_t which, int vl_msg_api_trace_free (api_main_t * am, vl_api_trace_which_t which); int vl_msg_api_trace_configure (api_main_t * am, vl_api_trace_which_t which, u32 nitems); -void vl_msg_api_handler_with_vm_node (api_main_t * am, svm_region_t * vlib_rp, - void *the_msg, vlib_main_t * vm, - vlib_node_runtime_t * node, - u8 is_private); u32 vl_msg_api_max_length (void *mp); vl_api_trace_t *vl_msg_api_trace_get (api_main_t * am, vl_api_trace_which_t which); diff --git a/src/vlibapi/api_common.h b/src/vlibapi/api_common.h index 6b36314e7bb..122f402d5f7 100644 --- a/src/vlibapi/api_common.h +++ b/src/vlibapi/api_common.h @@ -402,7 +402,6 @@ typedef struct api_main_t } api_main_t; extern __thread api_main_t *my_api_main; -extern api_main_t api_global_main; always_inline api_main_t * vlibapi_get_main (void) diff --git a/src/vlibapi/api_shared.c b/src/vlibapi/api_shared.c index f11344e6e66..77278431fb7 100644 --- a/src/vlibapi/api_shared.c +++ b/src/vlibapi/api_shared.c @@ -33,12 +33,11 @@ #include <vppinfra/callback.h> /* *INDENT-OFF* */ -api_main_t api_global_main = - { - .region_name = "/unset", - .api_uid = -1, - .api_gid = -1, - }; +static api_main_t api_global_main = { + .region_name = "/unset", + .api_uid = -1, + .api_gid = -1, +}; /* *INDENT-ON* */ /* Please use vlibapi_get_main() to access my_api_main */ @@ -644,156 +643,6 @@ msg_handler_internal (api_main_t *am, void *the_msg, uword msg_len, } } -void (*vl_msg_api_fuzz_hook) (u16, void *); - -/* This is only to be called from a vlib/vnet app */ -void -vl_msg_api_handler_with_vm_node (api_main_t * am, svm_region_t * vlib_rp, - void *the_msg, vlib_main_t * vm, - vlib_node_runtime_t * node, u8 is_private) -{ - u16 id = clib_net_to_host_u16 (*((u16 *) the_msg)); - u8 *(*handler) (void *, void *, void *); - u8 *(*print_fp) (void *, void *); - svm_region_t *old_vlib_rp; - void *save_shmem_hdr; - int is_mp_safe = 1; - - if (PREDICT_FALSE (am->elog_trace_api_messages)) - { - /* *INDENT-OFF* */ - ELOG_TYPE_DECLARE (e) = - { - .format = "api-msg: %s", - .format_args = "T4", - }; - /* *INDENT-ON* */ - struct - { - u32 c; - } *ed; - ed = ELOG_DATA (am->elog_main, e); - if (id < vec_len (am->msg_names) && am->msg_names[id]) - ed->c = elog_string (am->elog_main, (char *) am->msg_names[id]); - else - ed->c = elog_string (am->elog_main, "BOGUS"); - } - - if (id < vec_len (am->msg_handlers) && am->msg_handlers[id]) - { - handler = (void *) am->msg_handlers[id]; - - if (PREDICT_FALSE (am->rx_trace && am->rx_trace->enabled)) - vl_msg_api_trace (am, am->rx_trace, the_msg); - - if (PREDICT_FALSE (am->msg_print_flag)) - { - fformat (stdout, "[%d]: %s\n", id, am->msg_names[id]); - print_fp = (void *) am->msg_print_handlers[id]; - if (print_fp == 0) - { - fformat (stdout, " [no registered print fn for msg %d]\n", id); - } - else - { - (*print_fp) (the_msg, vm); - } - } - is_mp_safe = am->is_mp_safe[id]; - - if (!is_mp_safe) - { - vl_msg_api_barrier_trace_context (am->msg_names[id]); - vl_msg_api_barrier_sync (); - } - if (is_private) - { - old_vlib_rp = am->vlib_rp; - save_shmem_hdr = am->shmem_hdr; - am->vlib_rp = vlib_rp; - am->shmem_hdr = (void *) vlib_rp->user_ctx; - } - - if (PREDICT_FALSE (vl_msg_api_fuzz_hook != 0)) - (*vl_msg_api_fuzz_hook) (id, the_msg); - - if (am->is_autoendian[id]) - { - void (*endian_fp) (void *); - endian_fp = am->msg_endian_handlers[id]; - (*endian_fp) (the_msg); - } - if (PREDICT_FALSE (vec_len (am->perf_counter_cbs) != 0)) - clib_call_callbacks (am->perf_counter_cbs, am, id, 0 /* before */ ); - - (*handler) (the_msg, vm, node); - - if (PREDICT_FALSE (vec_len (am->perf_counter_cbs) != 0)) - clib_call_callbacks (am->perf_counter_cbs, am, id, 1 /* after */ ); - if (is_private) - { - am->vlib_rp = old_vlib_rp; - am->shmem_hdr = save_shmem_hdr; - } - if (!is_mp_safe) - vl_msg_api_barrier_release (); - } - else - { - clib_warning ("no handler for msg id %d", id); - } - - /* - * Special-case, so we can e.g. bounce messages off the vnet - * main thread without copying them... - */ - if (id >= vec_len (am->message_bounce) || !(am->message_bounce[id])) - { - if (is_private) - { - old_vlib_rp = am->vlib_rp; - save_shmem_hdr = am->shmem_hdr; - am->vlib_rp = vlib_rp; - am->shmem_hdr = (void *) vlib_rp->user_ctx; - } - vl_msg_api_free (the_msg); - if (is_private) - { - am->vlib_rp = old_vlib_rp; - am->shmem_hdr = save_shmem_hdr; - } - } - - if (PREDICT_FALSE (am->elog_trace_api_messages)) - { - /* *INDENT-OFF* */ - ELOG_TYPE_DECLARE (e) = - { - .format = "api-msg-done(%s): %s", - .format_args = "t4T4", - .n_enum_strings = 2, - .enum_strings = - { - "barrier", - "mp-safe", - } - }; - /* *INDENT-ON* */ - - struct - { - u32 barrier; - u32 c; - } *ed; - ed = ELOG_DATA (am->elog_main, e); - if (id < vec_len (am->msg_names) && am->msg_names[id]) - ed->c = elog_string (am->elog_main, (char *) am->msg_names[id]); - else - ed->c = elog_string (am->elog_main, "BOGUS"); - ed->barrier = is_mp_safe; - } -} - void vl_msg_api_handler (void *the_msg, uword msg_len) { diff --git a/src/vlibmemory/CMakeLists.txt b/src/vlibmemory/CMakeLists.txt index 488a0d7b827..d14e9cad954 100644 --- a/src/vlibmemory/CMakeLists.txt +++ b/src/vlibmemory/CMakeLists.txt @@ -15,8 +15,6 @@ add_vpp_library (vlibmemory SOURCES memory_api.c memory_shared.c - memory_client.c - socket_client.c socket_api.c memclnt_api.c vlib_api_cli.c diff --git a/src/vlibmemory/memory_api.c b/src/vlibmemory/memory_api.c index 6c066a152f4..a16110f2fa1 100644 --- a/src/vlibmemory/memory_api.c +++ b/src/vlibmemory/memory_api.c @@ -674,6 +674,147 @@ vl_mem_api_dead_client_scan (api_main_t * am, vl_shmem_hdr_t * shm, f64 now) } } +void (*vl_mem_api_fuzz_hook) (u16, void *); + +/* This is only to be called from a vlib/vnet app */ +static void +vl_mem_api_handler_with_vm_node (api_main_t *am, svm_region_t *vlib_rp, + void *the_msg, vlib_main_t *vm, + vlib_node_runtime_t *node, u8 is_private) +{ + u16 id = clib_net_to_host_u16 (*((u16 *) the_msg)); + u8 *(*handler) (void *, void *, void *); + u8 *(*print_fp) (void *, void *); + svm_region_t *old_vlib_rp; + void *save_shmem_hdr; + int is_mp_safe = 1; + + if (PREDICT_FALSE (am->elog_trace_api_messages)) + { + ELOG_TYPE_DECLARE (e) = { + .format = "api-msg: %s", + .format_args = "T4", + }; + struct + { + u32 c; + } * ed; + ed = ELOG_DATA (am->elog_main, e); + if (id < vec_len (am->msg_names) && am->msg_names[id]) + ed->c = elog_string (am->elog_main, (char *) am->msg_names[id]); + else + ed->c = elog_string (am->elog_main, "BOGUS"); + } + + if (id < vec_len (am->msg_handlers) && am->msg_handlers[id]) + { + handler = (void *) am->msg_handlers[id]; + + if (PREDICT_FALSE (am->rx_trace && am->rx_trace->enabled)) + vl_msg_api_trace (am, am->rx_trace, the_msg); + + if (PREDICT_FALSE (am->msg_print_flag)) + { + fformat (stdout, "[%d]: %s\n", id, am->msg_names[id]); + print_fp = (void *) am->msg_print_handlers[id]; + if (print_fp == 0) + { + fformat (stdout, " [no registered print fn for msg %d]\n", id); + } + else + { + (*print_fp) (the_msg, vm); + } + } + is_mp_safe = am->is_mp_safe[id]; + + if (!is_mp_safe) + { + vl_msg_api_barrier_trace_context (am->msg_names[id]); + vl_msg_api_barrier_sync (); + } + if (is_private) + { + old_vlib_rp = am->vlib_rp; + save_shmem_hdr = am->shmem_hdr; + am->vlib_rp = vlib_rp; + am->shmem_hdr = (void *) vlib_rp->user_ctx; + } + + if (PREDICT_FALSE (vl_mem_api_fuzz_hook != 0)) + (*vl_mem_api_fuzz_hook) (id, the_msg); + + if (am->is_autoendian[id]) + { + void (*endian_fp) (void *); + endian_fp = am->msg_endian_handlers[id]; + (*endian_fp) (the_msg); + } + if (PREDICT_FALSE (vec_len (am->perf_counter_cbs) != 0)) + clib_call_callbacks (am->perf_counter_cbs, am, id, 0 /* before */); + + (*handler) (the_msg, vm, node); + + if (PREDICT_FALSE (vec_len (am->perf_counter_cbs) != 0)) + clib_call_callbacks (am->perf_counter_cbs, am, id, 1 /* after */); + if (is_private) + { + am->vlib_rp = old_vlib_rp; + am->shmem_hdr = save_shmem_hdr; + } + if (!is_mp_safe) + vl_msg_api_barrier_release (); + } + else + { + clib_warning ("no handler for msg id %d", id); + } + + /* + * Special-case, so we can e.g. bounce messages off the vnet + * main thread without copying them... + */ + if (id >= vec_len (am->message_bounce) || !(am->message_bounce[id])) + { + if (is_private) + { + old_vlib_rp = am->vlib_rp; + save_shmem_hdr = am->shmem_hdr; + am->vlib_rp = vlib_rp; + am->shmem_hdr = (void *) vlib_rp->user_ctx; + } + vl_msg_api_free (the_msg); + if (is_private) + { + am->vlib_rp = old_vlib_rp; + am->shmem_hdr = save_shmem_hdr; + } + } + + if (PREDICT_FALSE (am->elog_trace_api_messages)) + { + ELOG_TYPE_DECLARE (e) = { .format = "api-msg-done(%s): %s", + .format_args = "t4T4", + .n_enum_strings = 2, + .enum_strings = { + "barrier", + "mp-safe", + } }; + + struct + { + u32 barrier; + u32 c; + } * ed; + ed = ELOG_DATA (am->elog_main, e); + if (id < vec_len (am->msg_names) && am->msg_names[id]) + ed->c = elog_string (am->elog_main, (char *) am->msg_names[id]); + else + ed->c = elog_string (am->elog_main, "BOGUS"); + ed->barrier = is_mp_safe; + } +} + static inline int void_mem_api_handle_msg_i (api_main_t * am, svm_region_t * vlib_rp, vlib_main_t * vm, vlib_node_runtime_t * node, @@ -687,7 +828,7 @@ void_mem_api_handle_msg_i (api_main_t * am, svm_region_t * vlib_rp, if (!svm_queue_sub2 (q, (u8 *) & mp)) { VL_MSG_API_UNPOISON ((void *) mp); - vl_msg_api_handler_with_vm_node (am, vlib_rp, (void *) mp, vm, node, + vl_mem_api_handler_with_vm_node (am, vlib_rp, (void *) mp, vm, node, is_private); return 0; } @@ -737,8 +878,8 @@ vl_mem_api_handle_rpc (vlib_main_t * vm, vlib_node_runtime_t * node) for (i = 0; i < vec_len (vm->processing_rpc_requests); i++) { mp = vm->processing_rpc_requests[i]; - vl_msg_api_handler_with_vm_node (am, am->vlib_rp, (void *) mp, vm, - node, 0 /* is_private */ ); + vl_mem_api_handler_with_vm_node (am, am->vlib_rp, (void *) mp, vm, + node, 0 /* is_private */); } vl_msg_api_barrier_release (); } |