X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlibmemory%2Fvlib_api.c;h=f9ed891f90ae72f070a8f1236f6bab8cc6ff4271;hb=06111a837;hp=16e6402d9f0093c68e7c94dfc779d28c85fe89d3;hpb=f6c68d74eca9038516986254846de60a4f7c02ae;p=vpp.git diff --git a/src/vlibmemory/vlib_api.c b/src/vlibmemory/vlib_api.c index 16e6402d9f0..f9ed891f90a 100644 --- a/src/vlibmemory/vlib_api.c +++ b/src/vlibmemory/vlib_api.c @@ -68,36 +68,13 @@ vl_api_trace_plugin_msg_ids_t_print (vl_api_trace_plugin_msg_ids_t * a, #include #undef vl_endianfun -u8 * -vl_api_serialize_message_table (api_main_t * am, u8 * vector) -{ - serialize_main_t _sm, *sm = &_sm; - hash_pair_t *hp; - u32 nmsg = hash_elts (am->msg_index_by_name_and_crc); - - serialize_open_vector (sm, vector); - - /* serialize the count */ - serialize_integer (sm, nmsg, sizeof (u32)); - - /* *INDENT-OFF* */ - hash_foreach_pair (hp, am->msg_index_by_name_and_crc, - ({ - serialize_likely_small_unsigned_integer (sm, hp->value[0]); - serialize_cstring (sm, (char *) hp->key); - })); - /* *INDENT-ON* */ - - return serialize_close_vector (sm); -} - static void vl_api_get_first_msg_id_t_handler (vl_api_get_first_msg_id_t * mp) { vl_api_get_first_msg_id_reply_t *rmp; vl_api_registration_t *regp; uword *p; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); vl_api_msg_range_t *rp; u8 name[64]; u16 first_msg_id = ~0; @@ -131,7 +108,7 @@ out: void vl_api_api_versions_t_handler (vl_api_api_versions_t * mp) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); vl_api_api_versions_reply_t *rmp; vl_api_registration_t *reg; u32 nmsg = vec_len (am->api_version_list); @@ -208,7 +185,7 @@ static void send_one_plugin_msg_ids_msg (u8 * name, u16 first_msg_id, u16 last_msg_id) { vl_api_trace_plugin_msg_ids_t *mp; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); vl_shmem_hdr_t *shmem_hdr = am->shmem_hdr; svm_queue_t *q; @@ -230,7 +207,7 @@ void vl_api_save_msg_table (void) { u8 *serialized_message_table; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); u8 *chroot_file; int fd, rv; @@ -271,16 +248,24 @@ vl_api_save_msg_table (void) vec_free (serialized_message_table); } +clib_error_t *vat_builtin_main_init (vlib_main_t * vm) __attribute__ ((weak)); +clib_error_t * +vat_builtin_main_init (vlib_main_t * vm) +{ + return 0; +} + static uword vl_api_clnt_process (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * f) { + vlib_global_main_t *vgm = vlib_get_global_main (); int private_segment_rotor = 0, i, rv; vl_socket_args_for_process_t *a; vl_shmem_hdr_t *shm; svm_queue_t *q; clib_error_t *e; - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); f64 dead_client_scan_time; f64 sleep_time, start_time; f64 vector_rate; @@ -305,8 +290,12 @@ vl_api_clnt_process (vlib_main_t * vm, vlib_node_runtime_t * node, shm = am->shmem_hdr; q = shm->vl_input_queue; - e = vlib_call_init_exit_functions - (vm, vm->api_init_function_registrations, 1 /* call_once */ ); + e = vlib_call_init_exit_functions (vm, &vgm->api_init_function_registrations, + 1 /* call_once */, 1 /* is_global */); + if (e) + clib_error_report (e); + + e = vat_builtin_main_init (vm); if (e) clib_error_report (e); @@ -342,7 +331,7 @@ vl_api_clnt_process (vlib_main_t * vm, vlib_node_runtime_t * node, * of the application to process the request, the client will * sit and wait for Godot... */ - vector_rate = vlib_last_vector_length_per_node (vm); + vector_rate = (f64) vlib_last_vectors_per_main_loop (vm); start_time = vlib_time_now (vm); while (1) { @@ -408,9 +397,16 @@ vl_api_clnt_process (vlib_main_t * vm, vlib_node_runtime_t * node, case SOCKET_READ_EVENT: for (i = 0; i < vec_len (event_data); i++) { + vl_api_registration_t *regp; + a = pool_elt_at_index (socket_main.process_args, event_data[i]); - vl_socket_process_api_msg (a->clib_file, a->regp, - (i8 *) a->data); + regp = vl_socket_get_registration (a->reg_index); + if (regp) + { + vl_socket_process_api_msg (regp, (i8 *) a->data); + a = pool_elt_at_index (socket_main.process_args, + event_data[i]); + } vec_free (a->data); pool_put (socket_main.process_args, a); } @@ -441,6 +437,7 @@ VLIB_REGISTER_NODE (vl_api_clnt_node) = .type = VLIB_NODE_TYPE_PROCESS, .name = "api-rx-from-ring", .state = VLIB_NODE_STATE_DISABLED, + .process_log2_n_stack_bytes = 18, }; /* *INDENT-ON* */ @@ -464,7 +461,7 @@ api_rx_from_node (vlib_main_t * vm, vec_validate (long_msg, 4095); n_left_from = frame->n_vectors; - from = vlib_frame_args (frame); + from = vlib_frame_vector_args (frame); while (n_left_from > 0) { @@ -498,7 +495,7 @@ api_rx_from_node (vlib_main_t * vm, } /* Free what we've been given. */ - vlib_buffer_free (vm, vlib_frame_args (frame), n_packets); + vlib_buffer_free (vm, vlib_frame_vector_args (frame), n_packets); return n_packets; } @@ -565,7 +562,7 @@ vl_api_rpc_call_reply_t_handler (vl_api_rpc_call_reply_t * mp) void vl_api_send_pending_rpc_requests (vlib_main_t * vm) { - vlib_main_t *vm_global = &vlib_global_main; + vlib_main_t *vm_global = vlib_get_first_main (); ASSERT (vm != vm_global); @@ -580,7 +577,7 @@ vl_api_rpc_call_main_thread_inline (void *fp, u8 * data, u32 data_length, u8 force_rpc) { vl_api_rpc_call_t *mp; - vlib_main_t *vm_global = &vlib_global_main; + vlib_main_t *vm_global = vlib_get_first_main (); vlib_main_t *vm = vlib_get_main (); /* Main thread and not a forced RPC: call the function directly */ @@ -601,7 +598,7 @@ vl_api_rpc_call_main_thread_inline (void *fp, u8 * data, u32 data_length, mp = vl_msg_api_alloc_as_if_client (sizeof (*mp) + data_length); clib_memset (mp, 0, sizeof (*mp)); - clib_memcpy (mp->data, data, data_length); + clib_memcpy_fast (mp->data, data, data_length); mp->_vl_msg_id = ntohs (VL_API_RPC_CALL); mp->function = pointer_to_uword (fp); mp->need_barrier_sync = 1; @@ -640,7 +637,7 @@ vl_api_force_rpc_call_main_thread (void *fp, u8 * data, u32 data_length) static void vl_api_trace_plugin_msg_ids_t_handler (vl_api_trace_plugin_msg_ids_t * mp) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); vl_api_msg_range_t *rp; uword *p; @@ -693,7 +690,7 @@ extern void *rpc_call_main_thread_cb_fn; static clib_error_t * rpc_api_hookup (vlib_main_t * vm) { - api_main_t *am = &api_main; + api_main_t *am = vlibapi_get_main (); #define _(N,n) \ vl_msg_api_set_handlers(VL_API_##N, #n, \ vl_api_##n##_t_handler, \