Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
api: multiple connections per process
[vpp.git]
/
src
/
vlibapi
/
api_shared.c
diff --git
a/src/vlibapi/api_shared.c
b/src/vlibapi/api_shared.c
index
ce7c4ae
..
a553a5b
100644
(file)
--- a/
src/vlibapi/api_shared.c
+++ b/
src/vlibapi/api_shared.c
@@
-32,7
+32,7
@@
#include <vppinfra/elog.h>
/* *INDENT-OFF* */
#include <vppinfra/elog.h>
/* *INDENT-OFF* */
-api_main_t api_main =
+api_main_t api_
global_
main =
{
.region_name = "/unset",
.api_uid = -1,
{
.region_name = "/unset",
.api_uid = -1,
@@
-40,10
+40,20
@@
api_main_t api_main =
};
/* *INDENT-ON* */
};
/* *INDENT-ON* */
+/* Please use vlibapi_get_main() to access my_api_main */
+__thread api_main_t *my_api_main = &api_global_main;
+
+void
+vl_msg_api_set_global_main (void *am_arg)
+{
+ ASSERT (am_arg);
+ my_api_main = (api_main_t *) am_arg;
+}
+
void
vl_msg_api_increment_missing_client_counter (void)
{
void
vl_msg_api_increment_missing_client_counter (void)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
am->missing_clients++;
}
am->missing_clients++;
}
@@
-249,7
+259,6
@@
vl_msg_api_trace_save (api_main_t * am, vl_api_trace_which_t which, FILE * fp)
fh.wrapped = tp->wrapped;
fh.nitems = clib_host_to_net_u32 (vec_len (tp->traces));
u8 *m = vl_api_serialize_message_table (am, 0);
fh.wrapped = tp->wrapped;
fh.nitems = clib_host_to_net_u32 (vec_len (tp->traces));
u8 *m = vl_api_serialize_message_table (am, 0);
- clib_warning ("Message table length %d", vec_len (m));
fh.msgtbl_size = clib_host_to_net_u32 (vec_len (m));
if (fwrite (&fh, sizeof (fh), 1, fp) != 1)
fh.msgtbl_size = clib_host_to_net_u32 (vec_len (m));
if (fwrite (&fh, sizeof (fh), 1, fp) != 1)
@@
-526,13
+535,15
@@
msg_handler_internal (api_main_t * am,
/* This is only to be called from a vlib/vnet app */
void
/* This is only to be called from a vlib/vnet app */
void
-vl_msg_api_handler_with_vm_node (api_main_t * am,
+vl_msg_api_handler_with_vm_node (api_main_t * am,
svm_region_t * vlib_rp,
void *the_msg, vlib_main_t * vm,
void *the_msg, vlib_main_t * vm,
- vlib_node_runtime_t * node)
+ 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 *);
{
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))
int is_mp_safe = 1;
if (PREDICT_FALSE (am->elog_trace_api_messages))
@@
-582,7
+593,19
@@
vl_msg_api_handler_with_vm_node (api_main_t * am,
vl_msg_api_barrier_trace_context (am->msg_names[id]);
vl_msg_api_barrier_sync ();
}
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;
+ }
(*handler) (the_msg, vm, node);
(*handler) (the_msg, vm, node);
+ if (is_private)
+ {
+ am->vlib_rp = old_vlib_rp;
+ am->shmem_hdr = save_shmem_hdr;
+ }
if (!is_mp_safe)
vl_msg_api_barrier_release ();
}
if (!is_mp_safe)
vl_msg_api_barrier_release ();
}
@@
-631,7
+654,7
@@
vl_msg_api_handler_with_vm_node (api_main_t * am,
void
vl_msg_api_handler (void *the_msg)
{
void
vl_msg_api_handler (void *the_msg)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
msg_handler_internal (am, the_msg,
(am->rx_trace
msg_handler_internal (am, the_msg,
(am->rx_trace
@@
-642,7
+665,7
@@
vl_msg_api_handler (void *the_msg)
void
vl_msg_api_handler_no_free (void *the_msg)
{
void
vl_msg_api_handler_no_free (void *the_msg)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
msg_handler_internal (am, the_msg,
(am->rx_trace
&& am->rx_trace->enabled) /* trace_it */ ,
msg_handler_internal (am, the_msg,
(am->rx_trace
&& am->rx_trace->enabled) /* trace_it */ ,
@@
-652,7
+675,7
@@
vl_msg_api_handler_no_free (void *the_msg)
void
vl_msg_api_handler_no_trace_no_free (void *the_msg)
{
void
vl_msg_api_handler_no_trace_no_free (void *the_msg)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
msg_handler_internal (am, the_msg, 0 /* trace_it */ , 1 /* do_it */ ,
0 /* free_it */ );
}
msg_handler_internal (am, the_msg, 0 /* trace_it */ , 1 /* do_it */ ,
0 /* free_it */ );
}
@@
-669,7
+692,7
@@
vl_msg_api_handler_no_trace_no_free (void *the_msg)
void
vl_msg_api_trace_only (void *the_msg)
{
void
vl_msg_api_trace_only (void *the_msg)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
msg_handler_internal (am, the_msg,
(am->rx_trace
msg_handler_internal (am, the_msg,
(am->rx_trace
@@
-680,7
+703,7
@@
vl_msg_api_trace_only (void *the_msg)
void
vl_msg_api_cleanup_handler (void *the_msg)
{
void
vl_msg_api_cleanup_handler (void *the_msg)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
u16 id = clib_net_to_host_u16 (*((u16 *) the_msg));
if (PREDICT_FALSE (id >= vec_len (am->msg_cleanup_handlers)))
u16 id = clib_net_to_host_u16 (*((u16 *) the_msg));
if (PREDICT_FALSE (id >= vec_len (am->msg_cleanup_handlers)))
@@
-700,7
+723,7
@@
vl_msg_api_cleanup_handler (void *the_msg)
void
vl_msg_api_replay_handler (void *the_msg)
{
void
vl_msg_api_replay_handler (void *the_msg)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
u16 id = clib_net_to_host_u16 (*((u16 *) the_msg));
u16 id = clib_net_to_host_u16 (*((u16 *) the_msg));
@@
-727,7
+750,7
@@
vl_msg_api_get_msg_length (void *msg_arg)
void
vl_msg_api_socket_handler (void *the_msg)
{
void
vl_msg_api_socket_handler (void *the_msg)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
msg_handler_internal (am, the_msg,
(am->rx_trace
msg_handler_internal (am, the_msg,
(am->rx_trace
@@
-748,7
+771,7
@@
_(is_mp_safe)
void
vl_msg_api_config (vl_msg_api_msg_config_t * c)
{
void
vl_msg_api_config (vl_msg_api_msg_config_t * c)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
/*
* This happens during the java core tests if the message
/*
* This happens during the java core tests if the message
@@
-831,7
+854,7
@@
vl_msg_api_clean_handlers (int msg_id)
void
vl_msg_api_set_cleanup_handler (int msg_id, void *fp)
{
void
vl_msg_api_set_cleanup_handler (int msg_id, void *fp)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
ASSERT (msg_id > 0);
vec_validate (am->msg_cleanup_handlers, msg_id);
ASSERT (msg_id > 0);
vec_validate (am->msg_cleanup_handlers, msg_id);
@@
-878,7
+901,7
@@
vl_msg_api_post_mortem_dump_enable_disable (int enable)
void
vl_msg_api_post_mortem_dump (void)
{
void
vl_msg_api_post_mortem_dump (void)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
FILE *fp;
char filename[64];
int rv;
FILE *fp;
char filename[64];
int rv;
@@
-913,7
+936,7
@@
vl_msg_api_post_mortem_dump (void)
void
vl_msg_api_register_pd_handler (void *fp, u16 msg_id_host_byte_order)
{
void
vl_msg_api_register_pd_handler (void *fp, u16 msg_id_host_byte_order)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
/* Mild idiot proofing */
if (msg_id_host_byte_order > 10000)
/* Mild idiot proofing */
if (msg_id_host_byte_order > 10000)
@@
-927,7
+950,7
@@
vl_msg_api_register_pd_handler (void *fp, u16 msg_id_host_byte_order)
int
vl_msg_api_pd_handler (void *mp, int rv)
{
int
vl_msg_api_pd_handler (void *mp, int rv)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
int (*fp) (void *, int);
u16 msg_id;
int (*fp) (void *, int);
u16 msg_id;
@@
-948,7
+971,7
@@
vl_msg_api_pd_handler (void *mp, int rv)
void
vl_msg_api_set_first_available_msg_id (u16 first_avail)
{
void
vl_msg_api_set_first_available_msg_id (u16 first_avail)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
am->first_available_msg_id = first_avail;
}
am->first_available_msg_id = first_avail;
}
@@
-956,7
+979,7
@@
vl_msg_api_set_first_available_msg_id (u16 first_avail)
u16
vl_msg_api_get_msg_ids (const char *name, int n)
{
u16
vl_msg_api_get_msg_ids (const char *name, int n)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
u8 *name_copy;
vl_api_msg_range_t *rp;
uword *p;
u8 *name_copy;
vl_api_msg_range_t *rp;
uword *p;
@@
-1028,7
+1051,7
@@
vl_msg_api_add_version (api_main_t * am, const char *string,
u32
vl_msg_api_get_msg_index (u8 * name_and_crc)
{
u32
vl_msg_api_get_msg_index (u8 * name_and_crc)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
uword *p;
if (am->msg_index_by_name_and_crc)
uword *p;
if (am->msg_index_by_name_and_crc)
@@
-1043,7
+1066,7
@@
vl_msg_api_get_msg_index (u8 * name_and_crc)
void *
vl_msg_push_heap (void)
{
void *
vl_msg_push_heap (void)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
pthread_mutex_lock (&am->vlib_rp->mutex);
return svm_push_data_heap (am->vlib_rp);
}
pthread_mutex_lock (&am->vlib_rp->mutex);
return svm_push_data_heap (am->vlib_rp);
}
@@
-1051,7
+1074,7
@@
vl_msg_push_heap (void)
void
vl_msg_pop_heap (void *oldheap)
{
void
vl_msg_pop_heap (void *oldheap)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
svm_pop_heap (oldheap);
pthread_mutex_unlock (&am->vlib_rp->mutex);
}
svm_pop_heap (oldheap);
pthread_mutex_unlock (&am->vlib_rp->mutex);
}
@@
-1059,7
+1082,8
@@
vl_msg_pop_heap (void *oldheap)
int
vl_api_to_api_string (u32 len, const char *buf, vl_api_string_t * str)
{
int
vl_api_to_api_string (u32 len, const char *buf, vl_api_string_t * str)
{
- clib_memcpy_fast (str->buf, buf, len);
+ if (len)
+ clib_memcpy_fast (str->buf, buf, len);
str->length = htonl (len);
return len + sizeof (u32);
}
str->length = htonl (len);
return len + sizeof (u32);
}
@@
-1086,6
+1110,14
@@
vl_api_string_len (vl_api_string_t * astr)
return clib_net_to_host_u32 (astr->length);
}
return clib_net_to_host_u32 (astr->length);
}
+u8 *
+vl_api_format_string (u8 * s, va_list * args)
+{
+ vl_api_string_t *a = va_arg (*args, vl_api_string_t *);
+ vec_add (s, a->buf, clib_net_to_host_u32 (a->length));
+ return s;
+}
+
/*
* Returns a new vector. Remember to free it after use.
*/
/*
* Returns a new vector. Remember to free it after use.
*/
@@
-1100,7
+1132,7
@@
vl_api_from_api_to_vec (vl_api_string_t * astr)
void
vl_api_set_elog_main (elog_main_t * m)
{
void
vl_api_set_elog_main (elog_main_t * m)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
am->elog_main = m;
}
am->elog_main = m;
}
@@
-1108,7
+1140,7
@@
int
vl_api_set_elog_trace_api_messages (int enable)
{
int rv;
vl_api_set_elog_trace_api_messages (int enable)
{
int rv;
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
rv = am->elog_trace_api_messages;
am->elog_trace_api_messages = enable;
rv = am->elog_trace_api_messages;
am->elog_trace_api_messages = enable;
@@
-1118,7
+1150,7
@@
vl_api_set_elog_trace_api_messages (int enable)
int
vl_api_get_elog_trace_api_messages (void)
{
int
vl_api_get_elog_trace_api_messages (void)
{
- api_main_t *am =
&api_main
;
+ api_main_t *am =
vlibapi_get_main ()
;
return am->elog_trace_api_messages;
}
return am->elog_trace_api_messages;
}