aboutsummaryrefslogtreecommitdiffstats
path: root/src/vlibapi
diff options
context:
space:
mode:
Diffstat (limited to 'src/vlibapi')
-rw-r--r--src/vlibapi/api_common.h4
-rw-r--r--src/vlibapi/api_helper_macros.h20
-rw-r--r--src/vlibapi/api_shared.c20
3 files changed, 43 insertions, 1 deletions
diff --git a/src/vlibapi/api_common.h b/src/vlibapi/api_common.h
index 0ea0943cb39..86b1c5ac3ee 100644
--- a/src/vlibapi/api_common.h
+++ b/src/vlibapi/api_common.h
@@ -132,6 +132,7 @@ typedef struct
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 is_autoendian; /**< endian conversion required? */
} vl_msg_api_msg_config_t;
/** Message header structure */
@@ -248,6 +249,9 @@ typedef struct
/** Message is mp safe vector */
u8 *is_mp_safe;
+ /** Message requires us to do endian conversion */
+ u8 *is_autoendian;
+
/** Allocator ring vectors (in shared memory) */
struct ring_alloc_ *arings;
diff --git a/src/vlibapi/api_helper_macros.h b/src/vlibapi/api_helper_macros.h
index 57502570f11..c7348cfde97 100644
--- a/src/vlibapi/api_helper_macros.h
+++ b/src/vlibapi/api_helper_macros.h
@@ -59,6 +59,26 @@ do { \
vl_api_send_msg (rp, (u8 *)rmp); \
} while(0);
+#define REPLY_MACRO2_END(t, body) \
+do { \
+ vl_api_registration_t *rp; \
+ rv = vl_msg_api_pd_handler (mp, rv); \
+ rp = vl_api_client_index_to_registration (mp->client_index); \
+ if (rp == 0) \
+ return; \
+ \
+ rmp = vl_msg_api_alloc (sizeof (*rmp)); \
+ rmp->_vl_msg_id = t+(REPLY_MSG_ID_BASE); \
+ rmp->context = mp->context; \
+ rmp->retval = rv; \
+ do {body;} while (0); \
+ api_main_t *am = vlibapi_get_main (); \
+ void (*endian_fp) (void *); \
+ endian_fp = am->msg_endian_handlers[t]; \
+ (*endian_fp) (rmp); \
+ vl_api_send_msg (rp, (u8 *)rmp); \
+} while(0);
+
#define REPLY_MACRO2_ZERO(t, body) \
do { \
vl_api_registration_t *rp; \
diff --git a/src/vlibapi/api_shared.c b/src/vlibapi/api_shared.c
index fbaa9c9e013..c818668c09f 100644
--- a/src/vlibapi/api_shared.c
+++ b/src/vlibapi/api_shared.c
@@ -485,6 +485,14 @@ msg_handler_internal (api_main_t * am,
vl_msg_api_barrier_trace_context (am->msg_names[id]);
vl_msg_api_barrier_sync ();
}
+
+ if (am->is_autoendian[id])
+ {
+ void (*endian_fp) (void *);
+ endian_fp = am->msg_endian_handlers[id];
+ (*endian_fp) (the_msg);
+ }
+
(*am->msg_handlers[id]) (the_msg);
if (!am->is_mp_safe[id])
vl_msg_api_barrier_release ();
@@ -606,6 +614,13 @@ vl_msg_api_handler_with_vm_node (api_main_t * am, svm_region_t * vlib_rp,
if (PREDICT_FALSE (vl_msg_api_fuzz_hook != 0))
(*vl_msg_api_fuzz_hook) (id, the_msg);
+ if (am->is_autoendian[id])
+ {
+ void (*endian_fp) (void *);
+ endian_fp = am->msg_endian_handlers[id];
+ (*endian_fp) (the_msg);
+ }
+
(*handler) (the_msg, vm, node);
if (is_private)
{
@@ -772,7 +787,8 @@ _(msg_endian_handlers) \
_(msg_print_handlers) \
_(api_trace_cfg) \
_(message_bounce) \
-_(is_mp_safe)
+_(is_mp_safe) \
+_(is_autoendian)
void
vl_msg_api_config (vl_msg_api_msg_config_t * c)
@@ -813,6 +829,7 @@ vl_msg_api_config (vl_msg_api_msg_config_t * c)
am->msg_print_handlers[c->id] = c->print;
am->message_bounce[c->id] = c->message_bounce;
am->is_mp_safe[c->id] = c->is_mp_safe;
+ am->is_autoendian[c->id] = c->is_autoendian;
am->api_trace_cfg[c->id].size = c->size;
am->api_trace_cfg[c->id].trace_enable = c->traced;
@@ -842,6 +859,7 @@ vl_msg_api_set_handlers (int id, char *name, void *handler, void *cleanup,
c->replay = 1;
c->message_bounce = 0;
c->is_mp_safe = 0;
+ c->is_autoendian = 0;
vl_msg_api_config (c);
}