diff options
Diffstat (limited to 'hicn-plugin/vapi')
-rw-r--r-- | hicn-plugin/vapi/CMakeLists.txt | 113 | ||||
-rw-r--r-- | hicn-plugin/vapi/include/vapi/vapi_safe.h | 19 | ||||
-rw-r--r-- | hicn-plugin/vapi/includes/vapi/vapi_safe.h | 33 | ||||
-rw-r--r-- | hicn-plugin/vapi/libsafevapi-config.cmake.in | 8 | ||||
-rw-r--r-- | hicn-plugin/vapi/src/vapi_safe.c | 98 | ||||
-rw-r--r-- | hicn-plugin/vapi/vapi_safe.c | 73 |
6 files changed, 221 insertions, 123 deletions
diff --git a/hicn-plugin/vapi/CMakeLists.txt b/hicn-plugin/vapi/CMakeLists.txt index 6c176b9f3..2005cdaf7 100644 --- a/hicn-plugin/vapi/CMakeLists.txt +++ b/hicn-plugin/vapi/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Cisco and/or its affiliates. +# Copyright (c) 2021-2022 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: @@ -11,51 +11,102 @@ # See the License for the specific language governing permissions and # limitations under the License. -cmake_minimum_required(VERSION 3.10 FATAL_ERROR) - -set(SAFE_VAPI safe_vapi CACHE INTERNAL "" FORCE) +############################################################## +# Libs and Bins names +############################################################## +set(SAFE_VAPI safevapi CACHE INTERNAL "" FORCE) set(SAFE_VAPI_SHARED ${SAFE_VAPI}.shared CACHE INTERNAL "" FORCE) -set(SAFE_VAPI_STATIC ${SAFE_VAPI}.static CACHE INTERNAL "" FORCE) +set(SAFE_VAPI_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/includes CACHE INTERNAL "" FORCE) +set(SAFE_VAPI_LIBRARIES ${SAFE_VAPI_SHARED} CACHE INTERNAL "" FORCE) + + +############################################################## +# Dependencies and third party libs +############################################################## +find_package(Vpp ${VPP_DEFAULT_VERSION} EXACT REQUIRED) -# Dependencies -find_package(Vpp REQUIRED) +############################################################## +# Check if building as subproject or as root project +############################################################## +if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + include(CommonSetup) + find_package(HicnPlugin ${CURRENT_VERSION} EXACT REQUIRED) +else() + list(APPEND DEPENDENCIES + ${HICNPLUGIN} + ) +endif() + +############################################################## +# Sources +############################################################## list(APPEND HEADER_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/include/vapi/vapi_safe.h + ${CMAKE_CURRENT_SOURCE_DIR}/includes/vapi/vapi_safe.h ) list(APPEND SOURCE_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/vapi_safe.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/vapi_safe.c ) + +############################################################## +# Compiler Options +############################################################## +set(COMPILER_OPTIONS + ${DEFAULT_COMPILER_OPTIONS} + ${MARCH_COMPILER_OPTIONS} +) + + +############################################################## +# Libraries to link +############################################################## set (LIBRARIES - ${VPP_LIBRARY_VAPICLIENT}) + ${VPP_LIBRARY_VAPICLIENT} +) + +############################################################## +# Include directories +############################################################## list (APPEND INCLUDE_DIRS - ${VPP_INCLUDE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include) + PUBLIC + $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> + $<BUILD_INTERFACE:${HICNPLUGIN_INCLUDE_DIRS}> + $<BUILD_INTERFACE:${VPP_INCLUDE_DIR}> + $<BUILD_INTERFACE:${SAFE_VAPI_INCLUDE_DIRS}> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> +) -build_library(${SAFE_VAPI} - SHARED STATIC - SOURCES ${SOURCE_FILES} ${HEADER_FILES} - INSTALL_HEADERS ${HEADER_FILES} - LINK_LIBRARIES ${LIBRARIES} - COMPONENT ${HICN_PLUGIN} - INCLUDE_DIRS ${INCLUDE_DIRS} - HEADER_ROOT_DIR / - DEFINITIONS ${COMPILER_DEFINITIONS} - ) -set(SAFE_VAPI_INCLUDE_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/include - "" CACHE INTERNAL - "" FORCE +############################################################## +# Build library +############################################################## +build_library(${SAFE_VAPI} + SHARED + SOURCES ${SOURCE_FILES} ${HEADER_FILES} + INSTALL_HEADERS ${HEADER_FILES} + LINK_LIBRARIES PRIVATE ${LIBRARIES} + COMPONENT ${HICN_PLUGIN} + INCLUDE_DIRS ${INCLUDE_DIRS} + HEADER_ROOT_DIR "" + DEFINITIONS PUBLIC ${COMPILER_DEFINITIONS} + DEPENDS ${HICNPLUGIN}.shared + VERSION ${CURRENT_VERSION} + EXPORT_NAME "libsafevapi" + COMPILE_OPTIONS ${COMPILER_OPTIONS} ) -set(SAFE_VAPI_LIBRARIES - ${SAFE_VAPI_SHARED} - "" CACHE INTERNAL - "" FORCE -) +############################################################## +# Create cmake configuration +############################################################## +create_cmake_config ( + "libsafevapi" + INCLUDE_DIRS ${SAFE_VAPI_INCLUDE_DIRS} + VERSION ${CURRENT_VERSION} + COMPONENT ${HICN_PLUGIN} + NAMESPACE hicn +) diff --git a/hicn-plugin/vapi/include/vapi/vapi_safe.h b/hicn-plugin/vapi/include/vapi/vapi_safe.h deleted file mode 100644 index df1114cde..000000000 --- a/hicn-plugin/vapi/include/vapi/vapi_safe.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef VAPI_SAFE -#include <vapi/vapi.h> -#include <pthread.h> - -extern pthread_mutex_t *mutex; - -vapi_error_e vapi_connect_safe(vapi_ctx_t * vapi_ctx_ret, int async); - -vapi_error_e vapi_disconnect_safe(); -void vapi_lock(); - -void vapi_unlock(); - -#define VAPI_SAFE (NAME, res, ...) \ - vapi_lock(); \ - res = ## NAME (__ARGS__); \ - vapi_unlock(); - -#endif //VAPI_SAFE diff --git a/hicn-plugin/vapi/includes/vapi/vapi_safe.h b/hicn-plugin/vapi/includes/vapi/vapi_safe.h new file mode 100644 index 000000000..423034730 --- /dev/null +++ b/hicn-plugin/vapi/includes/vapi/vapi_safe.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef __VAPI_SAFE__ +#define __VAPI_SAFE__ + +#include <vapi/vapi.h> +#include <pthread.h> + +#include <vapi/hicn.api.vapi.h> +#include <vapi/interface.api.vapi.h> +#include <vapi/ip.api.vapi.h> +#include <vapi/memif.api.vapi.h> +#include <vapi/udp.api.vapi.h> + +vapi_error_e vapi_connect_safe (vapi_ctx_t *vapi_ctx_ret, int async); +vapi_error_e vapi_disconnect_safe (); +void vapi_lock (); +void vapi_unlock (); + +#endif diff --git a/hicn-plugin/vapi/libsafevapi-config.cmake.in b/hicn-plugin/vapi/libsafevapi-config.cmake.in new file mode 100644 index 000000000..feb278c1f --- /dev/null +++ b/hicn-plugin/vapi/libsafevapi-config.cmake.in @@ -0,0 +1,8 @@ +@PACKAGE_INIT@ + +set(Libsafevapi_VERSION_MAJOR "@VERSION_MAJOR@") +set(Libsafevapi_VERSION_MINOR "@VERSION_MINOR@") +set(Libsafevapi_VERSION_PATCH "@VERSION_PATCH@") + +set_and_check(Libsafe_vapi_INCLUDE_DIRS "@PACKAGE_Libsafevapi_INCLUDE_DIRS@") +include("${CMAKE_CURRENT_LIST_DIR}/libsafevapi-targets.cmake") diff --git a/hicn-plugin/vapi/src/vapi_safe.c b/hicn-plugin/vapi/src/vapi_safe.c new file mode 100644 index 000000000..a91793674 --- /dev/null +++ b/hicn-plugin/vapi/src/vapi_safe.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2021 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 <vapi/vapi_safe.h> +#include <stdlib.h> +#include <stdio.h> + +#define APP_NAME "hicn_plugin" +#define MAX_OUTSTANDING_REQUESTS 4 +#define RESPONSE_QUEUE_SIZE 2 + +DEFINE_VAPI_MSG_IDS_HICN_API_JSON +DEFINE_VAPI_MSG_IDS_INTERFACE_API_JSON +DEFINE_VAPI_MSG_IDS_IP_API_JSON +DEFINE_VAPI_MSG_IDS_UDP_API_JSON +DEFINE_VAPI_MSG_IDS_MEMIF_API_JSON + +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +vapi_ctx_t g_vapi_ctx_instance = NULL; +u32 count = 0; + +vapi_error_e +vapi_connect_safe (vapi_ctx_t *vapi_ctx_ret, int async) +{ + vapi_error_e rv = VAPI_OK; + + vapi_lock (); + + if (!g_vapi_ctx_instance) + { + rv = vapi_ctx_alloc (&g_vapi_ctx_instance); + if (rv != VAPI_OK) + goto err; + } + + if (!count) + { + rv = vapi_connect (g_vapi_ctx_instance, APP_NAME, NULL, + MAX_OUTSTANDING_REQUESTS, RESPONSE_QUEUE_SIZE, + async ? VAPI_MODE_NONBLOCKING : VAPI_MODE_BLOCKING, + true); + + if (rv != VAPI_OK) + goto err; + } + + count++; + *vapi_ctx_ret = g_vapi_ctx_instance; + + vapi_unlock (); + return rv; + +err: + vapi_unlock (); + return VAPI_ENOMEM; +} + +vapi_error_e +vapi_disconnect_safe () +{ + vapi_error_e rv = VAPI_OK; + + vapi_lock (); + count--; + if (count == 0) + { + rv = vapi_disconnect (g_vapi_ctx_instance); + vapi_ctx_free (g_vapi_ctx_instance); + g_vapi_ctx_instance = NULL; + } + vapi_unlock (); + + return rv; +} + +void +vapi_lock () +{ + pthread_mutex_lock (&mutex); +} + +void +vapi_unlock () +{ + pthread_mutex_unlock (&mutex); +} diff --git a/hicn-plugin/vapi/vapi_safe.c b/hicn-plugin/vapi/vapi_safe.c deleted file mode 100644 index e9353497f..000000000 --- a/hicn-plugin/vapi/vapi_safe.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <vapi/vapi_safe.h> -#include <stdlib.h> -#include <stdio.h> - -#define APP_NAME "hicn_plugin" -#define MAX_OUTSTANDING_REQUESTS 4 -#define RESPONSE_QUEUE_SIZE 2 - -pthread_mutex_t *mutex = NULL; -vapi_ctx_t g_vapi_ctx_instance = NULL; -u32 count = 0; -int lock = 0; - -vapi_error_e vapi_connect_safe(vapi_ctx_t *vapi_ctx_ret, int async) { - vapi_error_e rv = VAPI_OK; - - while (!__sync_bool_compare_and_swap(&lock, 0, 1)); - - if (!g_vapi_ctx_instance && !mutex) - { - rv = vapi_ctx_alloc(&g_vapi_ctx_instance); - if (rv != VAPI_OK) - goto err; - - mutex = malloc(sizeof(pthread_mutex_t)); - if (!mutex) - goto err_mutex_alloc; - - if (pthread_mutex_init(mutex, NULL) != 0) { - printf("Mutex init failed\n"); - goto err_mutex_init; - } - } - - if (!count) - { - rv = vapi_connect(g_vapi_ctx_instance, APP_NAME, NULL, - MAX_OUTSTANDING_REQUESTS, RESPONSE_QUEUE_SIZE, - async ? VAPI_MODE_NONBLOCKING : VAPI_MODE_BLOCKING, true); - - if (rv != VAPI_OK) - goto err; - - count++; - } - - *vapi_ctx_ret = g_vapi_ctx_instance; - - while (!__sync_bool_compare_and_swap(&lock, 1, 0)); - return rv; - - err_mutex_init: - free(mutex); - err_mutex_alloc: - err: - while (!__sync_bool_compare_and_swap(&lock, 1, 0)); - return VAPI_ENOMEM; -} - -vapi_error_e vapi_disconnect_safe() { - pthread_mutex_lock(mutex); - vapi_error_e rv = VAPI_OK; - pthread_mutex_unlock(mutex); - return rv; -} - -void vapi_lock() { - pthread_mutex_lock(mutex); -} - -void vapi_unlock() { - pthread_mutex_unlock(mutex); -} |