aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/vapi
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-plugin/vapi')
-rw-r--r--hicn-plugin/vapi/CMakeLists.txt113
-rw-r--r--hicn-plugin/vapi/include/vapi/vapi_safe.h19
-rw-r--r--hicn-plugin/vapi/includes/vapi/vapi_safe.h33
-rw-r--r--hicn-plugin/vapi/libsafevapi-config.cmake.in8
-rw-r--r--hicn-plugin/vapi/src/vapi_safe.c98
-rw-r--r--hicn-plugin/vapi/vapi_safe.c73
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);
-}