aboutsummaryrefslogtreecommitdiffstats
path: root/src/scvpp
diff options
context:
space:
mode:
authorHongjun Ni <hongjun.ni@intel.com>2018-11-27 23:07:20 +0800
committerHongjun Ni <hongjun.ni@intel.com>2018-11-28 00:14:25 +0800
commit63e7bd9f2730b41f236e0b5d3731e6059210c4c4 (patch)
tree9211f9392925fcbd0067a540a6e70310e6810dfe /src/scvpp
parent76c1926491edcc8a650cc3b5eb87e06d1530cabe (diff)
Rework vpp connection based on vapi library
Change-Id: I3b41b4141fd7ef7577f4f2cc9193b9c623a9d6d7 Signed-off-by: Chuanguo Wang <wangchuanguo@huachentel.com> Signed-off-by: Hongjun Ni <hongjun.ni@intel.com>
Diffstat (limited to 'src/scvpp')
-rw-r--r--src/scvpp/CMakeLists.txt40
-rw-r--r--src/scvpp/libscvpp.pc.in10
-rw-r--r--src/scvpp/src/CMakeLists.txt43
-rw-r--r--src/scvpp/src/sc_vpp_operation.c73
-rw-r--r--src/scvpp/src/sc_vpp_operation.h104
-rw-r--r--src/scvpp/tests/CMakeLists.txt40
-rw-r--r--src/scvpp/tests/scvpp_test.c54
7 files changed, 364 insertions, 0 deletions
diff --git a/src/scvpp/CMakeLists.txt b/src/scvpp/CMakeLists.txt
new file mode 100644
index 0000000..1256fc8
--- /dev/null
+++ b/src/scvpp/CMakeLists.txt
@@ -0,0 +1,40 @@
+#
+# Copyright (c) 2018 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.
+#
+
+cmake_minimum_required(VERSION 2.8)
+project(scvpp)
+
+# add subdirectories
+add_subdirectory(src)
+
+# enable testing if requested and possible
+SET(ENABLE_TESTS 1 CACHE BOOL "Enable unit tests.")
+if(ENABLE_TESTS)
+ find_package(CMOCKA)
+ if(CMOCKA_FOUND)
+ MESSAGE(STATUS "CMocka found, tests are enabled.")
+ enable_testing()
+ add_subdirectory(tests)
+ else(CMOCKA_FOUND)
+ MESSAGE(WARNING "CMocka not found, tests are disabled.")
+ endif(CMOCKA_FOUND)
+endif(ENABLE_TESTS)
+
+find_package(PkgConfig QUIET)
+if(PKG_CONFIG_FOUND)
+ # generate and install pkg-config file
+ configure_file("libscvpp.pc.in" "libscvpp.pc" @ONLY)
+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libscvpp.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+endif()
diff --git a/src/scvpp/libscvpp.pc.in b/src/scvpp/libscvpp.pc.in
new file mode 100644
index 0000000..ce996e3
--- /dev/null
+++ b/src/scvpp/libscvpp.pc.in
@@ -0,0 +1,10 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
+libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
+
+Name: scvpp
+Description: VPP-Sweetcomb-Sysrepo integration library
+Version: 0.0.1
+Libs: -L${libdir} -lscvpp
+Cflags: -I${includedir}
+
diff --git a/src/scvpp/src/CMakeLists.txt b/src/scvpp/src/CMakeLists.txt
new file mode 100644
index 0000000..3961971
--- /dev/null
+++ b/src/scvpp/src/CMakeLists.txt
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2018 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(GNUInstallDirs)
+
+# scvpp sources
+set(SCVPP_SOURCES
+ sc_vpp_operation.c
+)
+
+# scvpp public headers
+set(SCVPP_HEADERS
+ sc_vpp_operation.h
+)
+
+set(CMAKE_C_FLAGS " -g -O0 -fpic -fPIC -std=gnu99 -Wl,-rpath-link=/usr/lib")
+
+# libraries to link with
+set(LINK_LIBRARIES sysrepo vlibmemoryclient vapiclient vppapiclient svm vppinfra pthread rt dl)
+
+# build instructions
+add_library(scvpp SHARED ${SCVPP_SOURCES})
+add_library(scvpp_a ${SCVPP_SOURCES})
+
+# linker instructions
+target_link_libraries(scvpp ${LINK_LIBRARIES})
+target_link_libraries(scvpp_a ${LINK_LIBRARIES})
+
+# install rules
+install(TARGETS scvpp DESTINATION ${CMAKE_INSTALL_LIBDIR})
+install(FILES ${SCVPP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/src/scvpp/src/sc_vpp_operation.c b/src/scvpp/src/sc_vpp_operation.c
new file mode 100644
index 0000000..3232403
--- /dev/null
+++ b/src/scvpp/src/sc_vpp_operation.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2018 HUACHENTEL 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 "sc_vpp_operation.h"
+
+#define APP_NAME "sweetcomb_vpp"
+#define MAX_OUTSTANDING_REQUESTS 4
+#define RESPONSE_QUEUE_SIZE 2
+
+vapi_ctx_t g_vapi_ctx_instance = NULL;
+//////////////////////////
+
+int sc_connect_vpp()
+{
+ SC_INVOKE_BEGIN;
+ // SC_LOG_DBG("*******cts %p \n", g_vapi_ctx_instance);
+ if (g_vapi_ctx_instance == NULL)
+ {
+ vapi_error_e rv = vapi_ctx_alloc(&g_vapi_ctx_instance);
+ rv = vapi_connect(g_vapi_ctx_instance, APP_NAME, NULL, MAX_OUTSTANDING_REQUESTS, RESPONSE_QUEUE_SIZE, VAPI_MODE_BLOCKING, true);
+ if (rv != VAPI_OK)
+ {
+ SC_LOG_ERR("*connect %s faild,with return %d", APP_NAME, rv);
+ return -1;
+ }
+ SC_LOG_DBG("*connected %s ok", APP_NAME);
+ }
+ else
+ {
+ SC_LOG_DBG("connection %s keeping", APP_NAME);
+ }
+ SC_INVOKE_END;
+ return 0;
+}
+
+int sc_disconnect_vpp()
+{
+ if (NULL != g_vapi_ctx_instance)
+ {
+ vapi_disconnect(g_vapi_ctx_instance);
+ vapi_ctx_free(g_vapi_ctx_instance);
+ g_vapi_ctx_instance = NULL;
+ }
+ return 0;
+}
+
+int sc_end_with(const char* str, const char* end)
+{
+ if (str != NULL && end != NULL)
+ {
+ int l1 = strlen(str);
+ int l2 = strlen(end);
+ if (l1 >= l2)
+ {
+ if (strcmp(str + l1 - l2, end) == 0)
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
diff --git a/src/scvpp/src/sc_vpp_operation.h b/src/scvpp/src/sc_vpp_operation.h
new file mode 100644
index 0000000..497b704
--- /dev/null
+++ b/src/scvpp/src/sc_vpp_operation.h
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2018 HUACHENTEL 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 __SWEETCOMB_VPP_OPERATION__
+#define __SWEETCOMB_VPP_OPERATION__
+#include <vapi/vapi.h>
+#include <vapi/vpe.api.vapi.h>
+DEFINE_VAPI_MSG_IDS_VPE_API_JSON;
+
+#include <sysrepo.h>
+#include <sysrepo/values.h>
+#include <sysrepo/plugins.h> //for SC_LOG_DBG
+
+#define VPP_INTFC_NAME_LEN 64
+#define VPP_TAP_NAME_LEN VPP_INTFC_NAME_LEN
+#define VPP_IP4_ADDRESS_LEN 4
+#define VPP_IP6_ADDRESS_LEN 16
+#define VPP_IP4_ADDRESS_STRING_LEN 16
+#define VPP_IP6_ADDRESS_STRING_LEN 46
+#define VPP_MAC_ADDRESS_LEN 8
+#define VPP_TAG_LEN VPP_INTFC_NAME_LEN
+#define VPP_IKEV2_PROFILE_NAME_LEN VPP_INTFC_NAME_LEN
+#define VPP_IKEV2_PSK_LEN VPP_INTFC_NAME_LEN
+#define VPP_IKEV2_ID_LEN 32
+
+#ifndef SC_THIS_FUNC
+#ifdef __FUNCTION__
+#define SC_THIS_FUNC __FUNCTION__
+#else
+#define SC_THIS_FUNC __func__
+#endif
+#endif
+
+#ifndef SC_NOLOG
+#define SC_LOG_DBG SRP_LOG_DBG
+#define SC_LOG_ERR SRP_LOG_ERR
+#define SC_LOG_DBG_MSG SRP_LOG_DBG_MSG
+#define SC_LOG_ERR_MSG SRP_LOG_ERR_MSG
+#else
+#define SC_LOG_DBG //printf
+#define SC_LOG_DBG //SRP_LOG_DBG
+#define SC_LOG_ERR //SRP_LOG_ERR
+#define SC_LOG_DBG_MSG //SRP_LOG_DBG_MSG
+#define SC_LOG_ERR_MSG //SRP_LOG_ERR_MSG
+#endif
+
+#define SC_INVOKE_BEGIN SC_LOG_DBG("inovke %s bein.",SC_THIS_FUNC);
+#define SC_INVOKE_END SC_LOG_DBG("inovke %s end,with return OK.",SC_THIS_FUNC);
+#define SC_INVOKE_ENDX(...) SC_LOG_DBG("inovke %s end,with %s.",SC_THIS_FUNC, ##__VA_ARGS__)
+
+/**
+ * when use tihs must fist DEFINE_VAPI_MSG_IDS_VXLAN_API_JSON
+ */
+#define SC_VPP_VAPI_RECV \
+do { \
+ size_t size; \
+ int recv_vapimsgid = -1; \
+ rv = vapi_recv (g_vapi_ctx_instance, (void *) &resp, &size, 0, 0); \
+ recv_vapimsgid = vapi_lookup_vapi_msg_id_t(g_vapi_ctx_instance, ntohs(resp->header._vl_msg_id) ); \
+ if(recv_vapimsgid <= vapi_msg_id_get_next_index_reply \
+ || recv_vapimsgid >= vapi_get_message_count ()) { \
+ SC_LOG_DBG("***recv error msgid[%d] not in [0-%d) ,try again!***\n", \
+ recv_vapimsgid, vapi_get_message_count ()); \
+ } else { \
+ SC_LOG_DBG("recv msgid [%d]\n", recv_vapimsgid); \
+ break; \
+ } \
+ } while(1);
+
+#define SC_REGISTER_RPC_EVT_HANDLER(rpc_evt_handle) \
+do { \
+ sr_error_t rc = rpc_evt_handle(session, &subscription); \
+ if (SR_ERR_OK != rc) \
+ { \
+ SC_LOG_ERR("load plugin failed: %s", sr_strerror(rc)); \
+ sr_unsubscribe(session, subscription); \
+ SC_INVOKE_ENDX(sr_strerror(rc)); \
+ return rc; \
+ } \
+} while(0);
+
+///////////////////////////
+//VPP接口
+int sc_connect_vpp();
+int sc_disconnect_vpp();
+int sc_end_with(const char* str, const char* end);
+extern vapi_ctx_t g_vapi_ctx_instance;
+#endif //__SWEETCOMB_VPP_OPERATION__
+
+
+
+
diff --git a/src/scvpp/tests/CMakeLists.txt b/src/scvpp/tests/CMakeLists.txt
new file mode 100644
index 0000000..bd135bf
--- /dev/null
+++ b/src/scvpp/tests/CMakeLists.txt
@@ -0,0 +1,40 @@
+#
+# Copyright (c) 2018 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_directories ("${PROJECT_SOURCE_DIR}/src")
+
+# check whether valgrind is installed
+find_program(valgrind_FOUND valgrind)
+
+# macro for adding of an unit test
+macro(ADD_UNIT_TEST TEST_NAME)
+ set(TEST_SRC
+ ${TEST_NAME}.c
+ )
+ add_executable(${TEST_NAME} ${TEST_SRC})
+ target_link_libraries(${TEST_NAME} ${CMOCKA_LIBRARIES} scvpp_a)
+ add_test(${TEST_NAME} ${TEST_NAME})
+
+ if(valgrind_FOUND)
+ add_test(${TEST_NAME}_valgrind valgrind
+ --error-exitcode=1 --read-var-info=yes
+ --leak-check=full --show-leak-kinds=all
+ ./${TEST_NAME}
+ )
+ endif(valgrind_FOUND)
+endmacro(ADD_UNIT_TEST)
+
+# add individual unit-tests
+ADD_UNIT_TEST(scvpp_test)
diff --git a/src/scvpp/tests/scvpp_test.c b/src/scvpp/tests/scvpp_test.c
new file mode 100644
index 0000000..114d190
--- /dev/null
+++ b/src/scvpp/tests/scvpp_test.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016 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 <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#include "sc_vpp_operation.h"
+
+
+static int
+scvpp_test_setup(void **state)
+{
+ //sc_vpp_connect
+ return 0;
+}
+
+static int
+scvpp_test_teardown(void **state)
+{
+ //sc_vpp_disconnect
+ return 0;
+}
+
+static void
+scvpp_interface_test(void **state)
+{
+ //call interface functions
+}
+
+
+int
+main()
+{
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test_setup_teardown(scvpp_interface_test, scvpp_test_setup, scvpp_test_teardown),
+ };
+
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}