From ccf813e13eba7b5c71cc3090582f50f25ba7b721 Mon Sep 17 00:00:00 2001 From: Alberto Compagno Date: Thu, 22 Aug 2019 09:48:32 +0200 Subject: [HICN-262] Fix binary api to prevent byteswapping of ip addresses in vapi Change-Id: If3f9a7db1e1310fdc08d1003b28e5e1d4006b61e Signed-off-by: Alberto Compagno --- .../src/hicn/transport/core/hicn_binary_api.c | 48 +++++++++++++++------- 1 file changed, 33 insertions(+), 15 deletions(-) (limited to 'libtransport/src/hicn/transport/core/hicn_binary_api.c') diff --git a/libtransport/src/hicn/transport/core/hicn_binary_api.c b/libtransport/src/hicn/transport/core/hicn_binary_api.c index 8fde516fd..9f93953ab 100644 --- a/libtransport/src/hicn/transport/core/hicn_binary_api.c +++ b/libtransport/src/hicn/transport/core/hicn_binary_api.c @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include @@ -58,7 +60,6 @@ #undef vl_api_version #undef vl_printfun #undef vl_endianfun - ///////////////////////////////////////////////////// const char *HICN_ERROR_STRING[] = { #define _(a, b, c) c, @@ -67,6 +68,24 @@ const char *HICN_ERROR_STRING[] = { }; ///////////////////////////////////////////////////// +/*********************** Missing Symbol in vpp libraries *************************/ +u8 * +format_vl_api_address_union (u8 * s, va_list * args) +{ + const vl_api_address_union_t *addr = + va_arg (*args, vl_api_address_union_t *); + vl_api_address_family_t af = va_arg (*args, vl_api_address_family_t); + + if (ADDRESS_IP6 == af) + s = format (s, "%U", format_ip6_address, addr->ip6); + else + s = format (s, "%U", format_ip4_address, addr->ip4); + + return s; +} + +/*********************************************************************************/ + static context_store_t context_store = { .global_pointers_map_index = 0, }; @@ -92,13 +111,14 @@ int hicn_binary_api_register_prod_app( CONTEXT_SAVE(context_store, api, mp) - mp->len = (u8)input_params->prefix->len; + fib_prefix_t prefix; + memcpy(&prefix.fp_addr.as_u64, &input_params->prefix->address.as_u64, sizeof(ip46_address_t)); + prefix.fp_len = input_params->prefix->len; + prefix.fp_proto = ip46_address_is_ip4(&prefix.fp_addr) ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6; + ip_prefix_encode(&prefix, &mp->prefix); mp->swif = clib_host_to_net_u32(input_params->swif); mp->cs_reserved = clib_host_to_net_u32(input_params->cs_reserved); - mp->prefix[0] = clib_host_to_net_u64(input_params->prefix->address.as_u64[0]); - mp->prefix[1] = clib_host_to_net_u64(input_params->prefix->address.as_u64[1]); - return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); } @@ -112,8 +132,8 @@ static void vl_api_hicn_api_register_prod_app_reply_t_handler( vpp_binary_api_set_ret_value(binary_api->vpp_api, clib_net_to_host_u32(mp->retval)); params->cs_reserved = mp->cs_reserved; - params->prod_addr->address.as_u64[0] = mp->prod_addr[0]; - params->prod_addr->address.as_u64[1] = mp->prod_addr[1]; + params->prod_addr = (ip_address_t *)malloc(sizeof(ip_address_t)); + ip_address_decode(&mp->prod_addr, (ip46_address_t *)(params->prod_addr)); params->face_id = clib_net_to_host_u32(mp->faceid); vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); @@ -147,9 +167,8 @@ static void vl_api_hicn_api_register_cons_app_reply_t_handler( vpp_binary_api_set_ret_value(binary_api->vpp_api, clib_net_to_host_u32(mp->retval)); - params->src4->address.v4.as_u32 = clib_net_to_host_u32(mp->src_addr4); - params->src6->address.as_u64[0] = clib_net_to_host_u64(mp->src_addr6[0]); - params->src6->address.as_u64[1] = clib_net_to_host_u64(mp->src_addr6[1]); + ip_address_decode(&mp->src_addr4, (ip46_address_t *)params->src4); + ip_address_decode(&mp->src_addr6, (ip46_address_t *)params->src6); params->face_id = clib_host_to_net_u32(mp->faceid); vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); @@ -165,11 +184,10 @@ int hicn_binary_api_register_route( M(HICN_API_ROUTE_NHOPS_ADD, mp); CONTEXT_SAVE(context_store, api, mp) - - mp->prefix[0] = input_params->prefix->address.as_u64[0]; - mp->prefix[1] = input_params->prefix->address.as_u64[1]; - mp->len = input_params->prefix->len; - mp->face_ids[0] = input_params->face_id; + fib_prefix_t prefix; + memcpy(&prefix.fp_addr.as_u64, &input_params->prefix->address.as_u64, sizeof(ip46_address_t)); + prefix.fp_len = input_params->prefix->len; + mp->face_ids[0] = clib_host_to_net_u32(input_params->face_id); mp->n_faces = 1; return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); -- cgit 1.2.3-korg