X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp%2Fapi%2Fapi_main.c;h=129334830d7684f51e97de2cd2284b08bc73864c;hb=59b2565cd91a67ced650739f36129650830211ac;hp=c355a5fdff0979bd5205b62b130eaa77aa719345;hpb=35ffa3e8f6b032f6e324234d495f769049d8feea;p=vpp.git diff --git a/src/vpp/api/api_main.c b/src/vpp/api/api_main.c index c355a5fdff0..129334830d7 100644 --- a/src/vpp/api/api_main.c +++ b/src/vpp/api/api_main.c @@ -49,10 +49,13 @@ api_main_init (vlib_main_t * vm) vam->my_client_index = (u32) ~ 0; /* Ensure that vam->inbuf is never NULL */ vec_validate (vam->inbuf, 0); + vec_validate (vam->cmd_reply, 0); + vec_reset_length (vam->cmd_reply); init_error_string_table (vam); rv = vat_plugin_init (vam); if (rv) clib_warning ("vat_plugin_init returned %d", rv); + return 0; } @@ -68,6 +71,47 @@ vat_plugin_hash_create (void) vam->help_by_name = hash_create_string (0, sizeof (uword)); } +static void +maybe_register_api_client (vat_main_t * vam) +{ + vl_api_registration_t **regpp; + vl_api_registration_t *regp; + svm_region_t *svm; + void *oldheap; + api_main_t *am = &api_main; + + if (vam->my_client_index != ~0) + return; + + pool_get (am->vl_clients, regpp); + + svm = am->vlib_rp; + + pthread_mutex_lock (&svm->mutex); + oldheap = svm_push_data_heap (svm); + *regpp = clib_mem_alloc (sizeof (vl_api_registration_t)); + + regp = *regpp; + memset (regp, 0, sizeof (*regp)); + regp->registration_type = REGISTRATION_TYPE_SHMEM; + regp->vl_api_registration_pool_index = regpp - am->vl_clients; + regp->vlib_rp = svm; + regp->shmem_hdr = am->shmem_hdr; + + /* Loopback connection */ + regp->vl_input_queue = am->shmem_hdr->vl_input_queue; + + regp->name = format (0, "%s", "vpp-internal"); + vec_add1 (regp->name, 0); + + pthread_mutex_unlock (&svm->mutex); + svm_pop_heap (oldheap); + + vam->my_client_index = vl_msg_api_handle_from_index_and_epoch + (regp->vl_api_registration_pool_index, + am->shmem_hdr->application_restarts); +} + static clib_error_t * api_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) @@ -82,6 +126,8 @@ api_command_fn (vlib_main_t * vm, int (*fp) (vat_main_t *); api_main_t *am = &api_main; + maybe_register_api_client (vam); + vam->vl_input_queue = am->shmem_hdr->vl_input_queue; /* vec_validated in the init routine */