X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlibmemory%2Fmemory_vlib.c;h=c3aef65e8542af9c6f0ddaa1eeecb76e8b91c3df;hb=0d056e5ede136cd0111dc3f9f41ef7b36a938027;hp=184a0f8c0a9acb4dcb5bbbbe5b3ed405d102a2ea;hpb=780fc39506759127f59840e37be9c03d278a2f6b;p=vpp.git diff --git a/src/vlibmemory/memory_vlib.c b/src/vlibmemory/memory_vlib.c index 184a0f8c0a9..c3aef65e854 100644 --- a/src/vlibmemory/memory_vlib.c +++ b/src/vlibmemory/memory_vlib.c @@ -470,12 +470,48 @@ vl_api_memclnt_keepalive_t_handler (vl_api_memclnt_keepalive_t * mp) vl_msg_api_send_shmem (shmem_hdr->vl_input_queue, (u8 *) & rmp); } +void +vl_api_api_versions_t_handler (vl_api_api_versions_t * mp) +{ + api_main_t *am = &api_main; + vl_api_api_versions_reply_t *rmp; + unix_shared_memory_queue_t *q; + u32 nmsg = vec_len (am->api_version_list); + int msg_size = sizeof (*rmp) + sizeof (rmp->api_versions[0]) * nmsg; + int i; + + q = vl_api_client_index_to_input_queue (mp->client_index); + if (q == 0) + return; + + rmp = vl_msg_api_alloc (msg_size); + memset (rmp, 0, msg_size); + rmp->_vl_msg_id = ntohs (VL_API_API_VERSIONS_REPLY); + + /* fill in the message */ + rmp->context = mp->context; + rmp->count = htonl (nmsg); + + for (i = 0; i < nmsg; ++i) + { + api_version_t *vl = &am->api_version_list[i]; + rmp->api_versions[i].major = htonl (vl->major); + rmp->api_versions[i].minor = htonl (vl->minor); + rmp->api_versions[i].patch = htonl (vl->patch); + strncpy ((char *) rmp->api_versions[i].name, vl->name, 64); + } + + vl_msg_api_send_shmem (q, (u8 *) & rmp); + +} + #define foreach_vlib_api_msg \ _(MEMCLNT_CREATE, memclnt_create) \ _(MEMCLNT_DELETE, memclnt_delete) \ _(GET_FIRST_MSG_ID, get_first_msg_id) \ _(MEMCLNT_KEEPALIVE, memclnt_keepalive) \ -_(MEMCLNT_KEEPALIVE_REPLY, memclnt_keepalive_reply) +_(MEMCLNT_KEEPALIVE_REPLY, memclnt_keepalive_reply) \ +_(API_VERSIONS, api_versions) /* * vl_api_init @@ -801,6 +837,8 @@ memclnt_process (vlib_main_t * vm, ASSERT (shm); q = shm->vl_input_queue; ASSERT (q); + /* Make a note so we can always find the primary region easily */ + am->vlib_primary_rp = am->vlib_rp; e = vlib_call_init_exit_functions (vm, vm->api_init_function_registrations, 1 /* call_once */ ); @@ -1317,14 +1355,16 @@ vl_api_ring_command (vlib_main_t * vm, vl_shmem_hdr_t *shmem_hdr; api_main_t *am = &api_main; - shmem_hdr = am->shmem_hdr; + /* First, dump the primary region rings.. */ - if (shmem_hdr == 0) + if (am->vlib_primary_rp == 0 || am->vlib_primary_rp->user_ctx == 0) { vlib_cli_output (vm, "Shared memory segment not initialized...\n"); return 0; } + shmem_hdr = (void *) am->vlib_primary_rp->user_ctx; + vlib_cli_output (vm, "Main API segment rings:"); vlib_cli_output (vm, "%U", format_api_message_rings, am, @@ -1338,7 +1378,7 @@ vl_api_ring_command (vlib_main_t * vm, svm_region_t *vlib_rp = am->vlib_private_rps[i]; shmem_hdr = (void *) vlib_rp->user_ctx; vl_api_registration_t **regpp; - vl_api_registration_t *regp; + vl_api_registration_t *regp = 0; /* For horizontal scaling, add a hash table... */ /* *INDENT-OFF* */ @@ -1351,8 +1391,12 @@ vl_api_ring_command (vlib_main_t * vm, goto found; } })); + vlib_cli_output (vm, "regp %llx not found?", regp); + continue; /* *INDENT-ON* */ found: + vlib_cli_output (vm, "%U", format_api_message_rings, am, + 0 /* print header */ , 0 /* notused */ ); vlib_cli_output (vm, "%U", format_api_message_rings, am, shmem_hdr, 0 /* main segment */ ); }