diff options
author | Alberto Compagno <acompagn+fdio@cisco.com> | 2019-12-02 19:41:05 +0000 |
---|---|---|
committer | Alberto Compagno <acompagn+fdio@cisco.com> | 2019-12-04 10:23:52 +0000 |
commit | da298bde46abb855cbdf7818bb34a0b5339060cc (patch) | |
tree | b7c6818520834666768dc44d5afaa8a293653e67 | |
parent | a90afcecc8029648c0e4ef2b79234eca8c31eac9 (diff) |
[HICN-427] Producer and consumer socket created with vapi
Signed-off-by: Alberto Compagno <acompagn+fdio@cisco.com>
Change-Id: I44142385b191b4c9b5c4bb418bfbd06a5e102eec
17 files changed, 413 insertions, 991 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index e95380893..68b7e10ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,6 @@ option(BUILD_HICNEXTRAPLUGIN "Build the hicn extra plugin" OFF) option(BUILD_SYSREPOPLUGIN "Build the sysrepo plugin" OFF) option(BUILD_SYSREPOP "Build the sysrepo plugin" OFF) option(BUILD_LIBYANG "Build the sysrepo plugin" OFF) -option(BUILD_CTRL_HICNPLUGIN "Build the hicn control tools for hicn plugin" OFF) list(APPEND dir_options BUILD_LIBHICN diff --git a/hicn-plugin/src/hicn.api b/hicn-plugin/src/hicn.api index 50a6f6a64..673f67c43 100644 --- a/hicn-plugin/src/hicn.api +++ b/hicn-plugin/src/hicn.api @@ -717,7 +717,7 @@ define hicn_api_register_prod_app u32 client_index; /* Arbitrary context, so client can match reply to request */ - u64 context; + u32 context; /* Prefix to match */ vl_api_prefix_t prefix; @@ -732,7 +732,7 @@ define hicn_api_register_prod_app define hicn_api_register_prod_app_reply { /* From the request */ - u64 context; + u32 context; /* Return value, zero means all OK */ i32 retval; @@ -765,7 +765,7 @@ define hicn_api_register_cons_app u32 client_index; /* Arbitrary context, so client can match reply to request */ - u64 context; + u32 context; /* swif */ u32 swif; @@ -774,7 +774,7 @@ define hicn_api_register_cons_app define hicn_api_register_cons_app_reply { /* From the request */ - u64 context; + u32 context; /* Return value, zero means all OK */ i32 retval; diff --git a/libtransport/CMakeLists.txt b/libtransport/CMakeLists.txt index d58df5c07..690b86cd8 100644 --- a/libtransport/CMakeLists.txt +++ b/libtransport/CMakeLists.txt @@ -72,12 +72,14 @@ find_package_wrapper(Asio REQUIRED) if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) set(LIBTRANSPORT hicntransport) if (__vpp__) - find_package_wrapper(HicnPlugin REQUIRED) + find_package(HicnPlugin REQUIRED) find_package(Libmemif REQUIRED) + find_package(Libhicnctrl REQUIRED) set(LIBTRANSPORT ${LIBTRANSPORT}-memif) list(APPEND LIBRARIES ${LIBMEMIF_LIBRARIES} + ${LIBHICNCTRL_SHARED} ) endif() @@ -100,6 +102,7 @@ else() if (__vpp__) list(APPEND DEPENDENCIES hicn_plugin + ${LIBHICNCTRL_SHARED} ) if (NOT Libmemif_FOUND) @@ -108,6 +111,7 @@ else() ) endif() + set(LIBHICNCTRL_LIBRARIES ${LIBHICNCTRL_SHARED}) list(APPEND LIBRARIES ${LIBMEMIF_LIBRARIES} ) @@ -143,6 +147,7 @@ list(APPEND LIBRARIES ${ANDROID_LIBRARIES} ${OPENSSL_LIBRARIES} ${WINDOWS_LIBRARIES} + ${LIBHICNCTRL_LIBRARIES} ) # Include dirs -- Order does matter! diff --git a/libtransport/cmake/Modules/Packaging.cmake b/libtransport/cmake/Modules/Packaging.cmake index 844df42cc..6fc079154 100644 --- a/libtransport/cmake/Modules/Packaging.cmake +++ b/libtransport/cmake/Modules/Packaging.cmake @@ -32,7 +32,7 @@ set(lib${LIBTRANSPORT}-devel_DESCRIPTION ${lib${LIBTRANSPORT}_DESCRIPTION} if ((BUILD_MEMIF_CONNECTOR OR BUILD_HICNPLUGIN) AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") set(lib${LIBTRANSPORT}_DEB_DEPENDENCIES - "lib${LIBHICN} (>= stable_version), libparc (>= 1.0), libmemif (>= stable_version), vpp (>= stable_version-release), vpp (<< next_version-release)" + "lib${LIBHICN} (>= stable_version), libparc (>= 1.0), libmemif (>= stable_version), vpp (>= stable_version-release), vpp (<< next_version-release), libhicnctrl-plugin (>= stable_version-release), libhicnctrl-plugin (<< stable_version-release)" CACHE STRING "Dependencies for deb/rpm package." ) diff --git a/libtransport/src/hicn/transport/core/CMakeLists.txt b/libtransport/src/hicn/transport/core/CMakeLists.txt index 0e674fcac..8439fdf45 100644 --- a/libtransport/src/hicn/transport/core/CMakeLists.txt +++ b/libtransport/src/hicn/transport/core/CMakeLists.txt @@ -55,17 +55,15 @@ if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") list(APPEND HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/vpp_forwarder_interface.h ${CMAKE_CURRENT_SOURCE_DIR}/memif_connector.h - ${CMAKE_CURRENT_SOURCE_DIR}/hicn_binary_api.h - ${CMAKE_CURRENT_SOURCE_DIR}/vpp_binary_api.h - ${CMAKE_CURRENT_SOURCE_DIR}/memif_binary_api.h + ${CMAKE_CURRENT_SOURCE_DIR}/hicn_vapi.h + ${CMAKE_CURRENT_SOURCE_DIR}/memif_vapi.h ) list(APPEND SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/vpp_forwarder_interface.cc ${CMAKE_CURRENT_SOURCE_DIR}/memif_connector.cc - ${CMAKE_CURRENT_SOURCE_DIR}/hicn_binary_api.c - ${CMAKE_CURRENT_SOURCE_DIR}/vpp_binary_api.c - ${CMAKE_CURRENT_SOURCE_DIR}/memif_binary_api.c + ${CMAKE_CURRENT_SOURCE_DIR}/hicn_vapi.c + ${CMAKE_CURRENT_SOURCE_DIR}/memif_vapi.c ) endif() diff --git a/libtransport/src/hicn/transport/core/hicn_binary_api.c b/libtransport/src/hicn/transport/core/hicn_binary_api.c deleted file mode 100644 index 1f8dfd326..000000000 --- a/libtransport/src/hicn/transport/core/hicn_binary_api.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <hicn/transport/config.h> - -#ifdef __vpp__ - -#include <hicn/transport/core/hicn_binary_api.h> -#include <hicn/transport/core/vpp_binary_api_internal.h> -#include <hicn/transport/utils/log.h> - -#define HICN_VPP_PLUGIN -#include <hicn/name.h> -#undef HICN_VPP_PLUGIN - -#include <fcntl.h> -#include <inttypes.h> -#include <semaphore.h> -#include <string.h> -#include <sys/stat.h> - -#include <vlib/vlib.h> -#include <vlibapi/api.h> -#include <vlibmemory/api.h> -#include <vppinfra/error.h> - -#include <vnet/ip/format.h> -#include <vnet/ip/ip4_packet.h> -#include <vnet/ip/ip6_packet.h> -#include <vnet/ip/ip_types_api.h> -#include <vnet/fib/fib_types.h> - -#include <vpp_plugins/hicn/error.h> -#include <vpp_plugins/hicn/hicn_api.h> - -// uword unformat_sw_if_index (unformat_input_t * input, va_list * args); - -/* Declare message IDs */ -#include <hicn/hicn_msg_enum.h> - -#define vl_endianfun -#define vl_typedefs -#include <vnet/ip/ip_types.api.h> -#undef vl_typedefs -#undef vl_endianfun - -#define vl_endianfun /* define message structures */ -#define vl_print(handle, ...) -#define vl_printfun -#define vl_api_version(n, v) static u32 api_version = (v); -#define vl_msg_name_crc_list -#include <hicn/hicn_all_api_h.h> -#undef vl_msg_name_crc_list -#undef vl_api_version -#undef vl_printfun -#undef vl_endianfun -///////////////////////////////////////////////////// -const char *HICN_ERROR_STRING[] = { -#define _(a, b, c) c, - foreach_hicn_error -#undef _ -}; -///////////////////////////////////////////////////// - -/*********************** 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, -}; - -/* - * Table of message reply handlers, must include boilerplate handlers - * we just generated - */ -#define foreach_hicn_api_reply_msg \ - _(HICN_API_REGISTER_PROD_APP_REPLY, hicn_api_register_prod_app_reply) \ - _(HICN_API_FACE_PROD_DEL_REPLY, hicn_api_face_prod_del_reply) \ - _(HICN_API_REGISTER_CONS_APP_REPLY, hicn_api_register_cons_app_reply) \ - _(HICN_API_FACE_CONS_DEL_REPLY, hicn_api_face_cons_del_reply) \ - _(HICN_API_ROUTE_NHOPS_ADD_REPLY, hicn_api_route_nhops_add_reply) - -int hicn_binary_api_register_prod_app( - vpp_plugin_binary_api_t *api, hicn_producer_input_params *input_params, - hicn_producer_output_params *output_params) { - vl_api_hicn_api_register_prod_app_t *mp; - vpp_plugin_binary_api_t *hm = api; - vpp_binary_api_set_user_param(api->vpp_api, output_params); - - /* Construct the API message */ - M(HICN_API_REGISTER_PROD_APP, mp); - - CONTEXT_SAVE(context_store, api, mp) - - fib_prefix_t prefix; - memcpy(&prefix.fp_addr, &input_params->prefix->address, 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); - - return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); -} - -static void vl_api_hicn_api_register_prod_app_reply_t_handler( - vl_api_hicn_api_register_prod_app_reply_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - hicn_producer_output_params *params = - vpp_binary_api_get_user_param(binary_api->vpp_api); - - 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 = (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); -} - -int hicn_binary_api_face_prod_del( - vpp_plugin_binary_api_t *api, hicn_del_face_app_input_params *input_params) { - vl_api_hicn_api_face_prod_del_t *mp; - vpp_plugin_binary_api_t *hm = api; - - //vpp_binary_api_set_user_param(hm->vpp_api, output_params); - - /* Construct the API message */ - M(HICN_API_FACE_PROD_DEL, mp); - - mp->faceid = clib_host_to_net_u32(input_params->face_id); - - CONTEXT_SAVE(context_store, api, mp) - - return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); -} - -static void vl_api_hicn_api_face_prod_del_reply_t_handler( - vl_api_hicn_api_face_prod_del_reply_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - - vpp_binary_api_set_ret_value(binary_api->vpp_api, - clib_net_to_host_u32(mp->retval)); - - vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); -} - -int hicn_binary_api_register_cons_app( - vpp_plugin_binary_api_t *api, hicn_consumer_input_params *input_params, - hicn_consumer_output_params *output_params) { - vl_api_hicn_api_register_cons_app_t *mp; - vpp_plugin_binary_api_t *hm = api; - - vpp_binary_api_set_user_param(hm->vpp_api, output_params); - - /* Construct the API message */ - M(HICN_API_REGISTER_CONS_APP, mp); - - mp->swif = clib_host_to_net_u32(input_params->swif); - - CONTEXT_SAVE(context_store, api, mp) - - return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); -} - -static void vl_api_hicn_api_register_cons_app_reply_t_handler( - vl_api_hicn_api_register_cons_app_reply_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - hicn_consumer_output_params *params = - vpp_binary_api_get_user_param(binary_api->vpp_api); - - vpp_binary_api_set_ret_value(binary_api->vpp_api, - clib_net_to_host_u32(mp->retval)); - - ip_address_decode(&mp->src_addr4, (ip46_address_t *)params->src4); - ip_address_decode(&mp->src_addr6, (ip46_address_t *)params->src6); - params->face_id1 = clib_host_to_net_u32(mp->faceid1); - params->face_id2 = clib_host_to_net_u32(mp->faceid2); - - vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); -} - -int hicn_binary_api_face_cons_del( - vpp_plugin_binary_api_t *api, hicn_del_face_app_input_params *input_params) { - vl_api_hicn_api_face_cons_del_t *mp; - vpp_plugin_binary_api_t *hm = api; - - /* Construct the API message */ - M(HICN_API_FACE_CONS_DEL, mp); - - mp->faceid = clib_host_to_net_u32(input_params->face_id); - - CONTEXT_SAVE(context_store, api, mp) - - return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); -} - -static void vl_api_hicn_api_face_cons_del_reply_t_handler( - vl_api_hicn_api_face_cons_del_reply_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - - vpp_binary_api_set_ret_value(binary_api->vpp_api, - clib_net_to_host_u32(mp->retval)); - - vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); -} - -int hicn_binary_api_register_route( - vpp_plugin_binary_api_t *api, - hicn_producer_set_route_params *input_params) { - vl_api_hicn_api_route_nhops_add_t *mp; - vpp_plugin_binary_api_t *hm = api; - - /* Construct the API message */ - M(HICN_API_ROUTE_NHOPS_ADD, mp); - - CONTEXT_SAVE(context_store, api, mp) - fib_prefix_t prefix; - memcpy(&prefix.fp_addr, &input_params->prefix->address, 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); -} - -static void vl_api_hicn_api_route_nhops_add_reply_t_handler( - vl_api_hicn_api_route_nhops_add_reply_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - - vpp_binary_api_set_ret_value(binary_api->vpp_api, - clib_net_to_host_u32(mp->retval)); - - vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); -} - -static int hicn_binary_api_setup_handlers(vpp_plugin_binary_api_t *binary_api) { - vpp_plugin_binary_api_t *sm __attribute__((unused)) = binary_api; -#define _(N, n) \ - vl_msg_api_set_handlers(VL_API_##N + sm->msg_id_base, #n, \ - vl_api_##n##_t_handler, vl_noop_handler, \ - vl_api_##n##_t_endian, vl_api_##n##_t_print, \ - sizeof(vl_api_##n##_t), 1); - foreach_hicn_api_reply_msg; -#undef _ - return 0; -} - -char *hicn_binary_api_get_error_string(int ret_val) { - return get_error_string(ret_val); -} - -vpp_plugin_binary_api_t *hicn_binary_api_init(vpp_binary_api_t *api) { - vpp_plugin_binary_api_t *ret = malloc(sizeof(vpp_plugin_binary_api_t)); - u8 *name = format(0, "hicn_%08x%c", api_version, 0); - ret->msg_id_base = vl_client_get_first_plugin_msg_id((char *)name); - ret->vpp_api = api; - ret->my_client_index = vpp_binary_api_get_client_index(api); - hicn_binary_api_setup_handlers(ret); - return ret; -} - -#endif // __vpp__ diff --git a/libtransport/src/hicn/transport/core/hicn_vapi.c b/libtransport/src/hicn/transport/core/hicn_vapi.c new file mode 100644 index 000000000..cca5a552a --- /dev/null +++ b/libtransport/src/hicn/transport/core/hicn_vapi.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <hicn/transport/config.h> + +#ifdef __vpp__ + +#include <hicn/transport/core/hicn_vapi.h> +#include <hicn/transport/utils/log.h> + +#define HICN_VPP_PLUGIN +#include <hicn/name.h> +#undef HICN_VPP_PLUGIN + +#include <vlib/vlib.h> +#include <vlibapi/api.h> +#include <vlibmemory/api.h> +#include <vppinfra/error.h> + +#include <vnet/ip/format.h> +#include <vnet/ip/ip4_packet.h> +#include <vnet/ip/ip6_packet.h> +#include <vnet/ip/ip_types_api.h> +#include <vnet/fib/fib_types.h> + +#include <vpp_plugins/hicn/error.h> +#include <vapi/hicn.api.vapi.h> +//#include <vpp_plugins/hicn/hicn_api.h> + +///////////////////////////////////////////////////// +const char *HICN_ERROR_STRING[] = { +#define _(a, b, c) c, + foreach_hicn_error +#undef _ +}; +///////////////////////////////////////////////////// + +/*********************** 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; + return NULL; +} + +/*********************************************************************************/ + +DEFINE_VAPI_MSG_IDS_HICN_API_JSON + +static vapi_error_e register_prod_app_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_hicn_api_register_prod_app_reply *reply) { + hicn_producer_output_params * output_params = (hicn_producer_output_params *)callback_ctx; + + if(reply == NULL) + return rv; + + output_params->cs_reserved = reply->cs_reserved; + output_params->prod_addr = (ip_address_t *)malloc(sizeof(ip_address_t)); + memset(output_params->prod_addr, 0, sizeof(ip_address_t)); + if(reply->prod_addr.af == ADDRESS_IP6) + memcpy(&output_params->prod_addr->v6, reply->prod_addr.un.ip6, sizeof(ip6_address_t)); + else + memcpy(&output_params->prod_addr->v4, reply->prod_addr.un.ip4, sizeof(ip4_address_t)); + output_params->face_id = reply->faceid; + + return reply->retval; +} + +int hicn_vapi_register_prod_app( + vapi_ctx_t ctx, hicn_producer_input_params *input_params, + hicn_producer_output_params *output_params) { + + vapi_msg_hicn_api_register_prod_app * msg = vapi_alloc_hicn_api_register_prod_app(ctx); + + if(ip46_address_is_ip4(&input_params->prefix->address)) { + memcpy(&msg->payload.prefix.address.un.ip4, &input_params->prefix->address, sizeof(ip4_address_t)); + msg->payload.prefix.address.af = ADDRESS_IP4; + } else { + memcpy(&msg->payload.prefix.address.un.ip6, &input_params->prefix->address, sizeof(ip6_address_t)); + msg->payload.prefix.address.af = ADDRESS_IP6; + } + msg->payload.prefix.len = input_params->prefix->len; + + msg->payload.swif = input_params->swif; + msg->payload.cs_reserved = input_params->cs_reserved; + + return vapi_hicn_api_register_prod_app(ctx, msg, register_prod_app_cb, output_params); +} + +static vapi_error_e face_prod_del_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_hicn_api_face_prod_del_reply *reply) { + if(reply == NULL) + return rv; + + return reply->retval; +} + +int hicn_vapi_face_prod_del( + vapi_ctx_t ctx, hicn_del_face_app_input_params *input_params) { + + vapi_msg_hicn_api_face_prod_del * msg = vapi_alloc_hicn_api_face_prod_del(ctx); + + msg->payload.faceid = input_params->face_id; + + return vapi_hicn_api_face_prod_del(ctx, msg, face_prod_del_cb, NULL); +} + +static vapi_error_e register_cons_app_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_hicn_api_register_cons_app_reply *reply) { + hicn_consumer_output_params * output_params = (hicn_consumer_output_params *)callback_ctx; + + if(reply == NULL) + return rv; + + output_params->src6 = (ip_address_t *)malloc(sizeof(ip_address_t)); + output_params->src4 = (ip_address_t *)malloc(sizeof(ip_address_t)); + memset(output_params->src6, 0, sizeof(ip_address_t)); + memset(output_params->src4, 0, sizeof(ip_address_t)); + memcpy(&output_params->src6->v6, &reply->src_addr6.un.ip6, sizeof(ip6_address_t)); + memcpy(&output_params->src4->v4, &reply->src_addr4.un.ip4, sizeof(ip4_address_t)); + + output_params->face_id1 = reply->faceid1; + output_params->face_id2 = reply->faceid2; + + return reply->retval; +} + +int hicn_vapi_register_cons_app( + vapi_ctx_t ctx, hicn_consumer_input_params *input_params, + hicn_consumer_output_params *output_params) { + + vapi_msg_hicn_api_register_cons_app * msg = vapi_alloc_hicn_api_register_cons_app(ctx); + + msg->payload.swif = input_params->swif; + + return vapi_hicn_api_register_cons_app(ctx, msg, register_cons_app_cb, output_params); +} + +static vapi_error_e face_cons_del_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_hicn_api_face_cons_del_reply *reply) { + if(reply == NULL) + return rv; + + return reply->retval; +} + +int hicn_vapi_face_cons_del( + vapi_ctx_t ctx, hicn_del_face_app_input_params *input_params) { + + vapi_msg_hicn_api_face_cons_del * msg = vapi_alloc_hicn_api_face_cons_del(ctx); + + msg->payload.faceid = input_params->face_id; + + return vapi_hicn_api_face_cons_del(ctx, msg, face_cons_del_cb, NULL); +} + +static vapi_error_e reigster_route_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_hicn_api_route_nhops_add_reply *reply) { + if(reply == NULL) + return rv; + + return reply->retval; +} + +int hicn_vapi_register_route( + vapi_ctx_t ctx, + hicn_producer_set_route_params *input_params) { + + vapi_msg_hicn_api_route_nhops_add * msg = vapi_alloc_hicn_api_route_nhops_add(ctx); + + fib_prefix_t prefix; + memcpy(&prefix.fp_addr, &input_params->prefix->address, sizeof(ip46_address_t)); + prefix.fp_len = input_params->prefix->len; + msg->payload.face_ids[0] = input_params->face_id; + msg->payload.n_faces = 1; + + return vapi_hicn_api_route_nhops_add(ctx, msg, reigster_route_cb, NULL); +} + +char *hicn_vapi_get_error_string(int ret_val) { + return get_error_string(ret_val); +} + +#endif // __vpp__ diff --git a/libtransport/src/hicn/transport/core/hicn_binary_api.h b/libtransport/src/hicn/transport/core/hicn_vapi.h index 11543da19..f2718e6f5 100644 --- a/libtransport/src/hicn/transport/core/hicn_binary_api.h +++ b/libtransport/src/hicn/transport/core/hicn_vapi.h @@ -20,12 +20,12 @@ #ifdef __vpp__ -#include <hicn/transport/core/vpp_binary_api.h> - #ifdef __cplusplus extern "C" { #endif +#include <vapi/vapi.h> + #include "stdint.h" typedef struct { @@ -60,26 +60,24 @@ typedef struct { uint32_t face_id; } hicn_producer_set_route_params; -vpp_plugin_binary_api_t* hicn_binary_api_init(vpp_binary_api_t* api); - -int hicn_binary_api_register_prod_app( - vpp_plugin_binary_api_t* api, hicn_producer_input_params* input_params, +int hicn_vapi_register_prod_app( + vapi_ctx_t ctx, hicn_producer_input_params* input_params, hicn_producer_output_params* output_params); -int hicn_binary_api_register_cons_app( - vpp_plugin_binary_api_t* api, hicn_consumer_input_params* input_params, +int hicn_vapi_register_cons_app( + vapi_ctx_t ctx, hicn_consumer_input_params* input_params, hicn_consumer_output_params* output_params); -int hicn_binary_api_register_route( - vpp_plugin_binary_api_t* api, hicn_producer_set_route_params* input_params); +int hicn_vapi_register_route( + vapi_ctx_t ctx, hicn_producer_set_route_params* input_params); -int hicn_binary_api_face_cons_del( - vpp_plugin_binary_api_t *api, hicn_del_face_app_input_params *input_params); +int hicn_vapi_face_cons_del( + vapi_ctx_t ctx, hicn_del_face_app_input_params *input_params); -int hicn_binary_api_face_prod_del( - vpp_plugin_binary_api_t *api, hicn_del_face_app_input_params *input_params); +int hicn_vapi_face_prod_del( + vapi_ctx_t ctx, hicn_del_face_app_input_params *input_params); -char* hicn_binary_api_get_error_string(int ret_val); +char* hicn_vapi_get_error_string(int ret_val); #ifdef __cplusplus } diff --git a/libtransport/src/hicn/transport/core/memif_binary_api.c b/libtransport/src/hicn/transport/core/memif_binary_api.c deleted file mode 100644 index 834c8db13..000000000 --- a/libtransport/src/hicn/transport/core/memif_binary_api.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <hicn/transport/config.h> - -#ifdef __vpp__ - -#include <hicn/transport/core/memif_binary_api.h> -#include <hicn/transport/core/vpp_binary_api_internal.h> -#include <hicn/transport/utils/log.h> - -#include <fcntl.h> -#include <inttypes.h> -#include <semaphore.h> -#include <string.h> -#include <sys/stat.h> - -#include <vlibapi/api.h> -#include <vlibmemory/api.h> - -// uword unformat_sw_if_index (unformat_input_t * input, va_list * args); - -/* Declare message IDs */ -#include <memif/memif_msg_enum.h> - -#define vl_msg_name_crc_list -#include <vpp/api/vpe_all_api_h.h> -#undef vl_msg_name_crc_list - -#define vl_typedefs -#define vl_endianfun -#define vl_print(handle, ...) -#define vl_printfun -#define vl_api_version(n, v) static u32 api_version = (v); -#define vl_msg_name_crc_list -#include <memif/memif_all_api_h.h> -#undef vl_msg_name_crc_list -#undef vl_api_version -#undef vl_printfun -#undef vl_endianfun -#undef vl_typedefs - -/* define message structures */ -#define vl_typedefs -#include <vpp/api/vpe_all_api_h.h> -#undef vl_typedefs - -static context_store_t context_store = { - .global_pointers_map_index = 0, -}; - -/* - * Table of message reply handlers, must include boilerplate handlers - * we just generated - */ -#define foreach_memif_api_reply_msg \ - _(MEMIF_CREATE_REPLY, memif_create_reply) \ - _(MEMIF_DELETE_REPLY, memif_delete_reply) \ - _(MEMIF_DETAILS, memif_details) - -int memif_binary_api_get_next_memif_id(vpp_plugin_binary_api_t *api, - uint32_t *memif_id) { - // Dump all the memif interfaces and return the next to the largest memif id - vl_api_memif_dump_t *mp; - vpp_plugin_binary_api_t *hm = api; - - M(MEMIF_DUMP, mp); - uint32_t *user_param = malloc(sizeof(uint32_t)); - *user_param = 0; - vpp_binary_api_set_user_param(api->vpp_api, user_param); - - CONTEXT_SAVE(context_store, api, mp); - - vpp_binary_api_send_request(api->vpp_api, mp); - - vpp_binary_api_send_receive_ping(api->vpp_api); - - user_param = vpp_binary_api_get_user_param(api->vpp_api); - *memif_id = *(uint32_t *)(user_param); - free(user_param); - - return vpp_binary_api_get_ret_value(api->vpp_api); -} - -static void vl_api_memif_details_t_handler(vl_api_memif_details_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - uint32_t *last_memif_id = vpp_binary_api_get_user_param(binary_api->vpp_api); - uint32_t current_memif_id = clib_net_to_host_u32(mp->id); - if (current_memif_id >= *last_memif_id) { - *last_memif_id = current_memif_id + 1; - } -} - -int memif_binary_api_create_memif(vpp_plugin_binary_api_t *api, - memif_create_params_t *input_params, - memif_output_params_t *output_params) { - vl_api_memif_create_t *mp; - vpp_plugin_binary_api_t *hm = api; - - if (input_params->socket_id == ~0) { - // invalid socket-id - return -1; - } - - if (!is_pow2(input_params->ring_size)) { - // ring size must be power of 2 - return -1; - } - - if (input_params->rx_queues > 255 || input_params->rx_queues < 1) { - // rx queue must be between 1 - 255 - return -1; - } - - if (input_params->tx_queues > 255 || input_params->tx_queues < 1) { - // tx queue must be between 1 - 255 - return -1; - } - - vpp_binary_api_set_user_param(api->vpp_api, output_params); - - /* Construct the API message */ - M(MEMIF_CREATE, mp); - - CONTEXT_SAVE(context_store, api, mp) - - mp->role = input_params->role; - mp->mode = input_params->mode; - mp->rx_queues = input_params->rx_queues; - mp->tx_queues = input_params->tx_queues; - mp->id = clib_host_to_net_u32(input_params->id); - mp->socket_id = clib_host_to_net_u32(input_params->socket_id); - mp->ring_size = clib_host_to_net_u32(input_params->ring_size); - mp->buffer_size = clib_host_to_net_u16(input_params->buffer_size); - - int ret = vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); - if (ret < 0) { - return ret; - } - - return vpp_binary_api_set_int_state(api->vpp_api, output_params->sw_if_index, - UP); -} -int memif_binary_api_delete_memif(vpp_plugin_binary_api_t *api, - uint32_t sw_if_index) { - vl_api_memif_delete_t *mp; - vpp_plugin_binary_api_t *hm = api; - - /* Construct the API message */ - M(MEMIF_DELETE, mp); - - CONTEXT_SAVE(context_store, api, mp) - - mp->sw_if_index = htonl(sw_if_index); - - return vpp_binary_api_send_request_wait_reply(api->vpp_api, mp); -} - -static void vl_api_memif_create_reply_t_handler( - vl_api_memif_create_reply_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - memif_output_params_t *params = - vpp_binary_api_get_user_param(binary_api->vpp_api); - - vpp_binary_api_set_ret_value(binary_api->vpp_api, - clib_net_to_host_u32(mp->retval)); - params->sw_if_index = clib_net_to_host_u32(mp->sw_if_index); - - vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); -} - -static void vl_api_memif_delete_reply_t_handler( - vl_api_memif_delete_reply_t *mp) { - vpp_plugin_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - - vpp_binary_api_set_ret_value(binary_api->vpp_api, - clib_net_to_host_u32(mp->retval)); - - vpp_binary_api_unlock_waiting_thread(binary_api->vpp_api); -} - -static int memif_binary_api_setup_handlers( - vpp_plugin_binary_api_t *binary_api) { - vpp_plugin_binary_api_t *sm __attribute__((unused)) = binary_api; -#define _(N, n) \ - vl_msg_api_set_handlers(VL_API_##N + sm->msg_id_base, #n, \ - vl_api_##n##_t_handler, vl_noop_handler, \ - vl_api_##n##_t_endian, vl_api_##n##_t_print, \ - sizeof(vl_api_##n##_t), 1); - foreach_memif_api_reply_msg; -#undef _ - return 0; -} - -vpp_plugin_binary_api_t *memif_binary_api_init(vpp_binary_api_t *api) { - vpp_plugin_binary_api_t *ret = malloc(sizeof(vpp_plugin_binary_api_t)); - u8 *name = format(0, "memif_%08x%c", api_version, 0); - ret->msg_id_base = vl_client_get_first_plugin_msg_id((char *)name); - ret->vpp_api = api; - ret->my_client_index = vpp_binary_api_get_client_index(api); - memif_binary_api_setup_handlers(ret); - return ret; -} - -#endif // __vpp__
\ No newline at end of file diff --git a/libtransport/src/hicn/transport/core/memif_connector.h b/libtransport/src/hicn/transport/core/memif_connector.h index 4f43c97ef..bf4e2d56c 100644 --- a/libtransport/src/hicn/transport/core/memif_connector.h +++ b/libtransport/src/hicn/transport/core/memif_connector.h @@ -17,7 +17,7 @@ #include <hicn/transport/config.h> #include <hicn/transport/core/connector.h> -#include <hicn/transport/core/hicn_binary_api.h> +//#include <hicn/transport/core/hicn_vapi.h> #include <hicn/transport/portability/portability.h> #include <hicn/transport/utils/epoll_event_reactor.h> #include <hicn/transport/utils/fd_deadline_timer.h> diff --git a/libtransport/src/hicn/transport/core/memif_vapi.c b/libtransport/src/hicn/transport/core/memif_vapi.c new file mode 100644 index 000000000..b0bf77e40 --- /dev/null +++ b/libtransport/src/hicn/transport/core/memif_vapi.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <hicn/transport/config.h> + +#ifdef __vpp__ + +#include <vppinfra/clib.h> +#include <hicn/transport/core/memif_vapi.h> +#include <fcntl.h> +#include <inttypes.h> +#include <semaphore.h> +#include <string.h> +#include <sys/stat.h> + +DEFINE_VAPI_MSG_IDS_MEMIF_API_JSON + +static vapi_error_e memif_details_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_memif_details *reply) { + uint32_t *last_memif_id = (uint32_t *)callback_ctx; + uint32_t current_memif_id = 0; + if (reply != NULL) { + current_memif_id = reply->id; + } + else { + return rv; + } + + if (current_memif_id >= *last_memif_id) { + *last_memif_id = current_memif_id + 1; + } + + return rv; +} + +int memif_vapi_get_next_memif_id(vapi_ctx_t ctx, + uint32_t *memif_id) { + + vapi_msg_memif_dump * msg = vapi_alloc_memif_dump(ctx); + return vapi_memif_dump(ctx, msg, memif_details_cb, memif_id); +} + +static vapi_error_e memif_create_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_memif_create_reply *reply) { + memif_output_params_t *output_params = (memif_output_params_t *)callback_ctx; + + if (reply == NULL) + return rv; + + output_params->sw_if_index = reply->sw_if_index; + + return rv; +} + +int memif_vapi_create_memif(vapi_ctx_t ctx, + memif_create_params_t *input_params, + memif_output_params_t *output_params) { + vapi_msg_memif_create * msg = vapi_alloc_memif_create(ctx); + + if (input_params->socket_id == ~0) { + // invalid socket-id + return -1; + } + + if (!is_pow2(input_params->ring_size)) { + // ring size must be power of 2 + return -1; + } + + if (input_params->rx_queues > 255 || input_params->rx_queues < 1) { + // rx queue must be between 1 - 255 + return -1; + } + + if (input_params->tx_queues > 255 || input_params->tx_queues < 1) { + // tx queue must be between 1 - 255 + return -1; + } + + msg->payload.role = input_params->role; + msg->payload.mode = input_params->mode; + msg->payload.rx_queues = input_params->rx_queues; + msg->payload.tx_queues = input_params->tx_queues; + msg->payload.id = input_params->id; + msg->payload.socket_id = input_params->socket_id; + msg->payload.ring_size = input_params->ring_size; + msg->payload.buffer_size = input_params->buffer_size; + + return vapi_memif_create(ctx, msg, memif_create_cb, output_params); + +} + +static vapi_error_e memif_delete_cb(vapi_ctx_t ctx, + void *callback_ctx, + vapi_error_e rv, + bool is_last, + vapi_payload_memif_delete_reply *reply) { + if(reply == NULL) + return rv; + + return reply->retval; +} + +int memif_vapi_delete_memif(vapi_ctx_t ctx, + uint32_t sw_if_index) { + vapi_msg_memif_delete * msg = vapi_alloc_memif_delete(ctx); + + msg->payload.sw_if_index = sw_if_index; + + return vapi_memif_delete(ctx, msg, memif_delete_cb, NULL); +} + +#endif // __vpp__
\ No newline at end of file diff --git a/libtransport/src/hicn/transport/core/memif_binary_api.h b/libtransport/src/hicn/transport/core/memif_vapi.h index b950292b9..c045cf093 100644 --- a/libtransport/src/hicn/transport/core/memif_binary_api.h +++ b/libtransport/src/hicn/transport/core/memif_vapi.h @@ -16,7 +16,6 @@ #pragma once #include <hicn/transport/config.h> -#include <hicn/transport/core/vpp_binary_api.h> #ifdef __vpp__ @@ -24,6 +23,7 @@ extern "C" { #endif +#include <vapi/memif.api.vapi.h> #include "stdint.h" typedef struct memif_create_params_s { @@ -43,16 +43,14 @@ typedef struct memif_output_params_s { uint32_t sw_if_index; } memif_output_params_t; -vpp_plugin_binary_api_t *memif_binary_api_init(vpp_binary_api_t *api); - -int memif_binary_api_get_next_memif_id(vpp_plugin_binary_api_t *api, +int memif_vapi_get_next_memif_id(vapi_ctx_t ctx, uint32_t *memif_id); -int memif_binary_api_create_memif(vpp_plugin_binary_api_t *api, +int memif_vapi_create_memif(vapi_ctx_t ctx, memif_create_params_t *input_params, memif_output_params_t *output_params); -int memif_binary_api_delete_memif(vpp_plugin_binary_api_t *api, +int memif_vapi_delete_memif(vapi_ctx_t ctx, uint32_t sw_if_index); #ifdef __cplusplus diff --git a/libtransport/src/hicn/transport/core/vpp_binary_api.c b/libtransport/src/hicn/transport/core/vpp_binary_api.c deleted file mode 100644 index d54ef257e..000000000 --- a/libtransport/src/hicn/transport/core/vpp_binary_api.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <hicn/transport/config.h> - -#ifdef __vpp__ - -#include <hicn/transport/core/vpp_binary_api.h> -#include <hicn/transport/core/vpp_binary_api_internal.h> -#include <hicn/transport/utils/log.h> - -#include <vat/vat.h> -#include <vlibapi/api.h> -#include <vlibmemory/api.h> - -#include <vnet/ip/ip.h> -#include <vppinfra/error.h> - -#include <fcntl.h> -#include <inttypes.h> -#include <string.h> -#include <sys/stat.h> - -#include <vpp/api/vpe_msg_enum.h> - -#define vl_typedefs -#include <vpp/api/vpe_all_api_h.h> -#undef vl_typedefs - -#define vl_endianfun -#include <vpp/api/vpe_all_api_h.h> -#undef vl_endianfun - -#define vl_print(handle, ...) -#define vl_printfun -#include <vpp/api/vpe_all_api_h.h> -#undef vl_printfun - -/* Get CRC codes of the messages */ -#define vl_msg_name_crc_list -#include <vpp/api/vpe_all_api_h.h> -#undef vl_msg_name_crc_list - -#include <semaphore.h> - -struct vpp_binary_api { - api_main_t *api_main; - u32 my_client_index; - unix_shared_memory_queue_t *vl_input_queue; - vlib_main_t *vlib_main; - sem_t *semaphore; - u32 ping_id; - int ret_val; - void *user_param; -}; - -static context_store_t context_store = { - .global_pointers_map_index = 0, -}; - -/* - * Table of message reply handlers, must include boilerplate handlers - * we just generated - */ -#define foreach_memif_api_reply_msg \ - _(MEMIF_CREATE_REPLY, memif_create_reply) \ - _(MEMIF_DELETE_REPLY, memif_delete_reply) \ - _(MEMIF_DETAILS, memif_details) - -/** - * @brief Generic VPP request structure. - */ -typedef struct __attribute__((packed)) vl_generic_request_s { - u16 _vl_msg_id; - u32 client_index; - u32 context; -} vl_generic_request_t; - -/** - * @brief Generic VPP reply structure (response with a single message). - */ -typedef struct __attribute__((packed)) vl_generic_reply_s { - u16 _vl_msg_id; - u32 context; - i32 retval; -} vl_generic_reply_t; - -static void vl_api_control_ping_reply_t_handler( - vl_api_control_ping_reply_t *mp) { - // Just unblock main thread - vpp_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - binary_api->ret_val = ntohl(mp->retval); - vpp_binary_api_unlock_waiting_thread(binary_api); -} - -static void vl_api_sw_interface_set_flags_reply_t_handler( - vl_api_control_ping_reply_t *mp) { - // Unblock main thread setting reply message status code - vpp_binary_api_t *binary_api; - CONTEXT_GET(context_store, mp, binary_api); - binary_api->ret_val = ntohl(mp->retval); - vpp_binary_api_unlock_waiting_thread(binary_api); -} - -static int vpp_connect_to_vlib(vpp_binary_api_t *binary_api, char *name) { - clib_mem_init_thread_safe(0, 256 << 20); - if (vl_client_connect_to_vlib("/vpe-api", name, 32) < 0) { - return -1; - } - - binary_api->vl_input_queue = binary_api->api_main->shmem_hdr->vl_input_queue; - binary_api->my_client_index = binary_api->api_main->my_client_index; - - return 0; -} - -vpp_binary_api_t *vpp_binary_api_init(const char *app_name) { - vpp_binary_api_t *ret = malloc(sizeof(vpp_binary_api_t)); - ret->api_main = &api_main; - ret->vlib_main = &vlib_global_main; - - vpp_connect_to_vlib(ret, (char *)app_name); - ret->semaphore = sem_open(app_name, O_CREAT, 0, 0); - - return ret; -} - -void vpp_binary_api_destroy(vpp_binary_api_t *api) { - sem_close(api->semaphore); - free(api); - vl_client_disconnect_from_vlib(); -} - -void vpp_binary_api_unlock_waiting_thread(vpp_binary_api_t *api) { - sem_post(api->semaphore); -} - -void vpp_binary_api_send_receive_ping(vpp_binary_api_t *api) { - /* Use a control ping for synchronization */ - - /* Get the control ping ID */ -#define _(id, n, crc) \ - const char *id##_CRC __attribute__((unused)) = #n "_" #crc; - foreach_vl_msg_name_crc_vpe; -#undef _ - - int ping_reply_id = - vl_msg_api_get_msg_index((u8 *)(VL_API_CONTROL_PING_REPLY_CRC)); - vl_msg_api_set_handlers(ping_reply_id, "control_ping_reply", - vl_api_control_ping_reply_t_handler, vl_noop_handler, - vl_api_control_ping_reply_t_endian, - vl_api_control_ping_reply_t_print, - sizeof(vl_api_control_ping_reply_t), 1); - - vl_api_control_ping_t *mp_ping; - mp_ping = vl_msg_api_alloc_as_if_client(sizeof(*mp_ping)); - mp_ping->_vl_msg_id = clib_host_to_net_u16( - vl_msg_api_get_msg_index((u8 *)(VL_API_CONTROL_PING_CRC))); - mp_ping->client_index = api->my_client_index; - - CONTEXT_SAVE(context_store, api, mp_ping); - - TRANSPORT_LOGD("Sending ping id %u", mp_ping->_vl_msg_id); - - vpp_binary_api_send_request_wait_reply(api, mp_ping); -} - -int vpp_binary_api_set_int_state(vpp_binary_api_t *api, uint32_t sw_index, - link_state_t state) { -#define _(id, n, crc) \ - const char *id##_CRC __attribute__((unused)) = #n "_" #crc; - foreach_vl_msg_name_crc_vpe; -#undef _ - - int sw_interface_set_flags_reply_id = VL_API_SW_INTERFACE_SET_FLAGS_REPLY; - vl_msg_api_set_handlers( - sw_interface_set_flags_reply_id, "sw_interface_set_flags_reply", - vl_api_sw_interface_set_flags_reply_t_handler, vl_noop_handler, - vl_api_sw_interface_set_flags_reply_t_endian, - vl_api_sw_interface_set_flags_reply_t_print, - sizeof(vl_api_sw_interface_set_flags_reply_t), 1); - - vl_api_sw_interface_set_flags_t *mp; - mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)); - mp->_vl_msg_id = clib_host_to_net_u16(VL_API_SW_INTERFACE_SET_FLAGS); - mp->client_index = api->my_client_index; - mp->sw_if_index = clib_host_to_net_u32(sw_index); - mp->admin_up_down = (u8)state; - - CONTEXT_SAVE(context_store, api, mp); - - TRANSPORT_LOGD("Sending set int flags id %u", mp->_vl_msg_id); - - return vpp_binary_api_send_request_wait_reply(api, mp); -} - -void vpp_binary_api_send_request(vpp_binary_api_t *api, void *request) { - vl_generic_request_t *req = NULL; - - req = (vl_generic_request_t *)request; - TRANSPORT_LOGD("Sending a request to VPP (id=%d).\n", ntohs(req->_vl_msg_id)); - - S(api, req); -} - -int vpp_binary_api_get_ret_value(vpp_binary_api_t *api) { return api->ret_val; } - -void vpp_binary_api_set_ret_value(vpp_binary_api_t *api, int ret_val) { - api->ret_val = ret_val; -} - -void *vpp_binary_api_get_user_param(vpp_binary_api_t *api) { - return api->user_param; -} - -void vpp_binary_api_set_user_param(vpp_binary_api_t *api, void *user_param) { - api->user_param = user_param; -} - -uint32_t vpp_binary_api_get_client_index(vpp_binary_api_t *api) { - return api->my_client_index; -} - -void vpp_binary_api_set_client_index(vpp_binary_api_t *api, - uint32_t client_index) { - api->my_client_index = client_index; -} - -int vpp_binary_api_send_request_wait_reply(vpp_binary_api_t *api, - void *request) { - vpp_binary_api_send_request(api, request); - - sem_wait(api->semaphore); - - return api->ret_val; -} - -#endif // __vpp__
\ No newline at end of file diff --git a/libtransport/src/hicn/transport/core/vpp_binary_api.h b/libtransport/src/hicn/transport/core/vpp_binary_api.h deleted file mode 100644 index 932a59ec2..000000000 --- a/libtransport/src/hicn/transport/core/vpp_binary_api.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <hicn/transport/config.h> - -#ifdef __vpp__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdint.h> -#include <stdlib.h> - -typedef struct vpp_binary_api vpp_binary_api_t; -typedef struct vpp_plugin_binary_api vpp_plugin_binary_api_t; - -typedef enum link_state_s { UP = 1, DOWN = 0 } link_state_t; - -/** - * @brief Instantiate a new vpp_binary_api_t data structure and - * connect the application to the local VPP forwarder. - */ -vpp_binary_api_t *vpp_binary_api_init(const char *app_name); - -/** - * @brief Destroy the vpp_binary_api_t and disconnect from VPP. - */ -void vpp_binary_api_destroy(vpp_binary_api_t *api); - -void vpp_binary_api_send_receive_ping(vpp_binary_api_t *api); - -int vpp_binary_api_set_int_state(vpp_binary_api_t *api, uint32_t sw_index, - link_state_t state); - -/** - * @brief Send request to VPP and wait for reply. - */ -int vpp_binary_api_send_request_wait_reply(vpp_binary_api_t *api, - void *request); - -void vpp_binary_api_unlock_waiting_thread(vpp_binary_api_t *api); - -void vpp_binary_api_send_request(vpp_binary_api_t *api, void *request); - -int vpp_binary_api_get_ret_value(vpp_binary_api_t *api); - -void vpp_binary_api_set_ret_value(vpp_binary_api_t *api, int ret_val); - -void *vpp_binary_api_get_user_param(vpp_binary_api_t *api); - -void vpp_binary_api_set_user_param(vpp_binary_api_t *api, void *user_param); - -uint32_t vpp_binary_api_get_client_index(vpp_binary_api_t *api); - -void vpp_binary_api_set_client_index(vpp_binary_api_t *api, - uint32_t client_index); - -#ifdef __cplusplus -} -#endif - -#endif // __vpp__
\ No newline at end of file diff --git a/libtransport/src/hicn/transport/core/vpp_binary_api_internal.h b/libtransport/src/hicn/transport/core/vpp_binary_api_internal.h deleted file mode 100644 index a6e2c01a3..000000000 --- a/libtransport/src/hicn/transport/core/vpp_binary_api_internal.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <hicn/transport/config.h> - -#ifdef __vpp__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <semaphore.h> -#include <vlibapi/api.h> -#include <vlibmemory/api.h> - -#include <stdint.h> - -typedef struct vpp_binary_api vpp_binary_api_t; - -struct vpp_plugin_binary_api { - vpp_binary_api_t *vpp_api; - u16 msg_id_base; - u32 my_client_index; -}; - -#define POINTER_MAP_SIZE 32 -typedef struct { - void *global_pointers_map[POINTER_MAP_SIZE]; - uint8_t global_pointers_map_index; -} context_store_t; - -#define CONTEXT_SAVE(context_store, pointer, mp) \ - do { \ - context_store \ - .global_pointers_map[context_store.global_pointers_map_index] = \ - pointer; \ - mp->context = context_store.global_pointers_map_index++; \ - context_store.global_pointers_map_index %= POINTER_MAP_SIZE; \ - } while (0); - -#define CONTEXT_GET(context_store, mp, pointer) \ - do { \ - pointer = context_store.global_pointers_map[mp->context]; \ - } while (0); - -#define M(T, mp) \ - do { \ - mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)); \ - memset(mp, 0, sizeof(*mp)); \ - mp->_vl_msg_id = ntohs(VL_API_##T + hm->msg_id_base); \ - mp->client_index = hm->my_client_index; \ - } while (0); - -#define S(api, mp) (vl_msg_api_send_shmem(api->vl_input_queue, (u8 *)&mp)) - -#ifdef __cplusplus -} -#endif - -#endif // __vpp__
\ No newline at end of file diff --git a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc index 45a37d551..976d25a2f 100644 --- a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc +++ b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc @@ -17,8 +17,8 @@ #ifdef __vpp__ -#include <hicn/transport/core/hicn_binary_api.h> -#include <hicn/transport/core/memif_binary_api.h> +#include <hicn/transport/core/hicn_vapi.h> +#include <hicn/transport/core/memif_vapi.h> #include <hicn/transport/core/prefix.h> #include <hicn/transport/core/vpp_forwarder_interface.h> @@ -37,9 +37,6 @@ namespace transport { namespace core { -vpp_binary_api_t *VPPForwarderInterface::api_ = nullptr; -vpp_plugin_binary_api_t *VPPForwarderInterface::memif_api_ = nullptr; -vpp_plugin_binary_api_t *VPPForwarderInterface::hicn_api_ = nullptr; std::mutex VPPForwarderInterface::global_lock_; VPPForwarderInterface::VPPForwarderInterface(MemifConnector &connector) @@ -47,7 +44,9 @@ VPPForwarderInterface::VPPForwarderInterface(MemifConnector &connector) sw_if_index_(~0), face_id1_(~0), face_id2_(~0), - is_consumer_(false) {} + is_consumer_(false){ + sock_ = hc_sock_create(); + } VPPForwarderInterface::~VPPForwarderInterface() {} @@ -57,8 +56,8 @@ VPPForwarderInterface::~VPPForwarderInterface() {} uint32_t VPPForwarderInterface::getMemifConfiguration() { memif_create_params_t input_params = {0}; - int ret = memif_binary_api_get_next_memif_id( - VPPForwarderInterface::memif_api_, &memif_id_); + int ret = memif_vapi_get_next_memif_id( + *(vapi_ctx_t *)VPPForwarderInterface::sock_, &memif_id_); if (ret < 0) { throw errors::RuntimeException( @@ -75,7 +74,7 @@ uint32_t VPPForwarderInterface::getMemifConfiguration() { memif_output_params_t output_params = {0}; - ret = memif_binary_api_create_memif(VPPForwarderInterface::memif_api_, + ret = memif_vapi_create_memif(*(vapi_ctx_t *)VPPForwarderInterface::sock_, &input_params, &output_params); if (ret < 0) { @@ -96,11 +95,13 @@ void VPPForwarderInterface::consumerConnection() { output.src6 = &ip6_address; input.swif = sw_if_index_; - int ret = hicn_binary_api_register_cons_app(VPPForwarderInterface::hicn_api_, + + + int ret = hicn_vapi_register_cons_app(*(vapi_ctx_t *)VPPForwarderInterface::sock_, &input, &output); if (ret < 0) { - throw errors::RuntimeException(hicn_binary_api_get_error_string(ret)); + throw errors::RuntimeException(hicn_vapi_get_error_string(ret)); } face_id1_ = output.face_id1; @@ -119,18 +120,7 @@ void VPPForwarderInterface::producerConnection() { void VPPForwarderInterface::connect(bool is_consumer) { std::lock_guard<std::mutex> connection_lock(global_lock_); - srand(time(nullptr)); - int secret = rand() % (1 << 10); - std::stringstream app_name; - app_name << "Libtransport_" << secret; - - if (!VPPForwarderInterface::memif_api_) { - VPPForwarderInterface::api_ = vpp_binary_api_init(app_name.str().c_str()); - VPPForwarderInterface::memif_api_ = - memif_binary_api_init(VPPForwarderInterface::api_); - VPPForwarderInterface::hicn_api_ = - hicn_binary_api_init(VPPForwarderInterface::api_); - } + hc_sock_connect(sock_); sw_if_index_ = getMemifConfiguration(); @@ -167,11 +157,11 @@ void VPPForwarderInterface::registerRoute(Prefix &prefix) { input.prefix->len = addr.len; input.cs_reserved = content_store_reserved_; - int ret = hicn_binary_api_register_prod_app( - VPPForwarderInterface::hicn_api_, &input, &output); + int ret = hicn_vapi_register_prod_app( + *(vapi_ctx_t *)VPPForwarderInterface::sock_, &input, &output); if (ret < 0) { - throw errors::RuntimeException(hicn_binary_api_get_error_string(ret)); + throw errors::RuntimeException(hicn_vapi_get_error_string(ret)); } inet6_address_ = *output.prod_addr; @@ -185,42 +175,42 @@ void VPPForwarderInterface::registerRoute(Prefix &prefix) { params.prefix->len = addr.len; params.face_id = face_id1_; - int ret = hicn_binary_api_register_route(VPPForwarderInterface::hicn_api_, + int ret = hicn_vapi_register_route(*(vapi_ctx_t *)VPPForwarderInterface::sock_, ¶ms); if (ret < 0) { - throw errors::RuntimeException(hicn_binary_api_get_error_string(ret)); + throw errors::RuntimeException(hicn_vapi_get_error_string(ret)); } } } void VPPForwarderInterface::closeConnection() { - if (VPPForwarderInterface::api_) { + if (VPPForwarderInterface::sock_) { connector_.close(); if (is_consumer_) { hicn_del_face_app_input_params params; params.face_id = face_id1_; - hicn_binary_api_face_cons_del(VPPForwarderInterface::hicn_api_, ¶ms); + hicn_vapi_face_cons_del(*(vapi_ctx_t *)VPPForwarderInterface::sock_, ¶ms); params.face_id = face_id2_; - hicn_binary_api_face_cons_del(VPPForwarderInterface::hicn_api_, ¶ms); + hicn_vapi_face_cons_del(*(vapi_ctx_t *)VPPForwarderInterface::sock_, ¶ms); } else { hicn_del_face_app_input_params params; params.face_id = face_id1_; - hicn_binary_api_face_prod_del(VPPForwarderInterface::hicn_api_, ¶ms); + hicn_vapi_face_prod_del(*(vapi_ctx_t *)VPPForwarderInterface::sock_, ¶ms); } if (sw_if_index_ != uint32_t(~0)) { - int ret = memif_binary_api_delete_memif(VPPForwarderInterface::memif_api_, + int ret = memif_vapi_delete_memif(*(vapi_ctx_t *)VPPForwarderInterface::sock_, sw_if_index_); if (ret < 0) { TRANSPORT_LOGE("Error deleting memif with sw idx %u.", sw_if_index_); } } - vpp_binary_api_destroy(VPPForwarderInterface::api_); - VPPForwarderInterface::api_ = nullptr; + hc_sock_free(sock_); + VPPForwarderInterface::sock_ = nullptr; } } diff --git a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.h b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.h index b1cb4b9b3..b9fd44dbe 100644 --- a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.h +++ b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.h @@ -17,6 +17,10 @@ #include <hicn/transport/config.h> +extern "C" { +#include <hicn/ctrl.h> +} + #ifdef __vpp__ #include <hicn/transport/core/forwarder_interface.h> @@ -63,15 +67,13 @@ class VPPForwarderInterface void producerConnection(); - static vpp_binary_api_t *api_; - static vpp_plugin_binary_api_t *memif_api_; - static vpp_plugin_binary_api_t *hicn_api_; uint32_t memif_id_; uint32_t sw_if_index_; //A consumer socket in vpp has two faces (ipv4 and ipv6) uint32_t face_id1_; uint32_t face_id2_; bool is_consumer_; + hc_sock_t *sock_; static std::mutex global_lock_; }; |