diff options
author | Paul Vinciguerra <pvinci@vinciconsulting.com> | 2019-05-14 21:01:28 -0400 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2019-07-08 17:47:33 +0000 |
commit | 888640a398f974cf388bdc983d10e78591275b37 (patch) | |
tree | d777158dece54df369f7e6a6f76e12cbdc1733ab /src/vpp | |
parent | 44e60468a2f0ad7ceff67de718fe3c401016ef6d (diff) |
map gbp papi: match endianess of f64
clib_net_to_host_f64, clib_host_to_net_f64 are now implemented as '=',
https://gerrit.fd.io/r/#/c/20406/ set papi to match.
- all f64 api references are now wrapped with
clib_net_to_host_f64 or clib_host_to_net_f64.
IEEE f64 endianess is not defined. If clib_net_to_host_f64 and
clib_host_to_net_f64 are later defined in VPP as big-endian, it is
a single character change in the papi vpp_serializer.
Note: This breaks the api in a manner that would not be detected by
the flag day initiative. The scope is small. This only impacts map.api,
which applied the u64 transformation, while the gbp api uses '='.
The implementation of "=" raises issues for the papi socket implementation
if used between systems of differing endianess. See Vratko's comments.
- Added get_f64_endian_value() to api to allow client to verify endianess of f64's.
Type: fix
Depends-on: https://gerrit.fd.io/r/#/c/20484/
Change-Id: I00fc64a6557ba0190398df211aa0ea5c7eb101df
Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
Diffstat (limited to 'src/vpp')
-rw-r--r-- | src/vpp/api/api.c | 35 | ||||
-rw-r--r-- | src/vpp/api/vpe.api | 50 |
2 files changed, 83 insertions, 2 deletions
diff --git a/src/vpp/api/api.c b/src/vpp/api/api.c index 66857fbac9f..9ae027dab9b 100644 --- a/src/vpp/api/api.c +++ b/src/vpp/api/api.c @@ -86,7 +86,9 @@ _(SHOW_THREADS, show_threads) \ _(GET_NODE_GRAPH, get_node_graph) \ _(GET_NEXT_INDEX, get_next_index) \ _(LOG_DUMP, log_dump) \ -_(SHOW_VPE_SYSTEM_TIME_TICKS, show_vpe_system_time_ticks) +_(SHOW_VPE_SYSTEM_TIME_TICKS, show_vpe_system_time_ticks) \ +_(GET_F64_ENDIAN_VALUE, get_f64_endian_value) \ +_(GET_F64_INCREMENT_BY_ONE, get_f64_increment_by_one) \ #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) @@ -554,6 +556,37 @@ static void /* *INDENT-ON* */ } +static void +vl_api_get_f64_endian_value_t_handler (vl_api_get_f64_endian_value_t * mp) +{ + int rv = 0; + f64 one = 1.0; + vl_api_get_f64_endian_value_reply_t *rmp; + if (1.0 != clib_net_to_host_f64 (mp->f64_one)) + rv = VNET_API_ERROR_API_ENDIAN_FAILED; + + /* *INDENT-OFF* */ + REPLY_MACRO2(VL_API_GET_F64_ENDIAN_VALUE_REPLY, + ({ + rmp->f64_one_result = clib_host_to_net_f64 (one); + })); + /* *INDENT-ON* */ +} + +static void +vl_api_get_f64_increment_by_one_t_handler (vl_api_get_f64_increment_by_one_t * + mp) +{ + int rv = 0; + vl_api_get_f64_increment_by_one_reply_t *rmp; + + /* *INDENT-OFF* */ + REPLY_MACRO2(VL_API_GET_F64_INCREMENT_BY_ONE_REPLY, + ({ + rmp->f64_value = clib_host_to_net_f64 (clib_net_to_host_f64(mp->f64_value) + 1.0); + })); + /* *INDENT-ON* */ +} #define BOUNCE_HANDLER(nn) \ static void vl_api_##nn##_t_handler ( \ diff --git a/src/vpp/api/vpe.api b/src/vpp/api/vpe.api index bd6b9d5638f..7c466b9a7a4 100644 --- a/src/vpp/api/vpe.api +++ b/src/vpp/api/vpe.api @@ -19,7 +19,7 @@ called through a shared memory interface. */ -option version = "1.3.0"; +option version = "1.4.0"; /* * Note: API placement cleanup in progress @@ -332,6 +332,54 @@ define show_vpe_system_time_ticks_reply f64 vpe_system_time_ticks; }; +/** \brief f64 types are not standardized across the wire. Sense wire format in each direction by sending the f64 value 1.0. + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param f64_one - The constant of 1.0. If you send a different value, expect an rv=VNET_API_ERROR_API_ENDIAN_FAILED. +*/ +define get_f64_endian_value +{ + u32 client_index; + u32 context; + f64 f64_one [default=1.0]; +}; + +/** \brief get_f64_endian_value reply message + @param context - sender context which was passed in the request + @param retval - return value - VNET_API_ERROR_API_ENDIAN_FAILED if f64_one != 1.0 + @param f64_one_result - The value of 'f64 1.0' +*/ +define get_f64_endian_value_reply +{ + u32 context; + u32 retval; + f64 f64_one_result; +}; + +/** \brief Verify f64 wire format by sending a value and receiving the value + 1.0 + @param client_index - opaque cookie to identify the sender. + @param context - sender context, to match reply w/ request. + @param f64_value - The value you want to test. Default: 1.0. +*/ +define get_f64_increment_by_one +{ + u32 client_index; + u32 context; + f64 f64_value [default=1.0]; +}; + +/** \brief get_f64_increment_by_one reply + @param client_index - opaque cookie to identify the sender. + @param context - sender context, to match reply w/ request. + @param f64_value - The input f64_value incremented by 1.0. +*/ +define get_f64_increment_by_one_reply +{ + u32 context; + u32 retval; + f64 f64_value; +}; + /* * Local Variables: * eval: (c-set-style "gnu") |