X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlibapi%2Fapi_common.h;h=66a547fb93d1d938431daa59bc35cfdc37935ded;hb=b70497124840fb6d9e8e5cf7239a41cb2bc7013c;hp=735921b30f7baf2534b0e24fc033312a88b2edf8;hpb=413f4a5b2123c1625d615315db293a080078482b;p=vpp.git diff --git a/src/vlibapi/api_common.h b/src/vlibapi/api_common.h index 735921b30f7..66a547fb93d 100644 --- a/src/vlibapi/api_common.h +++ b/src/vlibapi/api_common.h @@ -20,11 +20,14 @@ #ifndef included_api_common_h #define included_api_common_h -/** \file API common definitions +/** \file api_common.h + * API common definitions * See api_doc.md for more info */ #include +#include +#include #include #include #include @@ -55,6 +58,7 @@ typedef struct vl_api_registration_ f64 last_heard; int last_queue_head; int unanswered_pings; + int is_being_removed; /** shared memory only: pointer to client input queue */ svm_queue_t *vl_input_queue; @@ -71,18 +75,12 @@ typedef struct vl_api_registration_ /* socket client only */ u32 server_handle; /**< Socket client only: server handle */ u32 server_index; /**< Socket client only: server index */ + + bool keepalive; /**< Dead client scan */ } vl_api_registration_t; #define VL_API_INVALID_FI ((u32)~0) -/** Trace configuration for a single message */ -typedef struct -{ - int size; /**< for sanity checking */ - int trace_enable; /**< trace this message */ - int replay_enable; /**< This message can be replayed */ -} trace_cfg_t; - /** * API trace state */ @@ -125,11 +123,16 @@ typedef struct void *cleanup; /**< non-default message cleanup handler */ void *endian; /**< message endian function */ void *print; /**< message print function */ + void *print_json; /**< message print function (JSON format) */ + void *tojson; /**< binary to JSON convert function */ + void *fromjson; /**< JSON to binary convert function */ + void *calc_size; /**< message size calculation */ int size; /**< message size */ - int traced; /**< is this message to be traced? */ - int replay; /**< is this message to be replayed? */ - int message_bounce; /**< do not free message after processing */ - int is_mp_safe; /**< worker thread barrier required? */ + int traced : 1; /**< is this message to be traced? */ + int replay : 1; /**< is this message to be replayed? */ + int message_bounce : 1; /**< do not free message after processing */ + int is_mp_safe : 1; /**< worker thread barrier required? */ + int is_autoendian : 1; /**< endian conversion required? */ } vl_msg_api_msg_config_t; /** Message header structure */ @@ -141,19 +144,39 @@ typedef struct msgbuf_ u8 data[0]; /**< actual message begins here */ } msgbuf_t; +__clib_nosanitize_addr static inline void +VL_MSG_API_UNPOISON (const void *a) +{ + const msgbuf_t *m = &((const msgbuf_t *) a)[-1]; + clib_mem_unpoison (m, sizeof (*m) + ntohl (m->data_len)); +} + +__clib_nosanitize_addr static inline void +VL_MSG_API_SVM_QUEUE_UNPOISON (const svm_queue_t *q) +{ + clib_mem_unpoison (q, sizeof (*q) + q->elsize * q->maxsize); +} + +static inline void +VL_MSG_API_POISON (const void *a) +{ + const msgbuf_t *m = &((const msgbuf_t *) a)[-1]; + clib_mem_poison (m, sizeof (*m) + ntohl (m->data_len)); +} + /* api_shared.c prototypes */ -void vl_msg_api_handler (void *the_msg); -void 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_trace_only (void *the_msg); +void vl_msg_api_handler (void *the_msg, uword msg_len); +void vl_msg_api_handler_no_free (void *the_msg, uword msg_len); +void vl_msg_api_handler_no_trace_no_free (void *the_msg, uword msg_len); +void vl_msg_api_trace_only (void *the_msg, uword msg_len); void vl_msg_api_cleanup_handler (void *the_msg); void vl_msg_api_replay_handler (void *the_msg); -void vl_msg_api_socket_handler (void *the_msg); -void vl_msg_api_set_handlers (int msg_id, char *msg_name, - void *handler, - void *cleanup, - void *endian, - void *print, int msg_size, int traced); +void vl_msg_api_socket_handler (void *the_msg, uword msg_len); +void vl_msg_api_set_handlers (int msg_id, char *msg_name, void *handler, + void *cleanup, void *endian, void *print, + int msg_size, int traced, void *print_json, + void *tojson, void *fromjson, + void *validate_size); void vl_msg_api_clean_handlers (int msg_id); void vl_msg_api_config (vl_msg_api_msg_config_t *); void vl_msg_api_set_cleanup_handler (int msg_id, void *fp); @@ -180,7 +203,9 @@ void vl_msg_api_set_first_available_msg_id (u16 first_avail); u16 vl_msg_api_get_msg_ids (const char *name, int n); u32 vl_msg_api_get_msg_index (u8 * name_and_crc); void *vl_msg_push_heap (void); +void *vl_msg_push_heap_w_region (svm_region_t * vlib_rp); void vl_msg_pop_heap (void *oldheap); +void vl_msg_pop_heap_w_region (svm_region_t * vlib_rp, void *oldheap); typedef clib_error_t *(vl_msg_api_init_function_t) (u32 client_index); @@ -198,31 +223,54 @@ typedef struct char name[64]; } api_version_t; -/** API main structure, used by both vpp and binary API clients */ typedef struct { /** Message handler vector */ - void (**msg_handlers) (void *); - /** Plaform-dependent (aka hardware) message handler vector */ - int (**pd_msg_handlers) (void *, int); + void (*handler) (void *); /** non-default message cleanup handler vector */ - void (**msg_cleanup_handlers) (void *); + void (*cleanup_handler) (void *); + + /** Message name vector */ + const char *name; + + /** Message convert function vector */ + cJSON *(*tojson_handler) (void *); + + /** Message convert function vector */ + void *(*fromjson_handler) (cJSON *, int *); /** Message endian handler vector */ - void (**msg_endian_handlers) (void *); + void (*endian_handler) (void *); /** Message print function vector */ - void (**msg_print_handlers) (void *, void *); + void (*print_handler) (void *, void *); - /** Message name vector */ - const char **msg_names; + /** Message print function vector in JSON */ + void (*print_json_handler) (void *, void *); - /** Don't automatically free message buffer vetor */ - u8 *message_bounce; + /** Message calc size function vector */ + uword (*calc_size_func) (void *); - /** Message is mp safe vector */ - u8 *is_mp_safe; + /** trace size for sanity checking */ + int trace_size; + + /** Flags */ + u8 bounce : 1; /**> Don't automatically free message buffer vetor */ + u8 is_mp_safe : 1; /**< Message is mp safe vector */ + u8 is_autoendian : 1; /**< Message requires us to do endian conversion */ + u8 trace_enable : 1; /**< trace this message */ + u8 replay_allowed : 1; /**< This message can be replayed */ + +} vl_api_msg_data_t; + +/** API main structure, used by both vpp and binary API clients */ +typedef struct api_main_t +{ + vl_api_msg_data_t *msg_data; + + /** API message ID by name hash table */ + uword *msg_id_by_name; /** Allocator ring vectors (in shared memory) */ struct ring_alloc_ *arings; @@ -245,9 +293,6 @@ typedef struct /** Print every received message */ int msg_print_flag; - /** Current trace configuration */ - trace_cfg_t *api_trace_cfg; - /** Current process PID */ int our_pid; @@ -339,9 +384,42 @@ typedef struct /** List of API client reaper functions */ _vl_msg_api_function_list_elt_t *reaper_function_registrations; + /** Bin API thread handle */ + pthread_t rx_thread_handle; + + /** event log */ + elog_main_t *elog_main; + int elog_trace_api_messages; + + /** performance counter callback **/ + void (**perf_counter_cbs) + (struct api_main_t *, u32 id, int before_or_after); + void (**perf_counter_cbs_tmp) + (struct api_main_t *, u32 id, int before_or_after); + } api_main_t; -extern api_main_t api_main; +extern __thread api_main_t *my_api_main; + +always_inline api_main_t * +vlibapi_get_main (void) +{ + return my_api_main; +} + +always_inline vl_api_msg_data_t * +vl_api_get_msg_data (api_main_t *am, u32 msg_id) +{ + if (msg_id >= vec_len (am->msg_data)) + return 0; + return am->msg_data + msg_id; +} + +always_inline void +vlibapi_set_main (api_main_t * am) +{ + my_api_main = am; +} #endif /* included_api_common_h */