From b0768b35fb515b7c0a15c3c7d8c1227497c59786 Mon Sep 17 00:00:00 2001 From: Alberto Compagno Date: Mon, 27 Jan 2020 16:04:33 +0100 Subject: [HICN-488] Adding lock to vapi calls and manage vapi_connect in order to connect only once. - Added library to hicn-plugin called safe_vapi that takes care of handling concurrent calls to the vapi. - Removed dependency of libhicnctrl from libtransport and added dependency to safe_vapi. - Added dependency to safe_vapi on libhicnctrl Change-Id: Ie49e8319f64a50e7ed6a56e041db977c3b184cc5 Signed-off-by: Alberto Compagno --- libtransport/src/hicn/transport/core/hicn_vapi.c | 36 ++++++++++++++++------ libtransport/src/hicn/transport/core/memif_vapi.c | 34 ++++++++++++++------ .../hicn/transport/core/vpp_forwarder_interface.cc | 23 +++++++------- .../hicn/transport/core/vpp_forwarder_interface.h | 13 +++++--- 4 files changed, 70 insertions(+), 36 deletions(-) (limited to 'libtransport/src') diff --git a/libtransport/src/hicn/transport/core/hicn_vapi.c b/libtransport/src/hicn/transport/core/hicn_vapi.c index cca5a552a..9cb96231a 100644 --- a/libtransport/src/hicn/transport/core/hicn_vapi.c +++ b/libtransport/src/hicn/transport/core/hicn_vapi.c @@ -24,6 +24,7 @@ #include #undef HICN_VPP_PLUGIN +#include #include #include #include @@ -93,7 +94,8 @@ static vapi_error_e register_prod_app_cb(vapi_ctx_t ctx, int hicn_vapi_register_prod_app( vapi_ctx_t ctx, hicn_producer_input_params *input_params, hicn_producer_output_params *output_params) { - + + vapi_lock(); 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)) { @@ -108,7 +110,9 @@ int hicn_vapi_register_prod_app( 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); + int ret = vapi_hicn_api_register_prod_app(ctx, msg, register_prod_app_cb, output_params); + vapi_unlock(); + return ret; } static vapi_error_e face_prod_del_cb(vapi_ctx_t ctx, @@ -124,12 +128,16 @@ static vapi_error_e face_prod_del_cb(vapi_ctx_t ctx, int hicn_vapi_face_prod_del( vapi_ctx_t ctx, hicn_del_face_app_input_params *input_params) { - + vapi_lock(); 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); + printf("Deleting producer face %d\n", msg->payload.faceid); + int ret = vapi_hicn_api_face_prod_del(ctx, msg, face_prod_del_cb, NULL); + printf("DONE Deleting producer face %d\n", input_params->face_id); + vapi_unlock(); + return ret; } static vapi_error_e register_cons_app_cb(vapi_ctx_t ctx, @@ -159,11 +167,14 @@ int hicn_vapi_register_cons_app( vapi_ctx_t ctx, hicn_consumer_input_params *input_params, hicn_consumer_output_params *output_params) { + vapi_lock(); 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); + int ret = vapi_hicn_api_register_cons_app(ctx, msg, register_cons_app_cb, output_params); + vapi_unlock(); + return ret; } static vapi_error_e face_cons_del_cb(vapi_ctx_t ctx, @@ -179,12 +190,15 @@ static vapi_error_e face_cons_del_cb(vapi_ctx_t ctx, int hicn_vapi_face_cons_del( vapi_ctx_t ctx, hicn_del_face_app_input_params *input_params) { - + + vapi_lock(); 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); + int ret = vapi_hicn_api_face_cons_del(ctx, msg, face_cons_del_cb, NULL); + vapi_unlock(); + return ret; } static vapi_error_e reigster_route_cb(vapi_ctx_t ctx, @@ -201,7 +215,8 @@ static vapi_error_e reigster_route_cb(vapi_ctx_t ctx, int hicn_vapi_register_route( vapi_ctx_t ctx, hicn_producer_set_route_params *input_params) { - + + vapi_lock(); vapi_msg_hicn_api_route_nhops_add * msg = vapi_alloc_hicn_api_route_nhops_add(ctx); fib_prefix_t prefix; @@ -210,7 +225,10 @@ int hicn_vapi_register_route( 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); + int ret = vapi_hicn_api_route_nhops_add(ctx, msg, reigster_route_cb, NULL); + + vapi_unlock(); + return ret; } char *hicn_vapi_get_error_string(int ret_val) { diff --git a/libtransport/src/hicn/transport/core/memif_vapi.c b/libtransport/src/hicn/transport/core/memif_vapi.c index b0bf77e40..11cf42441 100644 --- a/libtransport/src/hicn/transport/core/memif_vapi.c +++ b/libtransport/src/hicn/transport/core/memif_vapi.c @@ -16,6 +16,7 @@ #ifdef __vpp__ +#include #include #include #include @@ -49,9 +50,11 @@ static vapi_error_e memif_details_cb(vapi_ctx_t ctx, int memif_vapi_get_next_memif_id(vapi_ctx_t ctx, uint32_t *memif_id) { - + vapi_lock(); vapi_msg_memif_dump * msg = vapi_alloc_memif_dump(ctx); - return vapi_memif_dump(ctx, msg, memif_details_cb, memif_id); + int ret = vapi_memif_dump(ctx, msg, memif_details_cb, memif_id); + vapi_unlock(); + return ret; } static vapi_error_e memif_create_cb(vapi_ctx_t ctx, @@ -72,26 +75,32 @@ static vapi_error_e memif_create_cb(vapi_ctx_t ctx, int memif_vapi_create_memif(vapi_ctx_t ctx, memif_create_params_t *input_params, memif_output_params_t *output_params) { + vapi_lock(); vapi_msg_memif_create * msg = vapi_alloc_memif_create(ctx); + int ret = 0; if (input_params->socket_id == ~0) { // invalid socket-id - return -1; + ret = -1; + goto END; } if (!is_pow2(input_params->ring_size)) { // ring size must be power of 2 - return -1; + ret = -1; + goto END; } if (input_params->rx_queues > 255 || input_params->rx_queues < 1) { // rx queue must be between 1 - 255 - return -1; + ret = -1; + goto END; } if (input_params->tx_queues > 255 || input_params->tx_queues < 1) { // tx queue must be between 1 - 255 - return -1; + ret = -1; + goto END; } msg->payload.role = input_params->role; @@ -103,8 +112,10 @@ int memif_vapi_create_memif(vapi_ctx_t ctx, 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); - + ret = vapi_memif_create(ctx, msg, memif_create_cb, output_params); + END: + vapi_unlock(); + return ret; } static vapi_error_e memif_delete_cb(vapi_ctx_t ctx, @@ -120,11 +131,14 @@ static vapi_error_e memif_delete_cb(vapi_ctx_t ctx, int memif_vapi_delete_memif(vapi_ctx_t ctx, uint32_t sw_if_index) { + vapi_lock(); 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); + int ret = vapi_memif_delete(ctx, msg, memif_delete_cb, NULL); + vapi_unlock(); + return ret; } -#endif // __vpp__ \ No newline at end of file +#endif // __vpp__ diff --git a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc index 976d25a2f..06672279e 100644 --- a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc +++ b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.cc @@ -45,7 +45,6 @@ VPPForwarderInterface::VPPForwarderInterface(MemifConnector &connector) face_id1_(~0), face_id2_(~0), is_consumer_(false){ - sock_ = hc_sock_create(); } VPPForwarderInterface::~VPPForwarderInterface() {} @@ -57,7 +56,7 @@ uint32_t VPPForwarderInterface::getMemifConfiguration() { memif_create_params_t input_params = {0}; int ret = memif_vapi_get_next_memif_id( - *(vapi_ctx_t *)VPPForwarderInterface::sock_, &memif_id_); + *VPPForwarderInterface::sock_, &memif_id_); if (ret < 0) { throw errors::RuntimeException( @@ -74,7 +73,7 @@ uint32_t VPPForwarderInterface::getMemifConfiguration() { memif_output_params_t output_params = {0}; - ret = memif_vapi_create_memif(*(vapi_ctx_t *)VPPForwarderInterface::sock_, + ret = memif_vapi_create_memif(*VPPForwarderInterface::sock_, &input_params, &output_params); if (ret < 0) { @@ -97,7 +96,7 @@ void VPPForwarderInterface::consumerConnection() { - int ret = hicn_vapi_register_cons_app(*(vapi_ctx_t *)VPPForwarderInterface::sock_, + int ret = hicn_vapi_register_cons_app(*VPPForwarderInterface::sock_, &input, &output); if (ret < 0) { @@ -120,7 +119,7 @@ void VPPForwarderInterface::producerConnection() { void VPPForwarderInterface::connect(bool is_consumer) { std::lock_guard connection_lock(global_lock_); - hc_sock_connect(sock_); + vapi_connect_safe(sock_, 0); sw_if_index_ = getMemifConfiguration(); @@ -158,7 +157,7 @@ void VPPForwarderInterface::registerRoute(Prefix &prefix) { input.cs_reserved = content_store_reserved_; int ret = hicn_vapi_register_prod_app( - *(vapi_ctx_t *)VPPForwarderInterface::sock_, &input, &output); + *VPPForwarderInterface::sock_, &input, &output); if (ret < 0) { throw errors::RuntimeException(hicn_vapi_get_error_string(ret)); @@ -175,7 +174,7 @@ void VPPForwarderInterface::registerRoute(Prefix &prefix) { params.prefix->len = addr.len; params.face_id = face_id1_; - int ret = hicn_vapi_register_route(*(vapi_ctx_t *)VPPForwarderInterface::sock_, + int ret = hicn_vapi_register_route(*VPPForwarderInterface::sock_, ¶ms); if (ret < 0) { @@ -191,25 +190,25 @@ void VPPForwarderInterface::closeConnection() { if (is_consumer_) { hicn_del_face_app_input_params params; params.face_id = face_id1_; - hicn_vapi_face_cons_del(*(vapi_ctx_t *)VPPForwarderInterface::sock_, ¶ms); + hicn_vapi_face_cons_del(*VPPForwarderInterface::sock_, ¶ms); params.face_id = face_id2_; - hicn_vapi_face_cons_del(*(vapi_ctx_t *)VPPForwarderInterface::sock_, ¶ms); + hicn_vapi_face_cons_del(*VPPForwarderInterface::sock_, ¶ms); } else { hicn_del_face_app_input_params params; params.face_id = face_id1_; - hicn_vapi_face_prod_del(*(vapi_ctx_t *)VPPForwarderInterface::sock_, ¶ms); + hicn_vapi_face_prod_del(*VPPForwarderInterface::sock_, ¶ms); } if (sw_if_index_ != uint32_t(~0)) { - int ret = memif_vapi_delete_memif(*(vapi_ctx_t *)VPPForwarderInterface::sock_, + int ret = memif_vapi_delete_memif(*VPPForwarderInterface::sock_, sw_if_index_); if (ret < 0) { TRANSPORT_LOGE("Error deleting memif with sw idx %u.", sw_if_index_); } } - hc_sock_free(sock_); + vapi_disconnect_safe(); 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 b9fd44dbe..da7507176 100644 --- a/libtransport/src/hicn/transport/core/vpp_forwarder_interface.h +++ b/libtransport/src/hicn/transport/core/vpp_forwarder_interface.h @@ -17,12 +17,15 @@ #include -extern "C" { -#include -} - #ifdef __vpp__ +#ifdef always_inline +#undef always_inline +#endif +extern "C" { +#include +}; + #include #include #include @@ -73,7 +76,7 @@ class VPPForwarderInterface uint32_t face_id1_; uint32_t face_id2_; bool is_consumer_; - hc_sock_t *sock_; + vapi_ctx_t *sock_; static std::mutex global_lock_; }; -- cgit 1.2.3-korg