int rv = 0;
void *oldheap;
api_main_t *am = &api_main;
- u8 *serialized_message_table_in_shmem;
/*
* This is tortured. Maintain a vlib-address-space private
regp->name = format (0, "%s", mp->name);
vec_add1 (regp->name, 0);
- serialized_message_table_in_shmem = vl_api_serialize_message_table (am, 0);
+ if (am->serialized_message_table_in_shmem == 0)
+ am->serialized_message_table_in_shmem =
+ vl_api_serialize_message_table (am, 0);
pthread_mutex_unlock (&svm->mutex);
svm_pop_heap (oldheap);
am->shmem_hdr->application_restarts);
rp->context = mp->context;
rp->response = ntohl (rv);
- rp->message_table = pointer_to_uword (serialized_message_table_in_shmem);
+ rp->message_table =
+ pointer_to_uword (am->serialized_message_table_in_shmem);
vl_msg_api_send_shmem (q, (u8 *) & rp);
}
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 - 1);
+ }
+
+ 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
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 */ );
if (PREDICT_FALSE (q->head == q->maxsize))
q->head = 0;
pthread_mutex_unlock (&q->mutex);
+
if (need_broadcast)
(void) pthread_cond_broadcast (&q->condvar);
- pthread_mutex_unlock (&q->mutex);
-
vl_msg_api_handler_with_vm_node (am, (void *) mp, vm, node);
}
else
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,
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* */
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 */ );
}