diff options
67 files changed, 1 insertions, 14597 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 41ecda018..26783d544 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,7 +102,6 @@ else () option(DISABLE_SHARED_LIBRARIES "Disable shared libraries" ON) endif () option(BUILD_HICNPLUGIN "Build the hicn vpp plugin" OFF) -option(BUILD_SYSREPOPLUGIN "Build the sysrepo plugin" OFF) option(BUILD_EXTRAS "Build external projects" OFF) option(BUILD_TELEMETRY "Build telemetry projects" OFF) option(BUILD_TESTS "Build unit tests" OFF) @@ -117,11 +116,6 @@ if (BUILD_APPS AND NOT BUILD_LIBTRANSPORT) set (BUILD_LIBTRANSPORT ON) endif() -if (BUILD_SYSREPOPLUGIN AND NOT BUILD_HICNPLUGIN) - message(STATUS "Hicn-plugin required. Enabled by default.") - set (BUILD_HICNPLUGIN ON) -endif() - if ((BUILD_HICNLIGHT OR BUILD_LIBTRANSPORT OR BUILD_APPS OR @@ -151,7 +145,6 @@ set(BUILD_LIBTRANSPORT_DIR libtransport) set(BUILD_APPS_DIR apps) set(BUILD_CTRL_DIR ctrl) set(BUILD_HICNPLUGIN_DIR hicn-plugin) -set(BUILD_SYSREPOPLUGIN_DIR ctrl/sysrepo-plugins) set(BUILD_EXTRAS_DIR extras/) set(BUILD_TELEMETRY_DIR telemetry) diff --git a/ctrl/sysrepo-plugins/AUTHORS b/ctrl/sysrepo-plugins/AUTHORS deleted file mode 100644 index 35097a36c..000000000 --- a/ctrl/sysrepo-plugins/AUTHORS +++ /dev/null @@ -1,5 +0,0 @@ -hicn sysrepo plugin authors are listed below: - - Masoud Hemmatpour <mhemmatp@cisco.com> - Alberto Compagno <acompagn@cisco.com> - Luca Muscariello <lumuscar@cisco.com> diff --git a/ctrl/sysrepo-plugins/CMakeLists.txt b/ctrl/sysrepo-plugins/CMakeLists.txt deleted file mode 100644 index 0765f75d8..000000000 --- a/ctrl/sysrepo-plugins/CMakeLists.txt +++ /dev/null @@ -1,69 +0,0 @@ -# -# 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: -# -# 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 3.10 FATAL_ERROR) -project(hicn_sysrepo_plugin) - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" -"${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/Modules" -) - -include(GNUInstallDirs) -include(BuildMacros) - -find_package(PkgConfig REQUIRED) -find_package(Sysrepo REQUIRED) - -if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") - message(FATAL_ERROR "Sysrepo plugin supported only on Linux systems") -endif() - -if (NOT SRPD_PLUGINS_PATH) - if (PKG_CONFIG_FOUND) - execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} "--variable=SRPD_PLUGINS_PATH" "libsysrepo" OUTPUT_VARIABLE SRPD_PLUGINS_PATH) - string(STRIP ${SRPD_PLUGINS_PATH} SRPD_PLUGINS_PATH) - endif() -endif() - -if (NOT SRPD_PLUGINS_PATH) - message(FATAL_ERROR "Cannot get sysrepo plugins directory due to missing pkg-config, set SRPD_PLUGINS_PATH manually.") -endif() - -find_package(Vpp ${VPP_DEFAULT_VERSION} REQUIRED) - -if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - find_package(HicnPlugin ${CURRENT_VERSION} REQUIRED) -else() - list(APPEND DEPENDENCIES - ${HICNPLUGIN_SHARED} - ) -endif() - -add_subdirectory(hicn-plugin) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/yang/hicn/hicn.yang - ${CMAKE_CURRENT_SOURCE_DIR}/yang/ietf/iana-if-type@2014-05-08.yang - ${CMAKE_CURRENT_SOURCE_DIR}/yang/ietf/ietf-interfaces.yang - ${CMAKE_CURRENT_SOURCE_DIR}/yang/ietf/ietf-ip@2014-06-16.yang - ${CMAKE_CURRENT_SOURCE_DIR}/yang/ietf/ietf-yang-types@2013-07-15.yang - DESTINATION ${CMAKE_INSTALL_LIBDIR}/modules_yang/ - COMPONENT hicn-sysrepo-plugin) - - -include(Packaging) -if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - include(Packager) - make_packages() -endif() diff --git a/ctrl/sysrepo-plugins/cmake/Modules/Packaging.cmake b/ctrl/sysrepo-plugins/cmake/Modules/Packaging.cmake deleted file mode 100644 index 19be58beb..000000000 --- a/ctrl/sysrepo-plugins/cmake/Modules/Packaging.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# 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. - -###################### -# Packages section -###################### - -set(hicn-sysrepo-plugin_DESCRIPTION - "A Plugin to enable hICN VPP in sysrepo." - CACHE STRING "Description for deb/rpm package." -) - -set(hicn-sysrepo-plugin_DEB_DEPENDENCIES - "hicn-plugin (= ${PREFIX_VERSION}-release), sysrepo (>= 1.0)" - CACHE STRING "Dependencies for deb/rpm package." -) - -set(hicn-sysrepo-plugin_RPM_DEPENDENCIES - "hicn-plugin = ${PREFIX_VERSION}-release, sysrepo >= 1.0" - CACHE STRING "Dependencies for deb/rpm package." -) diff --git a/ctrl/sysrepo-plugins/hicn-light/CMakeLists.txt b/ctrl/sysrepo-plugins/hicn-light/CMakeLists.txt deleted file mode 100644 index f8a1e64aa..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/CMakeLists.txt +++ /dev/null @@ -1,61 +0,0 @@ -# -# 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. -# - -# set compiler options -set(CMAKE_EXPORT_COMPILE_COMMANDS 1) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=gnu99") -set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2") -set(CMAKE_C_FLAGS_DEBUG "-g -O0") -set (CMAKE_INSTALL_LIBDIR "/usr/lib") - -project(sysrepo-light-plugins) - -# Cmake find modules -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../cmake/Modules" -"${CMAKE_CURRENT_LIST_DIR}/../../../cmake/Modules" -) - -find_package(PkgConfig) -find_package(HicnLight) -find_package(Sysrepo) - -#pkg_check_modules(SYSREPO libsysrepo) - -# get sysrepo plugins directory from pkgconfig -if (NOT SR_PLUGINS_DIR) - if (PKG_CONFIG_FOUND) - execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} "--variable=SR_PLUGINS_DIR" "libsysrepo" OUTPUT_VARIABLE SR_PLUGINS_DIR) - string(STRIP ${SR_PLUGINS_DIR} SR_PLUGINS_DIR) - endif() -endif() -if (NOT SR_PLUGINS_DIR) - message(FATAL_ERROR "Cannot get sysrepo plugins directory due to missing pkg-config, set SR_PLUGINS_DIR manually.") -endif() - -# plugins sources -set(PLUGINS_SOURCES - plugin/model/hicn_model.c - plugin/model/tlock.c - plugin/hicn_light_comm.c - plugin/hicn_light.c -) - -# build the source code into shared library -add_library(hicnlight SHARED ${PLUGINS_SOURCES}) -target_include_directories(hicnlight PUBLIC ${HICNLIGHT_INCLUDE_DIRS}) -target_link_libraries(hicnlight ${SYSREPO_LIBRARIES} ${HICNLIGHT_LIBRARIES}) - -# install the plugin into plugins dir -install(TARGETS hicnlight DESTINATION ${SR_PLUGINS_DIR} COMPONENT hicn_sysrepo_plugin) diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/CMakeLists.txt b/ctrl/sysrepo-plugins/hicn-light/plugin/CMakeLists.txt deleted file mode 100644 index b5faab705..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/CMakeLists.txt +++ /dev/null @@ -1,59 +0,0 @@ -# -# 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. -# - -# set compiler options -set(CMAKE_EXPORT_COMPILE_COMMANDS 1) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=gnu99") -set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2") -set(CMAKE_C_FLAGS_DEBUG "-g -O0") -set (CMAKE_INSTALL_LIBDIR "/usr/lib") - -project(sysrepo-light-plugins) - -# Cmake find modules -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../cmake") - -find_package(PkgConfig) -find_package(HicnLight) -find_package(Sysrepo) - -#pkg_check_modules(SYSREPO libsysrepo) - -# get sysrepo plugins directory from pkgconfig -if (NOT SR_PLUGINS_DIR) - if (PKG_CONFIG_FOUND) - execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} "--variable=SR_PLUGINS_DIR" "libsysrepo" OUTPUT_VARIABLE SR_PLUGINS_DIR) - string(STRIP ${SR_PLUGINS_DIR} SR_PLUGINS_DIR) - endif() -endif() -if (NOT SR_PLUGINS_DIR) - message(FATAL_ERROR "Cannot get sysrepo plugins directory due to missing pkg-config, set SR_PLUGINS_DIR manually.") -endif() - -# plugins sources -set(PLUGINS_SOURCES - model/hicn_model.c - model/tlock.c - hicn_light_comm.c - hicn_light.c -) - -# build the source code into shared library -add_library(hicnlight SHARED ${PLUGINS_SOURCES}) -target_include_directories(hicnlight PUBLIC ${HICNLIGHT_INCLUDE_DIRS}) -target_link_libraries(hicnlight ${SYSREPO_LIBRARIES} ${HICNLIGHT_LIBRARIES}) - -# install the plugin into plugins dir -install(TARGETS hicnlight DESTINATION ${SR_PLUGINS_DIR} COMPONENT hicn_sysrepo_plugin)
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.c b/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.c deleted file mode 100644 index b2495f730..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * 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 <inttypes.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "hicn_light.h" -#include "model/hicn_model.h" - -sr_subscription_ctx_t *subscription = NULL; -volatile int exit_application = 0; - -int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx) { - sr_subscription_ctx_t *subscription = NULL; - int rc = SR_ERR_OK; - rc = hicn_connect_light(); - if (SR_ERR_OK != rc) { - HICN_LOG_ERR("hicn light connect error , with return %d.", rc); - return SR_ERR_INTERNAL; - } - - hicn_subscribe_events(session, &subscription); - - /* set subscription as our private context */ - *private_ctx = subscription; - return SR_ERR_OK; -} - -void sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx) { - /* subscription was set as our private context */ - sr_unsubscribe(private_ctx); - HICN_LOG_DBG_MSG("hicn light unload plugin ok."); - hicn_disconnect_light(); - HICN_LOG_DBG_MSG("hicn light disconnect ok."); -} - -static void sigint_handler(int signum) { exit_application = 1; } -int subscribe_all_module_events(sr_session_ctx_t *session) { - sr_plugin_init_cb(session, (void **)&subscription); - return 0; -} - -int main(int argc, char **argv) { - sr_conn_ctx_t *connection = NULL; - sr_session_ctx_t *session = NULL; - int rc = SR_ERR_OK; - - /* connect to hicn light */ - rc = hicn_connect_light(); - if (-1 == rc) { - fprintf(stderr, "hicn light connect error"); - return -1; - } - - /* connect to sysrepo */ - rc = sr_connect(SR_CONN_DEFAULT, &connection); - if (SR_ERR_OK != rc) { - fprintf(stderr, "Error by sr_connect: %s\n", sr_strerror(rc)); - goto cleanup; - } - - /* start session */ - rc = sr_session_start(connection, SR_DS_STARTUP, &session); - if (SR_ERR_OK != rc) { - fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc)); - goto cleanup; - } - - /* subscribe all module events */ - rc = subscribe_all_module_events(session); - if (SR_ERR_OK != rc) { - fprintf(stderr, "Error by subscribe module events: %s\n", sr_strerror(rc)); - goto cleanup; - } - - /* loop until ctrl-c is pressed / SIGINT is received */ - signal(SIGINT, sigint_handler); - signal(SIGPIPE, SIG_IGN); - - while (!exit_application) { - sleep(2); - } - - printf("Application exit requested, exiting.\n"); - -cleanup: - if (NULL != subscription) { - sr_unsubscribe(subscription); - } - if (NULL != session) { - sr_session_stop(session); - } - if (NULL != connection) { - sr_disconnect(connection); - } - hicn_disconnect_light(); - return rc; -}
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.h b/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.h deleted file mode 100644 index cea2851c9..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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 __HICN_LIGHT_H__ -#define __HICN_LIGHT_H__ - -#include "hicn_light_comm.h" - -// functions that sysrepo-plugin need -int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx); -void sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx); - -#endif //__HICN_LIGHT_H__
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.c b/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.c deleted file mode 100644 index 08551b470..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 "hicn_light_comm.h" - -hc_sock_t* hsocket; - -int hicn_connect_light() { - hsocket = hc_sock_create(); - if (!hsocket) HICN_LOG_ERR_MSG("Error creating socket\n"); - if (hc_sock_connect(hsocket) < 0) - HICN_LOG_ERR_MSG("Error connecting to the forwarder\n"); - return 0; -} - -int hicn_disconnect_light() { - hc_sock_free(hsocket); - return 0; -}
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h b/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h deleted file mode 100644 index c03d59c30..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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 __HICN_LIGHT_COMMM_H__ -#define __HICN_LIGHT_COMMM_H__ -#include <sysrepo.h> -#include <sysrepo/values.h> - -#include <hicn/ctrl/api.h> - -#ifndef HICN_THIS_FUNC -#ifdef __FUNCTION__ -#define HICN_THIS_FUNC __FUNCTION__ -#else -#define HICN_THIS_FUNC __func__ -#endif -#endif - -#define ARG_CHECK(retval, arg) \ - do { \ - if (NULL == (arg)) { \ - HICN_LOG_ERR_MSG(#arg ":NULL pointer passed."); \ - return (retval); \ - } \ - } while (0) - -#define ARG_CHECK2(retval, arg1, arg2) \ - ARG_CHECK(retval, arg1); \ - ARG_CHECK(retval, arg2) - -#define ARG_CHECK5(retval, arg1, arg2, arg3, arg4, arg5) \ - ARG_CHECK(retval, arg1); \ - ARG_CHECK(retval, arg2); \ - ARG_CHECK(retval, arg3); \ - ARG_CHECK(retval, arg4); \ - ARG_CHECK(retval, arg5) - -#define MEM_ALIGN 4096 - -int hicn_connect_light(); -int hicn_disconnect_light(); -extern hc_sock_t* hsocket; -#endif //__HICN_LIGHT_COMMM_H__ diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c b/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c deleted file mode 100644 index d32fd55ef..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * 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 <stdio.h> -#include <malloc.h> -#include <sysrepo/xpath.h> - -/* Hicn headers */ - -#include "hicn_model.h" -#include "tlock.h" -#include "../hicn_light.h" -#include "../hicn_light_comm.h" -#include <hicn/util/sstrncpy.h> - -/** - * @brief API to add hicn face ip in hicn-light. - */ -static int hicn_face_ip_add_cb(sr_session_ctx_t *session, const char *path, - const sr_val_t *input, const size_t input_cnt, - sr_event_t event, uint32_t request_id, - sr_val_t **output, size_t *output_cnt, - void *private_data) { - SRP_LOG_DBGMSG("hicn face ip add received successfully"); - hc_face_t face; - if (strcmp(input[0].data.string_val, "-1")) { - struct sockaddr_in sa; - // store this IP address in sa: - inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr)); - face.face.family = AF_INET; - face.face.local_addr.v4.as_inaddr = sa.sin_addr; - - } else if (strcmp(input[1].data.string_val, "-1")) { - struct in6_addr *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, input[1].data.string_val, dst); - face.face.family = AF_INET6; - face.face.local_addr.v6.as_in6addr = *dst; - - } else { - SRP_LOG_DBGMSG("Invalid local IP address"); - return SR_ERR_OPERATION_FAILED; - } - - if (strcmp(input[2].data.string_val, "-1")) { - struct sockaddr_in sa; - // store this IP address in sa: - inet_pton(AF_INET, input[2].data.string_val, &(sa.sin_addr)); - face.face.family = AF_INET; - face.face.remote_addr.v4.as_inaddr = sa.sin_addr; - - } else if (strcmp(input[3].data.string_val, "-1")) { - struct in6_addr *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, input[3].data.string_val, dst); - face.face.family = AF_INET6; - face.face.remote_addr.v6.as_in6addr = *dst; - - } else { - SRP_LOG_DBGMSG("Invalid local IP address"); - return SR_ERR_OPERATION_FAILED; - } - - face.face.netdevice.index = - input[4].data.uint32_val; // This is the idx number of interface - - int rc; - face.id = 0; // can be empty - rc = strcpy_s(face.name, sizeof(face.name), "hicn_face"); - if (rc != EOK) return SR_ERR_OPERATION_FAILED; - face.face.type = 1; - - rc = hc_face_create(hsocket, &face); - if (rc > 0) { - SRP_LOG_DBGMSG("Face added successfully"); - return SR_ERR_OK; - } - - SRP_LOG_DBGMSG("Operation Failed"); - return SR_ERR_OPERATION_FAILED; -} - -/** - * @brief API to del hicn face ip in vpp. - */ -static int hicn_face_ip_del_cb(sr_session_ctx_t *session, const char *path, - const sr_val_t *input, const size_t input_cnt, - sr_event_t event, uint32_t request_id, - sr_val_t **output, size_t *output_cnt, - void *private_data) { - SRP_LOG_DBGMSG("hicn face ip del received successfully"); - face_t *face = NULL; - - face_free(face); - - SRP_LOG_DBGMSG("Operation Failed"); - return SR_ERR_OPERATION_FAILED; -} - -/** - * @brief API to del hicn face ip in vpp. - */ -static int hicn_route_add_cb(sr_session_ctx_t *session, const char *path, - const sr_val_t *input, const size_t input_cnt, - sr_event_t event, uint32_t request_id, - sr_val_t **output, size_t *output_cnt, - void *private_data) { - /* - - SRP_LOG_DBG_MSG("hicn route add received successfully"); - - hc_route_t * route; - - if(strcmp(input[0].data.string_val,"-1")){ - - struct sockaddr_in sa; - // store this IP address in sa: - inet_pton(AF_INET, input[0].data.string_val, &(sa.sin_addr)); - route.family=AF_INET; - route.face.hicn.local_addr.v4.as_inaddr=sa.sin_addr; - - - }else if(strcmp(input[1].data.string_val,"-1")){ - - struct in6_addr *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, input[1].data.string_val, dst); - face.face.hicn.family=AF_INET6; - face.face.hicn.local_addr.v6.as_in6addr = *dst; - - }else{ - SRP_LOG_DBG_MSG("Invalid local IP address"); - return SR_ERR_OPERATION_FAILED; - } - - - hc_route_create(hsocket, route); - */ - return SR_ERR_OK; -} - -int hicn_subscribe_events(sr_session_ctx_t *session, - sr_subscription_ctx_t **subscription) { - int rc; - rc = sr_rpc_subscribe(session, "/hicn:face-ip-add", hicn_face_ip_add_cb, - session, 100, SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription stat-get\n"); - goto error; - } - - rc = sr_rpc_subscribe(session, "/hicn:face-ip-del", hicn_face_ip_del_cb, - session, 100, SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription face-ip-del\n"); - goto error; - } - - rc = sr_rpc_subscribe(session, "/hicn:route-nhops-add", hicn_route_add_cb, - session, 100, SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription route-nhops-add\n"); - goto error; - } - - SRP_LOG_DBGMSG("hicn light initialized successfully."); - return SR_ERR_OK; - -error: - SRP_LOG_ERRMSG("Error by initialization of the hicn plugin."); - sr_plugin_cleanup_cb(session, hsocket); - return rc; -} diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.h b/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.h deleted file mode 100644 index be70bc711..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 __IETF_HICN_H__ -#define __IETF_HICN_H__ - -#include "../hicn_light_comm.h" - -#define MEM_ALIGN 4096 - -// Number of locks is equal to number of nodes in hicn-state -// It is a coarse grain approach later can be changed to fine grained -// better to initialize the lock by 0 -#define NLOCKS 5 -#define LOCK_INIT 0 - -enum locks_name { lstate, lstrategy, lstrategies, lroute, lface_ip_params }; - -#define NSTATE_LEAVES 15 -#define NSTRATEGY_LEAVES 1 -#define NSTRATEGIES_LEAVES 2 -#define NROUTE_LEAVES 2 -#define NFACE_IP_PARAMS_LEAVES 3 - -int hicn_subscribe_events(sr_session_ctx_t *session, - sr_subscription_ctx_t **subscription); - -#endif /* __IETF_HICN_H__ */
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.c b/ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.c deleted file mode 100644 index ba788d3a0..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "tlock.h" - -void Ticket_init(int Lock_Number, long int init) { - __atomic_store(&En[Lock_Number], &init, __ATOMIC_SEQ_CST); - __atomic_store(&De[Lock_Number], &init, __ATOMIC_SEQ_CST); - // En[Lock_Number]=init; - // De[Lock_Number]=init; -} - -void Ticket_Lock(int Lock_Number) { - int my_ticket = __sync_fetch_and_add(&En[Lock_Number], 1); - while (my_ticket != De[Lock_Number]) { - }; -} - -void Ticket_Unlock(int Lock_Number) { De[Lock_Number]++; } diff --git a/ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.h b/ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.h deleted file mode 100644 index 6840be1c0..000000000 --- a/ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 __TLOCK_H__ -#define __TLOCK_H__ - -// limit on the number of locks: it shoud be matched with the number of -// hicn-state leaves -#define MAX_LOCK_SIZE 5 - -volatile long int En[MAX_LOCK_SIZE], De[MAX_LOCK_SIZE]; // For Ticket Algorithm - -void Ticket_init(int Lock_Number, long int init); -void Ticket_Lock(int Lock_Number); -void Ticket_Unlock(int Lock_Number); - -#endif /* __IETF_HICN_H__ */
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-plugin/CMakeLists.txt b/ctrl/sysrepo-plugins/hicn-plugin/CMakeLists.txt deleted file mode 100644 index 3638f5456..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -# -# 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. - -# Cmake find modules -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../cmake/Modules" - "${CMAKE_CURRENT_LIST_DIR}/../cmake/Modules" -) - -# plugins sources -set(SOURCE_FILES - plugin/ietf/ietf_interface.c - plugin/model/hicn_model.c - plugin/model/tlock.c - plugin/hicn_vpp_comm.c - plugin/hicn_plugin.c -) - -list(APPEND SYSREPO_PLUGIN_INCLUDE_DIRS PRIVATE - ${VPP_INCLUDE_DIRS} - ${HICNPLUGIN_INCLUDE_DIRS} - ${SYSREPO_INCLUDE_DIRS} -) - -list(APPEND LIBRARIES - ${SYSREPO_LIBRARIES} - ${VPP_LIBRARIES} -) - -build_library(sysrepohicn - SHARED - SOURCES ${SOURCE_FILES} - LINK_LIBRARIES ${LIBRARIES} - DEPENDS ${DEPENDENCIES} - COMPONENT hicn-sysrepo-plugin - INCLUDE_DIRS ${SYSREPO_PLUGIN_INCLUDE_DIRS} - INSTALL_FULL_PATH_DIR ${SRPD_PLUGINS_PATH} - DEFINITIONS ${COMPILER_DEFINITIONS} -)
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-plugin/Doxyfile b/ctrl/sysrepo-plugins/hicn-plugin/Doxyfile deleted file mode 100644 index 61e503c1f..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/Doxyfile +++ /dev/null @@ -1,2494 +0,0 @@ -# Doxyfile 1.8.13 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "hICN Sysrepo plugin" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up -# to that level are automatically included in the table of contents, even if -# they do not have an id attribute. -# Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -TOC_INCLUDE_HEADINGS = 0 - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if <section_label> ... \endif and \cond <section_label> -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = plugin/ plugin/model - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.idl \ - *.ddl \ - *.odl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.cs \ - *.d \ - *.php \ - *.php4 \ - *.php5 \ - *.phtml \ - *.inc \ - *.m \ - *.markdown \ - *.md \ - *.mm \ - *.dox \ - *.py \ - *.pyw \ - *.f90 \ - *.f95 \ - *.f03 \ - *.f08 \ - *.f \ - *.for \ - *.tcl \ - *.vhd \ - *.vhdl \ - *.ucf \ - *.qsf - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# <filter> <input-file> -# -# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use <access key> + S -# (what the <access key> is depends on the OS and browser, but it is typically -# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down -# key> to jump into the search results window, the results can be navigated -# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel -# the search. The filter options can be selected when the cursor is inside the -# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> -# to select a filter and <Enter> or <escape> to activate or cancel the filter -# option. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There -# are two flavors of web server based searching depending on the EXTERNAL_SEARCH -# setting. When disabled, doxygen will generate a PHP script for searching and -# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing -# and searching needs to be provided by external tools. See the section -# "External Indexing and Searching" for details. -# The default value is: NO. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SERVER_BASED_SEARCH = NO - -# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP -# script for searching. Instead the search results are written to an XML file -# which needs to be processed by an external indexer. Doxygen will invoke an -# external search engine pointed to by the SEARCHENGINE_URL option to obtain the -# search results. -# -# Doxygen ships with an example indexer (doxyindexer) and search engine -# (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). -# -# See the section "External Indexing and Searching" for details. -# The default value is: NO. -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTERNAL_SEARCH = NO - -# The SEARCHENGINE_URL should point to a search engine hosted by a web server -# which will return the search results when EXTERNAL_SEARCH is enabled. -# -# Doxygen ships with an example indexer (doxyindexer) and search engine -# (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). See the section "External Indexing and -# Searching" for details. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SEARCHENGINE_URL = - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed -# search data is written to a file for indexing by an external tool. With the -# SEARCHDATA_FILE tag the name of this file can be specified. -# The default file is: searchdata.xml. -# This tag requires that the tag SEARCHENGINE is set to YES. - -SEARCHDATA_FILE = searchdata.xml - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the -# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is -# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple -# projects and redirect the results back to the right project. -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTERNAL_SEARCH_ID = - -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen -# projects other than the one defined by this configuration file, but that are -# all added to the same external search index. Each project needs to have a -# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of -# to a relative location where the documentation can be found. The format is: -# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... -# This tag requires that the tag SEARCHENGINE is set to YES. - -EXTRA_SEARCH_MAPPINGS = - -#--------------------------------------------------------------------------- -# Configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. -# The default value is: YES. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: latex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. -# -# Note that when enabling USE_PDFLATEX this option is only used for generating -# bitmaps for formulas in the HTML output, but not in the Makefile that is -# written to the output directory. -# The default file is: latex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate -# index for LaTeX. -# The default file is: makeindex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX -# documents. This may be useful for small projects and may help to save some -# trees in general. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used by the -# printer. -# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x -# 14 inches) and executive (7.25 x 10.5 inches). -# The default value is: a4. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names -# that should be included in the LaTeX output. The package can be specified just -# by its name or with the correct syntax as to be used with the LaTeX -# \usepackage command. To get the times font for instance you can specify : -# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} -# To use the option intlimits with the amsmath package you can specify: -# EXTRA_PACKAGES=[intlimits]{amsmath} -# If left blank no extra packages will be included. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. -# -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See -# LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_FOOTER = - -# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# LaTeX style sheets that are included after the standard style sheets created -# by doxygen. Using this option one can overrule certain style aspects. Doxygen -# will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_EXTRA_STYLESHEET = - -# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the LATEX_OUTPUT output -# directory. Note that the files will be copied as-is; there are no commands or -# markers available. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_EXTRA_FILES = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is -# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will -# contain links (just like the HTML output) instead of page references. This -# makes the output suitable for online browsing using a PDF viewer. -# The default value is: YES. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. -# The default value is: YES. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_BATCHMODE = NO - -# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the -# index chapters (such as File Index, Compound Index, etc.) in the output. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_HIDE_INDICES = NO - -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. See -# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. -# The default value is: plain. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_BIB_STYLE = plain - -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The -# RTF output is optimized for Word 97 and may not look too pretty with other RTF -# readers/editors. -# The default value is: NO. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: rtf. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF -# documents. This may be useful for small projects and may help to save some -# trees in general. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will -# contain hyperlink fields. The RTF file will contain links (just like the HTML -# output) instead of page references. This makes the output suitable for online -# browsing using Word or some other Word compatible readers that support those -# fields. -# -# Note: WordPad (write) and others do not support links. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's config -# file, i.e. a series of assignments. You only have to provide replacements, -# missing definitions are set to their default value. -# -# See also section "Doxygen usage" for information on how to generate the -# default style sheet that doxygen normally uses. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's config file. A template extensions file can be generated -# using doxygen -e rtf extensionFile. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_EXTENSIONS_FILE = - -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for -# classes and files. -# The default value is: NO. - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. A directory man3 will be created inside the directory specified by -# MAN_OUTPUT. -# The default directory is: man. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to the generated -# man pages. In case the manual section does not start with a number, the number -# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is -# optional. -# The default value is: .3. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_EXTENSION = .3 - -# The MAN_SUBDIR tag determines the name of the directory created within -# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by -# MAN_EXTENSION with the initial . removed. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_SUBDIR = - -# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it -# will generate one additional man file for each entity documented in the real -# man page(s). These additional files only source the real man page, but without -# them the man command would be unable to find the correct page. -# The default value is: NO. -# This tag requires that the tag GENERATE_MAN is set to YES. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that -# captures the structure of the code including all documentation. -# The default value is: NO. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: xml. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_OUTPUT = xml - -# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program -# listings (including syntax highlighting and cross-referencing information) to -# the XML output. Note that enabling this will significantly increase the size -# of the XML output. -# The default value is: YES. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the DOCBOOK output -#--------------------------------------------------------------------------- - -# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files -# that can be used to generate PDF. -# The default value is: NO. - -GENERATE_DOCBOOK = NO - -# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in -# front of it. -# The default directory is: docbook. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_OUTPUT = docbook - -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - -#--------------------------------------------------------------------------- -# Configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sf.net) file that captures the -# structure of the code including all documentation. Note that this feature is -# still experimental and incomplete at the moment. -# The default value is: NO. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module -# file that captures the structure of the code including all documentation. -# -# Note that this feature is still experimental and incomplete at the moment. -# The default value is: NO. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary -# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI -# output from the Perl module output. -# The default value is: NO. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely -# formatted so it can be parsed by a human reader. This is useful if you want to -# understand what is going on. On the other hand, if this tag is set to NO, the -# size of the Perl module output will be much smaller and Perl will parse it -# just the same. -# The default value is: YES. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file are -# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful -# so different doxyrules.make files included by the same Makefile don't -# overwrite each other's variables. -# This tag requires that the tag GENERATE_PERLMOD is set to YES. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all -# C-preprocessor directives found in the sources and include files. -# The default value is: YES. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names -# in the source code. If set to NO, only conditional compilation will be -# performed. Macro expansion can be done in a controlled way by setting -# EXPAND_ONLY_PREDEF to YES. -# The default value is: NO. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then -# the macro expansion is limited to the macros specified with the PREDEFINED and -# EXPAND_AS_DEFINED tags. -# The default value is: NO. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES, the include files in the -# INCLUDE_PATH will be searched if a #include is found. -# The default value is: YES. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by the -# preprocessor. -# This tag requires that the tag SEARCH_INCLUDES is set to YES. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will be -# used. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that are -# defined before the preprocessor is started (similar to the -D option of e.g. -# gcc). The argument of the tag is a list of macros of the form: name or -# name=definition (no spaces). If the definition and the "=" are omitted, "=1" -# is assumed. To prevent a macro definition from being undefined via #undef or -# recursively expanded use the := operator instead of the = operator. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this -# tag can be used to specify a list of macro names that should be expanded. The -# macro definition that is found in the sources will be used. Use the PREDEFINED -# tag if you want to use a different macro definition that overrules the -# definition found in the source code. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will -# remove all references to function-like macros that are alone on a line, have -# an all uppercase name, and do not end with a semicolon. Such function macros -# are typically used for boiler-plate code, and will confuse the parser if not -# removed. -# The default value is: YES. -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES tag can be used to specify one or more tag files. For each tag -# file the location of the external documentation should be added. The format of -# a tag file without this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where loc1 and loc2 can be relative or absolute paths or URLs. See the -# section "Linking to external documentation" for more information about the use -# of tag files. -# Note: Each tag file must have a unique name (where the name does NOT include -# the path). If a tag file is not located in the directory in which doxygen is -# run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create a -# tag file that is based on the input files it reads. See section "Linking to -# external documentation" for more information about the usage of tag files. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. -# The default value is: NO. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be -# listed. -# The default value is: YES. - -EXTERNAL_GROUPS = YES - -# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in -# the related pages index. If set to NO, only the current project's pages will -# be listed. -# The default value is: YES. - -EXTERNAL_PAGES = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - -# If set to YES the inheritance and collaboration graphs will hide inheritance -# and usage relations if the target is undocumented or is not a class. -# The default value is: YES. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent -# Bell Labs. The other options in this section have no effect if this option is -# set to NO -# The default value is: YES. - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed -# to run in parallel. When set to 0 doxygen will base this on the number of -# processors available in the system. You can set it explicitly to a value -# larger than 0 to get control over the balance between CPU load and processing -# speed. -# Minimum value: 0, maximum value: 32, default value: 0. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_NUM_THREADS = 0 - -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTPATH = - -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a -# graph for each documented class showing the direct and indirect implementation -# dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -UML_LOOK = NO - -# If the UML_LOOK tag is enabled, the fields and methods are shown inside the -# class node. If there are many fields or methods and many nodes the graph may -# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the -# number of items for each type to make the size more manageable. Set this to 0 -# for no limit. Note that the threshold may be exceeded by 50% before the limit -# is enforced. So when you set the threshold to 10, up to 15 fields may appear, -# but if the number exceeds 15, the total amount of fields shown is limited to -# 10. -# Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -UML_LIMIT_NUM_FIELDS = 10 - -# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and -# collaboration graphs will show the relations between templates and their -# instances. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -TEMPLATE_RELATIONS = NO - -# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to -# YES then doxygen will generate a graph for each documented file showing the -# direct and indirect include dependencies of the file with other documented -# files. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -INCLUDE_GRAPH = YES - -# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are -# set to YES then doxygen will generate a graph for each documented file showing -# the direct and indirect include dependencies of the file with other documented -# files. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH tag is set to YES then doxygen will generate a call -# dependency graph for every global function or class method. -# -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. Disabling a call graph can be -# accomplished by means of the command \hidecallgraph. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller -# dependency graph for every global function or class method. -# -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. Disabling a caller graph can be -# accomplished by means of the command \hidecallergraph. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical -# hierarchy of all classes instead of a textual one. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the -# dependencies a directory has on other directories in a graphical way. The -# dependency relations are determined by the #include relations between the -# files in the directories. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. For an explanation of the image formats see the section -# output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). -# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order -# to make the SVG files visible in IE 9+ (other browsers do not have this -# requirement). -# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, -# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, -# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, -# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and -# png:gdiplus:gdiplus. -# The default value is: png. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# -# Note that this requires a modern browser other than Internet Explorer. Tested -# and working are Firefox, Chrome, Safari, and Opera. -# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make -# the SVG files visible. Older versions of IE do not have SVG support. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -INTERACTIVE_SVG = NO - -# The DOT_PATH tag can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the \dotfile -# command). -# This tag requires that the tag HAVE_DOT is set to YES. - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). - -MSCFILE_DIRS = - -# The DIAFILE_DIRS tag can be used to specify one or more directories that -# contain dia files that are included in the documentation (see the \diafile -# command). - -DIAFILE_DIRS = - -# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. - -PLANTUML_JAR_PATH = - -# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a -# configuration file for plantuml. - -PLANTUML_CFG_FILE = - -# When using plantuml, the specified paths are searched for files specified by -# the !include statement in a plantuml block. - -PLANTUML_INCLUDE_PATH = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes -# that will be shown in the graph. If the number of nodes in a graph becomes -# larger than this value, doxygen will truncate the graph, which is visualized -# by representing a node as a red box. Note that doxygen if the number of direct -# children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that -# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. -# Minimum value: 0, maximum value: 10000, default value: 50. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs -# generated by dot. A depth value of 3 means that only nodes reachable from the -# root by following a path via at most 3 edges will be shown. Nodes that lay -# further from the root node will be omitted. Note that setting this option to 1 -# or 2 may greatly reduce the computation time needed for large code bases. Also -# note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. -# Minimum value: 0, maximum value: 1000, default value: 0. -# This tag requires that the tag HAVE_DOT is set to YES. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) support -# this, this feature is disabled by default. -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page -# explaining the meaning of the various boxes and arrows in the dot generated -# graphs. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot -# files that are used to generate the various graphs. -# The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_CLEANUP = YES diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.c b/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.c deleted file mode 100644 index fe2e6350f..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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 <inttypes.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "hicn_plugin.h" -#include "model/hicn_model.h" -#include "ietf/ietf_interface.h" - -sr_subscription_ctx_t *subscription = NULL; -volatile int exit_application = 0; - -int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx) { - sr_subscription_ctx_t *subscription = NULL; - int rc = SR_ERR_OK; - rc = hicn_connect_vpp(); - if (SR_ERR_OK != rc) { - return SR_ERR_INTERNAL; - } - - // HICN subscribe - hicn_subscribe_events(session, &subscription); - - // sr_subscription_ctx_t *subscription2 = NULL; - - // IETF subscribe - // ietf_subscribe_events(session, &subscription2); - - /* set subscription as our private context */ - *private_ctx = subscription; - - return SR_ERR_OK; -} - -void sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx) { - /* subscription was set as our private context */ - sr_unsubscribe(private_ctx); - hicn_disconnect_vpp(); -} - -static void sigint_handler(int signum) { exit_application = 1; } -int subscribe_all_module_events(sr_session_ctx_t *session) { - sr_plugin_init_cb(session, (void **)&subscription); - return 0; -} - -int main(int argc, char **argv) { - sr_conn_ctx_t *connection = NULL; - sr_session_ctx_t *session = NULL; - int rc = SR_ERR_OK; - /* connect to vpp */ - rc = hicn_connect_vpp(); - if (-1 == rc) { - fprintf(stderr, "vpp connect error"); - return -1; - } - - /* connect to sysrepo */ - rc = sr_connect(SR_CONN_DEFAULT, &connection); - if (SR_ERR_OK != rc) { - fprintf(stderr, "Error by sr_connect: %s\n", sr_strerror(rc)); - goto cleanup; - } - - /* start session */ - rc = sr_session_start(connection, SR_DS_STARTUP, &session); - if (SR_ERR_OK != rc) { - fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc)); - goto cleanup; - } - - /* subscribe all module events */ - rc = subscribe_all_module_events(session); - if (SR_ERR_OK != rc) { - fprintf(stderr, "Error by subscribe module events: %s\n", sr_strerror(rc)); - goto cleanup; - } - - /* loop until ctrl-c is pressed / SIGINT is received */ - signal(SIGINT, sigint_handler); - signal(SIGPIPE, SIG_IGN); - - while (!exit_application) { - sleep(2); - } - - printf("Application exit requested, exiting.\n"); - -cleanup: - if (NULL != subscription) { - sr_unsubscribe(subscription); - } - if (NULL != session) { - sr_session_stop(session); - } - if (NULL != connection) { - sr_disconnect(connection); - } - hicn_disconnect_vpp(); - return rc; -}
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.h b/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.h deleted file mode 100644 index 15aea72d6..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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. - */ - -/** - * @file hicn_plugin.h - * @brief This file contains init and cleanup for the sysrepo. - */ - -#ifndef __HICN_PLUGIN_H__ -#define __HICN_PLUGIN_H__ - -#include "hicn_vpp_comm.h" - -/** - * @brief initialize function for sysrepo plugin, - * In this function we connect to vpp from one side - * and subscribe for all hICN events as well as interface events (if any) - * @param session pointer to the sesssion context - * @param private_ctx pointer to the context - * @return in success the function returns SR_ERR_OK otherwise it pass error - */ -int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx); - -/** - * @brief cleanup function for sysrepo, - * In this function we connect to vpp from one side - * and and unsubscribe for all hICN events as well as interface events (if any) - * @param session pointer to the sesssion context - * @param private_ctx pointer to the context - */ -void sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx); - -#endif //__HICN_PLUGIN_H__
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.c b/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.c deleted file mode 100644 index 41ab3d057..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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 "hicn_vpp_comm.h" -#include <vapi/vapi.h> - -#define APP_NAME "hicn_plugin" -#define MAX_OUTSTANDING_REQUESTS 4 -#define RESPONSE_QUEUE_SIZE 2 - -vapi_ctx_t g_vapi_ctx_instance = NULL; - -int hicn_connect_vpp() { - 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) { - SRP_LOG_DBGMSG("Error connection"); - vapi_ctx_free(g_vapi_ctx_instance); - return -1; - } - SRP_LOG_DBGMSG("*connected ok"); - } else { - SRP_LOG_DBGMSG("connection keeping"); - } - return 0; -} - -int hicn_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; -}
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.h b/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.h deleted file mode 100644 index cb5eefcbe..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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. - */ - -/** - * @file hicn_vpp_comm.h - * @brief This file contains binary api to connect to the VPP. - */ - -#ifndef __HICN_VPP_COMMM_H__ -#define __HICN_VPP_COMMM_H__ -#include <sysrepo.h> -#include <sysrepo/values.h> -#include <vapi/vapi.h> - -#ifndef HICN_THIS_FUNC -#ifdef __FUNCTION__ -#define HICN_THIS_FUNC __FUNCTION__ -#else -#define HICN_THIS_FUNC __func__ -#endif -#endif - -/** - * @brief This is the context to connect to the vpp - */ - -extern vapi_ctx_t g_vapi_ctx_instance; - -/** - * @brief This macro is interface.c to communicate with vpp - */ -#define VPP_INTFC_NAME_LEN 64 -#define VPP_MAC_ADDRESS_LEN 8 -#define VPP_IP6_ADDRESS_LEN 16 - -/** - * @brief This macro checks the arg is NULL or not, if the arg is NULL it - * returns retval - */ -#define ARG_CHECK(retval, arg) \ - do { \ - if (NULL == (arg)) { \ - SRP_LOG_DBGMSG("NULL pointer passed."); \ - return (retval); \ - } \ - } while (0) - -/** - * @brief Please check ARG_CHECK - */ -#define ARG_CHECK2(retval, arg1, arg2) \ - ARG_CHECK(retval, arg1); \ - ARG_CHECK(retval, arg2) - -/** - * @brief This Macro is the multiple check of ARG_CHECK - */ -#define ARG_CHECK5(retval, arg1, arg2, arg3, arg4, arg5) \ - ARG_CHECK(retval, arg1); \ - ARG_CHECK(retval, arg2); \ - ARG_CHECK(retval, arg3); \ - ARG_CHECK(retval, arg4); \ - ARG_CHECK(retval, arg5) - -/** - * @brief This function is used to connect to the vpp - */ -int hicn_connect_vpp(); -/** - * @brief This function is used to close the connection of the vpp - */ -int hicn_disconnect_vpp(); - -#endif //__HICN_VPP_COMMM_H__ diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c b/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c deleted file mode 100644 index 9a74e6280..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c +++ /dev/null @@ -1,621 +0,0 @@ -/* - * 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 <stdio.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <sysrepo.h> -#include <sysrepo/values.h> -#include <sysrepo/xpath.h> -#include <vnet/interface.h> -#include <vnet/vnet.h> -#include <vnet/ip/ip.h> -#include <vapi/interface.api.vapi.h> - -#include "ietf_interface.h" -#include "../hicn_vpp_comm.h" - -DEFINE_VAPI_MSG_IDS_INTERFACE_API_JSON; - -typedef struct hicn_interface_ { - u32 sw_if_index; - char interface_name[VPP_INTFC_NAME_LEN]; - u8 l2_address[VPP_MAC_ADDRESS_LEN]; - u64 link_speed; - u32 flags; - u16 link_mtu; - u8 admin_up_down; - u8 link_up_down; -} hicnIntfc; - -typedef struct _ietf_sw_interface_dump_ctx { - u8 last_called; - int num_ifs; - int capacity; - hicnIntfc *intfcArray; -} ietf_sw_interface_dump_ctx; - -static i32 ietf_setInterfaceFlags(u32 sw_if_index, u8 admin_up_down); -static i32 ietf_interface_name2index(const char *name, u32 *if_index); -static i32 ietf_interface_add_del_addr(u32 sw_if_index, u8 is_add, u8 is_ipv6, - u8 del_all, u8 address_length, - u8 address[VPP_IP6_ADDRESS_LEN]); -static int ietf_initSwInterfaceDumpCTX(ietf_sw_interface_dump_ctx *dctx); -static int ietf_freeSwInterfaceDumpCTX(ietf_sw_interface_dump_ctx *dctx); - -/** - * @brief Helper function for converting netmask into prefix length. - */ -static uint8_t netmask_to_prefix(const char *netmask) { - in_addr_t n = 0; - uint8_t i = 0; - - inet_pton(AF_INET, netmask, &n); - - while (n > 0) { - n = n >> 1; - i++; - } - - return i; -} - -/** - * @brief Helper function for converting IPv4/IPv6 address string into binary - * representation. - */ -static int ip_addr_str_to_binary(const char *ip_address_str, - uint8_t *ip_address_bin, bool is_ipv6) { - struct in6_addr addr6 = { - 0, - }; - struct in_addr addr4 = { - 0, - }; - int ret = 0; - - if (is_ipv6) { - ret = inet_pton(AF_INET6, ip_address_str, &(addr6)); - if (1 == ret) { - memcpy(ip_address_bin, &addr6, sizeof(addr6)); - } - } else { - ret = inet_pton(AF_INET, ip_address_str, &(addr4)); - if (1 == ret) { - memcpy(ip_address_bin, &addr4, sizeof(addr4)); - } - } - - return ret; -} - -/** - * @brief Enable or disable given interface. - */ -static int interface_enable_disable(const char *if_name, bool enable) { - uint32_t if_index = ~0; - int rc = 0; - - /* get interface index */ - rc = ietf_interface_name2index(if_name, &if_index); - if (0 != rc) { - SRP_LOG_ERRMSG("Invalid interface name"); - return SR_ERR_INVAL_ARG; - } - - /* enable/disable interface */ - rc = ietf_setInterfaceFlags(if_index, (uint8_t)enable); - if (0 != rc) { - SRP_LOG_ERRMSG("Error by processing of the sw_interface_set_flags request"); - return SR_ERR_OPERATION_FAILED; - } else { - return SR_ERR_OK; - } -} - -vapi_error_e call_sw_interface_add_del_address( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_sw_interface_add_del_address_reply *reply) { - if (!reply->retval) { - SRP_LOG_DBGMSG("Successfully done"); - return VAPI_OK; - } else - return VAPI_EUSER; -} - -vapi_error_e call_sw_interface_set_flags( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_sw_interface_set_flags_reply *reply) { - if (!reply->retval) { - SRP_LOG_DBGMSG("Successfully done"); - return VAPI_OK; - } else - return VAPI_EUSER; -} - -/** - * @brief Callback to be called by any config change of - * "/ietf-interfaces:interfaces/interface/enabled" leaf. - */ -static int ietf_interface_enable_disable_cb(sr_session_ctx_t *session, - const char *module_name, - const char *xpath, sr_event_t event, - uint32_t request_id, - void *private_data) { - char *if_name = NULL; - sr_change_iter_t *iter = NULL; - sr_change_oper_t op = SR_OP_CREATED; - sr_val_t *old_val = NULL; - sr_val_t *new_val = NULL; - sr_xpath_ctx_t xpath_ctx = { - 0, - }; - int rc = SR_ERR_OK, op_rc = SR_ERR_OK; - - /* no-op for apply, we only care about SR_EV_ENABLED, SR_EV_VERIFY, - * SR_EV_ABORT */ - if (SR_EV_DONE == event) { - return SR_ERR_OK; - } - - /* get changes iterator */ - rc = sr_get_changes_iter(session, xpath, &iter); - if (SR_ERR_OK != rc) { - SRP_LOG_ERRMSG("Unable to retrieve change iterator"); - return rc; - } - - /* iterate over all changes */ - while ((SR_ERR_OK == op_rc || event == SR_EV_ABORT) && - (SR_ERR_OK == - (rc = sr_get_change_next(session, iter, &op, &old_val, &new_val)))) { - SRP_LOG_DBGMSG("A change detected"); - if_name = sr_xpath_key_value(new_val ? new_val->xpath : old_val->xpath, - "interface", "name", &xpath_ctx); - switch (op) { - case SR_OP_CREATED: - case SR_OP_MODIFIED: - op_rc = interface_enable_disable(if_name, new_val->data.bool_val); - break; - case SR_OP_DELETED: - op_rc = interface_enable_disable(if_name, false /* !enable */); - break; - default: - break; - } - sr_xpath_recover(&xpath_ctx); - if (SR_ERR_INVAL_ARG == op_rc) { - sr_set_error(session, "Invalid interface name.", - new_val ? new_val->xpath : old_val->xpath); - } - sr_free_val(old_val); - sr_free_val(new_val); - } - sr_free_change_iter(iter); - - return op_rc; -} - -/** - * @brief Add or remove IPv4/IPv6 address to/from an interface. - */ -static int interface_ipv46_config_add_remove(const char *if_name, uint8_t *addr, - uint8_t prefix, bool is_ipv6, - bool add) { - uint32_t if_index = ~0; - int rc = 0; - - /* get interface index */ - rc = ietf_interface_name2index(if_name, &if_index); - if (0 != rc) { - SRP_LOG_ERRMSG("Invalid interface name"); - return SR_ERR_INVAL_ARG; - } - - /* add del addr */ - rc = ietf_interface_add_del_addr(if_index, (uint8_t)add, (uint8_t)is_ipv6, 0, - prefix, addr); - if (0 != rc) { - SRP_LOG_ERRMSG("Error by processing of the sw_interface_set_flags request"); - return SR_ERR_OPERATION_FAILED; - } else { - return SR_ERR_OK; - } -} -int ietf_initSwInterfaceDumpCTX(ietf_sw_interface_dump_ctx *dctx) { - if (dctx == NULL) return -1; - - dctx->intfcArray = NULL; - dctx->last_called = false; - dctx->capacity = 0; - dctx->num_ifs = 0; - return 0; -} -int ietf_freeSwInterfaceDumpCTX(ietf_sw_interface_dump_ctx *dctx) { - if (dctx == NULL) return -1; - - if (dctx->intfcArray != NULL) { - free(dctx->intfcArray); - } - - return ietf_initSwInterfaceDumpCTX(dctx); -} -vapi_error_e ietf_sw_interface_dump_cb( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_sw_interface_details *reply) { - ietf_sw_interface_dump_ctx *dctx = callback_ctx; - if (is_last) { - dctx->last_called = true; - } else { - if (dctx->capacity == 0 && dctx->intfcArray == NULL) { - dctx->capacity = 10; - dctx->intfcArray = - (hicnIntfc *)malloc(sizeof(hicnIntfc) * dctx->capacity); - } - if (dctx->num_ifs >= dctx->capacity - 1) { - dctx->capacity += 10; - dctx->intfcArray = (hicnIntfc *)realloc( - dctx->intfcArray, sizeof(hicnIntfc) * dctx->capacity); - } - - hicnIntfc *thisIntfc = &dctx->intfcArray[dctx->num_ifs]; - - thisIntfc->sw_if_index = reply->sw_if_index; - memcpy(thisIntfc->interface_name, reply->interface_name, - VPP_INTFC_NAME_LEN); - memcpy(thisIntfc->l2_address, reply->l2_address, VPP_MAC_ADDRESS_LEN); - // thisIntfc->link_speed = reply->link_speed; -#define ONE_MEGABIT (uint64_t)1000000 - switch (reply->link_speed << VNET_HW_INTERFACE_FLAG_SPEED_SHIFT) { - default: - thisIntfc->link_speed = 0; - break; - } - - thisIntfc->link_mtu = reply->link_mtu; - thisIntfc->flags = reply->flags; - - dctx->num_ifs += 1; - } - return VAPI_OK; -} - -static i32 ietf_interface_name2index(const char *name, u32 *if_index) { - ARG_CHECK2(-1, name, if_index); - - i32 ret = -1; - ietf_sw_interface_dump_ctx dctx = {false, 0, 0, 0}; - vapi_msg_sw_interface_dump *dump; - vapi_error_e rv; - dctx.last_called = false; - - dump = vapi_alloc_sw_interface_dump(g_vapi_ctx_instance); - dump->payload.name_filter_valid = true; - memcpy(&dump->payload.name_filter, name, sizeof(dump->payload.name_filter)); - - while (VAPI_EAGAIN == - (rv = vapi_sw_interface_dump(g_vapi_ctx_instance, dump, - ietf_sw_interface_dump_cb, &dctx))) - ; - - int i = 0; - for (; i < dctx.num_ifs; ++i) { - if (strcmp(dctx.intfcArray[i].interface_name, name) == 0) { - *if_index = dctx.intfcArray[i].sw_if_index; - ret = 0; - break; - } - } - ietf_freeSwInterfaceDumpCTX(&dctx); - - return ret; -} - -i32 ietf_interface_add_del_addr(u32 sw_if_index, u8 is_add, u8 is_ipv6, - u8 del_all, u8 address_length, - u8 address[VPP_IP6_ADDRESS_LEN]) { - i32 ret = -1; - vapi_msg_sw_interface_add_del_address *msg = - vapi_alloc_sw_interface_add_del_address(g_vapi_ctx_instance); - msg->payload.sw_if_index = sw_if_index; - msg->payload.is_add = is_add; - msg->payload.prefix.address.af = is_ipv6 ? ADDRESS_IP6 : ADDRESS_IP4; - msg->payload.del_all = del_all; - msg->payload.prefix.len = address_length; - memcpy(msg->payload.prefix.address.un.ip6, address, VPP_IP6_ADDRESS_LEN); - - if (vapi_sw_interface_add_del_address(g_vapi_ctx_instance, msg, - call_sw_interface_add_del_address, - NULL) != VAPI_OK) { - SRP_LOG_DBGMSG("Operation failed"); - return SR_ERR_OPERATION_FAILED; - } - - return ret; -} - -i32 ietf_setInterfaceFlags(u32 sw_if_index, u8 admin_up_down) { - i32 ret = -1; - vapi_msg_sw_interface_set_flags *msg = - vapi_alloc_sw_interface_set_flags(g_vapi_ctx_instance); - msg->payload.sw_if_index = sw_if_index; - msg->payload.flags = admin_up_down ? IF_STATUS_API_FLAG_ADMIN_UP : 0; - - if (vapi_sw_interface_set_flags(g_vapi_ctx_instance, msg, - call_sw_interface_set_flags, - NULL) != VAPI_OK) { - SRP_LOG_DBGMSG("Operation failed"); - return SR_ERR_OPERATION_FAILED; - } - - return ret; -} - -/** - * @brief Modify existing IPv4/IPv6 config on an interface. - */ -static int interface_ipv46_config_modify(sr_session_ctx_t *session, - const char *if_name, sr_val_t *old_val, - sr_val_t *new_val, bool is_ipv6) { - sr_xpath_ctx_t xpath_ctx = { - 0, - }; - char *addr_str = NULL; - uint8_t addr[16] = { - 0, - }; - uint8_t prefix = 0; - int rc = SR_ERR_OK; - - SRP_LOG_DBGMSG("Updating IP config on interface"); - - /* get old config to be deleted */ - if (SR_UINT8_T == old_val->type) { - prefix = old_val->data.uint8_val; - } else if (SR_STRING_T == old_val->type) { - prefix = netmask_to_prefix(old_val->data.string_val); - } else { - return SR_ERR_INVAL_ARG; - } - addr_str = - sr_xpath_key_value((char *)old_val->xpath, "address", "ip", &xpath_ctx); - ip_addr_str_to_binary(addr_str, addr, is_ipv6); - sr_xpath_recover(&xpath_ctx); - - /* delete old IP config */ - rc = interface_ipv46_config_add_remove(if_name, addr, prefix, is_ipv6, - false /* remove */); - if (SR_ERR_OK != rc) { - SRP_LOG_ERRMSG("Unable to remove old IP address config"); - return rc; - } - - /* update the config with the new value */ - if (sr_xpath_node_name_eq(new_val->xpath, "prefix-length")) { - prefix = new_val->data.uint8_val; - } else if (sr_xpath_node_name_eq(new_val->xpath, "netmask")) { - prefix = netmask_to_prefix(new_val->data.string_val); - } - - /* set new IP config */ - rc = interface_ipv46_config_add_remove(if_name, addr, prefix, is_ipv6, - true /* add */); - if (SR_ERR_OK != rc) { - SRP_LOG_ERRMSG("Unable to remove old IP address config"); - return rc; - } - - return rc; -} - -/** - * @brief Callback to be called by any config change in subtrees - * "/ietf-interfaces:interfaces/interface/ietf-ip:ipv4/address" or - * "/ietf-interfaces:interfaces/interface/ietf-ip:ipv6/address". - */ -static int ietf_interface_ipv46_address_change_cb( - sr_session_ctx_t *session, const char *module_name, const char *xpath, - sr_event_t event, uint32_t request_id, void *private_data) { - sr_change_iter_t *iter = NULL; - sr_change_oper_t op = SR_OP_CREATED; - sr_val_t *old_val = NULL; - sr_val_t *new_val = NULL; - sr_xpath_ctx_t xpath_ctx = {0}; - bool is_ipv6 = false, has_addr = false, has_prefix = false; - uint8_t addr[16] = { - 0, - }; - uint8_t prefix = 0; - char *node_name = NULL, *if_name = NULL; - int rc = SR_ERR_OK, op_rc = SR_ERR_OK; - - /* no-op for apply, we only care about SR_EV_ENABLED, SR_EV_VERIFY, - * SR_EV_ABORT */ - if (SR_EV_DONE == event) { - return SR_ERR_OK; - } - - /* check whether we are handling ipv4 or ipv6 config */ - node_name = sr_xpath_node_idx((char *)xpath, 2, &xpath_ctx); - if (NULL != node_name && 0 == strcmp(node_name, "ipv6")) { - is_ipv6 = true; - } - sr_xpath_recover(&xpath_ctx); - - /* get changes iterator */ - rc = sr_get_changes_iter(session, xpath, &iter); - if (SR_ERR_OK != rc) { - // SRP_LOG_ERR("Unable to retrieve change iterator: %s", sr_strerror(rc)); - return rc; - } - - /* iterate over all changes */ - while ((SR_ERR_OK == op_rc || event == SR_EV_ABORT) && - (SR_ERR_OK == - (rc = sr_get_change_next(session, iter, &op, &old_val, &new_val)))) { - if_name = - strdup(sr_xpath_key_value(new_val ? new_val->xpath : old_val->xpath, - "interface", "name", &xpath_ctx)); - sr_xpath_recover(&xpath_ctx); - - switch (op) { - case SR_OP_CREATED: - if (SR_LIST_T == new_val->type) { - /* create on list item - reset state vars */ - has_addr = has_prefix = false; - } else { - if (sr_xpath_node_name_eq(new_val->xpath, "ip")) { - ip_addr_str_to_binary(new_val->data.string_val, addr, is_ipv6); - has_addr = true; - } else if (sr_xpath_node_name_eq(new_val->xpath, "prefix-length")) { - prefix = new_val->data.uint8_val; - has_prefix = true; - } else if (sr_xpath_node_name_eq(new_val->xpath, "netmask")) { - prefix = netmask_to_prefix(new_val->data.string_val); - has_prefix = true; - } - if (has_addr && has_prefix) { - op_rc = interface_ipv46_config_add_remove(if_name, addr, prefix, - is_ipv6, true /* add */); - } - } - break; - case SR_OP_MODIFIED: - op_rc = interface_ipv46_config_modify(session, if_name, old_val, - new_val, is_ipv6); - break; - case SR_OP_DELETED: - if (SR_LIST_T == old_val->type) { - /* delete on list item - reset state vars */ - has_addr = has_prefix = false; - } else { - if (sr_xpath_node_name_eq(old_val->xpath, "ip")) { - ip_addr_str_to_binary(old_val->data.string_val, addr, is_ipv6); - has_addr = true; - } else if (sr_xpath_node_name_eq(old_val->xpath, "prefix-length")) { - prefix = old_val->data.uint8_val; - has_prefix = true; - } else if (sr_xpath_node_name_eq(old_val->xpath, "netmask")) { - prefix = netmask_to_prefix(old_val->data.string_val); - has_prefix = true; - } - if (has_addr && has_prefix) { - op_rc = interface_ipv46_config_add_remove( - if_name, addr, prefix, is_ipv6, false /* !add */); - } - } - break; - default: - break; - } - if (SR_ERR_INVAL_ARG == op_rc) { - sr_set_error(session, "Invalid interface name.", - new_val ? new_val->xpath : old_val->xpath); - } - free(if_name); - sr_free_val(old_val); - sr_free_val(new_val); - } - sr_free_change_iter(iter); - - return op_rc; -} - -/** - * @brief Callback to be called by any config change under - * "/ietf-interfaces:interfaces-state/interface" path. Does not provide any - * functionality, needed just to cover not supported config leaves. - */ -static int ietf_interface_change_cb(sr_session_ctx_t *session, - const char *module_name, const char *xpath, - sr_event_t event, uint32_t request_id, - void *private_data) { - return SR_ERR_OK; -} - -int ietf_subscribe_events(sr_session_ctx_t *session, - sr_subscription_ctx_t **subscription) { - int rc = SR_ERR_OK; - SRP_LOG_DBGMSG("Subscriging ietf."); - - // - rc = sr_module_change_subscribe( - session, "ietf-interfaces", "/ietf-interfaces:interfaces/interface", - ietf_interface_change_cb, NULL, 0, - SR_SUBSCR_CTX_REUSE | SR_SUBSCR_ENABLED, subscription); - - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG( - "Problem in subscription /ietf-interfaces:interfaces/interface\n"); - goto error; - } - - rc = sr_module_change_subscribe( - session, "ietf-interfaces", - "/ietf-interfaces:interfaces/interface/enabled", - ietf_interface_enable_disable_cb, NULL, 100, - SR_SUBSCR_CTX_REUSE | SR_SUBSCR_ENABLED, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG( - "Problem in subscription " - "/ietf-interfaces:interfaces/interface/enabled\n"); - goto error; - } - - // rc = sr_module_change_subscribe(session, - // "ietf-interfaces","/ietf-interfaces:interfaces/interface/ietf-ip:ipv4/address", - // ietf_interface_ipv46_address_change_cb, - rc = sr_module_change_subscribe( - session, "ietf-interfaces", "/ietf-interfaces:interfaces", - ietf_interface_ipv46_address_change_cb, NULL, 99, - SR_SUBSCR_CTX_REUSE | SR_SUBSCR_ENABLED, subscription); - - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG( - "Problem in subscription " - "/ietf-interfaces:interfaces/interface/ietf-ip:ipv4/address\n"); - goto error; - } - - // rc = sr_module_change_subscribe(session, - // "ietf-interfaces","/ietf-interfaces:interfaces/interface/ietf-ip:ipv6/address", - // ietf_interface_ipv46_address_change_cb, - // NULL, - // 98, SR_SUBSCR_CTX_REUSE | - // SR_SUBSCR_ENABLED, subscription); - - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG( - "Problem in subscription " - "/ietf-interfaces:interfaces/interface/ietf-ip:ipv6/address\n"); - goto error; - } - - /* rc = sr_dp_get_items_subscribe(session, - "/ietf-interfaces:interfaces-state", ietf_interface_state_cb, NULL, - SR_SUBSCR_CTX_REUSE, subscription); if (rc != SR_ERR_OK) { - SRP_LOG_DBG_MSG("Problem in subscription - /ietf-interfaces:interfaces-state\n"); goto error; - }*/ - - SRP_LOG_INFMSG("ietf initialized successfully."); - return SR_ERR_OK; - -error: - SRP_LOG_ERRMSG("Error by initialization of the ietf."); - return rc; -} diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.h b/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.h deleted file mode 100644 index cf5430464..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 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 __IETF_INTERFACE_H__ -#define __IETF_INTERFACE_H__ - -int ietf_subscribe_events(sr_session_ctx_t *session, - sr_subscription_ctx_t **subscription); - -#endif /* __IETF_INTERFACE_H__ */ diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/mainpage.dox b/ctrl/sysrepo-plugins/hicn-plugin/plugin/mainpage.dox deleted file mode 100644 index 978578039..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/mainpage.dox +++ /dev/null @@ -1,211 +0,0 @@ -/** @mainpage About hICN sysrepo plugin -*This plugin serves as a data management agent. It provides yang models via -*NETCONF to allow the management of hicn-plugin which runs in VPP instance from out-of-box. - -*The following sections contain more details: -*- @subpage subp1 "hICN yang model" -*- @subpage subp2 "User Guide" -*- @subpage subp3 "Developer Guide" -*/ - -/** @page subp1 -*hicn.yang consists of one container for providing the state data (i.e., hicn-state). -*It consists of state, route, and face-ip-params -*nodes with the corresponding leaves. In the hicn model a variety of RPCs are provided -*to allow controller to communicate with the hicn-plugin as well as update the state -*data in hicn-state. You can install the yang model using the following bash script: - -``` -EXIT_CODE=0 -command -v sysrepoctl > /dev/null -if [ $? != 0 ]; then - echo "Could not find command \"sysrepoctl\"." - exit ${EXIT_CODE} -else -sysrepoctl --install path_to_hicn_yang_model -fi -``` - -*Here you can find different examples to run RPC in the yang-model. - -``` -<hicn-enable xmlns="urn:sysrepo:hicn"> - <prefix>b001::/64</prefix> -</hicn-enable> - -<hicn-disable xmlns="urn:sysrepo:hicn"> - <prefix>b001::/64</prefix> -</hicn-disable> -``` - */ - -/** @page subp2 - -*Firstly, verify the plugin and binary libraries are located correctly, then run -*the vpp through (service vpp start). Next, run the sysrepo plugin (sysrepo-plugind), -*for debug mode: sysrep-plugind -d -v 4 which -*runs with high verbosity. When the hicn sysrepo plugin is loaded, run the -*netopeer2-server which serves as NETCONF server. - - -*## Connect from netopeer2-cli - -*In order to connect through the netopeer client run the netopeer2-cli. Then, follow these steps: -``` -*- connect --host XXX --login XXX -*- get (you can get the configuration and operational data) -*- user-rpc (you can call one of the rpc proposed by hicn model but it needs an xml input) -``` - -*## Connect from OpenDaylight (ODL) controller - - -*In order to connect through the OpenDaylight follow these procedure: - -*- run karaf distribution (./opendayligh_installation_folder/bin/karaf) -*- install the required feature list in DOL (feature:install odl-netconf-server -* odl-netconf-connector odl-restconf-all odl-netconf-topology or -* odl-netconf-clustered-topology) -*- run a rest client program (e.g., postman or RESTClient) -*- mount the remote netopeer2-server to the OpenDaylight by the following REST API: - -*PUT http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/hicn-node - -* with the following body -``` - <node xmlns="urn:TBD:params:xml:ns:yang:network-topology"> - <node-id>hicn-node</node-id> - <host xmlns="urn:opendaylight:netconf-node-topology">Remote_NETCONF_SERVER_IP</host> - <port xmlns="urn:opendaylight:netconf-node-topology">830</port> - <username xmlns="urn:opendaylight:netconf-node-topology">username</username> - <password xmlns="urn:opendaylight:netconf-node-topology">password</password> - <tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only> - <keepalive-delay xmlns="urn:opendaylight:netconf-node-topology">1</keepalive-delay> - </node> -``` -*Note that the header files must be set to Content-Type: application/xml, Accept: application/xml. - -*- send the operation through the following REST API: - -*POST http://localhost:8181/restconf/operations/network-topology:network-topology/topology/topology-netconf/node/hicn-node/yang-ext:mount/ietf-netconf:edit-config - -*The body can be used the same as edit-config in netopeer2-cli. - -*## Connect from Network Services Orchestrator (NSO) - -*To connect NSO to the netopeer2-server, first, you need to write a NED package -*for your device. The procedure to create NED for hicn is explained in the following: - -*Place hicn.yang model in a folder called hicn-yang-model, and follow these steps: - -*- ncs-make-package --netconf-ned ./hicn-yang-model ./hicn-nso -*- cd hicn-nso/src; make -*- ncs-setup --ned-package ./hicn-nso --dest ./hicn-nso-project -*- cd hicn-nso-project -*- ncs -*- ncs_cli -C -u admin -*- configure -*- devices authgroups group authhicn default-map remote-name user_name remote-password password -*- devices device hicn address IP_device port 830 authgroup authhicn device-type netconf -*- state admin-state unlocked -*- commit -*- ssh fetch-host-keys - - -*At this point, we are able to connect to the remote device. - - - */ - - /** @page subp3 - -*This guide contains information intended for developers that need to extend/modify the hICN yang model. - -*# Adding configuration data -*In order to add configuration data, firstly it requires to update yang model and define the configuration paramters -*through a container and define the leaves. Once the yang model is updated in the sysrepo plugin you need to subscribe -*for ```sr_module_change_subscribe``` and provide the appropriate callback. -* -* -*# Adding new RPC -* -*In order to add RPC call, firstly it requires to update the yang model by new ```rpc``` statements and define the input to them. - - -*# Adding new operational data -* -*In order to add operational data, firstly it requires to add operational data in yang model by adding ```confg false``` to the container. -*Then, update the sysrepo plugin by the adding the ```sr_oper_get_items_subscribe```. - - Example: -I have a switch with two ports. I am going to write an RPC call to switch them on/off -, moreover I need to read operational data from each port. So, the following yang model can be proposed: - -``` -module switch { -namespace "urn:sysrepo:switch"; -prefix swtch; - -revision 2019-12-08{ - description "Initial revision."; -} - - -grouping status-reply{ - list port{ - key portid; - leaf portid { - description "the port id."; - type uint32; - } - leaf status { - description "the status of the port."; - type boolean; - } - -} -} - -rpc power { - description "Operation to power on/off switch."; - input { - leaf turned-on { - description "indicating on or off."; - type boolean; - default false; - } - } -} - - -container switch-state { - - config false; - description "operational data container for the switch."; - container status{ - uses status-reply; - } -``` -Afterwards, the following subscribes are required in the sysrepo plugin. - -``` -sr_rpc_subscribe(session, "/switch:power", callback, - session, 100,SR_SUBSCR_CTX_REUSE, subscription); - -``` - -session is the opened session with sysrepo, xpath is the path in the yang model, callback is the function -when RPC arrives, private context passed to the callback function, priprity which is set to 100 here indicates the priority if there re multiple RPCs, -options can alter the normal behaviour, and subscription is the subscribtion when initialize the connection towards the sysrepo - - -``` - rc = sr_oper_get_items_subscribe(session, "switch","/switch:switch-state/status", - callback, NULL, SR_SUBSCR_CTX_REUSE, - subscription); -``` -session is the opened session with sysrepo, xpath is the path in the yang model, callback is the function -when RPC arrives, private context passed to the callback which is NULL here, -options can alter the normal behaviour, and subscription is the subscribtion when initialize the connection towards the sysrepo - -*/
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c deleted file mode 100644 index f1b804267..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c +++ /dev/null @@ -1,875 +0,0 @@ -/* - * 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. - */ - -/** @file hicn_model.c - * @brief This file contains implementations of the main calls - */ - -#define _GNU_SOURCE - -#include <inttypes.h> -#include <malloc.h> -#include <pthread.h> -#include <sched.h> -#include <stdio.h> -#include <string.h> -#include <sysrepo/xpath.h> -#include <unistd.h> -/* Hicn headers */ - -#include <hicn/util/ip_address.h> - -#include "../hicn_plugin.h" -#include "../hicn_vpp_comm.h" -#include "hicn_model.h" -#include "tlock.h" - -DEFINE_VAPI_MSG_IDS_HICN_API_JSON - -// Shared local variables between state and RPCs - -/** - * @brief this shared variable keeps the hicn state - */ -volatile hicn_state_t *hicn_state = NULL; -/** - * @brief this shared variable keeps hicn strategies - */ -volatile hicn_strategies_t *hicn_strategies = NULL; -/** - * @brief this shared variable keeps statistics of hicn faces - */ -volatile hicn_faces_t *hicn_faces = NULL; -/** - * @brief this shared variable keeps routes information in hicn - */ -volatile hicn_routes_t *hicn_routes = NULL; -/** - * @brief this shared variable is the link list to maintain all the faces (up to - * MAX_FACES) - */ -struct hicn_faces_s *fcurrent = NULL; -/** - * @brief this shared variable is the link list to maintain all the routes - */ -struct hicn_routes_s *rcurrent = NULL; - -static int init_buffer(void) { - hicn_state = memalign(MEM_ALIGN, sizeof(hicn_state_t)); - memset((hicn_state_t *)hicn_state, 0, sizeof(hicn_state_t)); - - hicn_strategies = memalign(MEM_ALIGN, sizeof(hicn_strategies_t)); - memset((hicn_strategies_t *)hicn_strategies, 0, sizeof(hicn_strategies_t)); - - hicn_faces = memalign(MEM_ALIGN, sizeof(hicn_faces_t)); - hicn_faces->next = memalign(MEM_ALIGN, sizeof(struct hicn_faces_s)); - fcurrent = hicn_faces->next; - - hicn_routes = memalign(MEM_ALIGN, sizeof(hicn_routes_t)); - hicn_routes->next = memalign(MEM_ALIGN, sizeof(struct hicn_routes_s)); - rcurrent = hicn_routes->next; - - int retval = -1; - ARG_CHECK5(retval, hicn_state, hicn_strategies, fcurrent, hicn_faces, - hicn_routes); - hicn_routes->nroute = 0; - hicn_faces->nface = 0; - retval = 0; - - return retval; -} - -static int init_face_pool(struct hicn_faces_s *head) { - for (int i = 0; i < MAX_FACE_POOL; i++) { - head->next = memalign(MEM_ALIGN, sizeof(struct hicn_faces_s)); - head = head->next; - } - SRP_LOG_DBGMSG("Face memory pool allocated\n"); - head->next = NULL; - return 0; -} - -static int init_route_pool(struct hicn_routes_s *head) { - for (int i = 0; i < MAX_ROUTE_POOL; i++) { - head->next = memalign(MEM_ALIGN, sizeof(struct hicn_routes_s)); - head = head->next; - } - SRP_LOG_DBGMSG("Route memory pool allocated\n"); - head->next = NULL; - return 0; -} - -/* VAPI CALLBACKS */ - -static vapi_error_e call_hicn_api_strategies_get( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_strategies_get_reply *reply) { - if (!reply->retval) { - SRP_LOG_DBGMSG("Successfully done"); - return VAPI_OK; - } else - return VAPI_EUSER; -} - -static vapi_error_e call_hicn_api_face_params_get( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_face_params_get_reply *reply) { - if (!reply->retval) { - if (callback_ctx != NULL) { - struct hicn_faces_s *tmp; - tmp = (struct hicn_faces_s *)callback_ctx; - tmp->face.intfc = reply->swif; - } - return VAPI_OK; - } else - return VAPI_EUSER; -} - -static vapi_error_e call_vapi_hicn_api_node_stats_get( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_node_stats_get_reply *reply) { - if (!reply->retval) { - hicn_state->pkts_processed = reply->pkts_processed; - hicn_state->pkts_interest_count = reply->pkts_interest_count; - hicn_state->pkts_data_count = reply->pkts_data_count; - hicn_state->pkts_from_cache_count = reply->pkts_from_cache_count; - hicn_state->pkts_no_pit_count = reply->pkts_no_pit_count; - hicn_state->pit_expired_count = reply->pit_expired_count; - hicn_state->cs_expired_count = reply->cs_expired_count; - hicn_state->cs_lru_count = reply->cs_lru_count; - hicn_state->pkts_drop_no_buf = reply->pkts_drop_no_buf; - hicn_state->interests_aggregated = reply->interests_aggregated; - hicn_state->interests_retx = reply->interests_retx; - hicn_state->pit_entries_count = reply->pit_entries_count; - hicn_state->cs_entries_count = reply->cs_entries_count; - hicn_state->cs_entries_ntw_count = reply->cs_entries_ntw_count; - return VAPI_OK; - } else - return VAPI_EUSER; -} - -static inline void state_update(sr_val_t *vals, struct lyd_node **parent, - sr_session_ctx_t *session) { - char buf[20]; - - sr_val_set_xpath(&vals[0], "/hicn:hicn-state/states/pkts_processed"); - vals[0].type = SR_UINT64_T; - vals[0].data.uint64_val = hicn_state->pkts_processed; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pkts_processed); - *parent = - lyd_new_path(NULL, sr_get_context(sr_session_get_connection(session)), - vals[0].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[1], "/hicn:hicn-state/states/pkts_interest_count"); - vals[1].type = SR_UINT64_T; - vals[1].data.uint64_val = hicn_state->pkts_interest_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pkts_interest_count); - lyd_new_path(*parent, NULL, vals[1].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[2], "/hicn:hicn-state/states/pkts_data_count"); - vals[2].type = SR_UINT64_T; - vals[2].data.uint64_val = hicn_state->pkts_data_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pkts_data_count); - lyd_new_path(*parent, NULL, vals[2].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[3], "/hicn:hicn-state/states/pkts_from_cache_count"); - vals[3].type = SR_UINT64_T; - vals[3].data.uint64_val = hicn_state->pkts_from_cache_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pkts_from_cache_count); - lyd_new_path(*parent, NULL, vals[3].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[4], "/hicn:hicn-state/states/pkts_no_pit_count"); - vals[4].type = SR_UINT64_T; - vals[4].data.uint64_val = hicn_state->pkts_no_pit_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pkts_no_pit_count); - lyd_new_path(*parent, NULL, vals[4].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[5], "/hicn:hicn-state/states/pit_expired_count"); - vals[5].type = SR_UINT64_T; - vals[5].data.uint64_val = hicn_state->pit_expired_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pit_expired_count); - lyd_new_path(*parent, NULL, vals[5].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[6], "/hicn:hicn-state/states/cs_expired_count"); - vals[6].type = SR_UINT64_T; - vals[6].data.uint64_val = hicn_state->cs_expired_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->cs_expired_count); - lyd_new_path(*parent, NULL, vals[6].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[7], "/hicn:hicn-state/states/cs_lru_count"); - vals[7].type = SR_UINT64_T; - vals[7].data.uint64_val = hicn_state->cs_lru_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->cs_lru_count); - lyd_new_path(*parent, NULL, vals[7].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[8], "/hicn:hicn-state/states/pkts_drop_no_buf"); - vals[8].type = SR_UINT64_T; - vals[8].data.uint64_val = hicn_state->pkts_drop_no_buf; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pkts_drop_no_buf); - lyd_new_path(*parent, NULL, vals[8].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[9], "/hicn:hicn-state/states/interests_aggregated"); - vals[9].type = SR_UINT64_T; - vals[9].data.uint64_val = hicn_state->interests_aggregated; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->interests_aggregated); - lyd_new_path(*parent, NULL, vals[9].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[10], "/hicn:hicn-state/states/interests_retx"); - vals[10].type = SR_UINT64_T; - vals[10].data.uint64_val = hicn_state->interests_retx; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->interests_retx); - lyd_new_path(*parent, NULL, vals[10].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[11], - "/hicn:hicn-state/states/interests_hash_collision"); - vals[11].type = SR_UINT64_T; - vals[11].data.uint64_val = hicn_state->interests_hash_collision; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->interests_hash_collision); - lyd_new_path(*parent, NULL, vals[11].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[12], "/hicn:hicn-state/states/pit_entries_count"); - vals[12].type = SR_UINT64_T; - vals[12].data.uint64_val = hicn_state->pit_entries_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->pit_entries_count); - lyd_new_path(*parent, NULL, vals[12].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[13], "/hicn:hicn-state/states/cs_entries_count"); - vals[13].type = SR_UINT64_T; - vals[13].data.uint64_val = hicn_state->cs_entries_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->cs_entries_count); - lyd_new_path(*parent, NULL, vals[13].xpath, buf, 0, 0); - - sr_val_set_xpath(&vals[14], "/hicn:hicn-state/states/cs_entries_ntw_count"); - vals[14].type = SR_UINT64_T; - vals[14].data.uint64_val = hicn_state->cs_entries_ntw_count; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, hicn_state->cs_entries_ntw_count); - lyd_new_path(*parent, NULL, vals[14].xpath, buf, 0, 0); -} - -static inline int routes_update(sr_val_t *vals, uint32_t nleaves, - struct lyd_node **parent, - sr_session_ctx_t *session) { - struct hicn_routes_s *temp = hicn_routes->next; - char buf[20]; - int route = 0; - for (int count = 0; count < nleaves; count++) { - sr_val_build_xpath(&vals[route], "%s[routeid='%d']/prefix", - "/hicn:hicn-state/routes/route", temp->route.route_id); - vals[route].type = SR_STRING_T; - - memset(buf, 0x00, 20); - if (temp->route.prefix.address.af == ADDRESS_IP4) { - struct sockaddr_in sa; - memcpy(&sa.sin_addr.s_addr, temp->route.prefix.address.un.ip4, - IPV4_ADDR_LEN); - inet_ntop(AF_INET, &(sa.sin_addr), buf, INET_ADDRSTRLEN); - vals[route].data.string_val = buf; - } else { - struct sockaddr_in6 sa; - memcpy(&sa.sin6_addr, temp->route.prefix.address.un.ip6, IPV6_ADDR_LEN); - inet_ntop(AF_INET6, &(sa.sin6_addr), buf, INET6_ADDRSTRLEN); - vals[route].data.string_val = buf; - } - - lyd_new_path(*parent, NULL, vals[route].xpath, buf, 0, 0); - - route++; - - sr_val_build_xpath(&vals[route], "%s[routeid='%d']/strategy_id", - "/hicn:hicn-state/routes/route", temp->route.route_id); - vals[route].type = SR_UINT32_T; - vals[route].data.uint32_val = temp->route.strategy_id; - memset(buf, 0x00, 20); - sprintf(buf, "%d", temp->route.strategy_id); - lyd_new_path(*parent, NULL, vals[route].xpath, buf, 0, 0); - - route++; - - temp = temp->next; - } - - SRP_LOG_DBGMSG("Routes state updated \n"); - return SR_ERR_OK; -} - -static inline int faces_update(sr_val_t *vals, uint32_t nleaves, - struct lyd_node **parent, - sr_session_ctx_t *session) { - struct hicn_faces_s *temp = hicn_faces->next; - char buf[20]; - int face = 0; - - for (int count = 0; count < nleaves; count++) { - vapi_msg_hicn_api_face_params_get *msg; - msg = vapi_alloc_hicn_api_face_params_get(g_vapi_ctx_instance); - - msg->payload.faceid = temp->face.faceid; - - if (vapi_hicn_api_face_params_get(g_vapi_ctx_instance, msg, - call_hicn_api_face_params_get, - (void *)temp) != VAPI_OK) { - SRP_LOG_DBGMSG("Operation failed"); - return SR_ERR_OPERATION_FAILED; - } - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/intfc", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT32_T; - vals[face].data.uint32_val = temp->face.intfc; - memset(buf, 0x00, 20); - sprintf(buf, "%u", temp->face.intfc); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/irx_packets", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.irx_packets; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.irx_packets); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/irx_bytes", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.irx_bytes; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.irx_bytes); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/itx_packets", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.itx_packets; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.itx_packets); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/itx_bytes", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.itx_bytes; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.itx_bytes); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/drx_packets", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.drx_packets; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.drx_packets); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/drx_bytes", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.drx_bytes; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.drx_packets); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/dtx_packets", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.dtx_packets; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.dtx_packets); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - sr_val_build_xpath(&vals[face], "%s[faceid='%d']/dtx_bytes", - "/hicn:hicn-state/faces/face", temp->face.faceid); - vals[face].type = SR_UINT64_T; - vals[face].data.uint64_val = temp->face.dtx_bytes; - memset(buf, 0x00, 20); - sprintf(buf, "%" PRIu64, temp->face.dtx_bytes); - lyd_new_path(*parent, NULL, vals[face].xpath, buf, 0, 0); - - face++; - - temp = temp->next; - } - SRP_LOG_DBGMSG("Faces state updated \n"); - return SR_ERR_OK; -} - -static int hicn_state_states_cb(sr_session_ctx_t *session, - const char *module_name, const char *path, - const char *request_xpath, uint32_t request_id, - struct lyd_node **parent, void *private_data) { - sr_val_t *vals; - int rc; - enum locks_name state; - state = lstate; - SRP_LOG_DBGMSG("Requesting state data"); - - rc = sr_new_values(NSTATE_LEAVES, &vals); - if (SR_ERR_OK != rc) { - return rc; - } - - tlock(state); - state_update(vals, parent, session); - tunlock(state); - - return SR_ERR_OK; -} - -static int hicn_state_route_cb(sr_session_ctx_t *session, - const char *module_name, const char *path, - const char *request_xpath, uint32_t request_id, - struct lyd_node **parent, void *private_data) { - sr_val_t *vals; - int rc; - enum locks_name route; - route = lroute; - uint32_t NROUTE_NODES = hicn_routes->nroute * ROUTES_CHILDREN; - - rc = sr_new_values(NROUTE_NODES, &vals); - if (SR_ERR_OK != rc) { - return rc; - } - - tlock(route); - routes_update(vals, NROUTE_NODES / ROUTES_CHILDREN, parent, session); - tunlock(route); - - return SR_ERR_OK; -} - -static int hicn_state_faces_cb(sr_session_ctx_t *session, - const char *module_name, const char *path, - const char *request_xpath, uint32_t request_id, - struct lyd_node **parent, void *private_data) { - sr_val_t *vals; - int rc; - enum locks_name faces; - faces = lfaces; - uint32_t NFACES_NODES = hicn_faces->nface * FACES_CHILDREN; - - rc = sr_new_values(NFACES_NODES, &vals); - if (SR_ERR_OK != rc) { - return rc; - } - - tlock(faces); - faces_update(vals, NFACES_NODES / FACES_CHILDREN, parent, session); - tunlock(faces); - - return SR_ERR_OK; -} - -static int hicn_strategies_get_cb(sr_session_ctx_t *session, const char *path, - const sr_val_t *input, const size_t input_cnt, - sr_event_t event, uint32_t request_id, - sr_val_t **output, size_t *output_cnt, - void *private_data) { - SRP_LOG_DBGMSG("hicn strategies received successfully"); - vapi_msg_hicn_api_strategies_get *msg; - - msg = vapi_alloc_hicn_api_strategies_get(g_vapi_ctx_instance); - - if (vapi_hicn_api_strategies_get(g_vapi_ctx_instance, msg, - call_hicn_api_strategies_get, - NULL) != VAPI_OK) { - SRP_LOG_DBGMSG("Operation failed"); - return SR_ERR_OPERATION_FAILED; - } - return SR_ERR_OK; -} - -static int hicn_face_params_get_cb(sr_session_ctx_t *session, const char *path, - const sr_val_t *input, - const size_t input_cnt, sr_event_t event, - uint32_t request_id, sr_val_t **output, - size_t *output_cnt, void *private_data) { - SRP_LOG_DBGMSG("hicn face ip params get received successfully"); - vapi_msg_hicn_api_face_params_get *msg; - - msg = vapi_alloc_hicn_api_face_params_get(g_vapi_ctx_instance); - - msg->payload.faceid = input[0].data.uint32_val; - - if (vapi_hicn_api_face_params_get(g_vapi_ctx_instance, msg, - call_hicn_api_face_params_get, - NULL) != VAPI_OK) { - SRP_LOG_DBGMSG("Operation failed"); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -static vapi_error_e call_hicn_api_enable_disable( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_enable_disable_reply *reply) { - if (!reply->retval) { - SRP_LOG_DBGMSG("Successfully done"); - return VAPI_OK; - } else - return VAPI_EUSER; -} - -static int hicn_enable_cb(sr_session_ctx_t *session, const char *path, - const sr_val_t *input, const size_t input_cnt, - sr_event_t event, uint32_t request_id, - sr_val_t **output, size_t *output_cnt, - void *private_data) { - SRP_LOG_DBGMSG("hicn enable received successfully"); - vapi_msg_hicn_api_enable_disable *msg; - - msg = vapi_alloc_hicn_api_enable_disable(g_vapi_ctx_instance); - - const char *delim = "/"; - if (input->type != SR_STRING_T) { - SRP_LOG_DBGMSG("Expected prefix of type string"); - return SR_ERR_OPERATION_FAILED; - } - char *token; - - /* get the first token */ - token = strtok(input->data.string_val, delim); - - /* if null the address is ipv4 else ipv6*/ - if (strrchr(token, ':') == NULL) { - struct sockaddr_in sa; - inet_pton(AF_INET, token, &(sa.sin_addr)); - unsigned char *tmp = (unsigned char *)&sa.sin_addr.s_addr; - memcpy(&msg->payload.prefix.address.un.ip4[0], tmp, B32); - msg->payload.prefix.address.af = ADDRESS_IP4; - } else { - void *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, token, dst); - unsigned char *tmp = (unsigned char *)((struct in6_addr *)dst)->s6_addr; - memcpy(&msg->payload.prefix.address.un.ip6[0], tmp, B128); - msg->payload.prefix.address.af = ADDRESS_IP6; - } - - /* The second token is the prefix len*/ - token = strtok(NULL, delim); - - msg->payload.prefix.len = atoi(token); - msg->payload.enable_disable = 1; - - if (vapi_hicn_api_enable_disable(g_vapi_ctx_instance, msg, - call_hicn_api_enable_disable, - NULL) != VAPI_OK) { - SRP_LOG_DBGMSG("Operation failed"); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -static int hicn_disable_cb(sr_session_ctx_t *session, const char *path, - const sr_val_t *input, const size_t input_cnt, - sr_event_t event, uint32_t request_id, - sr_val_t **output, size_t *output_cnt, - void *private_data) { - SRP_LOG_DBGMSG("hicn disable received successfully"); - vapi_msg_hicn_api_enable_disable *msg; - - msg = vapi_alloc_hicn_api_enable_disable(g_vapi_ctx_instance); - - const char *delim = "/"; - if (input->type != SR_STRING_T) { - SRP_LOG_DBGMSG("Expected prefix of type string"); - return SR_ERR_OPERATION_FAILED; - } - char *token; - - /* get the first token */ - token = strtok(input->data.string_val, delim); - - /* if null the address is ipv4 else ipv6*/ - if (strrchr(token, ':') == NULL) { - struct sockaddr_in sa; - inet_pton(AF_INET, token, &(sa.sin_addr)); - unsigned char *tmp = (unsigned char *)&sa.sin_addr.s_addr; - memcpy(&msg->payload.prefix.address.un.ip4[0], tmp, B32); - msg->payload.prefix.address.af = ADDRESS_IP4; - } else { - void *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, token, dst); - unsigned char *tmp = (unsigned char *)((struct in6_addr *)dst)->s6_addr; - memcpy(&msg->payload.prefix.address.un.ip6[0], tmp, B128); - msg->payload.prefix.address.af = ADDRESS_IP6; - } - - /* The second token is the prefix len*/ - token = strtok(NULL, delim); - - msg->payload.prefix.len = atoi(token); - msg->payload.enable_disable = 0; - - if (vapi_hicn_api_enable_disable(g_vapi_ctx_instance, msg, - call_hicn_api_enable_disable, - NULL) != VAPI_OK) { - SRP_LOG_DBGMSG("Operation failed"); - return SR_ERR_OPERATION_FAILED; - } - - return SR_ERR_OK; -} - -static vapi_error_e hicn_api_routes_dump_cb( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_routes_details *reply) { - static int counter = 0; - - tlock(lroute); - if (reply != NULL) { - rcurrent->route.route_id = counter; - rcurrent->route.prefix = reply->prefix; - rcurrent->route.nfaces = reply->nfaces; - rcurrent->route.strategy_id = reply->strategy_id; - for (int cnt = 0; cnt < rcurrent->route.nfaces; cnt++) - rcurrent->route.faceids[cnt] = rcurrent->route.faceids[cnt]; - - counter++; - rcurrent = rcurrent->next; - - SRP_LOG_DBG("nfaces %d", reply->nfaces); - SRP_LOG_DBG("strategy_id %d", reply->strategy_id); - - } else { - SRP_LOG_DBGMSG("---------Routes------- \n"); - hicn_routes->nroute = counter; - counter = 0; - rcurrent = hicn_routes->next; - } - tunlock(lroute); - return SR_ERR_OK; -} - -static vapi_error_e hicn_api_face_stats_dump_cb( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_face_stats_details *reply) { - static int counter = 0; - - tlock(lfaces); - if (reply != NULL) { - fcurrent->face.faceid = reply->faceid; - fcurrent->face.intfc = 1; - fcurrent->face.irx_packets = reply->irx_packets; - fcurrent->face.irx_bytes = reply->irx_bytes; - fcurrent->face.itx_packets = reply->itx_packets; - fcurrent->face.itx_bytes = reply->itx_bytes; - fcurrent->face.drx_packets = reply->drx_packets; - fcurrent->face.drx_bytes = reply->drx_bytes; - fcurrent->face.dtx_packets = reply->dtx_packets; - fcurrent->face.dtx_bytes = reply->dtx_bytes; - counter++; - fcurrent = fcurrent->next; - SRP_LOG_DBG("faceid %d", reply->faceid); - SRP_LOG_DBG("drxB %d", reply->drx_bytes); - SRP_LOG_DBG("dtxB %d", reply->dtx_bytes); - - } else { - SRP_LOG_DBGMSG("---------Faces------- \n"); - hicn_faces->nface = counter; - counter = 0; - fcurrent = hicn_faces->next; - } - tunlock(lfaces); - return SR_ERR_OK; -} - -static void *state_thread(void *arg) { - // mapping can be retrieved by cpuinfo - int map = 0; - cpu_set_t cpuset; - CPU_ZERO(&cpuset); - CPU_SET(map, &cpuset); - - // pin the thread to a core - if (pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset)) { - SRP_LOG_DBGMSG("Thread pining failed\n"); - exit(1); - } - - vapi_msg_hicn_api_node_stats_get *msg = NULL; - enum locks_name state; - state = lstate; - - while (true) { - tlock(state); - // dump faces - vapi_msg_hicn_api_face_stats_dump *fmsg; - fmsg = vapi_alloc_hicn_api_face_stats_dump(g_vapi_ctx_instance); - vapi_hicn_api_face_stats_dump(g_vapi_ctx_instance, fmsg, - hicn_api_face_stats_dump_cb, fcurrent); - - // dump routes - vapi_msg_hicn_api_routes_dump *rmsg; - rmsg = vapi_alloc_hicn_api_routes_dump(g_vapi_ctx_instance); - vapi_hicn_api_routes_dump(g_vapi_ctx_instance, rmsg, - hicn_api_routes_dump_cb, rcurrent); - - msg = vapi_alloc_hicn_api_node_stats_get(g_vapi_ctx_instance); - - if (vapi_hicn_api_node_stats_get(g_vapi_ctx_instance, msg, - call_vapi_hicn_api_node_stats_get, - NULL) != VAPI_OK) { - SRP_LOG_DBGMSG(" State operation failed"); - } - - tunlock(state); - sleep(1); - - SRP_LOG_DBGMSG("state cached"); - } - return NULL; -} - -int hicn_subscribe_events(sr_session_ctx_t *session, - sr_subscription_ctx_t **subscription) { - int rc = SR_ERR_OK; - SRP_LOG_DBGMSG("Subscriging hicn."); - - // Initializing the locks - for (int i = 0; i < NLOCKS; i++) ticket_init(i, LOCK_INIT); - - // Initializing the buffer - rc = init_buffer(); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in initializing the buffers\n"); - goto error; - } - - SRP_LOG_DBGMSG("buffer initialized successfully."); - - rc = init_face_pool(fcurrent); - if (rc) { - SRP_LOG_DBGMSG("Problem in initializing the pools\n"); - goto error; - } - - rc = init_route_pool(rcurrent); - if (rc) { - SRP_LOG_DBGMSG("Problem in initializing the pools\n"); - goto error; - } - - SRP_LOG_DBGMSG("pools created successfully."); - - // Create state thread observation - pthread_t state_tid; - rc = pthread_create((pthread_t *)&state_tid, NULL, state_thread, NULL); - if (rc != 0) { - SRP_LOG_DBGMSG("Error making hicn state thread"); - return SR_ERR_OPERATION_FAILED; - } - SRP_LOG_DBGMSG("State thread created successfully."); - - // strategies subscriptions - - rc = sr_rpc_subscribe(session, "/hicn:strategies-get", hicn_strategies_get_cb, - session, 98, SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription strategies-get\n"); - goto error; - } - - // face ip subscriptions - - rc = sr_rpc_subscribe(session, "/hicn:face-params-get", - hicn_face_params_get_cb, session, 93, - SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription face-params-get\n"); - goto error; - } - - // hICN enable-disable subscriptions - - rc = sr_rpc_subscribe(session, "/hicn:hicn-enable", hicn_enable_cb, session, - 94, SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription hicn-enable\n"); - goto error; - } - - rc = sr_rpc_subscribe(session, "/hicn:hicn-disable", hicn_disable_cb, session, - 95, SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription hicn-enable\n"); - goto error; - } - - // subscribe as hicn state data provider - - rc = sr_oper_get_items_subscribe(session, "hicn", "/hicn:hicn-state/states", - hicn_state_states_cb, NULL, - SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription /hicn:hicn-state/states\n"); - goto error; - } - - rc = sr_oper_get_items_subscribe(session, "hicn", "/hicn:hicn-state/routes", - hicn_state_route_cb, NULL, - SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription /hicn:hicn-state/routes\n"); - goto error; - } - - rc = sr_oper_get_items_subscribe(session, "hicn", "/hicn:hicn-state/faces", - hicn_state_faces_cb, NULL, - SR_SUBSCR_CTX_REUSE, subscription); - if (rc != SR_ERR_OK) { - SRP_LOG_DBGMSG("Problem in subscription /hicn:hicn-state/faces\n"); - goto error; - } - - SRP_LOG_DBGMSG("hicn plugin initialized successfully.\n"); - return SR_ERR_OK; - -error: - SRP_LOG_ERRMSG("Error by initialization of the hicn plugin."); - sr_plugin_cleanup_cb(session, &g_vapi_ctx_instance); - return rc; -} diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h deleted file mode 100644 index 866eafd5e..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * 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. - */ - -/** - * @file hicn_model.h - * @brief This file contains main calls for hICN events coresponding to the hICN - * yang models - */ - -#ifndef __IETF_HICN_H__ -#define __IETF_HICN_H__ - -#include "../hicn_vpp_comm.h" -#include <vapi/hicn.api.vapi.h> - -/** - * @brief Align memory to one page boundary - */ -#define MEM_ALIGN 4096 - -/** - * @brief 32 bits = 4 bytes - */ -#define B32 4 -/** - * @brief 64bits = 8 bytes - */ -#define B64 8 -/** - * @brief 128 bits = 16 bytes - */ -#define B128 16 - -/** - * @brief set number of lock to 5 - */ -#define NLOCKS 5 - -/** - * @brief initialize all locks by 0, better to initialize by 0 :) - */ -#define LOCK_INIT 0 - -/** - * @brief enumeration for the locks - */ -enum locks_name { lstate, lstrategy, lstrategies, lroute, lfaces }; - -// It is a coarse grain approach later can be changed to fine grained - -/** - * @brief This indicates the number of leaves for the hICN state - */ -#define NSTATE_LEAVES 15 -/** - * @brief This indicates the number of leaves for strategy - */ -#define NSTRATEGY_LEAVES 1 -/** - * @brief This indicates the number of leaves for strategies - */ -#define NSTRATEGIES_LEAVES 2 -/** - * @brief This indicates the maximum faces which can be read as operational data - */ -#define MAX_FACE_POOL 100 -/** - * @brief This indicates the maximum routes which can be read as operational - * data - */ -#define MAX_ROUTE_POOL 100 -/** - * @brief This indicates the number of leaves for faces - */ -#define FACES_CHILDREN \ - 9 /*this is the number of children of each leave in face except the key*/ -/** - * @brief This indicates the number of leaves for routes - */ -#define ROUTES_CHILDREN \ - 2 /*this is the number of children of each leave in face except the key*/ - -typedef struct __attribute__((__packed__)) { - int32_t retval; - uint64_t pkts_processed; - uint64_t pkts_interest_count; - uint64_t pkts_data_count; - uint64_t pkts_from_cache_count; - uint64_t pkts_no_pit_count; - uint64_t pit_expired_count; - uint64_t cs_expired_count; - uint64_t cs_lru_count; - uint64_t pkts_drop_no_buf; - uint64_t interests_aggregated; - uint64_t interests_retx; - uint64_t interests_hash_collision; - uint64_t pit_entries_count; - uint64_t cs_entries_count; - uint64_t cs_entries_ntw_count; -} hicn_state_t; - -typedef struct __attribute__((__packed__)) { - uint8_t n_strategies; - uint32_t strategy_id[256]; - int32_t retval; -} hicn_strategies_t; - -typedef struct __attribute__((__packed__)) { - uint32_t faceid; - uint32_t intfc; - uint64_t irx_packets; - uint64_t irx_bytes; - uint64_t itx_packets; - uint64_t itx_bytes; - uint64_t drx_packets; - uint64_t drx_bytes; - uint64_t dtx_packets; - uint64_t dtx_bytes; -} hicn_face_inf_t; - -typedef struct __attribute__((__packed__)) { - u32 route_id; - vapi_type_prefix prefix; - u32 faceids[5]; - u8 nfaces; - u32 strategy_id; -} hicn_route_inf_t; - -/** - * @brief This is the link list to maintain the statistics of the faces - */ -struct hicn_faces_s { - hicn_face_inf_t face; - struct hicn_faces_s *next; -}; - -typedef struct __attribute__((__packed__)) { - uint32_t nface; - struct hicn_faces_s *next; -} hicn_faces_t; - -/** - * @brief This is the link list to maintain the route informations - */ -struct hicn_routes_s { - hicn_route_inf_t route; - struct hicn_routes_s *next; -}; - -typedef struct __attribute__((__packed__)) { - uint32_t nroute; - struct hicn_routes_s *next; -} hicn_routes_t; - -/** - * @brief This function subscribes the hICN evens consisting of all RPCs - * as well as operational data - */ -int hicn_subscribe_events(sr_session_ctx_t *session, - sr_subscription_ctx_t **subscription); - -#endif /* __IETF_HICN_H__ */ diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.c b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.c deleted file mode 100644 index c3c225ef7..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "tlock.h" - -void ticket_init(int Lock_Number, long int init) { - //__atomic_store( &En[Lock_Number] , &init , __ATOMIC_SEQ_CST ); - //__atomic_store( &De[Lock_Number] , &init , __ATOMIC_SEQ_CST ); - En[Lock_Number] = init; - De[Lock_Number] = init; -} - -void tlock(int Lock_Number) { - int my_ticket = __sync_fetch_and_add(&En[Lock_Number], 1); - while (my_ticket != De[Lock_Number]) { - }; -} - -void tunlock(int Lock_Number) { De[Lock_Number]++; } diff --git a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.h b/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.h deleted file mode 100644 index be3342d3f..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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. - */ - -/** - * @file tlock.h - * @brief This file contains ticket lock APIs. - */ - -#ifndef __TLOCK_H__ -#define __TLOCK_H__ - -/** - - * @brief limit the number of locks: it shoud be matched with the - * number of hicn-state leaves - */ -#define MAX_LOCK_SIZE 5 - -/** - * @brief Ticket lock counters - */ -volatile long int En[MAX_LOCK_SIZE]; - -/** - * @brief Ticket lock counters - */ -volatile long int De[MAX_LOCK_SIZE]; - -/** - * @brief This function initialize the ticket lock - * @param Lock_Number describes the number of locks need to be initialized - * @param init describes the init number - */ -void ticket_init(int Lock_Number, long int init); -/** - * @brief this function acquire the lock - * Description of what the function does. This part may refer to the parameters - * @param Lock_Number pass the lock - */ -void tlock(int Lock_Number); -/** - * @briefthis function release the lock - * @param Lock_Number lock number - - */ -void tunlock(int Lock_Number); - -#endif /* __IETF_HICN_H__ */
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/README.md b/ctrl/sysrepo-plugins/hicn-plugin/test/README.md deleted file mode 100644 index a1c9bedff..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# test hICN sysrepo plugin - -Two simple tests are provided to verify the functionality of the plugin. In ```netconf-test``` you can find ```test.py``` which uses netconf-clinet library to send NETCONF command toward the sysrepo. This is the usage: -``` -python test.py host user password operation -``` -<b>host</b> indicates the host information. <b>user</b>, <b>password</b> are credentials to connect to the device. <b>Operation</b> can be one of the following: -``` -- route_dump - It receives the route operational data from vpp -- face_dump - It receives the face operational data from vpp -- face_add - It adds an hICN face in the vpp -- punt_add - It adds a punt in the vpp -- route_add - It adds route in the vpp -- face_dell - It deletes face from vpp -- route_del - It deletes route from vpp -- punt_del - It deletes punt from vpp -``` - -In the ```vapi-test``` you can find testing the VAPI for the communication between the hICN sysrepo plugin and vpp. This is the usage: - -``` -./test [route_add [4|6], punt_add [4|6], face_add [4|6], route_dump, face_dump] -``` -The definition for the argument is the same as the netconf-test except that here you can choose the test for IPV4 and IPV6. diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aface.xml b/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aface.xml deleted file mode 100644 index e1452f722..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aface.xml +++ /dev/null @@ -1,7 +0,0 @@ -<face-ip-add xmlns="urn:sysrepo:hicn"> - <lip4>192.168.20.10</lip4> - <lip6>-1</lip6> - <rip4>192.168.100.1</rip4> - <rip6>-1</rip6> - <swif>0</swif> -</face-ip-add> diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/apunt.xml b/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/apunt.xml deleted file mode 100644 index b7fa8b741..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/apunt.xml +++ /dev/null @@ -1,6 +0,0 @@ -<punting-add xmlns="urn:sysrepo:hicn"> - <ip4>192.168.0.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <swif>0</swif> -</punting-add> diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aroute.xml b/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aroute.xml deleted file mode 100644 index 9997452b9..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aroute.xml +++ /dev/null @@ -1,13 +0,0 @@ -<route-nhops-add xmlns="urn:sysrepo:hicn"> - <ip4>192.168.1.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <face_ids0>0</face_ids0> - <face_ids1>0</face_ids1> - <face_ids2>0</face_ids2> - <face_ids3>0</face_ids3> - <face_ids4>0</face_ids4> - <face_ids5>0</face_ids5> - <face_ids6>0</face_ids6> - <n_faces>1</n_faces> -</route-nhops-add> diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dface.xml b/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dface.xml deleted file mode 100644 index 07a9488a9..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dface.xml +++ /dev/null @@ -1,3 +0,0 @@ -<face-ip-del xmlns="urn:sysrepo:hicn"> - <faceid>0</faceid> -</face-ip-del> diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dpunt.xml b/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dpunt.xml deleted file mode 100644 index 72d5c3c88..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dpunt.xml +++ /dev/null @@ -1,6 +0,0 @@ -<punting-del xmlns="urn:sysrepo:hicn"> - <ip4>192.168.0.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <swif>0</swif> -</punting-del> diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/droute.xml b/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/droute.xml deleted file mode 100644 index ded28eecf..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/droute.xml +++ /dev/null @@ -1,6 +0,0 @@ -<route-nhops-del xmlns="urn:sysrepo:hicn"> - <ip4>192.168.1.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <faceid>0</faceid> -</route-nhops-del> diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/test.py b/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/test.py deleted file mode 100755 index 7c6163521..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/test.py +++ /dev/null @@ -1,66 +0,0 @@ -import sys -import xml.etree.ElementTree as ET -from netconf.client import connect_ssh - -def usage(): - print('usage: test.py host user password operation{route_dump, face_dump, face_add, route_add, punt_add, face_del, punt_del, route_del}') - -def test(host,user,password,operation): - with connect_ssh(host, 830, user, password) as session: - if (operation=='face_dump'): - config = session.get() - for root in config: - if root.tag=="{urn:sysrepo:hicn}hicn-state": - for entity in root: - if entity.tag=="{urn:sysrepo:hicn}faces": - print('Faces') - for face in entity: - for elem in face: - print(elem.tag +" : "+ elem.text) - elif (operation=='state_dump'): - config = session.get() - for root in config: - if root.tag=="{urn:sysrepo:hicn}hicn-state": - for entity in root: - if entity.tag=="{urn:sysrepo:hicn}states": - print('States') - for state in entity: - print(state.tag +" : "+ state.text) - elif (operation=='route_dump'): - config = session.get() - for root in config: - if root.tag=="{urn:sysrepo:hicn}hicn-state": - for entity in root: - if entity.tag=="{urn:sysrepo:hicn}routes": - print('Routes') - for route in entity: - for elem in route: - print(elem.tag +" : "+ elem.text) - elif(operation=='face_add'): - root = ET.parse('aface.xml').getroot() - session.send_rpc(ET.tostring(root, encoding='utf8').decode('utf8')) - elif(operation=='punt_add'): - root = ET.parse('apunt.xml').getroot() - session.send_rpc(ET.tostring(root, encoding='utf8').decode('utf8')) - elif(operation=='route_add'): - root = ET.parse('aroute.xml').getroot() - session.send_rpc(ET.tostring(root, encoding='utf8').decode('utf8')) - elif(operation=='face_del'): - root = ET.parse('dface.xml').getroot() - session.send_rpc(ET.tostring(root, encoding='utf8').decode('utf8')) - elif(operation=='punt_del'): - root = ET.parse('dpunt.xml').getroot() - session.send_rpc(ET.tostring(root, encoding='utf8').decode('utf8')) - elif(operation=='route_del'): - root = ET.parse('droute.xml').getroot() - session.send_rpc(ET.tostring(root, encoding='utf8').decode('utf8')) - else: - usage() - -if __name__ == '__main__': - if(len(sys.argv)<4): - usage() - else: - test(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4]) - - diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/Makefile b/ctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/Makefile deleted file mode 100755 index 8ab5d27de..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -main: - sudo gcc -g -o test test.c -lvapiclient diff --git a/ctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/test.c b/ctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/test.c deleted file mode 100644 index d3e47c970..000000000 --- a/ctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/test.c +++ /dev/null @@ -1,258 +0,0 @@ -#include <vapi/vapi.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <signal.h> -#include <inttypes.h> - -#include <vapi/hicn.api.vapi.h> - -DEFINE_VAPI_MSG_IDS_HICN_API_JSON; - -vapi_ctx_t g_vapi_ctx_instance; - -#define APP_NAME "test_hicn_plugin" -#define MAX_OUTSTANDING_REQUESTS 4 -#define RESPONSE_QUEUE_SIZE 2 - -vapi_ctx_t g_vapi_ctx_instance = NULL; - -void usage() { - printf( - "choose the test [route_add [4|6], punt_add [4|6], face_add [4|6], " - "route_dump, face_dump]\n"); -} - -static vapi_error_e call_hicn_api_punting_add( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_punting_add_reply *reply) { - if (!reply->retval) { - printf("Successfully done"); - return VAPI_OK; - } else - return VAPI_EUSER; -} - -static vapi_error_e call_hicn_api_face_ip_add( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_face_ip_add_reply *reply) { - if (!reply->retval) { - printf("Successfully done"); - return VAPI_OK; - } else - return VAPI_EUSER; -} - -static vapi_error_e call_hicn_api_route_nhops_add( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_route_nhops_add_reply *reply) { - if (!reply->retval) { - printf("Successfully done"); - return VAPI_OK; - } else - return VAPI_EUSER; -} - -static vapi_error_e hicn_api_routes_dump_cb( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_routes_details *reply) { - char buf[20]; - if (reply != NULL) { - memset(buf, 0x00, 20); - if (reply->prefix.address.af == ADDRESS_IP4) { - struct sockaddr_in sa; - memcpy(&sa.sin_addr.s_addr, reply->prefix.address.un.ip4, 4); - inet_ntop(AF_INET, &(sa.sin_addr.s_addr), buf, INET_ADDRSTRLEN); - printf("Prefix:%s\n", buf); - } else { - struct sockaddr_in6 sa; - memcpy(&sa.sin6_addr, reply->prefix.address.un.ip6, 6); - inet_ntop(AF_INET6, &(sa.sin6_addr), buf, INET6_ADDRSTRLEN); - printf("Prefix:%s\n", buf); - } - } else { - printf("---------Routes------- \n"); - } - return 0; -} - -static vapi_error_e hicn_api_face_stats_dump_cb( - struct vapi_ctx_s *ctx, void *callback_ctx, vapi_error_e rv, bool is_last, - vapi_payload_hicn_api_face_stats_details *reply) { - if (reply != NULL) { - printf("face_id:%d \n", reply->faceid); - printf("irx_packets:%" PRId64 "\n", reply->irx_packets); - printf("irx_bytes:%" PRId64 "\n", reply->irx_bytes); - printf("itx_packets:%" PRId64 "\n", reply->itx_packets); - printf("itx_bytes:%" PRId64 "\n", reply->itx_bytes); - printf("drx_packets:%" PRId64 "\n", reply->drx_packets); - printf("drx_bytes:%" PRId64 "\n", reply->drx_bytes); - printf("dtx_packets:%" PRId64 "\n", reply->dtx_packets); - printf("dtx_bytes:%" PRId64 "\n", reply->dtx_bytes); - - } else { - printf("---------Facees------- \n"); - } - return 0; -} - -int hicn_connect_vpp() { - 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) { - vapi_ctx_free(g_vapi_ctx_instance); - return -1; - } - } else { - } - return 0; -} - -int hicn_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 main(int argc, char **argv) { - if (argc < 2) { - usage(); - return 1; - } - - /* connect to vpp */ - int rc = hicn_connect_vpp(); - if (-1 == rc) { - perror("vpp connect error"); - return -1; - } - - if (!strcmp(argv[1], "route_add")) { - vapi_msg_hicn_api_route_nhops_add *msg; - msg = vapi_alloc_hicn_api_route_nhops_add(g_vapi_ctx_instance); - - if (!strcmp(argv[2], "4")) { - struct sockaddr_in sa; - inet_pton(AF_INET, "192.168.10.10", &(sa.sin_addr)); - unsigned char *tmp = (unsigned char *)&sa.sin_addr.s_addr; - memcpy(&msg->payload.prefix.address.un.ip4[0], tmp, 4); - msg->payload.prefix.address.af = ADDRESS_IP4; - } else { - void *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, "2001::1", dst); - unsigned char *tmp = (unsigned char *)((struct in6_addr *)dst)->s6_addr; - memcpy(&msg->payload.prefix.address.un.ip6[0], tmp, 16); - msg->payload.prefix.address.af = ADDRESS_IP6; - } - - msg->payload.prefix.len = 24; - msg->payload.face_ids[0] = 0; - msg->payload.face_ids[1] = 0; - msg->payload.face_ids[2] = 0; - msg->payload.face_ids[3] = 0; - msg->payload.face_ids[4] = 0; - msg->payload.face_ids[5] = 0; - msg->payload.face_ids[6] = 0; - msg->payload.n_faces = 1; - - if (vapi_hicn_api_route_nhops_add(g_vapi_ctx_instance, msg, - call_hicn_api_route_nhops_add, - NULL) != VAPI_OK) { - perror("Operation failed"); - return -1; - } - } else if (!strcmp(argv[1], "face_add")) { - vapi_msg_hicn_api_face_ip_add *fmsg; - fmsg = vapi_alloc_hicn_api_face_ip_add(g_vapi_ctx_instance); - - if (!strcmp(argv[2], "4")) { - struct sockaddr_in sa; - inet_pton(AF_INET, "192.168.50.19", &(sa.sin_addr)); - unsigned char *tmp = (unsigned char *)&sa.sin_addr.s_addr; - memcpy(&fmsg->payload.face.local_addr.un.ip4[0], tmp, 4); - fmsg->payload.face.local_addr.af = ADDRESS_IP4; - - inet_pton(AF_INET, "192.168.60.10", &(sa.sin_addr)); - tmp = (unsigned char *)&sa.sin_addr.s_addr; - memcpy(&fmsg->payload.face.remote_addr.un.ip4[0], tmp, 4); - fmsg->payload.face.remote_addr.af = ADDRESS_IP4; - - } else { - void *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, "2001::1", dst); - unsigned char *tmp = (unsigned char *)((struct in6_addr *)dst)->s6_addr; - memcpy(&fmsg->payload.face.local_addr.un.ip6[0], tmp, 16); - fmsg->payload.face.local_addr.af = ADDRESS_IP6; - - inet_pton(AF_INET6, "3001::1", dst); - tmp = (unsigned char *)((struct in6_addr *)dst)->s6_addr; - memcpy(&fmsg->payload.face.remote_addr.un.ip6[0], tmp, 16); - fmsg->payload.face.remote_addr.af = ADDRESS_IP6; - } - - fmsg->payload.face.swif = 0; // This is the idx number of interface - - if (vapi_hicn_api_face_ip_add(g_vapi_ctx_instance, fmsg, - call_hicn_api_face_ip_add, NULL) != VAPI_OK) { - perror("Operation failed"); - return -1; - } - } else if (!strcmp(argv[1], "route_dump")) { - // routes dump - vapi_msg_hicn_api_routes_dump *rmsg; - rmsg = vapi_alloc_hicn_api_routes_dump(g_vapi_ctx_instance); - vapi_hicn_api_routes_dump(g_vapi_ctx_instance, rmsg, - hicn_api_routes_dump_cb, NULL); - - } else if (!strcmp(argv[1], "face_dump")) { - // faces dump - vapi_msg_hicn_api_face_stats_dump *fmsg; - fmsg = vapi_alloc_hicn_api_face_stats_dump(g_vapi_ctx_instance); - vapi_hicn_api_face_stats_dump(g_vapi_ctx_instance, fmsg, - hicn_api_face_stats_dump_cb, NULL); - } else if (!strcmp(argv[1], "punt_add")) { - vapi_msg_hicn_api_punting_add *pmsg; - - pmsg = vapi_alloc_hicn_api_punting_add(g_vapi_ctx_instance); - - pmsg->payload.type = IP_PUNT; - - if (!strcmp(argv[2], "4")) { - struct sockaddr_in sa; - // store this IP address in sa: - inet_pton(AF_INET, "192.168.10.20", &(sa.sin_addr)); - unsigned char *tmp = (unsigned char *)&sa.sin_addr.s_addr; - memcpy(&pmsg->payload.rule.ip.prefix.address.un.ip4[0], tmp, 4); - pmsg->payload.rule.ip.prefix.address.af = ADDRESS_IP4; - - } else { - void *dst = malloc(sizeof(struct in6_addr)); - inet_pton(AF_INET6, "3001::1", dst); - unsigned char *tmp = (unsigned char *)((struct in6_addr *)dst)->s6_addr; - memcpy(&pmsg->payload.rule.ip.prefix.address.un.ip6[0], tmp, 16); - pmsg->payload.rule.ip.prefix.address.af = ADDRESS_IP6; - } - - pmsg->payload.rule.ip.prefix.len = 24; - pmsg->payload.rule.ip.swif = 0; - - if (vapi_hicn_api_punting_add(g_vapi_ctx_instance, pmsg, - call_hicn_api_punting_add, NULL) != VAPI_OK) { - perror("Operation failed"); - return -1; - } - } else { - usage(); - return 1; - } - - hicn_disconnect_vpp(); - - return rc; -} diff --git a/ctrl/sysrepo-plugins/yang/hicn/hicn.yang b/ctrl/sysrepo-plugins/yang/hicn/hicn.yang deleted file mode 100644 index 0514a7a2a..000000000 --- a/ctrl/sysrepo-plugins/yang/hicn/hicn.yang +++ /dev/null @@ -1,247 +0,0 @@ -module hicn { - namespace "urn:sysrepo:hicn"; - prefix hcn; - - import ietf-inet-types { - prefix inet; - } - - revision 2020-04-29{ - description "revised revision focus on telemetry."; - } - - /* new data types and grouping definition to forward the remote request toward hicn controler--to-->hicn */ - - typedef float { - type decimal64 { - fraction-digits 2; - } - } - - grouping states-reply { - - leaf pkts_processed { - description "ICN packets processed."; - type uint64; - } - - leaf pkts_interest_count { - description "PIT maximum size, otherwise -1 to assign default value."; - type uint64; - } - - leaf pkts_data_count { - description "CS maximum size, otherwise -1 to assign default value."; - type uint64; - } - - leaf pkts_from_cache_count { - description "Portion of CS reserved to application, otherwise -1 to assign default value."; - type uint64; - } - - leaf pkts_no_pit_count { - description "Default PIT entry lifetime, otherwise -1 to assign default value."; - type uint64; - } - - leaf pit_expired_count { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value."; - type uint64; - } - - leaf cs_expired_count { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf cs_lru_count { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf pkts_drop_no_buf { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf interests_aggregated { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf interests_retx { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf interests_hash_collision { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf pit_entries_count { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf cs_entries_count { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf cs_entries_ntw_count { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - } - - grouping face-stats-reply { - list face{ - key faceid; - leaf faceid { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint32; - } - - leaf intfc { - description "This is the idx number of the faceid."; - type uint32; - } - - leaf irx_packets { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf irx_bytes { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf itx_packets { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf itx_bytes { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - - leaf drx_packets { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf drx_bytes { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - leaf dtx_packets { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - - - leaf dtx_bytes { - description "Upper bound on PIT entry lifetime, otherwise -1 to assign default value ."; - type uint64; - } - } - } - - grouping route-reply { - - list route{ - key routeid; - leaf routeid { - description "the unique key for each item."; - type uint32; - } - leaf prefix { - description "IP address."; - type string; - - } - leaf strategy_id { - description "compile-time plugin features."; - type uint32; - } - } - } - - grouping strategies-reply { - leaf n_strategies { - description "Enable / disable ICN forwarder in VPP."; - type uint8; - } - leaf strategy_id { - description "Enable / disable ICN forwarder in VPP."; - type uint32; - } - - } - - typedef hicn-prefix { - description "hICN prefix."; - type inet:ip-prefix; - } - - - /* Hicn operational data */ - - container hicn-state { - - config false; - description "operational data container for the hicn."; - container faces{ - uses face-stats-reply; - } - container states{ - uses states-reply; - } - container routes{ - uses route-reply; - } - } - - - /* RPC Definitions */ - - rpc strategies-get { - description "Operation to get hicn strategies."; - } - - rpc face-params-get { - description "Operation to del hicn route."; - input { - leaf faceid { - description "Face to be retrieved ."; - type uint32; - } - } - } - - rpc hicn-enable { - description "Enable hicn on a gie prefix."; - input { - leaf prefix { - type hicn-prefix; - } - } - } - - rpc hicn-disable { - description "Disable hicn on a gie prefix."; - input { - leaf prefix { - type hicn-prefix; - } - } - } - -} diff --git a/ctrl/sysrepo-plugins/yang/hicn/rpc_call_samples.xml b/ctrl/sysrepo-plugins/yang/hicn/rpc_call_samples.xml deleted file mode 100644 index db79fd4ef..000000000 --- a/ctrl/sysrepo-plugins/yang/hicn/rpc_call_samples.xml +++ /dev/null @@ -1,78 +0,0 @@ -<node-params-get xmlns="urn:sysrepo:hicn"/> - -<node-stat-get xmlns="urn:sysrepo:hicn"/> - -<strategy-get xmlns="urn:sysrepo:hicn"> - <strategy_id>0</strategy_id> -</strategy-get> - -<strategies-get xmlns="urn:sysrepo:hicn"/> - - -<route-get xmlns="urn:sysrepo:hicn"> - <ip4>192.168.1.1</ip4> - <ip6>-1</ip6> - <len>24</len> -</route-get> - -<route-del xmlns="urn:sysrepo:hicn"> - <ip4>192.168.1.1</ip4> - <ip6>-1</ip6> - <len>30</len> -</route-del> - -<route-nhops-add xmlns="urn:sysrepo:hicn"> - <ip4>192.168.1.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <face_ids0>0</face_ids0> - <face_ids1>0</face_ids1> - <face_ids2>0</face_ids2> - <face_ids3>0</face_ids3> - <face_ids4>0</face_ids4> - <face_ids5>0</face_ids5> - <face_ids6>0</face_ids6> - <n_faces>1</n_faces> -</route-nhops-add> - -<route-nhops-del xmlns="urn:sysrepo:hicn"> - <ip4>192.168.1.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <faceid>0</faceid> -</route-nhops-del> - - -<face-ip-params-get xmlns="urn:sysrepo:hicn"> - <faceid>10</faceid> -</face-ip-params-get> - -<face-ip-add xmlns="urn:sysrepo:hicn"> - <lip4>192.168.1.10</lip4> - <lip6>-1</lip6> - <rip4>192.168.1.1</rip4> - <rip6>-1</rip6> - <swif>0</swif> -</face-ip-add> - - -<face-ip-del xmlns="urn:sysrepo:hicn"> - <faceid>0</faceid> -</face-ip-del> - -<punting-add xmlns="urn:sysrepo:hicn"> - <ip4>192.168.0.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <swif>0</swif> -</punting-add> - - -<punting-del xmlns="urn:sysrepo:hicn"> - <ip4>192.168.0.1</ip4> - <ip6>-1</ip6> - <len>24</len> - <swif>0</swif> -</punting-del> - -<face-stats-details xmlns="urn:sysrepo:hicn"/> diff --git a/ctrl/sysrepo-plugins/yang/hicn/sysrepo_startup.xml b/ctrl/sysrepo-plugins/yang/hicn/sysrepo_startup.xml deleted file mode 100644 index f88e13ea2..000000000 --- a/ctrl/sysrepo-plugins/yang/hicn/sysrepo_startup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<hicn-conf xmlns="urn:sysrepo:hicn"> -<params> - <enable_disable>false</enable_disable> - <pit_max_size>-1</pit_max_size> - <cs_max_size>-1</cs_max_size> - <cs_reserved_app>-1</cs_reserved_app> - <pit_dflt_lifetime_sec>-1</pit_dflt_lifetime_sec> - <pit_max_lifetime_sec>-1</pit_max_lifetime_sec> - <pit_min_lifetime_sec>-1</pit_min_lifetime_sec> -</params> -</hicn-conf>
\ No newline at end of file diff --git a/ctrl/sysrepo-plugins/yang/ietf/iana-if-type@2014-05-08.yang b/ctrl/sysrepo-plugins/yang/ietf/iana-if-type@2014-05-08.yang deleted file mode 100644 index 4138ba46e..000000000 --- a/ctrl/sysrepo-plugins/yang/ietf/iana-if-type@2014-05-08.yang +++ /dev/null @@ -1,1704 +0,0 @@ -module iana-if-type { - - yang-version 1; - - namespace - "urn:ietf:params:xml:ns:yang:iana-if-type"; - - prefix ianaift; - - import ietf-interfaces { - prefix if; - } - - organization "IANA"; - - contact - " Internet Assigned Numbers Authority - - Postal: ICANN - 4676 Admiralty Way, Suite 330 - Marina del Rey, CA 90292 - - Tel: +1 310 823 9358 - <mailto:iana@iana.org>"; - - description - "This YANG module defines YANG identities for IANA-registered - interface types. - - This YANG module is maintained by IANA and reflects the - 'ifType definitions' registry. - - The latest revision of this YANG module can be obtained from - the IANA web site. - - Requests for new values should be made to IANA via - email (iana@iana.org). - - Copyright (c) 2014 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (http://trustee.ietf.org/license-info). - - The initial version of this YANG module is part of RFC 7224; - see the RFC itself for full legal notices."; - - reference - "IANA 'ifType definitions' registry. - <http://www.iana.org/assignments/smi-numbers>"; - - - revision "2014-05-08" { - description "Initial revision."; - reference - "RFC 7224: IANA Interface Type YANG Module"; - - } - - - identity iana-interface-type { - base if:interface-type; - description - "This identity is used as a base for all interface types - defined in the 'ifType definitions' registry."; - } - - identity other { - base iana-interface-type; - } - - identity regular1822 { - base iana-interface-type; - } - - identity hdh1822 { - base iana-interface-type; - } - - identity ddnX25 { - base iana-interface-type; - } - - identity rfc877x25 { - base iana-interface-type; - reference - "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer"; - - } - - identity ethernetCsmacd { - base iana-interface-type; - description - "For all Ethernet-like interfaces, regardless of speed, - as per RFC 3635."; - reference - "RFC 3635 - Definitions of Managed Objects for the - Ethernet-like Interface Types"; - - } - - identity iso88023Csmacd { - base iana-interface-type; - status deprecated; - description - "Deprecated via RFC 3635. - Use ethernetCsmacd(6) instead."; - reference - "RFC 3635 - Definitions of Managed Objects for the - Ethernet-like Interface Types"; - - } - - identity iso88024TokenBus { - base iana-interface-type; - } - - identity iso88025TokenRing { - base iana-interface-type; - } - - identity iso88026Man { - base iana-interface-type; - } - - identity starLan { - base iana-interface-type; - status deprecated; - description - "Deprecated via RFC 3635. - Use ethernetCsmacd(6) instead."; - reference - "RFC 3635 - Definitions of Managed Objects for the - Ethernet-like Interface Types"; - - } - - identity proteon10Mbit { - base iana-interface-type; - } - - identity proteon80Mbit { - base iana-interface-type; - } - - identity hyperchannel { - base iana-interface-type; - } - - identity fddi { - base iana-interface-type; - reference - "RFC 1512 - FDDI Management Information Base"; - - } - - identity lapb { - base iana-interface-type; - reference - "RFC 1381 - SNMP MIB Extension for X.25 LAPB"; - - } - - identity sdlc { - base iana-interface-type; - } - - identity ds1 { - base iana-interface-type; - description "DS1-MIB."; - reference - "RFC 4805 - Definitions of Managed Objects for the - DS1, J1, E1, DS2, and E2 Interface Types"; - - } - - identity e1 { - base iana-interface-type; - status obsolete; - description "Obsolete; see DS1-MIB."; - reference - "RFC 4805 - Definitions of Managed Objects for the - DS1, J1, E1, DS2, and E2 Interface Types"; - - } - - identity basicISDN { - base iana-interface-type; - description - "No longer used. See also RFC 2127."; - } - - identity primaryISDN { - base iana-interface-type; - description - "No longer used. See also RFC 2127."; - } - - identity propPointToPointSerial { - base iana-interface-type; - description "Proprietary serial."; - } - - identity ppp { - base iana-interface-type; - } - - identity softwareLoopback { - base iana-interface-type; - } - - identity eon { - base iana-interface-type; - description "CLNP over IP."; - } - - identity ethernet3Mbit { - base iana-interface-type; - } - - identity nsip { - base iana-interface-type; - description "XNS over IP."; - } - - identity slip { - base iana-interface-type; - description "Generic SLIP."; - } - - identity ultra { - base iana-interface-type; - description "Ultra Technologies."; - } - - identity ds3 { - base iana-interface-type; - description "DS3-MIB."; - reference - "RFC 3896 - Definitions of Managed Objects for the - DS3/E3 Interface Type"; - - } - - identity sip { - base iana-interface-type; - description "SMDS, coffee."; - reference - "RFC 1694 - Definitions of Managed Objects for SMDS - Interfaces using SMIv2"; - - } - - identity frameRelay { - base iana-interface-type; - description "DTE only."; - reference - "RFC 2115 - Management Information Base for Frame Relay - DTEs Using SMIv2"; - - } - - identity rs232 { - base iana-interface-type; - reference - "RFC 1659 - Definitions of Managed Objects for RS-232-like - Hardware Devices using SMIv2"; - - } - - identity para { - base iana-interface-type; - description "Parallel-port."; - reference - "RFC 1660 - Definitions of Managed Objects for - Parallel-printer-like Hardware Devices using - SMIv2"; - - } - - identity arcnet { - base iana-interface-type; - description "ARCnet."; - } - - identity arcnetPlus { - base iana-interface-type; - description "ARCnet Plus."; - } - - identity atm { - base iana-interface-type; - description "ATM cells."; - } - - identity miox25 { - base iana-interface-type; - reference - "RFC 1461 - SNMP MIB extension for Multiprotocol - Interconnect over X.25"; - - } - - identity sonet { - base iana-interface-type; - description "SONET or SDH."; - } - - identity x25ple { - base iana-interface-type; - reference - "RFC 2127 - ISDN Management Information Base using SMIv2"; - - } - - identity iso88022llc { - base iana-interface-type; - } - - identity localTalk { - base iana-interface-type; - } - - identity smdsDxi { - base iana-interface-type; - } - - identity frameRelayService { - base iana-interface-type; - description "FRNETSERV-MIB."; - reference - "RFC 2954 - Definitions of Managed Objects for Frame - Relay Service"; - - } - - identity v35 { - base iana-interface-type; - } - - identity hssi { - base iana-interface-type; - } - - identity hippi { - base iana-interface-type; - } - - identity modem { - base iana-interface-type; - description "Generic modem."; - } - - identity aal5 { - base iana-interface-type; - description "AAL5 over ATM."; - } - - identity sonetPath { - base iana-interface-type; - } - - identity sonetVT { - base iana-interface-type; - } - - identity smdsIcip { - base iana-interface-type; - description - "SMDS InterCarrier Interface."; - } - - identity propVirtual { - base iana-interface-type; - description - "Proprietary virtual/internal."; - reference - "RFC 2863 - The Interfaces Group MIB"; - - } - - identity propMultiplexor { - base iana-interface-type; - description - "Proprietary multiplexing."; - reference - "RFC 2863 - The Interfaces Group MIB"; - - } - - identity ieee80212 { - base iana-interface-type; - description "100BaseVG."; - } - - identity fibreChannel { - base iana-interface-type; - description "Fibre Channel."; - } - - identity hippiInterface { - base iana-interface-type; - description "HIPPI interfaces."; - } - - identity frameRelayInterconnect { - base iana-interface-type; - status obsolete; - description - "Obsolete; use either - frameRelay(32) or frameRelayService(44)."; - } - - identity aflane8023 { - base iana-interface-type; - description - "ATM Emulated LAN for 802.3."; - } - - identity aflane8025 { - base iana-interface-type; - description - "ATM Emulated LAN for 802.5."; - } - - identity cctEmul { - base iana-interface-type; - description "ATM Emulated circuit."; - } - - identity fastEther { - base iana-interface-type; - status deprecated; - description - "Obsoleted via RFC 3635. - ethernetCsmacd(6) should be used instead."; - reference - "RFC 3635 - Definitions of Managed Objects for the - Ethernet-like Interface Types"; - - } - - identity isdn { - base iana-interface-type; - description "ISDN and X.25."; - reference - "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN - in the Packet Mode"; - - } - - identity v11 { - base iana-interface-type; - description "CCITT V.11/X.21."; - } - - identity v36 { - base iana-interface-type; - description "CCITT V.36."; - } - - identity g703at64k { - base iana-interface-type; - description "CCITT G703 at 64Kbps."; - } - - identity g703at2mb { - base iana-interface-type; - status obsolete; - description "Obsolete; see DS1-MIB."; - } - - identity qllc { - base iana-interface-type; - description "SNA QLLC."; - } - - identity fastEtherFX { - base iana-interface-type; - status deprecated; - description - "Obsoleted via RFC 3635. - ethernetCsmacd(6) should be used instead."; - reference - "RFC 3635 - Definitions of Managed Objects for the - Ethernet-like Interface Types"; - - } - - identity channel { - base iana-interface-type; - description "Channel."; - } - - identity ieee80211 { - base iana-interface-type; - description "Radio spread spectrum."; - } - - identity ibm370parChan { - base iana-interface-type; - description - "IBM System 360/370 OEMI Channel."; - } - - identity escon { - base iana-interface-type; - description - "IBM Enterprise Systems Connection."; - } - - identity dlsw { - base iana-interface-type; - description "Data Link Switching."; - } - - identity isdns { - base iana-interface-type; - description "ISDN S/T interface."; - } - - identity isdnu { - base iana-interface-type; - description "ISDN U interface."; - } - - identity lapd { - base iana-interface-type; - description "Link Access Protocol D."; - } - - identity ipSwitch { - base iana-interface-type; - description "IP Switching Objects."; - } - - identity rsrb { - base iana-interface-type; - description - "Remote Source Route Bridging."; - } - - identity atmLogical { - base iana-interface-type; - description "ATM Logical Port."; - reference - "RFC 3606 - Definitions of Supplemental Managed Objects - for ATM Interface"; - - } - - identity ds0 { - base iana-interface-type; - description "Digital Signal Level 0."; - reference - "RFC 2494 - Definitions of Managed Objects for the DS0 - and DS0 Bundle Interface Type"; - - } - - identity ds0Bundle { - base iana-interface-type; - description - "Group of ds0s on the same ds1."; - reference - "RFC 2494 - Definitions of Managed Objects for the DS0 - and DS0 Bundle Interface Type"; - - } - - identity bsc { - base iana-interface-type; - description "Bisynchronous Protocol."; - } - - identity async { - base iana-interface-type; - description "Asynchronous Protocol."; - } - - identity cnr { - base iana-interface-type; - description "Combat Net Radio."; - } - - identity iso88025Dtr { - base iana-interface-type; - description "ISO 802.5r DTR."; - } - - identity eplrs { - base iana-interface-type; - description "Ext Pos Loc Report Sys."; - } - - identity arap { - base iana-interface-type; - description - "Appletalk Remote Access Protocol."; - } - - identity propCnls { - base iana-interface-type; - description - "Proprietary Connectionless Protocol."; - } - - identity hostPad { - base iana-interface-type; - description - "CCITT-ITU X.29 PAD Protocol."; - } - - identity termPad { - base iana-interface-type; - description - "CCITT-ITU X.3 PAD Facility."; - } - - identity frameRelayMPI { - base iana-interface-type; - description - "Multiproto Interconnect over FR."; - } - - identity x213 { - base iana-interface-type; - description "CCITT-ITU X213."; - } - - identity adsl { - base iana-interface-type; - description - "Asymmetric Digital Subscriber Loop."; - } - - identity radsl { - base iana-interface-type; - description - "Rate-Adapt. Digital Subscriber Loop."; - } - - identity sdsl { - base iana-interface-type; - description - "Symmetric Digital Subscriber Loop."; - } - - identity vdsl { - base iana-interface-type; - description - "Very H-Speed Digital Subscrib. Loop."; - } - - identity iso88025CRFPInt { - base iana-interface-type; - description "ISO 802.5 CRFP."; - } - - identity myrinet { - base iana-interface-type; - description "Myricom Myrinet."; - } - - identity voiceEM { - base iana-interface-type; - description - "Voice recEive and transMit."; - } - - identity voiceFXO { - base iana-interface-type; - description - "Voice Foreign Exchange Office."; - } - - identity voiceFXS { - base iana-interface-type; - description - "Voice Foreign Exchange Station."; - } - - identity voiceEncap { - base iana-interface-type; - description "Voice encapsulation."; - } - - identity voiceOverIp { - base iana-interface-type; - description - "Voice over IP encapsulation."; - } - - identity atmDxi { - base iana-interface-type; - description "ATM DXI."; - } - - identity atmFuni { - base iana-interface-type; - description "ATM FUNI."; - } - - identity atmIma { - base iana-interface-type; - description "ATM IMA."; - } - - identity pppMultilinkBundle { - base iana-interface-type; - description "PPP Multilink Bundle."; - } - - identity ipOverCdlc { - base iana-interface-type; - description "IBM ipOverCdlc."; - } - - identity ipOverClaw { - base iana-interface-type; - description - "IBM Common Link Access to Workstn."; - } - - identity stackToStack { - base iana-interface-type; - description "IBM stackToStack."; - } - - identity virtualIpAddress { - base iana-interface-type; - description "IBM VIPA."; - } - - identity mpc { - base iana-interface-type; - description - "IBM multi-protocol channel support."; - } - - identity ipOverAtm { - base iana-interface-type; - description "IBM ipOverAtm."; - reference - "RFC 2320 - Definitions of Managed Objects for Classical IP - and ARP Over ATM Using SMIv2 (IPOA-MIB)"; - - } - - identity iso88025Fiber { - base iana-interface-type; - description - "ISO 802.5j Fiber Token Ring."; - } - - identity tdlc { - base iana-interface-type; - description - "IBM twinaxial data link control."; - } - - identity gigabitEthernet { - base iana-interface-type; - status deprecated; - description - "Obsoleted via RFC 3635. - ethernetCsmacd(6) should be used instead."; - reference - "RFC 3635 - Definitions of Managed Objects for the - Ethernet-like Interface Types"; - - } - - identity hdlc { - base iana-interface-type; - description "HDLC."; - } - - identity lapf { - base iana-interface-type; - description "LAP F."; - } - - identity v37 { - base iana-interface-type; - description "V.37."; - } - - identity x25mlp { - base iana-interface-type; - description "Multi-Link Protocol."; - } - - identity x25huntGroup { - base iana-interface-type; - description "X25 Hunt Group."; - } - - identity transpHdlc { - base iana-interface-type; - description "Transp HDLC."; - } - - identity interleave { - base iana-interface-type; - description "Interleave channel."; - } - - identity fast { - base iana-interface-type; - description "Fast channel."; - } - - identity ip { - base iana-interface-type; - description - "IP (for APPN HPR in IP networks)."; - } - - identity docsCableMaclayer { - base iana-interface-type; - description "CATV Mac Layer."; - } - - identity docsCableDownstream { - base iana-interface-type; - description - "CATV Downstream interface."; - } - - identity docsCableUpstream { - base iana-interface-type; - description "CATV Upstream interface."; - } - - identity a12MppSwitch { - base iana-interface-type; - description - "Avalon Parallel Processor."; - } - - identity tunnel { - base iana-interface-type; - description "Encapsulation interface."; - } - - identity coffee { - base iana-interface-type; - description "Coffee pot."; - reference - "RFC 2325 - Coffee MIB"; - - } - - identity ces { - base iana-interface-type; - description - "Circuit Emulation Service."; - } - - identity atmSubInterface { - base iana-interface-type; - description "ATM Sub Interface."; - } - - identity l2vlan { - base iana-interface-type; - description - "Layer 2 Virtual LAN using 802.1Q."; - } - - identity l3ipvlan { - base iana-interface-type; - description - "Layer 3 Virtual LAN using IP."; - } - - identity l3ipxvlan { - base iana-interface-type; - description - "Layer 3 Virtual LAN using IPX."; - } - - identity digitalPowerline { - base iana-interface-type; - description "IP over Power Lines."; - } - - identity mediaMailOverIp { - base iana-interface-type; - description "Multimedia Mail over IP."; - } - - identity dtm { - base iana-interface-type; - description - "Dynamic synchronous Transfer Mode."; - } - - identity dcn { - base iana-interface-type; - description - "Data Communications Network."; - } - - identity ipForward { - base iana-interface-type; - description "IP Forwarding Interface."; - } - - identity msdsl { - base iana-interface-type; - description - "Multi-rate Symmetric DSL."; - } - - identity ieee1394 { - base iana-interface-type; - description - "IEEE1394 High Performance Serial Bus."; - } - - identity if-gsn { - base iana-interface-type; - description "HIPPI-6400."; - } - - identity dvbRccMacLayer { - base iana-interface-type; - description "DVB-RCC MAC Layer."; - } - - identity dvbRccDownstream { - base iana-interface-type; - description - "DVB-RCC Downstream Channel."; - } - - identity dvbRccUpstream { - base iana-interface-type; - description - "DVB-RCC Upstream Channel."; - } - - identity atmVirtual { - base iana-interface-type; - description "ATM Virtual Interface."; - } - - identity mplsTunnel { - base iana-interface-type; - description - "MPLS Tunnel Virtual Interface."; - } - - identity srp { - base iana-interface-type; - description "Spatial Reuse Protocol."; - } - - identity voiceOverAtm { - base iana-interface-type; - description "Voice over ATM."; - } - - identity voiceOverFrameRelay { - base iana-interface-type; - description "Voice Over Frame Relay."; - } - - identity idsl { - base iana-interface-type; - description - "Digital Subscriber Loop over ISDN."; - } - - identity compositeLink { - base iana-interface-type; - description - "Avici Composite Link Interface."; - } - - identity ss7SigLink { - base iana-interface-type; - description "SS7 Signaling Link."; - } - - identity propWirelessP2P { - base iana-interface-type; - description - "Prop. P2P wireless interface."; - } - - identity frForward { - base iana-interface-type; - description "Frame Forward Interface."; - } - - identity rfc1483 { - base iana-interface-type; - description - "Multiprotocol over ATM AAL5."; - reference - "RFC 1483 - Multiprotocol Encapsulation over ATM - Adaptation Layer 5"; - - } - - identity usb { - base iana-interface-type; - description "USB Interface."; - } - - identity ieee8023adLag { - base iana-interface-type; - description - "IEEE 802.3ad Link Aggregate."; - } - - identity bgppolicyaccounting { - base iana-interface-type; - description "BGP Policy Accounting."; - } - - identity frf16MfrBundle { - base iana-interface-type; - description - "FRF.16 Multilink Frame Relay."; - } - - identity h323Gatekeeper { - base iana-interface-type; - description "H323 Gatekeeper."; - } - - identity h323Proxy { - base iana-interface-type; - description - "H323 Voice and Video Proxy."; - } - - identity mpls { - base iana-interface-type; - description "MPLS."; - } - - identity mfSigLink { - base iana-interface-type; - description - "Multi-frequency signaling link."; - } - - identity hdsl2 { - base iana-interface-type; - description - "High Bit-Rate DSL - 2nd generation."; - } - - identity shdsl { - base iana-interface-type; - description "Multirate HDSL2."; - } - - identity ds1FDL { - base iana-interface-type; - description - "Facility Data Link (4Kbps) on a DS1."; - } - - identity pos { - base iana-interface-type; - description - "Packet over SONET/SDH Interface."; - } - - identity dvbAsiIn { - base iana-interface-type; - description "DVB-ASI Input."; - } - - identity dvbAsiOut { - base iana-interface-type; - description "DVB-ASI Output."; - } - - identity plc { - base iana-interface-type; - description - "Power Line Communications."; - } - - identity nfas { - base iana-interface-type; - description - "Non-Facility Associated Signaling."; - } - - identity tr008 { - base iana-interface-type; - description "TR008."; - } - - identity gr303RDT { - base iana-interface-type; - description "Remote Digital Terminal."; - } - - identity gr303IDT { - base iana-interface-type; - description - "Integrated Digital Terminal."; - } - - identity isup { - base iana-interface-type; - description "ISUP."; - } - - identity propDocsWirelessMaclayer { - base iana-interface-type; - description - "Cisco proprietary Maclayer."; - } - - identity propDocsWirelessDownstream { - base iana-interface-type; - description - "Cisco proprietary Downstream."; - } - - identity propDocsWirelessUpstream { - base iana-interface-type; - description - "Cisco proprietary Upstream."; - } - - identity hiperlan2 { - base iana-interface-type; - description - "HIPERLAN Type 2 Radio Interface."; - } - - identity propBWAp2Mp { - base iana-interface-type; - description - "PropBroadbandWirelessAccesspt2Multipt (use of this value - for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f - is deprecated, and ieee80216WMAN(237) should be used - instead)."; - } - - identity sonetOverheadChannel { - base iana-interface-type; - description "SONET Overhead Channel."; - } - - identity digitalWrapperOverheadChannel { - base iana-interface-type; - description "Digital Wrapper."; - } - - identity aal2 { - base iana-interface-type; - description "ATM adaptation layer 2."; - } - - identity radioMAC { - base iana-interface-type; - description - "MAC layer over radio links."; - } - - identity atmRadio { - base iana-interface-type; - description "ATM over radio links."; - } - - identity imt { - base iana-interface-type; - description "Inter-Machine Trunks."; - } - - identity mvl { - base iana-interface-type; - description - "Multiple Virtual Lines DSL."; - } - - identity reachDSL { - base iana-interface-type; - description "Long Reach DSL."; - } - - identity frDlciEndPt { - base iana-interface-type; - description - "Frame Relay DLCI End Point."; - } - - identity atmVciEndPt { - base iana-interface-type; - description "ATM VCI End Point."; - } - - identity opticalChannel { - base iana-interface-type; - description "Optical Channel."; - } - - identity opticalTransport { - base iana-interface-type; - description "Optical Transport."; - } - - identity propAtm { - base iana-interface-type; - description "Proprietary ATM."; - } - - identity voiceOverCable { - base iana-interface-type; - description - "Voice Over Cable Interface."; - } - - identity infiniband { - base iana-interface-type; - description "Infiniband."; - } - - identity teLink { - base iana-interface-type; - description "TE Link."; - } - - identity q2931 { - base iana-interface-type; - description "Q.2931."; - } - - identity virtualTg { - base iana-interface-type; - description "Virtual Trunk Group."; - } - - identity sipTg { - base iana-interface-type; - description "SIP Trunk Group."; - } - - identity sipSig { - base iana-interface-type; - description "SIP Signaling."; - } - - identity docsCableUpstreamChannel { - base iana-interface-type; - description "CATV Upstream Channel."; - } - - identity econet { - base iana-interface-type; - description "Acorn Econet."; - } - - identity pon155 { - base iana-interface-type; - description - "FSAN 155Mb Symetrical PON interface."; - } - - identity pon622 { - base iana-interface-type; - description - "FSAN 622Mb Symetrical PON interface."; - } - - identity bridge { - base iana-interface-type; - description - "Transparent bridge interface."; - } - - identity linegroup { - base iana-interface-type; - description - "Interface common to multiple lines."; - } - - identity voiceEMFGD { - base iana-interface-type; - description - "Voice E&M Feature Group D."; - } - - identity voiceFGDEANA { - base iana-interface-type; - description - "Voice FGD Exchange Access North American."; - } - - identity voiceDID { - base iana-interface-type; - description - "Voice Direct Inward Dialing."; - } - - identity mpegTransport { - base iana-interface-type; - description - "MPEG transport interface."; - } - - identity sixToFour { - base iana-interface-type; - status deprecated; - description - "6to4 interface (DEPRECATED)."; - reference - "RFC 4087 - IP Tunnel MIB"; - - } - - identity gtp { - base iana-interface-type; - description - "GTP (GPRS Tunneling Protocol)."; - } - - identity pdnEtherLoop1 { - base iana-interface-type; - description "Paradyne EtherLoop 1."; - } - - identity pdnEtherLoop2 { - base iana-interface-type; - description "Paradyne EtherLoop 2."; - } - - identity opticalChannelGroup { - base iana-interface-type; - description "Optical Channel Group."; - } - - identity homepna { - base iana-interface-type; - description "HomePNA ITU-T G.989."; - } - - identity gfp { - base iana-interface-type; - description - "Generic Framing Procedure (GFP)."; - } - - identity ciscoISLvlan { - base iana-interface-type; - description - "Layer 2 Virtual LAN using Cisco ISL."; - } - - identity actelisMetaLOOP { - base iana-interface-type; - description - "Acteleis proprietary MetaLOOP High Speed Link."; - } - - identity fcipLink { - base iana-interface-type; - description "FCIP Link."; - } - - identity rpr { - base iana-interface-type; - description - "Resilient Packet Ring Interface Type."; - } - - identity qam { - base iana-interface-type; - description "RF Qam Interface."; - } - - identity lmp { - base iana-interface-type; - description - "Link Management Protocol."; - reference - "RFC 4327 - Link Management Protocol (LMP) Management - Information Base (MIB)"; - - } - - identity cblVectaStar { - base iana-interface-type; - description - "Cambridge Broadband Networks Limited VectaStar."; - } - - identity docsCableMCmtsDownstream { - base iana-interface-type; - description - "CATV Modular CMTS Downstream Interface."; - } - - identity adsl2 { - base iana-interface-type; - status deprecated; - description - "Asymmetric Digital Subscriber Loop Version 2 - (DEPRECATED/OBSOLETED - please use adsl2plus(238) - instead)."; - reference - "RFC 4706 - Definitions of Managed Objects for Asymmetric - Digital Subscriber Line 2 (ADSL2)"; - - } - - identity macSecControlledIF { - base iana-interface-type; - description "MACSecControlled."; - } - - identity macSecUncontrolledIF { - base iana-interface-type; - description "MACSecUncontrolled."; - } - - identity aviciOpticalEther { - base iana-interface-type; - description - "Avici Optical Ethernet Aggregate."; - } - - identity atmbond { - base iana-interface-type; - description "atmbond."; - } - - identity voiceFGDOS { - base iana-interface-type; - description - "Voice FGD Operator Services."; - } - - identity mocaVersion1 { - base iana-interface-type; - description - "MultiMedia over Coax Alliance (MoCA) Interface - as documented in information provided privately to IANA."; - } - - identity ieee80216WMAN { - base iana-interface-type; - description - "IEEE 802.16 WMAN interface."; - } - - identity adsl2plus { - base iana-interface-type; - description - "Asymmetric Digital Subscriber Loop Version 2 - - Version 2 Plus and all variants."; - } - - identity dvbRcsMacLayer { - base iana-interface-type; - description "DVB-RCS MAC Layer."; - reference - "RFC 5728 - The SatLabs Group DVB-RCS MIB"; - - } - - identity dvbTdm { - base iana-interface-type; - description "DVB Satellite TDM."; - reference - "RFC 5728 - The SatLabs Group DVB-RCS MIB"; - - } - - identity dvbRcsTdma { - base iana-interface-type; - description "DVB-RCS TDMA."; - reference - "RFC 5728 - The SatLabs Group DVB-RCS MIB"; - - } - - identity x86Laps { - base iana-interface-type; - description - "LAPS based on ITU-T X.86/Y.1323."; - } - - identity wwanPP { - base iana-interface-type; - description "3GPP WWAN."; - } - - identity wwanPP2 { - base iana-interface-type; - description "3GPP2 WWAN."; - } - - identity voiceEBS { - base iana-interface-type; - description - "Voice P-phone EBS physical interface."; - } - - identity ifPwType { - base iana-interface-type; - description - "Pseudowire interface type."; - reference - "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)"; - - } - - identity ilan { - base iana-interface-type; - description - "Internal LAN on a bridge per IEEE 802.1ap."; - } - - identity pip { - base iana-interface-type; - description - "Provider Instance Port on a bridge per IEEE 802.1ah PBB."; - } - - identity aluELP { - base iana-interface-type; - description - "Alcatel-Lucent Ethernet Link Protection."; - } - - identity gpon { - base iana-interface-type; - description - "Gigabit-capable passive optical networks (G-PON) as per - ITU-T G.948."; - } - - identity vdsl2 { - base iana-interface-type; - description - "Very high speed digital subscriber line Version 2 - (as per ITU-T Recommendation G.993.2)."; - reference - "RFC 5650 - Definitions of Managed Objects for Very High - Speed Digital Subscriber Line 2 (VDSL2)"; - - } - - identity capwapDot11Profile { - base iana-interface-type; - description "WLAN Profile Interface."; - reference - "RFC 5834 - Control and Provisioning of Wireless Access - Points (CAPWAP) Protocol Binding MIB for - IEEE 802.11"; - - } - - identity capwapDot11Bss { - base iana-interface-type; - description "WLAN BSS Interface."; - reference - "RFC 5834 - Control and Provisioning of Wireless Access - Points (CAPWAP) Protocol Binding MIB for - IEEE 802.11"; - - } - - identity capwapWtpVirtualRadio { - base iana-interface-type; - description - "WTP Virtual Radio Interface."; - reference - "RFC 5833 - Control and Provisioning of Wireless Access - Points (CAPWAP) Protocol Base MIB"; - - } - - identity bits { - base iana-interface-type; - description "bitsport."; - } - - identity docsCableUpstreamRfPort { - base iana-interface-type; - description - "DOCSIS CATV Upstream RF Port."; - } - - identity cableDownstreamRfPort { - base iana-interface-type; - description "CATV downstream RF Port."; - } - - identity vmwareVirtualNic { - base iana-interface-type; - description - "VMware Virtual Network Interface."; - } - - identity ieee802154 { - base iana-interface-type; - description - "IEEE 802.15.4 WPAN interface."; - reference - "IEEE 802.15.4-2006"; - - } - - identity otnOdu { - base iana-interface-type; - description "OTN Optical Data Unit."; - } - - identity otnOtu { - base iana-interface-type; - description - "OTN Optical channel Transport Unit."; - } - - identity ifVfiType { - base iana-interface-type; - description - "VPLS Forwarding Instance Interface Type."; - } - - identity g9981 { - base iana-interface-type; - description - "G.998.1 bonded interface."; - } - - identity g9982 { - base iana-interface-type; - description - "G.998.2 bonded interface."; - } - - identity g9983 { - base iana-interface-type; - description - "G.998.3 bonded interface."; - } - - identity aluEpon { - base iana-interface-type; - description - "Ethernet Passive Optical Networks (E-PON)."; - } - - identity aluEponOnu { - base iana-interface-type; - description - "EPON Optical Network Unit."; - } - - identity aluEponPhysicalUni { - base iana-interface-type; - description - "EPON physical User to Network interface."; - } - - identity aluEponLogicalLink { - base iana-interface-type; - description - "The emulation of a point-to-point link over the EPON - layer."; - } - - identity aluGponOnu { - base iana-interface-type; - description - "GPON Optical Network Unit."; - reference - "ITU-T G.984.2"; - - } - - identity aluGponPhysicalUni { - base iana-interface-type; - description - "GPON physical User to Network interface."; - reference - "ITU-T G.984.2"; - - } - - identity vmwareNicTeam { - base iana-interface-type; - description "VMware NIC Team."; - } - } // module iana-if-type diff --git a/ctrl/sysrepo-plugins/yang/ietf/ietf-interfaces.yang b/ctrl/sysrepo-plugins/yang/ietf/ietf-interfaces.yang deleted file mode 100644 index a9251d14d..000000000 --- a/ctrl/sysrepo-plugins/yang/ietf/ietf-interfaces.yang +++ /dev/null @@ -1,1123 +0,0 @@ -module ietf-interfaces { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces"; - prefix if; - - import ietf-yang-types { - prefix yang; - } - - organization - "IETF NETMOD (Network Modeling) Working Group"; - - contact - "WG Web: <https://datatracker.ietf.org/wg/netmod/> - WG List: <mailto:netmod@ietf.org> - - Editor: Martin Bjorklund - <mailto:mbj@tail-f.com>"; - - description - "This module contains a collection of YANG definitions for - managing network interfaces. - - Copyright (c) 2021 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC 8343; see - the RFC itself for full legal notices."; - - revision 2018-02-20 { - description - "Updated to support NMDA."; - reference - "RFC 8343: A YANG Data Model for Interface Management"; - } - - revision 2014-05-08 { - description - "Initial revision."; - reference - "RFC 7223: A YANG Data Model for Interface Management"; - } - - /* - * Typedefs - */ - - typedef interface-ref { - type leafref { - path "/if:interfaces/if:interface/if:name"; - } - description - "This type is used by data models that need to reference - interfaces."; - } - - /* - * Identities - */ - - identity interface-type { - description - "Base identity from which specific interface types are - derived."; - } - - /* - * Features - */ - - feature arbitrary-names { - description - "This feature indicates that the device allows user-controlled - interfaces to be named arbitrarily."; - } - feature pre-provisioning { - description - "This feature indicates that the device supports - pre-provisioning of interface configuration, i.e., it is - possible to configure an interface whose physical interface - hardware is not present on the device."; - } - feature if-mib { - description - "This feature indicates that the device implements - the IF-MIB."; - reference - "RFC 2863: The Interfaces Group MIB"; - } - - /* - * Data nodes - */ - - container interfaces { - description - "Interface parameters."; - - list interface { - key "name"; - - description - "The list of interfaces on the device. - - The status of an interface is available in this list in the - operational state. If the configuration of a - system-controlled interface cannot be used by the system - (e.g., the interface hardware present does not match the - interface type), then the configuration is not applied to - the system-controlled interface shown in the operational - state. If the configuration of a user-controlled interface - cannot be used by the system, the configured interface is - not instantiated in the operational state. - - System-controlled interfaces created by the system are - always present in this list in the operational state, - whether or not they are configured."; - - leaf name { - type string; - description - "The name of the interface. - - A device MAY restrict the allowed values for this leaf, - possibly depending on the type of the interface. - For system-controlled interfaces, this leaf is the - device-specific name of the interface. - - If a client tries to create configuration for a - system-controlled interface that is not present in the - operational state, the server MAY reject the request if - the implementation does not support pre-provisioning of - interfaces or if the name refers to an interface that can - never exist in the system. A Network Configuration - Protocol (NETCONF) server MUST reply with an rpc-error - with the error-tag 'invalid-value' in this case. - - If the device supports pre-provisioning of interface - configuration, the 'pre-provisioning' feature is - advertised. - - If the device allows arbitrarily named user-controlled - interfaces, the 'arbitrary-names' feature is advertised. - - When a configured user-controlled interface is created by - the system, it is instantiated with the same name in the - operational state. - - A server implementation MAY map this leaf to the ifName - MIB object. Such an implementation needs to use some - mechanism to handle the differences in size and characters - allowed between this leaf and ifName. The definition of - such a mechanism is outside the scope of this document."; - reference - "RFC 2863: The Interfaces Group MIB - ifName"; - } - - leaf description { - type string; - description - "A textual description of the interface. - - A server implementation MAY map this leaf to the ifAlias - MIB object. Such an implementation needs to use some - mechanism to handle the differences in size and characters - allowed between this leaf and ifAlias. The definition of - such a mechanism is outside the scope of this document. - - Since ifAlias is defined to be stored in non-volatile - storage, the MIB implementation MUST map ifAlias to the - value of 'description' in the persistently stored - configuration."; - reference - "RFC 2863: The Interfaces Group MIB - ifAlias"; - } - - leaf type { - type identityref { - base interface-type; - } - mandatory true; - description - "The type of the interface. - - When an interface entry is created, a server MAY - initialize the type leaf with a valid value, e.g., if it - is possible to derive the type from the name of the - interface. - - If a client tries to set the type of an interface to a - value that can never be used by the system, e.g., if the - type is not supported or if the type does not match the - name of the interface, the server MUST reject the request. - A NETCONF server MUST reply with an rpc-error with the - error-tag 'invalid-value' in this case."; - reference - "RFC 2863: The Interfaces Group MIB - ifType"; - } - - leaf enabled { - type boolean; - default "true"; - description - "This leaf contains the configured, desired state of the - interface. - - Systems that implement the IF-MIB use the value of this - leaf in the intended configuration to set - IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry - has been initialized, as described in RFC 2863. - - Changes in this leaf in the intended configuration are - reflected in ifAdminStatus."; - reference - "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; - } - - leaf link-up-down-trap-enable { - if-feature if-mib; - type enumeration { - enum enabled { - value 1; - description - "The device will generate linkUp/linkDown SNMP - notifications for this interface."; - } - enum disabled { - value 2; - description - "The device will not generate linkUp/linkDown SNMP - notifications for this interface."; - } - } - description - "Controls whether linkUp/linkDown SNMP notifications - should be generated for this interface. - - If this node is not configured, the value 'enabled' is - operationally used by the server for interfaces that do - not operate on top of any other interface (i.e., there are - no 'lower-layer-if' entries), and 'disabled' otherwise."; - reference - "RFC 2863: The Interfaces Group MIB - - ifLinkUpDownTrapEnable"; - } - - leaf admin-status { - if-feature if-mib; - type enumeration { - enum up { - value 1; - description - "Ready to pass packets."; - } - enum down { - value 2; - description - "Not ready to pass packets and not in some test mode."; - } - enum testing { - value 3; - description - "In some test mode."; - } - } - config false; - mandatory true; - description - "The desired state of the interface. - - This leaf has the same read semantics as ifAdminStatus."; - reference - "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; - } - - leaf oper-status { - type enumeration { - enum up { - value 1; - description - "Ready to pass packets."; - } - enum down { - value 2; - - description - "The interface does not pass any packets."; - } - enum testing { - value 3; - description - "In some test mode. No operational packets can - be passed."; - } - enum unknown { - value 4; - description - "Status cannot be determined for some reason."; - } - enum dormant { - value 5; - description - "Waiting for some external event."; - } - enum not-present { - value 6; - description - "Some component (typically hardware) is missing."; - } - enum lower-layer-down { - value 7; - description - "Down due to state of lower-layer interface(s)."; - } - } - config false; - mandatory true; - description - "The current operational state of the interface. - - This leaf has the same semantics as ifOperStatus."; - reference - "RFC 2863: The Interfaces Group MIB - ifOperStatus"; - } - - leaf last-change { - type yang:date-and-time; - config false; - description - "The time the interface entered its current operational - state. If the current state was entered prior to the - last re-initialization of the local network management - subsystem, then this node is not present."; - reference - "RFC 2863: The Interfaces Group MIB - ifLastChange"; - } - - leaf if-index { - if-feature if-mib; - type int32 { - range "1..2147483647"; - } - config false; - mandatory true; - description - "The ifIndex value for the ifEntry represented by this - interface."; - reference - "RFC 2863: The Interfaces Group MIB - ifIndex"; - } - - leaf phys-address { - type yang:phys-address; - config false; - description - "The interface's address at its protocol sub-layer. For - example, for an 802.x interface, this object normally - contains a Media Access Control (MAC) address. The - interface's media-specific modules must define the bit - and byte ordering and the format of the value of this - object. For interfaces that do not have such an address - (e.g., a serial line), this node is not present."; - reference - "RFC 2863: The Interfaces Group MIB - ifPhysAddress"; - } - - leaf-list higher-layer-if { - type interface-ref; - config false; - description - "A list of references to interfaces layered on top of this - interface."; - reference - "RFC 2863: The Interfaces Group MIB - ifStackTable"; - } - - leaf-list lower-layer-if { - type interface-ref; - config false; - - description - "A list of references to interfaces layered underneath this - interface."; - reference - "RFC 2863: The Interfaces Group MIB - ifStackTable"; - } - - leaf speed { - type yang:gauge64; - units "bits/second"; - config false; - description - "An estimate of the interface's current bandwidth in bits - per second. For interfaces that do not vary in - bandwidth or for those where no accurate estimation can - be made, this node should contain the nominal bandwidth. - For interfaces that have no concept of bandwidth, this - node is not present."; - reference - "RFC 2863: The Interfaces Group MIB - - ifSpeed, ifHighSpeed"; - } - - container statistics { - config false; - description - "A collection of interface-related statistics objects."; - - leaf discontinuity-time { - type yang:date-and-time; - mandatory true; - description - "The time on the most recent occasion at which any one or - more of this interface's counters suffered a - discontinuity. If no such discontinuities have occurred - since the last re-initialization of the local management - subsystem, then this node contains the time the local - management subsystem re-initialized itself."; - } - - leaf in-octets { - type yang:counter64; - description - "The total number of octets received on the interface, - including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; - } - - leaf in-unicast-pkts { - type yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were not addressed to a - multicast or broadcast address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; - } - - leaf in-broadcast-pkts { - type yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a broadcast - address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInBroadcastPkts"; - } - - leaf in-multicast-pkts { - type yang:counter64; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a multicast - address at this sub-layer. For a MAC-layer protocol, - this includes both Group and Functional addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInMulticastPkts"; - } - - leaf in-discards { - type yang:counter32; - description - "The number of inbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being deliverable to a higher-layer - protocol. One possible reason for discarding such a - packet could be to free up buffer space. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInDiscards"; - } - - leaf in-errors { - type yang:counter32; - description - "For packet-oriented interfaces, the number of inbound - packets that contained errors preventing them from being - deliverable to a higher-layer protocol. For character- - oriented or fixed-length interfaces, the number of - inbound transmission units that contained errors - preventing them from being deliverable to a higher-layer - protocol. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInErrors"; - } - - leaf in-unknown-protos { - type yang:counter32; - - description - "For packet-oriented interfaces, the number of packets - received via the interface that were discarded because - of an unknown or unsupported protocol. For - character-oriented or fixed-length interfaces that - support protocol multiplexing, the number of - transmission units received via the interface that were - discarded because of an unknown or unsupported protocol. - For any interface that does not support protocol - multiplexing, this counter is not present. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; - } - - leaf out-octets { - type yang:counter64; - description - "The total number of octets transmitted out of the - interface, including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; - } - - leaf out-unicast-pkts { - type yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted and that were not addressed - to a multicast or broadcast address at this sub-layer, - including those that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; - } - - leaf out-broadcast-pkts { - type yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted and that were addressed to a - broadcast address at this sub-layer, including those - that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutBroadcastPkts"; - } - - leaf out-multicast-pkts { - type yang:counter64; - description - "The total number of packets that higher-level protocols - requested be transmitted and that were addressed to a - multicast address at this sub-layer, including those - that were discarded or not sent. For a MAC-layer - protocol, this includes both Group and Functional - addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutMulticastPkts"; - } - - leaf out-discards { - type yang:counter32; - description - "The number of outbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being transmitted. One possible reason - for discarding such a packet could be to free up buffer - space. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; - } - - leaf out-errors { - type yang:counter32; - description - "For packet-oriented interfaces, the number of outbound - packets that could not be transmitted because of errors. - For character-oriented or fixed-length interfaces, the - number of outbound transmission units that could not be - transmitted because of errors. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutErrors"; - } - } - - } - } - - /* - * Legacy typedefs - */ - - typedef interface-state-ref { - type leafref { - path "/if:interfaces-state/if:interface/if:name"; - } - status deprecated; - description - "This type is used by data models that need to reference - the operationally present interfaces."; - } - - /* - * Legacy operational state data nodes - */ - - container interfaces-state { - config false; - status deprecated; - description - "Data nodes for the operational state of interfaces."; - - list interface { - key "name"; - status deprecated; - - description - "The list of interfaces on the device. - - System-controlled interfaces created by the system are - always present in this list, whether or not they are - configured."; - - leaf name { - type string; - status deprecated; - description - "The name of the interface. - - A server implementation MAY map this leaf to the ifName - MIB object. Such an implementation needs to use some - mechanism to handle the differences in size and characters - allowed between this leaf and ifName. The definition of - such a mechanism is outside the scope of this document."; - reference - "RFC 2863: The Interfaces Group MIB - ifName"; - } - - leaf type { - type identityref { - base interface-type; - } - mandatory true; - status deprecated; - description - "The type of the interface."; - reference - "RFC 2863: The Interfaces Group MIB - ifType"; - } - - leaf admin-status { - if-feature if-mib; - type enumeration { - enum up { - value 1; - description - "Ready to pass packets."; - } - enum down { - value 2; - description - "Not ready to pass packets and not in some test mode."; - } - enum testing { - value 3; - description - "In some test mode."; - } - } - mandatory true; - status deprecated; - description - "The desired state of the interface. - - This leaf has the same read semantics as ifAdminStatus."; - reference - "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; - } - - leaf oper-status { - type enumeration { - enum up { - value 1; - description - "Ready to pass packets."; - } - enum down { - value 2; - description - "The interface does not pass any packets."; - } - enum testing { - value 3; - description - "In some test mode. No operational packets can - be passed."; - } - enum unknown { - value 4; - description - "Status cannot be determined for some reason."; - } - enum dormant { - value 5; - description - "Waiting for some external event."; - } - enum not-present { - value 6; - description - "Some component (typically hardware) is missing."; - } - enum lower-layer-down { - value 7; - description - "Down due to state of lower-layer interface(s)."; - } - } - mandatory true; - status deprecated; - description - "The current operational state of the interface. - - This leaf has the same semantics as ifOperStatus."; - reference - "RFC 2863: The Interfaces Group MIB - ifOperStatus"; - } - - leaf last-change { - type yang:date-and-time; - status deprecated; - description - "The time the interface entered its current operational - state. If the current state was entered prior to the - last re-initialization of the local network management - subsystem, then this node is not present."; - reference - "RFC 2863: The Interfaces Group MIB - ifLastChange"; - } - - leaf if-index { - if-feature if-mib; - type int32 { - range "1..2147483647"; - } - mandatory true; - status deprecated; - description - "The ifIndex value for the ifEntry represented by this - interface."; - - reference - "RFC 2863: The Interfaces Group MIB - ifIndex"; - } - - leaf phys-address { - type yang:phys-address; - status deprecated; - description - "The interface's address at its protocol sub-layer. For - example, for an 802.x interface, this object normally - contains a Media Access Control (MAC) address. The - interface's media-specific modules must define the bit - and byte ordering and the format of the value of this - object. For interfaces that do not have such an address - (e.g., a serial line), this node is not present."; - reference - "RFC 2863: The Interfaces Group MIB - ifPhysAddress"; - } - - leaf-list higher-layer-if { - type interface-state-ref; - status deprecated; - description - "A list of references to interfaces layered on top of this - interface."; - reference - "RFC 2863: The Interfaces Group MIB - ifStackTable"; - } - - leaf-list lower-layer-if { - type interface-state-ref; - status deprecated; - description - "A list of references to interfaces layered underneath this - interface."; - reference - "RFC 2863: The Interfaces Group MIB - ifStackTable"; - } - - leaf speed { - type yang:gauge64; - units "bits/second"; - status deprecated; - description - "An estimate of the interface's current bandwidth in bits - per second. For interfaces that do not vary in - bandwidth or for those where no accurate estimation can - - be made, this node should contain the nominal bandwidth. - For interfaces that have no concept of bandwidth, this - node is not present."; - reference - "RFC 2863: The Interfaces Group MIB - - ifSpeed, ifHighSpeed"; - } - - container statistics { - status deprecated; - description - "A collection of interface-related statistics objects."; - - leaf discontinuity-time { - type yang:date-and-time; - mandatory true; - status deprecated; - description - "The time on the most recent occasion at which any one or - more of this interface's counters suffered a - discontinuity. If no such discontinuities have occurred - since the last re-initialization of the local management - subsystem, then this node contains the time the local - management subsystem re-initialized itself."; - } - - leaf in-octets { - type yang:counter64; - status deprecated; - description - "The total number of octets received on the interface, - including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; - } - - leaf in-unicast-pkts { - type yang:counter64; - status deprecated; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were not addressed to a - multicast or broadcast address at this sub-layer. - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; - } - - leaf in-broadcast-pkts { - type yang:counter64; - status deprecated; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a broadcast - address at this sub-layer. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInBroadcastPkts"; - } - - leaf in-multicast-pkts { - type yang:counter64; - status deprecated; - description - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, that were addressed to a multicast - address at this sub-layer. For a MAC-layer protocol, - this includes both Group and Functional addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCInMulticastPkts"; - } - - leaf in-discards { - type yang:counter32; - status deprecated; - - description - "The number of inbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being deliverable to a higher-layer - protocol. One possible reason for discarding such a - packet could be to free up buffer space. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInDiscards"; - } - - leaf in-errors { - type yang:counter32; - status deprecated; - description - "For packet-oriented interfaces, the number of inbound - packets that contained errors preventing them from being - deliverable to a higher-layer protocol. For character- - oriented or fixed-length interfaces, the number of - inbound transmission units that contained errors - preventing them from being deliverable to a higher-layer - protocol. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInErrors"; - } - - leaf in-unknown-protos { - type yang:counter32; - status deprecated; - description - "For packet-oriented interfaces, the number of packets - received via the interface that were discarded because - of an unknown or unsupported protocol. For - character-oriented or fixed-length interfaces that - support protocol multiplexing, the number of - transmission units received via the interface that were - discarded because of an unknown or unsupported protocol. - For any interface that does not support protocol - multiplexing, this counter is not present. - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; - } - - leaf out-octets { - type yang:counter64; - status deprecated; - description - "The total number of octets transmitted out of the - interface, including framing characters. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; - } - - leaf out-unicast-pkts { - type yang:counter64; - status deprecated; - description - "The total number of packets that higher-level protocols - requested be transmitted and that were not addressed - to a multicast or broadcast address at this sub-layer, - including those that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; - } - - leaf out-broadcast-pkts { - type yang:counter64; - status deprecated; - - description - "The total number of packets that higher-level protocols - requested be transmitted and that were addressed to a - broadcast address at this sub-layer, including those - that were discarded or not sent. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutBroadcastPkts"; - } - - leaf out-multicast-pkts { - type yang:counter64; - status deprecated; - description - "The total number of packets that higher-level protocols - requested be transmitted and that were addressed to a - multicast address at this sub-layer, including those - that were discarded or not sent. For a MAC-layer - protocol, this includes both Group and Functional - addresses. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - - ifHCOutMulticastPkts"; - } - - leaf out-discards { - type yang:counter32; - status deprecated; - description - "The number of outbound packets that were chosen to be - discarded even though no errors had been detected to - prevent their being transmitted. One possible reason - for discarding such a packet could be to free up buffer - space. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; - } - - leaf out-errors { - type yang:counter32; - status deprecated; - description - "For packet-oriented interfaces, the number of outbound - packets that could not be transmitted because of errors. - For character-oriented or fixed-length interfaces, the - number of outbound transmission units that could not be - transmitted because of errors. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system and at - other times as indicated by the value of - 'discontinuity-time'."; - reference - "RFC 2863: The Interfaces Group MIB - ifOutErrors"; - } - } - } - } -} diff --git a/ctrl/sysrepo-plugins/yang/ietf/ietf-ip@2014-06-16.yang b/ctrl/sysrepo-plugins/yang/ietf/ietf-ip@2014-06-16.yang deleted file mode 100644 index 79606cc07..000000000 --- a/ctrl/sysrepo-plugins/yang/ietf/ietf-ip@2014-06-16.yang +++ /dev/null @@ -1,742 +0,0 @@ -module ietf-ip { - - yang-version 1; - - namespace - "urn:ietf:params:xml:ns:yang:ietf-ip"; - - prefix ip; - - import ietf-interfaces { - prefix if; - } - import ietf-inet-types { - prefix inet; - } - import ietf-yang-types { - prefix yang; - } - - organization - "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; - - contact - "WG Web: <http://tools.ietf.org/wg/netmod/> - WG List: <mailto:netmod@ietf.org> - - WG Chair: Thomas Nadeau - <mailto:tnadeau@lucidvision.com> - - WG Chair: Juergen Schoenwaelder - <mailto:j.schoenwaelder@jacobs-university.de> - - Editor: Martin Bjorklund - <mailto:mbj@tail-f.com>"; - - description - "This module contains a collection of YANG definitions for - configuring IP implementations. - - Copyright (c) 2014 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (http://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC 7277; see - the RFC itself for full legal notices."; - - revision "2014-06-16" { - description "Initial revision."; - reference - "RFC 7277: A YANG Data Model for IP Management"; - - } - - - feature ipv4-non-contiguous-netmasks { - description - "Indicates support for configuring non-contiguous - subnet masks."; - } - - feature ipv6-privacy-autoconf { - description - "Indicates support for Privacy Extensions for Stateless Address - Autoconfiguration in IPv6."; - reference - "RFC 4941: Privacy Extensions for Stateless Address - Autoconfiguration in IPv6"; - - } - - typedef ip-address-origin { - type enumeration { - enum "other" { - value 0; - description - "None of the following."; - } - enum "static" { - value 1; - description - "Indicates that the address has been statically - configured - for example, using NETCONF or a Command Line - Interface."; - } - enum "dhcp" { - value 2; - description - "Indicates an address that has been assigned to this - system by a DHCP server."; - } - enum "link-layer" { - value 3; - description - "Indicates an address created by IPv6 stateless - autoconfiguration that embeds a link-layer address in its - interface identifier."; - } - enum "random" { - value 4; - description - "Indicates an address chosen by the system at - - random, e.g., an IPv4 address within 169.254/16, an - RFC 4941 temporary address, or an RFC 7217 semantically - opaque address."; - reference - "RFC 4941: Privacy Extensions for Stateless Address - Autoconfiguration in IPv6 - RFC 7217: A Method for Generating Semantically Opaque - Interface Identifiers with IPv6 Stateless - Address Autoconfiguration (SLAAC)"; - - } - } - description - "The origin of an address."; - } - - typedef neighbor-origin { - type enumeration { - enum "other" { - value 0; - description - "None of the following."; - } - enum "static" { - value 1; - description - "Indicates that the mapping has been statically - configured - for example, using NETCONF or a Command Line - Interface."; - } - enum "dynamic" { - value 2; - description - "Indicates that the mapping has been dynamically resolved - using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery - protocol."; - } - } - description - "The origin of a neighbor entry."; - } - - augment /if:interfaces/if:interface { - description - "Parameters for configuring IP on interfaces. - - If an interface is not capable of running IP, the server - must not allow the client to configure these parameters."; - container ipv4 { - presence - "Enables IPv4 unless the 'enabled' leaf - (which defaults to 'true') is set to 'false'"; - description - "Parameters for the IPv4 address family."; - leaf enabled { - type boolean; - default 'true'; - description - "Controls whether IPv4 is enabled or disabled on this - interface. When IPv4 is enabled, this interface is - connected to an IPv4 stack, and the interface can send - and receive IPv4 packets."; - } - - leaf forwarding { - type boolean; - default 'false'; - description - "Controls IPv4 packet forwarding of datagrams received by, - but not addressed to, this interface. IPv4 routers - forward datagrams. IPv4 hosts do not (except those - source-routed via the host)."; - } - - leaf mtu { - type uint16 { - range "68..max"; - } - units "octets"; - description - "The size, in octets, of the largest IPv4 packet that the - interface will send and receive. - - The server may restrict the allowed values for this leaf, - depending on the interface's type. - - If this leaf is not configured, the operationally used MTU - depends on the interface's type."; - reference - "RFC 791: Internet Protocol"; - - } - - list address { - key "ip"; - description - "The list of configured IPv4 addresses on the interface."; - leaf ip { - type inet:ipv4-address-no-zone; - description - "The IPv4 address on the interface."; - } - - choice subnet { - mandatory true; - description - "The subnet can be specified as a prefix-length, or, - if the server supports non-contiguous netmasks, as - a netmask."; - leaf prefix-length { - type uint8 { - range "0..32"; - } - description - "The length of the subnet prefix."; - } - leaf netmask { - if-feature ipv4-non-contiguous-netmasks; - type yang:dotted-quad; - description - "The subnet specified as a netmask."; - } - } // choice subnet - } // list address - - list neighbor { - key "ip"; - description - "A list of mappings from IPv4 addresses to - link-layer addresses. - - Entries in this list are used as static entries in the - ARP Cache."; - reference - "RFC 826: An Ethernet Address Resolution Protocol"; - - leaf ip { - type inet:ipv4-address-no-zone; - description - "The IPv4 address of the neighbor node."; - } - - leaf link-layer-address { - type yang:phys-address; - mandatory true; - description - "The link-layer address of the neighbor node."; - } - } // list neighbor - } // container ipv4 - - container ipv6 { - presence - "Enables IPv6 unless the 'enabled' leaf - (which defaults to 'true') is set to 'false'"; - description - "Parameters for the IPv6 address family."; - leaf enabled { - type boolean; - default 'true'; - description - "Controls whether IPv6 is enabled or disabled on this - interface. When IPv6 is enabled, this interface is - connected to an IPv6 stack, and the interface can send - and receive IPv6 packets."; - } - - leaf forwarding { - type boolean; - default 'false'; - description - "Controls IPv6 packet forwarding of datagrams received by, - but not addressed to, this interface. IPv6 routers - forward datagrams. IPv6 hosts do not (except those - source-routed via the host)."; - reference - "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) - Section 6.2.1, IsRouter"; - - } - - leaf mtu { - type uint32 { - range "1280..max"; - } - units "octets"; - description - "The size, in octets, of the largest IPv6 packet that the - interface will send and receive. - - The server may restrict the allowed values for this leaf, - depending on the interface's type. - - If this leaf is not configured, the operationally used MTU - depends on the interface's type."; - reference - "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification - Section 5"; - - } - - list address { - key "ip"; - description - "The list of configured IPv6 addresses on the interface."; - leaf ip { - type inet:ipv6-address-no-zone; - description - "The IPv6 address on the interface."; - } - - leaf prefix-length { - type uint8 { - range "0..128"; - } - mandatory true; - description - "The length of the subnet prefix."; - } - } // list address - - list neighbor { - key "ip"; - description - "A list of mappings from IPv6 addresses to - link-layer addresses. - - Entries in this list are used as static entries in the - Neighbor Cache."; - reference - "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)"; - - leaf ip { - type inet:ipv6-address-no-zone; - description - "The IPv6 address of the neighbor node."; - } - - leaf link-layer-address { - type yang:phys-address; - mandatory true; - description - "The link-layer address of the neighbor node."; - } - } // list neighbor - - leaf dup-addr-detect-transmits { - type uint32; - default '1'; - description - "The number of consecutive Neighbor Solicitation messages - sent while performing Duplicate Address Detection on a - tentative address. A value of zero indicates that - Duplicate Address Detection is not performed on - tentative addresses. A value of one indicates a single - transmission with no follow-up retransmissions."; - reference - "RFC 4862: IPv6 Stateless Address Autoconfiguration"; - - } - - container autoconf { - description - "Parameters to control the autoconfiguration of IPv6 - addresses, as described in RFC 4862."; - reference - "RFC 4862: IPv6 Stateless Address Autoconfiguration"; - - leaf create-global-addresses { - type boolean; - default 'true'; - description - "If enabled, the host creates global addresses as - described in RFC 4862."; - reference - "RFC 4862: IPv6 Stateless Address Autoconfiguration - Section 5.5"; - - } - - leaf create-temporary-addresses { - if-feature ipv6-privacy-autoconf; - type boolean; - default 'false'; - description - "If enabled, the host creates temporary addresses as - described in RFC 4941."; - reference - "RFC 4941: Privacy Extensions for Stateless Address - Autoconfiguration in IPv6"; - - } - - leaf temporary-valid-lifetime { - if-feature ipv6-privacy-autoconf; - type uint32; - units "seconds"; - default '604800'; - description - "The time period during which the temporary address - is valid."; - reference - "RFC 4941: Privacy Extensions for Stateless Address - Autoconfiguration in IPv6 - - TEMP_VALID_LIFETIME"; - - } - - leaf temporary-preferred-lifetime { - if-feature ipv6-privacy-autoconf; - type uint32; - units "seconds"; - default '86400'; - description - "The time period during which the temporary address is - preferred."; - reference - "RFC 4941: Privacy Extensions for Stateless Address - Autoconfiguration in IPv6 - - TEMP_PREFERRED_LIFETIME"; - - } - } // container autoconf - } // container ipv6 - } - - augment /if:interfaces-state/if:interface { - description - "Data nodes for the operational state of IP on interfaces."; - container ipv4 { - presence - "Present if IPv4 is enabled on this interface"; - config false; - description - "Interface-specific parameters for the IPv4 address family."; - leaf forwarding { - type boolean; - description - "Indicates whether IPv4 packet forwarding is enabled or - disabled on this interface."; - } - - leaf mtu { - type uint16 { - range "68..max"; - } - units "octets"; - description - "The size, in octets, of the largest IPv4 packet that the - interface will send and receive."; - reference - "RFC 791: Internet Protocol"; - - } - - list address { - key "ip"; - description - "The list of IPv4 addresses on the interface."; - leaf ip { - type inet:ipv4-address-no-zone; - description - "The IPv4 address on the interface."; - } - - choice subnet { - description - "The subnet can be specified as a prefix-length, or, - if the server supports non-contiguous netmasks, as - a netmask."; - leaf prefix-length { - type uint8 { - range "0..32"; - } - description - "The length of the subnet prefix."; - } - leaf netmask { - if-feature ipv4-non-contiguous-netmasks; - type yang:dotted-quad; - description - "The subnet specified as a netmask."; - } - } // choice subnet - - leaf origin { - type ip-address-origin; - description - "The origin of this address."; - } - } // list address - - list neighbor { - key "ip"; - description - "A list of mappings from IPv4 addresses to - link-layer addresses. - - This list represents the ARP Cache."; - reference - "RFC 826: An Ethernet Address Resolution Protocol"; - - leaf ip { - type inet:ipv4-address-no-zone; - description - "The IPv4 address of the neighbor node."; - } - - leaf link-layer-address { - type yang:phys-address; - description - "The link-layer address of the neighbor node."; - } - - leaf origin { - type neighbor-origin; - description - "The origin of this neighbor entry."; - } - } // list neighbor - } // container ipv4 - - container ipv6 { - presence - "Present if IPv6 is enabled on this interface"; - config false; - description - "Parameters for the IPv6 address family."; - leaf forwarding { - type boolean; - default 'false'; - description - "Indicates whether IPv6 packet forwarding is enabled or - disabled on this interface."; - reference - "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) - Section 6.2.1, IsRouter"; - - } - - leaf mtu { - type uint32 { - range "1280..max"; - } - units "octets"; - description - "The size, in octets, of the largest IPv6 packet that the - interface will send and receive."; - reference - "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification - Section 5"; - - } - - list address { - key "ip"; - description - "The list of IPv6 addresses on the interface."; - leaf ip { - type inet:ipv6-address-no-zone; - description - "The IPv6 address on the interface."; - } - - leaf prefix-length { - type uint8 { - range "0..128"; - } - mandatory true; - description - "The length of the subnet prefix."; - } - - leaf origin { - type ip-address-origin; - description - "The origin of this address."; - } - - leaf status { - type enumeration { - enum "preferred" { - value 0; - description - "This is a valid address that can appear as the - destination or source address of a packet."; - } - enum "deprecated" { - value 1; - description - "This is a valid but deprecated address that should - no longer be used as a source address in new - communications, but packets addressed to such an - address are processed as expected."; - } - enum "invalid" { - value 2; - description - "This isn't a valid address, and it shouldn't appear - as the destination or source address of a packet."; - } - enum "inaccessible" { - value 3; - description - "The address is not accessible because the interface - to which this address is assigned is not - operational."; - } - enum "unknown" { - value 4; - description - "The status cannot be determined for some reason."; - } - enum "tentative" { - value 5; - description - "The uniqueness of the address on the link is being - verified. Addresses in this state should not be - used for general communication and should only be - used to determine the uniqueness of the address."; - } - enum "duplicate" { - value 6; - description - "The address has been determined to be non-unique on - the link and so must not be used."; - } - enum "optimistic" { - value 7; - description - "The address is available for use, subject to - restrictions, while its uniqueness on a link is - being verified."; - } - } - description - "The status of an address. Most of the states correspond - to states from the IPv6 Stateless Address - Autoconfiguration protocol."; - reference - "RFC 4293: Management Information Base for the - Internet Protocol (IP) - - IpAddressStatusTC - RFC 4862: IPv6 Stateless Address Autoconfiguration"; - - } - } // list address - - list neighbor { - key "ip"; - description - "A list of mappings from IPv6 addresses to - link-layer addresses. - - This list represents the Neighbor Cache."; - reference - "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)"; - - leaf ip { - type inet:ipv6-address-no-zone; - description - "The IPv6 address of the neighbor node."; - } - - leaf link-layer-address { - type yang:phys-address; - description - "The link-layer address of the neighbor node."; - } - - leaf origin { - type neighbor-origin; - description - "The origin of this neighbor entry."; - } - - leaf is-router { - type empty; - description - "Indicates that the neighbor node acts as a router."; - } - - leaf state { - type enumeration { - enum "incomplete" { - value 0; - description - "Address resolution is in progress, and the link-layer - address of the neighbor has not yet been - determined."; - } - enum "reachable" { - value 1; - description - "Roughly speaking, the neighbor is known to have been - reachable recently (within tens of seconds ago)."; - } - enum "stale" { - value 2; - description - "The neighbor is no longer known to be reachable, but - until traffic is sent to the neighbor no attempt - should be made to verify its reachability."; - } - enum "delay" { - value 3; - description - "The neighbor is no longer known to be reachable, and - traffic has recently been sent to the neighbor. - Rather than probe the neighbor immediately, however, - delay sending probes for a short while in order to - give upper-layer protocols a chance to provide - reachability confirmation."; - } - enum "probe" { - value 4; - description - "The neighbor is no longer known to be reachable, and - unicast Neighbor Solicitation probes are being sent - to verify reachability."; - } - } - description - "The Neighbor Unreachability Detection state of this - entry."; - reference - "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) - Section 7.3.2"; - - } - } // list neighbor - } // container ipv6 - } - } // module ietf-ip diff --git a/ctrl/sysrepo-plugins/yang/ietf/ietf-yang-types@2013-07-15.yang b/ctrl/sysrepo-plugins/yang/ietf/ietf-yang-types@2013-07-15.yang deleted file mode 100644 index ee58fa3ab..000000000 --- a/ctrl/sysrepo-plugins/yang/ietf/ietf-yang-types@2013-07-15.yang +++ /dev/null @@ -1,474 +0,0 @@ -module ietf-yang-types { - - namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; - prefix "yang"; - - organization - "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; - - contact - "WG Web: <http://tools.ietf.org/wg/netmod/> - WG List: <mailto:netmod@ietf.org> - - WG Chair: David Kessens - <mailto:david.kessens@nsn.com> - - WG Chair: Juergen Schoenwaelder - <mailto:j.schoenwaelder@jacobs-university.de> - - Editor: Juergen Schoenwaelder - <mailto:j.schoenwaelder@jacobs-university.de>"; - - description - "This module contains a collection of generally useful derived - YANG data types. - - Copyright (c) 2013 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (http://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC 6991; see - the RFC itself for full legal notices."; - - revision 2013-07-15 { - description - "This revision adds the following new data types: - - yang-identifier - - hex-string - - uuid - - dotted-quad"; - reference - "RFC 6991: Common YANG Data Types"; - } - - revision 2010-09-24 { - description - "Initial revision."; - reference - "RFC 6021: Common YANG Data Types"; - } - - /*** collection of counter and gauge types ***/ - - typedef counter32 { - type uint32; - description - "The counter32 type represents a non-negative integer - that monotonically increases until it reaches a - maximum value of 2^32-1 (4294967295 decimal), when it - wraps around and starts increasing again from zero. - - Counters have no defined 'initial' value, and thus, a - single value of a counter has (in general) no information - content. Discontinuities in the monotonically increasing - value normally occur at re-initialization of the - management system, and at other times as specified in the - description of a schema node using this type. If such - other times can occur, for example, the creation of - a schema node of type counter32 at times other than - re-initialization, then a corresponding schema node - should be defined, with an appropriate type, to indicate - the last discontinuity. - - The counter32 type should not be used for configuration - schema nodes. A default statement SHOULD NOT be used in - combination with the type counter32. - - In the value set and its semantics, this type is equivalent - to the Counter32 type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef zero-based-counter32 { - type yang:counter32; - default "0"; - description - "The zero-based-counter32 type represents a counter32 - that has the defined 'initial' value zero. - - A schema node of this type will be set to zero (0) on creation - and will thereafter increase monotonically until it reaches - a maximum value of 2^32-1 (4294967295 decimal), when it - wraps around and starts increasing again from zero. - - Provided that an application discovers a new schema node - of this type within the minimum time to wrap, it can use the - 'initial' value as a delta. It is important for a management - station to be aware of this minimum time and the actual time - between polls, and to discard data if the actual time is too - long or there is no defined minimum time. - - In the value set and its semantics, this type is equivalent - to the ZeroBasedCounter32 textual convention of the SMIv2."; - reference - "RFC 4502: Remote Network Monitoring Management Information - Base Version 2"; - } - - typedef counter64 { - type uint64; - description - "The counter64 type represents a non-negative integer - that monotonically increases until it reaches a - maximum value of 2^64-1 (18446744073709551615 decimal), - when it wraps around and starts increasing again from zero. - - Counters have no defined 'initial' value, and thus, a - single value of a counter has (in general) no information - content. Discontinuities in the monotonically increasing - value normally occur at re-initialization of the - management system, and at other times as specified in the - description of a schema node using this type. If such - other times can occur, for example, the creation of - a schema node of type counter64 at times other than - re-initialization, then a corresponding schema node - should be defined, with an appropriate type, to indicate - the last discontinuity. - - The counter64 type should not be used for configuration - schema nodes. A default statement SHOULD NOT be used in - combination with the type counter64. - - In the value set and its semantics, this type is equivalent - to the Counter64 type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef zero-based-counter64 { - type yang:counter64; - default "0"; - description - "The zero-based-counter64 type represents a counter64 that - has the defined 'initial' value zero. - - A schema node of this type will be set to zero (0) on creation - and will thereafter increase monotonically until it reaches - a maximum value of 2^64-1 (18446744073709551615 decimal), - when it wraps around and starts increasing again from zero. - - Provided that an application discovers a new schema node - of this type within the minimum time to wrap, it can use the - 'initial' value as a delta. It is important for a management - station to be aware of this minimum time and the actual time - between polls, and to discard data if the actual time is too - long or there is no defined minimum time. - - In the value set and its semantics, this type is equivalent - to the ZeroBasedCounter64 textual convention of the SMIv2."; - reference - "RFC 2856: Textual Conventions for Additional High Capacity - Data Types"; - } - - typedef gauge32 { - type uint32; - description - "The gauge32 type represents a non-negative integer, which - may increase or decrease, but shall never exceed a maximum - value, nor fall below a minimum value. The maximum value - cannot be greater than 2^32-1 (4294967295 decimal), and - the minimum value cannot be smaller than 0. The value of - a gauge32 has its maximum value whenever the information - being modeled is greater than or equal to its maximum - value, and has its minimum value whenever the information - being modeled is smaller than or equal to its minimum value. - If the information being modeled subsequently decreases - below (increases above) the maximum (minimum) value, the - gauge32 also decreases (increases). - - In the value set and its semantics, this type is equivalent - to the Gauge32 type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef gauge64 { - type uint64; - description - "The gauge64 type represents a non-negative integer, which - may increase or decrease, but shall never exceed a maximum - value, nor fall below a minimum value. The maximum value - cannot be greater than 2^64-1 (18446744073709551615), and - the minimum value cannot be smaller than 0. The value of - a gauge64 has its maximum value whenever the information - being modeled is greater than or equal to its maximum - value, and has its minimum value whenever the information - being modeled is smaller than or equal to its minimum value. - If the information being modeled subsequently decreases - below (increases above) the maximum (minimum) value, the - gauge64 also decreases (increases). - - In the value set and its semantics, this type is equivalent - to the CounterBasedGauge64 SMIv2 textual convention defined - in RFC 2856"; - reference - "RFC 2856: Textual Conventions for Additional High Capacity - Data Types"; - } - - /*** collection of identifier-related types ***/ - - typedef object-identifier { - type string { - pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' - + '(\.(0|([1-9]\d*)))*'; - } - description - "The object-identifier type represents administratively - assigned names in a registration-hierarchical-name tree. - - Values of this type are denoted as a sequence of numerical - non-negative sub-identifier values. Each sub-identifier - value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers - are separated by single dots and without any intermediate - whitespace. - - The ASN.1 standard restricts the value space of the first - sub-identifier to 0, 1, or 2. Furthermore, the value space - of the second sub-identifier is restricted to the range - 0 to 39 if the first sub-identifier is 0 or 1. Finally, - the ASN.1 standard requires that an object identifier - has always at least two sub-identifiers. The pattern - captures these restrictions. - - Although the number of sub-identifiers is not limited, - module designers should realize that there may be - implementations that stick with the SMIv2 limit of 128 - sub-identifiers. - - This type is a superset of the SMIv2 OBJECT IDENTIFIER type - since it is not restricted to 128 sub-identifiers. Hence, - this type SHOULD NOT be used to represent the SMIv2 OBJECT - IDENTIFIER type; the object-identifier-128 type SHOULD be - used instead."; - reference - "ISO9834-1: Information technology -- Open Systems - Interconnection -- Procedures for the operation of OSI - Registration Authorities: General procedures and top - arcs of the ASN.1 Object Identifier tree"; - } - - typedef object-identifier-128 { - type object-identifier { - pattern '\d*(\.\d*){1,127}'; - } - description - "This type represents object-identifiers restricted to 128 - sub-identifiers. - - In the value set and its semantics, this type is equivalent - to the OBJECT IDENTIFIER type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef yang-identifier { - type string { - length "1..max"; - pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; - pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; - } - description - "A YANG identifier string as defined by the 'identifier' - rule in Section 12 of RFC 6020. An identifier must - start with an alphabetic character or an underscore - followed by an arbitrary sequence of alphabetic or - numeric characters, underscores, hyphens, or dots. - - A YANG identifier MUST NOT start with any possible - combination of the lowercase or uppercase character - sequence 'xml'."; - reference - "RFC 6020: YANG - A Data Modeling Language for the Network - Configuration Protocol (NETCONF)"; - } - - /*** collection of types related to date and time***/ - - typedef date-and-time { - type string { - pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' - + '(Z|[\+\-]\d{2}:\d{2})'; - } - description - "The date-and-time type is a profile of the ISO 8601 - standard for representation of dates and times using the - Gregorian calendar. The profile is defined by the - date-time production in Section 5.6 of RFC 3339. - - The date-and-time type is compatible with the dateTime XML - schema type with the following notable exceptions: - - (a) The date-and-time type does not allow negative years. - - (b) The date-and-time time-offset -00:00 indicates an unknown - time zone (see RFC 3339) while -00:00 and +00:00 and Z - all represent the same time zone in dateTime. - - (c) The canonical format (see below) of data-and-time values - differs from the canonical format used by the dateTime XML - schema type, which requires all times to be in UTC using - the time-offset 'Z'. - - This type is not equivalent to the DateAndTime textual - convention of the SMIv2 since RFC 3339 uses a different - separator between full-date and full-time and provides - higher resolution of time-secfrac. - - The canonical format for date-and-time values with a known time - zone uses a numeric time zone offset that is calculated using - the device's configured known offset to UTC time. A change of - the device's offset to UTC time will cause date-and-time values - to change accordingly. Such changes might happen periodically - in case a server follows automatically daylight saving time - (DST) time zone offset changes. The canonical format for - date-and-time values with an unknown time zone (usually - referring to the notion of local time) uses the time-offset - -00:00."; - reference - "RFC 3339: Date and Time on the Internet: Timestamps - RFC 2579: Textual Conventions for SMIv2 - XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; - } - - typedef timeticks { - type uint32; - description - "The timeticks type represents a non-negative integer that - represents the time, modulo 2^32 (4294967296 decimal), in - hundredths of a second between two epochs. When a schema - node is defined that uses this type, the description of - the schema node identifies both of the reference epochs. - - In the value set and its semantics, this type is equivalent - to the TimeTicks type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef timestamp { - type yang:timeticks; - description - "The timestamp type represents the value of an associated - timeticks schema node at which a specific occurrence - happened. The specific occurrence must be defined in the - description of any schema node defined using this type. When - the specific occurrence occurred prior to the last time the - associated timeticks attribute was zero, then the timestamp - value is zero. Note that this requires all timestamp values - to be reset to zero when the value of the associated timeticks - attribute reaches 497+ days and wraps around to zero. - - The associated timeticks schema node must be specified - in the description of any schema node using this type. - - In the value set and its semantics, this type is equivalent - to the TimeStamp textual convention of the SMIv2."; - reference - "RFC 2579: Textual Conventions for SMIv2"; - } - - /*** collection of generic address types ***/ - - typedef phys-address { - type string { - pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; - } - - description - "Represents media- or physical-level addresses represented - as a sequence octets, each octet represented by two hexadecimal - numbers. Octets are separated by colons. The canonical - representation uses lowercase characters. - - In the value set and its semantics, this type is equivalent - to the PhysAddress textual convention of the SMIv2."; - reference - "RFC 2579: Textual Conventions for SMIv2"; - } - - typedef mac-address { - type string { - pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; - } - description - "The mac-address type represents an IEEE 802 MAC address. - The canonical representation uses lowercase characters. - - In the value set and its semantics, this type is equivalent - to the MacAddress textual convention of the SMIv2."; - reference - "IEEE 802: IEEE Standard for Local and Metropolitan Area - Networks: Overview and Architecture - RFC 2579: Textual Conventions for SMIv2"; - } - - /*** collection of XML-specific types ***/ - - typedef xpath1.0 { - type string; - description - "This type represents an XPATH 1.0 expression. - - When a schema node is defined that uses this type, the - description of the schema node MUST specify the XPath - context in which the XPath expression is evaluated."; - reference - "XPATH: XML Path Language (XPath) Version 1.0"; - } - - /*** collection of string types ***/ - - typedef hex-string { - type string { - pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; - } - description - "A hexadecimal string with octets represented as hex digits - separated by colons. The canonical representation uses - lowercase characters."; - } - - typedef uuid { - type string { - pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' - + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; - } - description - "A Universally Unique IDentifier in the string representation - defined in RFC 4122. The canonical representation uses - lowercase characters. - - The following is an example of a UUID in string representation: - f81d4fae-7dec-11d0-a765-00a0c91e6bf6 - "; - reference - "RFC 4122: A Universally Unique IDentifier (UUID) URN - Namespace"; - } - - typedef dotted-quad { - type string { - pattern - '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' - + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; - } - description - "An unsigned 32-bit number expressed in the dotted-quad - notation, i.e., four octets written as decimal numbers - and separated with the '.' (full stop) character."; - } -} diff --git a/docs/source/control.md b/docs/source/control.md index f4dc4f22b..fb6b7faf3 100644 --- a/docs/source/control.md +++ b/docs/source/control.md @@ -1,319 +1,3 @@ # Control plane support -Control plane functionalities are provides via SDN controllers or via standard -IP routing protocols. SDN support is provided by using the NETCONF/YANG protocol -for network management, control and telemetry. - -Routing is supported via synchronization of the IP FIB and the IP RIB as implemented -by one of the routing protocols in FRR. Without loss of generality we have reported -below one example of IGP routing via OSPF for IPv6. - -The VPP IP FIB can be controlled and updated by one FRR routing protocol which -is used for routing over locators and also over hICN name prefixes. - -## NETCONF/YANG - -### Getting started - -NETCONF/YANG support is provided via several external components such as -libyang, sysrepo, libnetconf and netopeer. -The hicn project provides a sysrepo plugin and a YANG model for two devices: -the VPP based hicn virtual switch and the portable forwarder. -The YANG model for the VPP based hICN vSwitch is based the full hICN C API -exported by the VPP plugin with the addition of some VPP APIs such as -interface and FIB management which are required by the hICN plugin. - -The dependencies libyang, sysrepo, libnetconf and netopeer2 for Ubuntu20.04 -amd64/arm64 are built from sources. See the following Dockerfile for -reference: - -<https://github.com/icn-team/vSwitch/blob/master/Dockerfile> - - -The hICN YANG models are installed under `/usr/lib/$(uname -m)-linux-gnu/modules_yang`. - -Configure the NETCONF/YANG components: - -```bash -bash /usr/bin/setup.sh sysrepoctl /usr/lib/$(uname -m)-linux-gnu/modules_yang root -bash /usr/bin/merge_hostkey.sh sysrepocfg openssl -bash /usr/bin/merge_config.sh sysrepocfg genkey -``` - -You can manually install the yang model using the following bash script: - -```bash -EXIT_CODE=0 -command -v sysrepoctl > /dev/null -if [ $? != 0 ]; then - echo "Could not find command \"sysrepoctl\"." - exit ${EXIT_CODE} -else -sysrepoctl --install --yang=path_to_hicn_yang_model -fi -``` - -### YANG model - -hicn.yang can be found in the yang-model. It consists of two container nodes: - -```text -|--+ hicn-conf: holds the configuration data; -| |--+ params: contains all configuration parameters; -|--+ hicn-state: provides the state data -| |--+ state, -| |--+ strategy, -| |--+ strategies, -| |--+ route, -| |--+ face-ip-params -and corresponding leaves. -``` - -A controller can configure these parameters through the edit-config RPC -call. This node can be used to enable and to initialize the hicn-plugin in VPP -instance. hicn-state container is used to provide the state data to the -controller. It consists of state, strategy, strategies, route, and face-ip-params -nodes with the corresponding leaves. In the hicn model a variety of RPCs are provided -to allow controller to communicate with the hicn-plugin as well as update the state -data in hicn-state. - -### Example - -To setup the startup configuration you can use the following script: - -```bash -EXIT_CODE=0 -command -v sysrepocfg > /dev/null -if [ $? != 0 ]; then - echo "Could not find command \"sysrepocfg\"." - exit ${EXIT_CODE} -else -sysrepocfg -d startup -i path_to_startup_xml -f xml hicn -fi -``` - -startup.xml is placed in the yang-model. Here you can find the content: - -```xml -<hicn-conf xmlns="urn:sysrepo:hicn"> -<params> - <enable_disable>false</enable_disable> - <pit_max_size>-1</pit_max_size> - <cs_max_size>-1</cs_max_size> - <cs_reserved_app>-1</cs_reserved_app> - <pit_dflt_lifetime_sec>-1</pit_dflt_lifetime_sec> - <pit_max_lifetime_sec>-1</pit_max_lifetime_sec> - <pit_min_lifetime_sec>-1</pit_min_lifetime_sec> -</params> -</hicn-conf> -``` - -It contains the leaves of the parameters in hicn-conf node which is -used as the startup configuration. This configuration can be changed through the -controller by subscribing which changes the target to the running state. hicn -yang model provides a list of RPCs which allows controller to communicate -directly with the hicn-plugin. This RPCs may also cause the modification in -state data. - -In order to run different RPCs from controller you can use the examples in the -controler_rpcs_instances.xml in the yang-model. Here you can find the content: - -```xml -<node-params-get xmlns="urn:sysrepo:hicn"/> - -<node-stat-get xmlns="urn:sysrepo:hicn"/> - -<strategy-get xmlns="urn:sysrepo:hicn"> - <strategy_id>0</strategy_id> -</strategy-get> - -<strategies-get xmlns="urn:sysrepo:hicn"/> - -<route-get xmlns="urn:sysrepo:hicn"> - <prefix0>10</prefix0> - <prefix1>20</prefix1> - <len>30</len> -</route-get> - -<face-params-get xmlns="urn:sysrepo:hicn"> - <faceid>10</faceid> -</face-params-get> - -<hicn-enable xmlns="urn:sysrepo:hicn"> - <prefix>b001::/64</prefix> -</hicn-enable> - -<hicn-disable xmlns="urn:sysrepo:hicn"> - <prefix>b001::/64</prefix> -</hicn-disable> -``` - -#### Run the plugin - -First, verify the plugin and binary libraries are located correctly, then run -the vpp through (service vpp start). Next, run the sysrepo plugin -(sysrepo-plugind), for debug mode: sysrep-plugind -d -v 4 which runs with high -verbosity. Now, the hicn sysrepo plugin is loaded. Then, run the -netopeer2-server which serves as NETCONF server - -#### Connect from netopeer2-cli - -In order to connect through the netopeer client run the netopeer2-cli. Then, -follow these steps: - -- connect --host XXX --login XXX -- get (you can get the configuration and operational data) -- get-config (you can get the configuration data) -- edit-config --target running --config - -With the default netopeer2-server configuration the authentication required by -netopeer2-cli reflects the ssh authentication (username and password or public -key). For other means of authentication please refer to netopeer2-server -documentation (e.g., netopeer2/server/configuration/README.md). - -You can modify the configuration but it needs an xml configuration input. - -```xml -<hicn-conf xmlns="urn:sysrepo:hicn"> -<params> - <enable_disable>false</enable_disable> - <pit_max_size>-1</pit_max_size> - <cs_max_size>-1</cs_max_size> - <cs_reserved_app>-1</cs_reserved_app> - <pit_dflt_lifetime_sec>-1</pit_dflt_lifetime_sec> - <pit_max_lifetime_sec>-1</pit_max_lifetime_sec> - <pit_min_lifetime_sec>-1</pit_min_lifetime_sec> -</params> -</hicn-conf> -``` - -- user-rpc (you can call one of the rpc proposed by hicn model but it needs an xml input) - -#### Connect from OpenDaylight (ODL) controller - -In order to connect through the OpenDaylight follow these procedure: - -- run karaf distribution (./opendayligh_installation_folder/bin/karaf) -- install the required feature list in DOL (feature:install odl-netconf-server - odl-netconf-connector odl-restconf-all odl-netconf-topology or - odl-netconf-clustered-topology) -- run a rest client program (e.g., postman or RESTClient) -- mount the remote netopeer2-server to the OpenDaylight by the following REST API: - - ``` - PUT <http://localhost:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/hicn-node>` - ``` - with the following body: - - ```xml - <node xmlns="urn:TBD:params:xml:ns:yang:network-topology"> - <node-id>hicn-node</node-id> - <host xmlns="urn:opendaylight:netconf-node-topology">Remote_NETCONF_SERVER_IP</host> - <port xmlns="urn:opendaylight:netconf-node-topology">830</port> - <username xmlns="urn:opendaylight:netconf-node-topology">username</username> - <password xmlns="urn:opendaylight:netconf-node-topology">password</password> - <tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only> - <keepalive-delay xmlns="urn:opendaylight:netconf-node-topology">1</keepalive-delay> - </node> - ``` - - Note that the header files must be set to `Content-Type: application/xml, Accept: application/xml`. - -- send the operation through the following REST API: - -POST <http://localhost:8181/restconf/operations/network-topology:network-topology/topology/topology-netconf/node/hicn-node/yang-ext:mount/ietf-netconf:edit-config> - -The body can be used the same as edit-config in netopeer2-cli. - -#### Connect from Cisco Network Services Orchestrator (NSO) - -To connect NSO to the netopeer2-server, first, you need to write a NED package -for your device. The procedure to create NED for hicn is explained in the -following: - -Place hicn.yang model in a folder called hicn-yang-model, and follow these steps: - -- ncs-make-package --netconf-ned ./hicn-yang-model ./hicn-nso -- cd hicn-nso/src; make -- ncs-setup --ned-package ./hicn-nso --dest ./hicn-nso-project -- cd hicn-nso-project -- ncs -- ncs_cli -C -u admin -- configure -- devices authgroups group authhicn default-map remote-name user_name remote-password password -- devices device hicn address IP_device port 830 authgroup authhicn device-type netconf -- state admin-state unlocked -- commit -- ssh fetch-host-keys - -At this point, we are able to connect to the remote device. - -## Release note - -The current version is compatible with the 20.01 VPP stable and sysrepo devel. - -## Routing plugin for VPP and FRRouting for OSPF6 - -This document describes how to configure the VPP with hicn_router -plugin and FRR to enable the OSPF protocol. The VPP and FRR -are configured in a docker file. - -### DPDK configuration on host machine - -Install and configure DPDK: -```bash -make install T=x86_64-native-linux-gcc && cd x86_64-native-linux-gcc && sudo make install -modprobe uio -modprobe uio_pci_generic -dpdk-devbind --status -the PCIe number of the desired device can be observed ("xxx") -sudo dpdk-devbind -b uio_pci_generic "xxx" -``` - -### VPP configuration - -Run and configure the VPP (hICN router plugin is required to be installed in VPP): -```bash -vpp# set int state TenGigabitEtherneta/0/0 up -vpp# set int ip address TenGigabitEtherneta/0/0 a001::1/24 -vpp# create loopback interface -vpp# set interface state loop0 up -vpp# set interface ip address loop0 b001::1/128 -vpp# enable tap-inject # This creates the taps by router plugin -vpp# show tap-inject # This shows the created taps -vpp# ip mroute add ff02::/64 via local Forward # ff02:: is multicast ip address -vpp# ip mroute add ff02::/64 via TenGigabitEtherneta/0/0 Accept -vpp# ip mroute add ff02::/64 via loop0 Accept -``` - -Setup the tap interface: -```bash -ip addr add a001::1/24 dev vpp0 -ip addr add b001::1/128 dev vpp1 -ip link set dev vpp0 up -ip link set dev vpp1 up -``` - -### FRR configuration - -Install FRR in Ubuntu 18 LTS: -<http://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-ubuntu1804.html> - -Run and configure FRRouting (ospf): -```text -/usr/lib/frr/frrinit.sh start & -vtysh -configure terminal -router ospf6 -area 0.0.0.0 range a001::1/24 -area 0.0.0.0 range b001::1/128 -interface vpp0 area 0.0.0.0 -interface vpp1 area 0.0.0.0 -end -wr -add "no ipv6 nd suppress-ra" to the first configurtion part of the /etc/frr/frr.conf -``` - -After the following configuration, the traffic over tap interface can be observed -via `tcpdump- i vpp1`. The neighborhood and route can be seen with the -`show ipv6 ospf6 neighbor/route` command. +A new control plane for hicn is under construction. diff --git a/extras/CMakeLists.txt b/extras/CMakeLists.txt index 1683902db..31628cba3 100644 --- a/extras/CMakeLists.txt +++ b/extras/CMakeLists.txt @@ -20,11 +20,7 @@ list(APPEND CMAKE_MODULE_PATH include("${CMAKE_CURRENT_SOURCE_DIR}/../versions.cmake") set (DESTDIR ${CMAKE_BINARY_DIR}/extras-root) -# add_subdirectory(router-plugin) add_subdirectory(libmemif) -# add_subdirectory(libyang) -# add_subdirectory(sysrepo) - if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) include(Packager) diff --git a/extras/libyang/CMakeLists.txt b/extras/libyang/CMakeLists.txt deleted file mode 100644 index 3dec9c5fb..000000000 --- a/extras/libyang/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -# 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. -cmake_minimum_required(VERSION 3.10) -project(libyang) - -list(APPEND MODULE_PATH - ${CMAKE_MODULE_PATH} - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules -) - -string(REPLACE ";" "|" MODULE_PATH "${MODULE_PATH}") - -include(ExternalProject) - -ExternalProject_Add(libyang - GIT_REPOSITORY https://github.com/CESNET/libyang.git - GIT_TAG devel - GIT_SHALLOW TRUE - PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libyang - PATCH_COMMAND git apply ${CMAKE_CURRENT_SOURCE_DIR}/libyang.patch - # Use the alternate list separator - # (https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#lists) - LIST_SEPARATOR | - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_MODULE_PATH=${MODULE_PATH} - BUILD_COMMAND make package - INSTALL_COMMAND make DESTDIR=${DESTDIR} install -) - -if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - include(Packager) - make_packages() -endif()
\ No newline at end of file diff --git a/extras/libyang/cmake/Modules/Packaging.cmake b/extras/libyang/cmake/Modules/Packaging.cmake deleted file mode 100644 index 9a7738196..000000000 --- a/extras/libyang/cmake/Modules/Packaging.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# 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. - -# Generate DEB / RPM packages - -###################### -# Packages section -###################### - -set(libyang_DESCRIPTION - "libyang is a YANG data modelling language parser and toolkit written (and providing API) in C." - CACHE STRING "Description for deb/rpm package." -) - -set(libyang_DEB_DEPENDENCIES - "libpcre3 (>= 2:8.38-3.1)" - CACHE STRING "Dependencies for deb/rpm package." -) - -set(libyang_RPM_DEPENDENCIES - "pcre >= 8.32-17" - CACHE STRING "Dependencies for deb/rpm package." -)
\ No newline at end of file diff --git a/extras/libyang/libyang.patch b/extras/libyang/libyang.patch deleted file mode 100644 index ac6a63746..000000000 --- a/extras/libyang/libyang.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 3e0fe79..037d60b 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -317,14 +317,14 @@ find_package(PCRE REQUIRED) - include_directories(${PCRE_INCLUDE_DIRS}) - target_link_libraries(yang ${PCRE_LIBRARIES}) - --install(TARGETS yang DESTINATION ${CMAKE_INSTALL_LIBDIR}) --install(FILES ${headers} ${PROJECT_BINARY_DIR}/src/libyang.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libyang) -+install(TARGETS yang DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libyang) -+install(FILES ${headers} ${PROJECT_BINARY_DIR}/src/libyang.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libyang COMPONENT libyang) - - find_package(PkgConfig) - if(PKG_CONFIG_FOUND) - # generate and install pkg-config file - configure_file("libyang.pc.in" "libyang.pc" @ONLY) -- install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libyang.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -+ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libyang.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" COMPONENT libyang) - # check that pkg-config includes the used path - execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable pc_path pkg-config RESULT_VARIABLE RETURN OUTPUT_VARIABLE PC_PATH ERROR_QUIET) - if(RETURN EQUAL 0) -@@ -410,14 +410,14 @@ configure_file(${PROJECT_SOURCE_DIR}/src/plugin_config.h.in ${PROJECT_BINARY_DIR - # yanglint - add_executable(yanglint ${lintsrc}) - target_link_libraries(yanglint yang) --install(TARGETS yanglint DESTINATION ${CMAKE_INSTALL_BINDIR}) --install(FILES ${PROJECT_SOURCE_DIR}/tools/lint/yanglint.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) -+install(TARGETS yanglint DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libyang) -+install(FILES ${PROJECT_SOURCE_DIR}/tools/lint/yanglint.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT libyang) - - #yangre - add_executable(yangre ${resrc}) - target_link_libraries(yangre yang) --install(TARGETS yangre DESTINATION ${CMAKE_INSTALL_BINDIR}) --install(FILES ${PROJECT_SOURCE_DIR}/tools/re/yangre.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) -+install(TARGETS yangre DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libyang) -+install(FILES ${PROJECT_SOURCE_DIR}/tools/re/yangre.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT libyang) - - # yang2yin - add_executable(yang2yin ${yang2yinsrc}) -@@ -446,3 +446,8 @@ endif(ENABLE_BUILD_FUZZ_TARGETS) - if(GEN_LANGUAGE_BINDINGS AND GEN_CPP_BINDINGS) - add_subdirectory(swig) - endif() -+ -+ -+include(Packaging) -+include(Packager) -+make_packages() diff --git a/extras/router-plugin/.clang-format b/extras/router-plugin/.clang-format deleted file mode 100644 index 351a70e20..000000000 --- a/extras/router-plugin/.clang-format +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal clang-format version is 8 - -BasedOnStyle: GNU -UseTab: Always -SpaceAfterCStyleCast: true -SortIncludes: false -AlignConsecutiveMacros: true -BreakBeforeTernaryOperators: false -BreakBeforeBinaryOperators: None -ContinuationIndentWidth: 2 - -ForEachMacros: - - 'clib_bitmap_foreach' - - 'pool_foreach' - - 'pool_foreach_index' - - 'vec_foreach' - - 'vec_foreach_backwards' - - 'vec_foreach_index' - - 'vec_foreach_index_backwards' - - 'vlib_foreach_rx_tx' diff --git a/extras/router-plugin/CMakeLists.txt b/extras/router-plugin/CMakeLists.txt deleted file mode 100644 index 63594297a..000000000 --- a/extras/router-plugin/CMakeLists.txt +++ /dev/null @@ -1,102 +0,0 @@ -# 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. - -cmake_minimum_required(VERSION 3.10 FATAL_ERROR) -project(router-plugin) - -include(GNUInstallDirs) - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - "${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/Modules/" - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/" -) - -set (CMAKE_C_STANDARD 11) - -include (Packaging) - -set(HICN_EXTRA_PLUGIN hicn-router-plugin) - -# Dependencies - -find_package(Vpp ${VPP_DEFAULT_VERSION} REQUIRED) - -include_directories(${VPP_INCLUDE_DIR}) - -set(HICN_EXTRA_PLUGIN_SOURCE_FILES - rtinject/tap_inject.c - rtinject/tap_inject_netlink.c - rtinject/tap_inject_node.c - rtinject/tap_inject_tap.c - devices/rtnetlink/mapper.c - devices/rtnetlink/netns.c - devices/rtnetlink/rtnl.c -) - -set(HICN_EXTRA_PLUGIN_HEADER_FILES - devices/rtnetlink/mapper.h - devices/rtnetlink/netns.h - devices/rtnetlink/rtnl.h -) - -if (NOT VPP_HOME) - set(VPP_HOME /usr) -endif() - -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE "Release") -endif (NOT CMAKE_BUILD_TYPE) - -SET(EXTRA_INSTALL_PREFIX - ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} - CACHE STRING "extra_install_prefix" -) - -if (CMAKE_BUILD_TYPE STREQUAL "Release") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall -march=native -O3 -g") -elseif (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -march=native -O0 -g") - add_definitions(-DHICN_DDEBUG -DCLIB_DEBUG -fPIC -fstack-protector-all) -endif() - -include_directories(SYSTEM) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DEXTRA_VPP_PLUGIN=1") - -add_library(hicn_router_plugin SHARED - ${HICN_EXTRA_PLUGIN_SOURCE_FILES} -) - -include_directories(${CMAKE_CURRENT_BINARY_DIR}/vpp_plugins) - -set(VPP_INSTALL_PLUGIN ${EXTRA_INSTALL_PREFIX}/vpp_plugins) - -set_target_properties(hicn_router_plugin - PROPERTIES - LINKER_LANGUAGE C - INSTALL_RPATH ${VPP_INSTALL_PLUGIN} - PREFIX "" - LIBRARY_OUTPUT_NAME "hicn_router" -) - -install(DIRECTORY - DESTINATION ${VPP_INSTALL_PLUGIN} - COMPONENT ${HICN_EXTRA_PLUGIN} -) - -install(TARGETS hicn_router_plugin - DESTINATION - ${VPP_INSTALL_PLUGIN} - COMPONENT ${HICN_EXTRA_PLUGIN} -) diff --git a/extras/router-plugin/cmake/Modules/Packaging.cmake b/extras/router-plugin/cmake/Modules/Packaging.cmake deleted file mode 100644 index 972f804a6..000000000 --- a/extras/router-plugin/cmake/Modules/Packaging.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# 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. - -###################### -# Packages section -###################### - -set(${HICN_EXTRA_PLUGIN}_DESCRIPTION - "A extra plugin to VPP." - CACHE STRING "Description for deb/rpm package." -) - -set(${HICN_EXTRA_PLUGIN}_DEB_DEPENDENCIES - "vpp (= ${PREFIX_VERSION}-release), vpp-plugin-core (= ${PREFIX_VERSION}-release)" - CACHE STRING "Dependencies for deb/rpm package." -) - -set(${HICN_EXTRA_PLUGIN}_RPM_DEPENDENCIES - "vpp = ${PREFIX_VERSION}-release, vpp-plugins = ${PREFIX_VERSION}-release" - CACHE STRING "Dependencies for deb/rpm package." -) diff --git a/extras/router-plugin/devices/rtnetlink/mapper.c b/extras/router-plugin/devices/rtnetlink/mapper.c deleted file mode 100644 index 410d5527d..000000000 --- a/extras/router-plugin/devices/rtnetlink/mapper.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - * 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 <vnet/fib/fib.h> -#include <vnet/ip/ip.h> -#include <vnet/ip/lookup.h> - -#include "mapper.h" -#include "netns.h" -#include <hicn/util/sstrncpy.h> - -typedef struct -{ - int linux_ifindex; - u32 sw_if_index; -} mapper_map_t; - -typedef struct -{ - char nsname[RTNL_NETNS_NAMELEN + 1]; - mapper_map_t *mappings; - u32 netns_handle; // Used to receive notifications - u32 v4fib_index; // One fib index for the namespace - u32 v6fib_index; -} mapper_ns_t; - -typedef struct -{ - mapper_ns_t *namespaces; -} mapper_main_t; - -static mapper_main_t mapper_main; - -mapper_map_t * -mapper_get_by_ifindex (mapper_ns_t *ns, int ifindex) -{ - mapper_map_t *map; - pool_foreach (map, ns->mappings, { - if (ifindex == map->linux_ifindex) - return map; - }) - ; - return NULL; -} - -int -mapper_add_del_route (mapper_ns_t *ns, ns_route_t *route, int del) -{ - mapper_main_t *mm = &mapper_main; - clib_warning ("NS %d %s %U", ns - mm->namespaces, del ? "del" : "add", - format_ns_route, route); - - mapper_map_t *map = mapper_get_by_ifindex (ns, route->oif); - if (!map) - return 0; - - if (route->rtm.rtm_family == AF_INET6) - { - - // Filter-out multicast - if (route->rtm.rtm_dst_len >= 8 && route->dst[0] == 0xff) - return 0; - - fib_prefix_t prefix; - ip_address_t nh; - - memset (&prefix, 0, sizeof (prefix)); - prefix.fp_len = route->rtm.rtm_dst_len; - prefix.fp_proto = FIB_PROTOCOL_IP6; - clib_memcpy (&prefix.fp_addr.ip6, route->dst, - sizeof (prefix.fp_addr.ip6)); - - memset (&nh, 0, sizeof (nh)); - clib_memcpy (&nh.ip6, route->gateway, sizeof (nh.ip6)); - - fib_table_entry_path_add ( - ns->v6fib_index, &prefix, FIB_SOURCE_API, FIB_ENTRY_FLAG_NONE, - prefix.fp_proto, &nh, map->sw_if_index, ns->v6fib_index, - 0 /* weight */, (fib_mpls_label_t *) MPLS_LABEL_INVALID, - FIB_ROUTE_PATH_FLAG_NONE); - } - else - { - fib_prefix_t prefix; - ip_address_t nh; - - memset (&prefix, 0, sizeof (prefix)); - prefix.fp_len = route->rtm.rtm_dst_len; - prefix.fp_proto = FIB_PROTOCOL_IP4; - clib_memcpy (&prefix.fp_addr.ip4, route->dst, - sizeof (prefix.fp_addr.ip4)); - - memset (&nh, 0, sizeof (nh)); - clib_memcpy (&nh.ip4, route->gateway, sizeof (nh.ip4)); - - fib_table_entry_path_add ( - ns->v4fib_index, &prefix, FIB_SOURCE_API, FIB_ENTRY_FLAG_NONE, - prefix.fp_proto, &nh, map->sw_if_index, ns->v4fib_index, - 0 /* weight */, (fib_mpls_label_t *) MPLS_LABEL_INVALID, - FIB_ROUTE_PATH_FLAG_NONE); - } - - return 0; -} - -static void -mapper_netns_notify_cb (void *obj, netns_type_t type, u32 flags, uword opaque) -{ - mapper_main_t *mm = &mapper_main; - mapper_ns_t *ns = &mm->namespaces[(u32) opaque]; - ASSERT (!pool_is_free_index (mm->namespaces, (u32) opaque)); - if (type != NETNS_TYPE_ROUTE) - return; // For now... - - ns_route_t *route = obj; - if (flags & NETNS_F_DEL) - { - mapper_add_del_route (ns, route, 1); - } - else if (flags & NETNS_F_ADD) - { - mapper_add_del_route (ns, route, 0); - } -} - -void -mapper_delmap (mapper_ns_t *ns, mapper_map_t *map) -{ - ns_route_t *route; - netns_t *netns = netns_getns (ns->netns_handle); - pool_foreach (route, netns->routes, { - if (route->oif == map->linux_ifindex) - mapper_add_del_route (ns, route, 1); - }) - ; - pool_put (ns->mappings, map); -} - -mapper_map_t * -mapper_getmap (mapper_ns_t *ns, u32 sw_if_index, int linux_ifindex, int create) -{ - mapper_map_t *map; - pool_foreach (map, ns->mappings, { - if (linux_ifindex == map->linux_ifindex) - { - if (sw_if_index != map->sw_if_index) - return NULL; // Cannot have multiple mapping with the same ifindex - else - return map; - } - }) - ; - - if (!create) - return NULL; - - pool_get (ns->mappings, map); - map->linux_ifindex = linux_ifindex; - map->sw_if_index = sw_if_index; - ip6_main.fib_index_by_sw_if_index[sw_if_index] = ns->v6fib_index; - ip4_main.fib_index_by_sw_if_index[sw_if_index] = ns->v4fib_index; - - // Load available routes - ns_route_t *route; - netns_t *netns = netns_getns (ns->netns_handle); - pool_foreach (route, netns->routes, { - if (route->oif == map->linux_ifindex) - mapper_add_del_route (ns, route, 0); - }) - ; - return map; -} - -u32 -mapper_get_ns (char *nsname) -{ - mapper_main_t *mm = &mapper_main; - mapper_ns_t *ns; - pool_foreach (ns, mm->namespaces, { - if (!strcmp (nsname, ns->nsname)) - return ns - mm->namespaces; - }) - ; - return ~0; -} - -int -mapper_add_del (u32 nsindex, int linux_ifindex, u32 sw_if_index, int del) -{ - mapper_main_t *mm = &mapper_main; - // ip6_main_t *im6 = &ip6_main; - mapper_ns_t *ns = &mm->namespaces[nsindex]; - mapper_map_t *map; - // vnet_sw_interface_t *iface = vnet_get_sw_interface(vnet_get_main(), - // sw_if_index); - - if (pool_is_free (mm->namespaces, ns)) - return -1; - - /*if (!del) { - if ((iface->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) && - im6->fib_index_by_sw_if_index[sw_if_index] != ~0) { - //A custom fib index will be used... - clib_warning("Cannot add interface with a custom fib index (current is - %d)", im6->fib_index_by_sw_if_index[sw_if_index]); return -1; - } - }*/ - - if (!(map = mapper_getmap (ns, sw_if_index, linux_ifindex, !del))) - return -1; - - if (del) - mapper_delmap (ns, map); - - return 0; -} - -int -mapper_add_ns (char *nsname, u32 v4fib_index, u32 v6fib_index, u32 *nsindex) -{ - mapper_main_t *mm = &mapper_main; - mapper_ns_t *ns; - if (mapper_get_ns (nsname) != ~0) - return -1; // Already exists - - pool_get (mm->namespaces, ns); - int rc = strcpy_s (ns->nsname, sizeof (ns->nsname), nsname); - if (rc != EOK) - return -1; - ns->v4fib_index = v4fib_index; - ns->v6fib_index = v6fib_index; - ns->mappings = 0; - - netns_sub_t sub; - sub.notify = mapper_netns_notify_cb; - sub.opaque = (uword) (ns - mm->namespaces); - if ((ns->netns_handle = netns_open (ns->nsname, &sub)) == ~0) - { - pool_put (mm->namespaces, ns); - return -1; - } - *nsindex = ns - mm->namespaces; - return 0; -} - -int -mapper_del_ns (u32 nsindex) -{ - mapper_main_t *mm = &mapper_main; - mapper_ns_t *ns = &mm->namespaces[nsindex]; - if (pool_is_free (mm->namespaces, ns)) - return -1; - - // Remove all existing mappings - int i, *indexes = 0; - pool_foreach_index (i, ns->mappings, { vec_add1 (indexes, i); }) - ; - vec_foreach_index (i, indexes) - { - mapper_delmap (ns, &ns->mappings[indexes[i]]); - } - vec_free (indexes); - - netns_close (ns->netns_handle); - pool_put (mm->namespaces, ns); - return 0; -} - -clib_error_t * -mapper_init (vlib_main_t *vm) -{ - mapper_main_t *mm = &mapper_main; - mm->namespaces = 0; - return 0; -} - -VLIB_INIT_FUNCTION (mapper_init); diff --git a/extras/router-plugin/devices/rtnetlink/mapper.h b/extras/router-plugin/devices/rtnetlink/mapper.h deleted file mode 100644 index 436e5dc4d..000000000 --- a/extras/router-plugin/devices/rtnetlink/mapper.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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 MAPPER_H_ -#define MAPPER_H_ - -#include "netns.h" - -/* - * Automatically map linux network routes to VPP. - * Each namespace is associated with an individual fib. - * - * One linux interface can only be mapped to a single VPP - * interface, but one VPP interface can be mapped to - * multiple linux interfaces. - * A mapped VPP interface must not have any configured fib. - */ - -int mapper_add_ns (char *nsname, u32 v4fib_index, u32 v6fib_index, - u32 *nsindex); -int mapper_del_ns (u32 nsindex); -int mapper_add_del (u32 nsindex, int linux_ifindex, u32 sw_if_index, int del); - -#endif /* MAPPER_H_ */ diff --git a/extras/router-plugin/devices/rtnetlink/netns.c b/extras/router-plugin/devices/rtnetlink/netns.c deleted file mode 100644 index 0d9986185..000000000 --- a/extras/router-plugin/devices/rtnetlink/netns.c +++ /dev/null @@ -1,840 +0,0 @@ -/* - * 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 <stddef.h> -#include <vlib/unix/unix.h> -#include <vlib/vlib.h> -#include <vnet/ethernet/ethernet.h> -#include <vnet/ip/format.h> -#include <vnet/ip/ip4_packet.h> -#include <vnet/ip/ip6_packet.h> - -#include "netns.h" -#include <hicn/util/sstrncpy.h> - -/* Enable some RTA values debug */ -//#define RTNL_CHECK - -#define is_nonzero(x) \ - ({ \ - u8 __is_zero_zero[sizeof (x)] = {}; \ - memcmp (__is_zero_zero, &x, sizeof (x)); \ - }) - -typedef struct -{ - u8 type; // Attribute identifier - u8 unique; // Part of the values uniquely identifying an entry - u16 offset; // Offset where stored in struct - u16 size; // Length of the attribute -} rtnl_mapping_t; - -#define ns_foreach_ifla \ - _ (IFLA_ADDRESS, hwaddr) \ - _ (IFLA_BROADCAST, broadcast) \ - _ (IFLA_IFNAME, ifname) \ - _ (IFLA_MASTER, master) \ - _ (IFLA_MTU, mtu) \ - _ (IFLA_QDISC, qdisc) - -static rtnl_mapping_t ns_ifmap[] = { -#define _(t, e) \ - { .type = t, \ - .offset = offsetof (ns_link_t, e), \ - .size = sizeof (((ns_link_t *) 0)->e) }, - ns_foreach_ifla -#undef _ - { .type = 0 } -}; - -u8 * -format_ns_link (u8 *s, va_list *args) -{ - ns_link_t *l = va_arg (*args, ns_link_t *); - s = format (s, "%s index %u", l->ifname, l->ifi.ifi_index); - return s; -} - -#define ns_foreach_rta \ - _ (RTA_DST, dst, 1) \ - _ (RTA_SRC, src, 1) \ - _ (RTA_GATEWAY, gateway, 1) \ - _ (RTA_IIF, iif, 1) \ - _ (RTA_OIF, oif, 1) \ - _ (RTA_PREFSRC, prefsrc, 0) \ - _ (RTA_TABLE, table, 0) \ - _ (RTA_PRIORITY, priority, 0) \ - _ (RTA_CACHEINFO, cacheinfo, 0) \ - _ (RTA_ENCAP, encap, 1) - -static rtnl_mapping_t ns_routemap[] = { -#define _(t, e, u) \ - { .type = t, \ - .unique = u, \ - .offset = offsetof (ns_route_t, e), \ - .size = sizeof (((ns_route_t *) 0)->e) }, - ns_foreach_rta -#undef _ - { .type = 0 } -}; - -u8 * -format_ns_route (u8 *s, va_list *args) -{ - ns_route_t *r = va_arg (*args, ns_route_t *); - void *format_ip = - r->rtm.rtm_family == AF_INET ? format_ip4_address : format_ip6_address; - s = format (s, "%U/%d", format_ip, r->dst, r->rtm.rtm_dst_len); - if (r->rtm.rtm_src_len) - s = format (s, " from %U/%d", format_ip, r->src, r->rtm.rtm_src_len); - if (is_nonzero (r->gateway)) - s = format (s, " via %U", format_ip, r->gateway); - if (r->iif) - s = format (s, " iif %d", r->iif); - if (r->oif) - s = format (s, " oif %d", r->oif); - if (is_nonzero (r->prefsrc)) - s = format (s, " src %U", format_ip, r->prefsrc); - if (r->table) - s = format (s, " table %d", r->table); - if (r->priority) - s = format (s, " priority %u", r->priority); - return s; -} - -#define ns_foreach_ifaddr \ - _ (IFA_ADDRESS, addr, 1) \ - _ (IFA_LOCAL, local, 1) \ - _ (IFA_LABEL, label, 0) \ - _ (IFA_BROADCAST, broadcast, 0) \ - _ (IFA_ANYCAST, anycast, 0) \ - _ (IFA_CACHEINFO, cacheinfo, 0) - -static rtnl_mapping_t ns_addrmap[] = { -#define _(t, e, u) \ - { .type = t, \ - .unique = u, \ - .offset = offsetof (ns_addr_t, e), \ - .size = sizeof (((ns_addr_t *) 0)->e) }, - ns_foreach_ifaddr -#undef _ - { .type = 0 } -}; - -u8 * -format_ns_addr (u8 *s, va_list *args) -{ - ns_addr_t *a = va_arg (*args, ns_addr_t *); - void *format_ip = - a->ifaddr.ifa_family == AF_INET ? format_ip4_address : format_ip6_address; - s = format (s, "%U/%d", format_ip, a->addr, a->ifaddr.ifa_prefixlen); - if (is_nonzero (a->label)) - s = format (s, " dev %s", a->label); - if (is_nonzero (a->broadcast)) - s = format (s, " broadcast %U", format_ip, a->broadcast); - if (is_nonzero (a->anycast)) - s = format (s, " anycast %U", format_ip, a->anycast); - if (is_nonzero (a->local)) - s = format (s, " local %U", format_ip, a->local); - return s; -} - -#ifndef NDA_RTA -#define NDA_RTA(r) \ - ((struct rtattr *) (((char *) (r)) + NLMSG_ALIGN (sizeof (struct ndmsg)))) -#define NDA_PAYLOAD(n) NLMSG_PAYLOAD (n, sizeof (struct ndmsg)) -#endif - -#define ns_foreach_neigh \ - _ (NDA_DST, dst, 1) \ - _ (NDA_LLADDR, lladdr, 0) \ - _ (NDA_PROBES, probes, 0) \ - _ (NDA_CACHEINFO, cacheinfo, 0) - -static rtnl_mapping_t ns_neighmap[] = { -#define _(t, e, u) \ - { .type = t, \ - .unique = u, \ - .offset = offsetof (ns_neigh_t, e), \ - .size = sizeof (((ns_neigh_t *) 0)->e) }, - ns_foreach_neigh -#undef _ - { .type = 0 } -}; - -u8 * -format_ns_neigh (u8 *s, va_list *args) -{ - ns_neigh_t *n = va_arg (*args, ns_neigh_t *); - void *format_ip = - n->nd.ndm_family == AF_INET ? format_ip4_address : format_ip6_address; - s = format (s, "%U", format_ip, n->dst); - if (is_nonzero (n->lladdr)) - s = format (s, " lladdr %U", format_ethernet_address, n->lladdr); - if (n->probes) - s = format (s, " probes %d", n->probes); - return s; -} - -typedef struct -{ - void (*notify) (void *obj, netns_type_t type, u32 flags, uword opaque); - uword opaque; - u32 netns_index; -} netns_handle_t; - -typedef struct -{ - netns_t netns; - u32 rtnl_handle; - u32 subscriber_count; -} netns_p; - -typedef struct -{ - netns_p *netnss; - netns_handle_t *handles; -} netns_main_t; - -netns_main_t netns_main; - -static int -rtnl_parse_rtattr (struct rtattr *db[], size_t max, struct rtattr *rta, - size_t len) -{ - for (; RTA_OK (rta, len); rta = RTA_NEXT (rta, len)) - { - if (rta->rta_type <= max) - db[rta->rta_type] = rta; -#ifdef RTNL_CHECK - else - clib_warning ("RTA type too high: %d", rta->rta_type); -#endif - } - - if (len) - { - clib_warning ("rattr lenght mistmatch %d %d len", (int) len, - (int) rta->rta_len); - return -1; - } - return 0; -} - -/* - * Debug function to display when - * we receive an RTA that I forgot in - * the mapping table (there are so many of them). - */ -#ifdef RTNL_CHECK -static void -rtnl_entry_check (struct rtattr *rtas[], size_t rta_len, rtnl_mapping_t map[], - char *logstr) -{ - int i; - for (i = 0; i < rta_len; i++) - { - if (!rtas[i]) - continue; - - rtnl_mapping_t *m = map; - for (m = map; m->type; m++) - { - if (m->type == rtas[i]->rta_type) - break; - } - if (!m->type) - clib_warning ("Unknown RTA type %d (%s)", rtas[i]->rta_type, logstr); - } -} -#endif - -/* - * Check if the provided entry matches the parsed and unique rtas - */ -static int -rtnl_entry_match (void *entry, struct rtattr *rtas[], rtnl_mapping_t map[]) -{ - u8 zero[1024] = {}; - for (; map->type != 0; map++) - { - struct rtattr *rta = rtas[map->type]; - size_t rta_len = rta ? RTA_PAYLOAD (rta) : 0; - if (!map->unique) - continue; - - if (rta && RTA_PAYLOAD (rta) > map->size) - { - clib_warning ("rta (type=%d len=%d) too long (max %d)", - rta->rta_type, rta->rta_len, map->size); - return -1; - } - - if ((rta && memcmp (RTA_DATA (rta), entry + map->offset, rta_len)) || - memcmp (entry + map->offset + rta_len, zero, map->size - rta_len)) - { - return 0; - } - } - return 1; -} - -static int -rtnl_entry_set (void *entry, struct rtattr *rtas[], rtnl_mapping_t map[], - int init) -{ - for (; map->type != 0; map++) - { - - struct rtattr *rta = rtas[map->type]; - - if (map->type == RTA_ENCAP && rta) - { - /*Data of RTA_ENCAP is a pointer to rta attributes for MPLS*/ - rta = (struct rtattr *) RTA_DATA (rta); - if (RTA_PAYLOAD (rta) > map->size) - { - clib_warning ("rta (type=%d len=%d) too long (max %d)", - rta->rta_type, rta->rta_len, map->size); - return -1; - } - memcpy (entry + map->offset, RTA_DATA (rta), map->size); - memset (entry + map->offset + map->size, 0, 0); - } - else if (rta) - { - if (RTA_PAYLOAD (rta) > map->size) - { - clib_warning ("rta (type=%d len=%d) too long (max %d)", - rta->rta_type, rta->rta_len, map->size); - return -1; - } - memcpy (entry + map->offset, RTA_DATA (rta), RTA_PAYLOAD (rta)); - memset (entry + map->offset + RTA_PAYLOAD (rta), 0, - map->size - RTA_PAYLOAD (rta)); - } - else if (init) - { - memset (entry + map->offset, 0, map->size); - } - } - return 0; -} - -void -netns_notify (netns_p *ns, void *obj, netns_type_t type, u32 flags) -{ - netns_main_t *nm = &netns_main; - netns_handle_t *h; - pool_foreach (h, nm->handles, { - if (h->netns_index == (ns - nm->netnss) && h->notify) - h->notify (obj, type, flags, h->opaque); - }) - ; -} - -static_always_inline int -mask_match (void *a, void *b, void *mask, size_t len) -{ - u8 *va = (u8 *) a; - u8 *vb = (u8 *) b; - u8 *vm = (u8 *) mask; - while (len--) - { - if ((va[len] ^ vb[len]) & vm[len]) - return 0; - } - return 1; -} - -static ns_link_t * -ns_get_link (netns_p *ns, struct ifinfomsg *ifi, struct rtattr *rtas[]) -{ - ns_link_t *link; - pool_foreach (link, ns->netns.links, { - if (ifi->ifi_index == link->ifi.ifi_index) - return link; - }) - ; - return NULL; -} - -static int -ns_rcv_link (netns_p *ns, struct nlmsghdr *hdr) -{ - ns_link_t *link; - struct ifinfomsg *ifi; - struct rtattr *rtas[IFLA_MAX + 1] = {}; - size_t datalen = hdr->nlmsg_len - NLMSG_ALIGN (sizeof (*hdr)); - - if (datalen < sizeof (*ifi)) - return -1; - - ifi = NLMSG_DATA (hdr); - if ((datalen > NLMSG_ALIGN (sizeof (*ifi))) && - rtnl_parse_rtattr (rtas, IFLA_MAX, IFLA_RTA (ifi), IFLA_PAYLOAD (hdr))) - { - return -1; - } -#ifdef RTNL_CHECK - rtnl_entry_check (rtas, IFLA_MAX + 1, ns_ifmap, "link"); -#endif - - link = ns_get_link (ns, ifi, rtas); - - if (hdr->nlmsg_type == RTM_DELLINK) - { - if (!link) - return -1; - pool_put (ns->netns.links, link); - netns_notify (ns, link, NETNS_TYPE_LINK, NETNS_F_DEL); - return 0; - } - - if (!link) - { - pool_get (ns->netns.links, link); - rtnl_entry_set (link, rtas, ns_ifmap, 1); - } - else - { - rtnl_entry_set (link, rtas, ns_ifmap, 0); - } - - link->ifi = *ifi; - link->last_updated = vlib_time_now (vlib_get_main ()); - netns_notify (ns, link, NETNS_TYPE_LINK, NETNS_F_ADD); - return 0; -} - -static ns_route_t * -ns_get_route (netns_p *ns, struct rtmsg *rtm, struct rtattr *rtas[]) -{ - ns_route_t *route; - - // This describes the values which uniquely identify a route - struct rtmsg msg = { .rtm_family = 0xff, - .rtm_dst_len = 0xff, - .rtm_src_len = 0xff, - .rtm_table = 0xff, - .rtm_protocol = 0xff, - .rtm_type = 0xff }; - - pool_foreach (route, ns->netns.routes, { - if (mask_match (&route->rtm, rtm, &msg, sizeof (struct rtmsg)) && - rtnl_entry_match (route, rtas, ns_routemap)) - return route; - }) - ; - return NULL; -} - -static int -ns_rcv_route (netns_p *ns, struct nlmsghdr *hdr) -{ - ns_route_t *route; - struct rtmsg *rtm; - struct rtattr *rtas[RTA_MAX + 1] = {}; - size_t datalen = hdr->nlmsg_len - NLMSG_ALIGN (sizeof (*hdr)); - - if (datalen < sizeof (*rtm)) - return -1; - - rtm = NLMSG_DATA (hdr); - if ((datalen > NLMSG_ALIGN (sizeof (*rtm))) && - rtnl_parse_rtattr (rtas, RTA_MAX, RTM_RTA (rtm), RTM_PAYLOAD (hdr))) - { - return -1; - } -#ifdef RTNL_CHECK - rtnl_entry_check (rtas, RTA_MAX + 1, ns_routemap, "route"); -#endif - route = ns_get_route (ns, rtm, rtas); - - if (hdr->nlmsg_type == RTM_DELROUTE) - { - if (!route) - return -1; - pool_put (ns->netns.routes, route); - netns_notify (ns, route, NETNS_TYPE_ROUTE, NETNS_F_DEL); - return 0; - } - - if (!route) - { - pool_get (ns->netns.routes, route); - memset (route, 0, sizeof (*route)); - rtnl_entry_set (route, rtas, ns_routemap, 1); - } - else - { - rtnl_entry_set (route, rtas, ns_routemap, 0); - } - - route->rtm = *rtm; - route->last_updated = vlib_time_now (vlib_get_main ()); - netns_notify (ns, route, NETNS_TYPE_ROUTE, NETNS_F_ADD); - return 0; -} - -static ns_addr_t * -ns_get_addr (netns_p *ns, struct ifaddrmsg *ifaddr, struct rtattr *rtas[]) -{ - ns_addr_t *addr; - - // This describes the values which uniquely identify a route - struct ifaddrmsg msg = { - .ifa_family = 0xff, - .ifa_prefixlen = 0xff, - }; - - pool_foreach (addr, ns->netns.addresses, { - if (mask_match (&addr->ifaddr, ifaddr, &msg, sizeof (struct ifaddrmsg)) && - rtnl_entry_match (addr, rtas, ns_addrmap)) - return addr; - }) - ; - return NULL; -} - -static int -ns_rcv_addr (netns_p *ns, struct nlmsghdr *hdr) -{ - ns_addr_t *addr; - struct ifaddrmsg *ifaddr; - struct rtattr *rtas[IFA_MAX + 1] = {}; - size_t datalen = hdr->nlmsg_len - NLMSG_ALIGN (sizeof (*hdr)); - - if (datalen < sizeof (*ifaddr)) - return -1; - - ifaddr = NLMSG_DATA (hdr); - if ((datalen > NLMSG_ALIGN (sizeof (*ifaddr))) && - rtnl_parse_rtattr (rtas, IFA_MAX, IFA_RTA (ifaddr), IFA_PAYLOAD (hdr))) - { - return -1; - } -#ifdef RTNL_CHECK - rtnl_entry_check (rtas, IFA_MAX + 1, ns_addrmap, "addr"); -#endif - addr = ns_get_addr (ns, ifaddr, rtas); - - if (hdr->nlmsg_type == RTM_DELADDR) - { - if (!addr) - return -1; - pool_put (ns->netns.addresses, addr); - netns_notify (ns, addr, NETNS_TYPE_ADDR, NETNS_F_DEL); - return 0; - } - - if (!addr) - { - pool_get (ns->netns.addresses, addr); - memset (addr, 0, sizeof (*addr)); - rtnl_entry_set (addr, rtas, ns_addrmap, 1); - } - else - { - rtnl_entry_set (addr, rtas, ns_addrmap, 0); - } - - addr->ifaddr = *ifaddr; - addr->last_updated = vlib_time_now (vlib_get_main ()); - netns_notify (ns, addr, NETNS_TYPE_ADDR, NETNS_F_ADD); - return 0; -} - -static ns_neigh_t * -ns_get_neigh (netns_p *ns, struct ndmsg *nd, struct rtattr *rtas[]) -{ - ns_neigh_t *neigh; - - // This describes the values which uniquely identify a route - struct ndmsg msg = { - .ndm_family = 0xff, - .ndm_ifindex = 0xff, - }; - - pool_foreach (neigh, ns->netns.neighbors, { - if (mask_match (&neigh->nd, nd, &msg, sizeof (&msg)) && - rtnl_entry_match (neigh, rtas, ns_neighmap)) - return neigh; - }) - ; - return NULL; -} - -static int -ns_rcv_neigh (netns_p *ns, struct nlmsghdr *hdr) -{ - ns_neigh_t *neigh; - struct ndmsg *nd; - struct rtattr *rtas[NDA_MAX + 1] = {}; - size_t datalen = hdr->nlmsg_len - NLMSG_ALIGN (sizeof (*hdr)); - - if (datalen < sizeof (*nd)) - return -1; - - nd = NLMSG_DATA (hdr); - if ((datalen > NLMSG_ALIGN (sizeof (*nd))) && - rtnl_parse_rtattr (rtas, NDA_MAX, NDA_RTA (nd), NDA_PAYLOAD (hdr))) - { - return -1; - } -#ifdef RTNL_CHECK - rtnl_entry_check (rtas, NDA_MAX + 1, ns_neighmap, "nd"); -#endif - neigh = ns_get_neigh (ns, nd, rtas); - - if (hdr->nlmsg_type == RTM_DELNEIGH) - { - if (!neigh) - return -1; - pool_put (ns->netns.neighbors, neigh); - netns_notify (ns, neigh, NETNS_TYPE_NEIGH, NETNS_F_DEL); - return 0; - } - - if (!neigh) - { - pool_get (ns->netns.neighbors, neigh); - memset (neigh, 0, sizeof (*neigh)); - rtnl_entry_set (neigh, rtas, ns_neighmap, 1); - } - else - { - rtnl_entry_set (neigh, rtas, ns_neighmap, 0); - } - - neigh->nd = *nd; - neigh->last_updated = vlib_time_now (vlib_get_main ()); - netns_notify (ns, neigh, NETNS_TYPE_NEIGH, NETNS_F_ADD); - return 0; -} - -#define ns_object_foreach \ - _ (neighbors, NETNS_TYPE_NEIGH) \ - _ (routes, NETNS_TYPE_ROUTE) \ - _ (addresses, NETNS_TYPE_ADDR) \ - _ (links, NETNS_TYPE_LINK) - -static void -ns_recv_error (rtnl_error_t err, uword o) -{ - // An error was received. Reset everything. - netns_p *ns = &netns_main.netnss[o]; - u32 *indexes = 0; - u32 *i = 0; - -#define _(pool, type) \ - pool_foreach_index (*i, ns->netns.pool, { vec_add1 (indexes, *i); }) \ - vec_foreach (i, indexes) \ - { \ - pool_put_index (ns->netns.pool, *i); \ - netns_notify (ns, &ns->netns.pool[*i], type, NETNS_F_DEL); \ - } \ - vec_reset_length (indexes); - - ns_object_foreach - -#undef _ - vec_free (indexes); -} - -static void -ns_recv_rtnl (struct nlmsghdr *hdr, uword o) -{ - netns_p *ns = &netns_main.netnss[o]; - switch (hdr->nlmsg_type) - { - case RTM_NEWROUTE: - case RTM_DELROUTE: - ns_rcv_route (ns, hdr); - break; - case RTM_NEWLINK: - case RTM_DELLINK: - ns_rcv_link (ns, hdr); - break; - case RTM_NEWADDR: - case RTM_DELADDR: - ns_rcv_addr (ns, hdr); - break; - case RTM_NEWNEIGH: - case RTM_DELNEIGH: - ns_rcv_neigh (ns, hdr); - break; - default: - clib_warning ("unknown rtnl type %d", hdr->nlmsg_type); - break; - } -} - -static void -netns_destroy (netns_p *ns) -{ - netns_main_t *nm = &netns_main; - rtnl_stream_close (ns->rtnl_handle); - pool_put (nm->netnss, ns); - pool_free (ns->netns.links); - pool_free (ns->netns.addresses); - pool_free (ns->netns.routes); - pool_free (ns->netns.neighbors); -} - -static netns_p * -netns_get (char *name) -{ - netns_main_t *nm = &netns_main; - netns_p *ns; - pool_foreach (ns, nm->netnss, { - if (!strcmp (name, ns->netns.name)) - return ns; - }) - ; - - if (strlen (name) > RTNL_NETNS_NAMELEN) - return NULL; - - pool_get (nm->netnss, ns); - rtnl_stream_t s = { - .recv_message = ns_recv_rtnl, - .error = ns_recv_error, - .opaque = (uword) (ns - nm->netnss), - }; - int rc = strcpy_s (s.name, sizeof (s.name), name); - if (rc != EOK) - return NULL; - - u32 handle; - if ((handle = rtnl_stream_open (&s)) == ~0) - { - pool_put (nm->netnss, ns); - return NULL; - } - - rc = strcpy_s (ns->netns.name, sizeof (ns->netns.name), name); - if (rc != EOK) - return NULL; - ns->netns.addresses = 0; - ns->netns.links = 0; - ns->netns.neighbors = 0; - ns->netns.routes = 0; - ns->subscriber_count = 0; - ns->rtnl_handle = handle; - return ns; -} - -u32 -netns_open (char *name, netns_sub_t *sub) -{ - netns_main_t *nm = &netns_main; - netns_p *ns; - netns_handle_t *p; - if (!(ns = netns_get (name))) - return ~0; - - pool_get (nm->handles, p); - p->netns_index = ns - nm->netnss; - p->notify = sub->notify; - p->opaque = sub->opaque; - ns->subscriber_count++; - return p - nm->handles; -} - -netns_t * -netns_getns (u32 handle) -{ - netns_main_t *nm = &netns_main; - netns_handle_t *h = pool_elt_at_index (nm->handles, handle); - netns_p *ns = pool_elt_at_index (nm->netnss, h->netns_index); - return &ns->netns; -} - -void -netns_close (u32 handle) -{ - netns_main_t *nm = &netns_main; - netns_handle_t *h = pool_elt_at_index (nm->handles, handle); - netns_p *ns = pool_elt_at_index (nm->netnss, h->netns_index); - pool_put (h, nm->handles); - ns->subscriber_count--; - if (!ns->subscriber_count) - netns_destroy (ns); -} - -void -netns_callme (u32 handle, char del) -{ - netns_main_t *nm = &netns_main; - netns_handle_t *h = pool_elt_at_index (nm->handles, handle); - netns_p *ns = pool_elt_at_index (nm->netnss, h->netns_index); - u32 i = 0; - if (!h->notify) - return; - -#define _(pool, type) \ - pool_foreach_index (i, ns->netns.pool, { \ - h->notify (&ns->netns.pool[i], type, del ? NETNS_F_DEL : NETNS_F_ADD, \ - h->opaque); \ - }) \ - ; - - ns_object_foreach -#undef _ -} - -u8 * -format_ns_object (u8 *s, va_list *args) -{ - netns_type_t t = va_arg (*args, netns_type_t); - void *o = va_arg (*args, void *); - switch (t) - { - case NETNS_TYPE_ADDR: - return format (s, "addr %U", format_ns_addr, o); - case NETNS_TYPE_ROUTE: - return format (s, "route %U", format_ns_route, o); - case NETNS_TYPE_LINK: - return format (s, "link %U", format_ns_link, o); - case NETNS_TYPE_NEIGH: - return format (s, "neigh %U", format_ns_neigh, o); - } - return s; -} - -u8 * -format_ns_flags (u8 *s, va_list *args) -{ - u32 flags = va_arg (*args, u32); - if (flags & NETNS_F_ADD) - s = format (s, "add"); - else if (flags & NETNS_F_DEL) - s = format (s, "del"); - else - s = format (s, "mod"); - return s; -} - -clib_error_t * -netns_init (vlib_main_t *vm) -{ - netns_main_t *nm = &netns_main; - nm->netnss = 0; - nm->handles = 0; - return 0; -} - -VLIB_INIT_FUNCTION (netns_init); diff --git a/extras/router-plugin/devices/rtnetlink/netns.h b/extras/router-plugin/devices/rtnetlink/netns.h deleted file mode 100644 index b94356c3b..000000000 --- a/extras/router-plugin/devices/rtnetlink/netns.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * 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 NETNS_H_ -#define NETNS_H_ - -#include <vlib/vlib.h> - -#include <linux/netlink.h> -#include <linux/rtnetlink.h> -#include <net/if.h> -#include <sys/socket.h> - -#include "rtnl.h" - -/*include it for 'struct mpls_label'*/ -#include <linux/mpls.h> -/*so far depth is fixed, looking into ways to be dynamic*/ -#define MPLS_STACK_DEPTH 7 - -typedef struct -{ - struct ifinfomsg ifi; - u8 hwaddr[IFHWADDRLEN]; - u8 broadcast[IFHWADDRLEN]; - u8 ifname[IFNAMSIZ]; - u32 mtu; - u32 master; - u8 qdisc[IFNAMSIZ]; - struct rtnl_link_stats - stats; // This struct is big and only comes as a response to a request - f64 last_updated; -} ns_link_t; - -typedef struct -{ - struct rtmsg rtm; - u8 dst[16]; - u8 src[16]; - u8 via[16]; - u8 prefsrc[16]; - u32 iif; - u32 oif; - u32 table; - u8 gateway[16]; - u32 priority; - struct rta_cacheinfo cacheinfo; - struct mpls_label encap[MPLS_STACK_DEPTH]; - f64 last_updated; -} ns_route_t; - -typedef struct -{ - struct ifaddrmsg ifaddr; - u8 addr[16]; - u8 local[16]; - u8 label[IFNAMSIZ]; - u8 broadcast[16]; - u8 anycast[16]; - struct ifa_cacheinfo cacheinfo; - f64 last_updated; -} ns_addr_t; - -typedef struct -{ - struct ndmsg nd; - u8 dst[16]; - u8 lladdr[IFHWADDRLEN]; - u32 probes; - struct nda_cacheinfo cacheinfo; - f64 last_updated; -} ns_neigh_t; - -typedef struct -{ - char name[RTNL_NETNS_NAMELEN + 1]; - ns_link_t *links; - ns_route_t *routes; - ns_addr_t *addresses; - ns_neigh_t *neighbors; -} netns_t; - -typedef enum -{ - NETNS_TYPE_LINK, - NETNS_TYPE_ROUTE, - NETNS_TYPE_ADDR, - NETNS_TYPE_NEIGH, -} netns_type_t; - -// Flags used in notification functions call -#define NETNS_F_ADD 0x01 -#define NETNS_F_DEL 0x02 - -typedef struct -{ - void (*notify) (void *obj, netns_type_t type, u32 flags, uword opaque); - uword opaque; -} netns_sub_t; - -/* - * Subscribe for events related to the given namespace. - * When another subscriber already uses the namespace, - * this call will not trigger updates for already - * existing routes (This is to protect against - * synch. Vs asynch. issues). - */ -u32 netns_open (char *name, netns_sub_t *sub); - -/* - * Retrieves the namespace structure associated with a - * given namespace handler. - */ -netns_t *netns_getns (u32 handle); - -/* - * Terminates a subscriber session. - */ -void netns_close (u32 handle); - -/* - * Calls the callback associated with the handle - * for all existing objects with the flags - * set to (del?NETNS_F_DEL:NETNS_F_ADD). - */ -void netns_callme (u32 handle, char del); - -/* - * netns struct format functions. - * Taking the struct as single argument. - */ -u8 *format_ns_neigh (u8 *s, va_list *args); -u8 *format_ns_addr (u8 *s, va_list *args); -u8 *format_ns_route (u8 *s, va_list *args); -u8 *format_ns_link (u8 *s, va_list *args); - -u8 *format_ns_object (u8 *s, va_list *args); -u8 *format_ns_flags (u8 *s, va_list *args); - -#endif diff --git a/extras/router-plugin/devices/rtnetlink/rtnl.c b/extras/router-plugin/devices/rtnetlink/rtnl.c deleted file mode 100644 index 9c4757b17..000000000 --- a/extras/router-plugin/devices/rtnetlink/rtnl.c +++ /dev/null @@ -1,661 +0,0 @@ -/* - * 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. - */ - -#define _GNU_SOURCE -#include <sched.h> - -#include <vlib/unix/unix.h> -#include <vlib/vlib.h> -#include <vppinfra/error.h> - -#include <fcntl.h> -#include <float.h> -#include <linux/netlink.h> -#include <linux/rtnetlink.h> -#include <sys/socket.h> - -#include <errno.h> -#include <string.h> -#include <sys/types.h> -#include <sys/wait.h> - -#include "netns.h" -#include "rtnl.h" - -#undef DBL_MAX -#define DBL_MAX 1000000000.0 - -typedef enum -{ - RTNL_E_OPEN, - RTNL_E_CLOSE, - RTNL_E_READ, -} rtnl_event_t; - -typedef enum -{ - RTNL_S_INIT, - RTNL_S_SYNC, - RTNL_S_READY, -} rtnl_state_t; - -typedef enum -{ - RTNL_SS_OPENING, - RTNL_SS_LINK, - RTNL_SS_ADDR, - RTNL_SS_ROUTE4, - RTNL_SS_ROUTE6, - RTNL_SS_NEIGH, -} rtnl_sync_state_t; - -typedef struct -{ - rtnl_stream_t stream; - rtnl_state_t state; - rtnl_sync_state_t sync_state; - int ns_fd; - int rtnl_socket; - u32 unix_index; - u32 rtnl_seq; - f64 timeout; -} rtnl_ns_t; - -typedef struct -{ - f64 now; - rtnl_ns_t *streams; -} rtnl_main_t; - -static rtnl_main_t rtnl_main; -static vlib_node_registration_t rtnl_process_node; - -#define RTNL_BUFFSIZ 16384 -#define RTNL_DUMP_TIMEOUT 1 - -static inline u32 -grpmask (u32 g) -{ - ASSERT (g <= 31); - if (g) - { - return 1 << (g - 1); - } - else - return 0; -} - -u8 * -format_rtnl_nsname2path (u8 *s, va_list *args) -{ - char *nsname = va_arg (*args, char *); - if (!nsname || !strlen (nsname)) - { - return format (s, "/proc/self/ns/net"); - } - else if (strpbrk (nsname, "/") != NULL) - { - return format (s, "%s", nsname); - } - else - { - return format (s, "/var/run/netns/%s", nsname); - } -} - -static_always_inline void -rtnl_schedule_timeout (rtnl_ns_t *ns, f64 when) -{ - ns->timeout = when; -} - -static_always_inline void -rtnl_cancel_timeout (rtnl_ns_t *ns) -{ - ns->timeout = DBL_MAX; -} - -static clib_error_t * -rtnl_read_cb (struct clib_file *f) -{ - rtnl_main_t *rm = &rtnl_main; - vlib_main_t *vm = vlib_get_main (); - rtnl_ns_t *ns = &rm->streams[f->private_data]; - vlib_process_signal_event (vm, rtnl_process_node.index, RTNL_E_READ, - (uword) (ns - rm->streams)); - return 0; -} - -int -rtnl_dump_request (rtnl_ns_t *ns, int type, void *req, size_t len) -{ - struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK }; - struct nlmsghdr nlh = { - .nlmsg_len = NLMSG_LENGTH (len), - .nlmsg_type = type, - .nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, - .nlmsg_pid = 0, - .nlmsg_seq = ++ns->rtnl_seq, - }; - struct iovec iov[2] = { { .iov_base = &nlh, .iov_len = sizeof (nlh) }, - { .iov_base = req, .iov_len = len } }; - struct msghdr msg = { - .msg_name = &nladdr, - .msg_namelen = sizeof (nladdr), - .msg_iov = iov, - .msg_iovlen = 2, - }; - if (sendmsg (ns->rtnl_socket, &msg, 0) < 0) - { - clib_warning ("sendmsg error: %s", strerror (errno)); - return -1; - } - return 0; -} - -static void -rtnl_socket_close (rtnl_ns_t *ns) -{ - clib_file_del (&file_main, &file_main.file_pool[ns->unix_index]); - close (ns->rtnl_socket); -} - -struct rtnl_thread_exec -{ - int fd; - void *(*fn) (void *); - void *arg; - void **ret; -}; - -static void * -rtnl_exec_in_thread_fn (void *p) -{ - struct rtnl_thread_exec *ex = (struct rtnl_thread_exec *) p; - if (setns (ex->fd, 0)) - return (void *) ((uword) (-errno)); - - *ex->ret = ex->fn (ex->arg); - return NULL; -} - -static int -rtnl_exec_in_namespace_byfd (int fd, void *(*fn) (void *), void *arg, - void **ret) -{ - pthread_t thread; - void *thread_ret; - struct rtnl_thread_exec ex = { .fd = fd, .fn = fn, .arg = arg, .ret = ret }; - if (pthread_create (&thread, NULL, rtnl_exec_in_thread_fn, &ex)) - return -errno; - - if (pthread_join (thread, &thread_ret)) - return -errno; - - if (thread_ret) - return (int) ((uword) thread_ret); - - return 0; -} - -int -rtnl_exec_in_namespace (u32 stream_index, void *(*fn) (void *), void *arg, - void **ret) -{ - rtnl_main_t *rm = &rtnl_main; - if (pool_is_free_index (rm->streams, stream_index)) - return -EBADR; - - rtnl_ns_t *ns = pool_elt_at_index (rm->streams, stream_index); - return rtnl_exec_in_namespace_byfd (ns->ns_fd, fn, arg, ret); -} - -int -rtnl_exec_in_namespace_by_name (char *nsname, void *(*fn) (void *), void *arg, - void **ret) -{ - int fd; - u8 *s = format ((u8 *) 0, "%U", format_rtnl_nsname2path, nsname); - - if ((fd = open ((char *) s, O_RDONLY)) < 0) - { - vec_free (s); - return -errno; - } - - int r = rtnl_exec_in_namespace_byfd (fd, fn, arg, ret); - vec_free (s); - close (fd); - return r; -} - -/* this function is run by the second thread */ -static void * -rtnl_thread_fn (void *p) -{ - rtnl_ns_t *ns = (rtnl_ns_t *) p; - if (setns (ns->ns_fd, 0)) - { - clib_warning ("setns(%d, %d) error %d", ns->ns_fd, CLONE_NEWNET, errno); - return (void *) -1; - } - - if ((ns->rtnl_socket = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1) - { - clib_warning ("Cannot open socket"); - return (void *) -2; - } - - return NULL; -} - -static int -rtnl_socket_open (rtnl_ns_t *ns) -{ - rtnl_main_t *rm = &rtnl_main; - pthread_t thread; - void *thread_ret; - if (pthread_create (&thread, NULL, rtnl_thread_fn, ns)) - { - clib_warning ("Can't create opening thread"); - return -1; - } - - if (pthread_join (thread, &thread_ret)) - { - clib_warning ("Can't join opening thread"); - return -2; - } - - if (thread_ret) - { - clib_warning ("Could not open netlink socket"); - return -3; - } - - struct sockaddr_nl addr = { - .nl_family = AF_NETLINK, - .nl_pad = 0, - .nl_pid = 0, - /*add mpls message group*/ - .nl_groups = grpmask (RTNLGRP_LINK) | grpmask (RTNLGRP_IPV6_IFADDR) | - grpmask (RTNLGRP_IPV4_IFADDR) | grpmask (RTNLGRP_IPV4_ROUTE) | - grpmask (RTNLGRP_IPV6_ROUTE) | grpmask (RTNLGRP_NEIGH) | - grpmask (RTNLGRP_NOTIFY) /* | grpmask(RTNLGRP_MPLS_ROUTE)*/, - }; - - if (bind (ns->rtnl_socket, (struct sockaddr *) &addr, sizeof (addr))) - { - close (ns->rtnl_socket); - return -3; - } - - clib_file_t template = { 0 }; - template.read_function = rtnl_read_cb; - template.file_descriptor = ns->rtnl_socket; - template.private_data = (uword) (ns - rm->streams); - ns->unix_index = clib_file_add (&file_main, &template); - return 0; -} - -static int -rtnl_rcv_error (rtnl_ns_t *ns, struct nlmsghdr *hdr, int *error) -{ - struct nlmsgerr *err = NLMSG_DATA (hdr); - size_t datalen = hdr->nlmsg_len - NLMSG_ALIGN (sizeof (*hdr)); - if (datalen < sizeof (*err)) - return -1; - - *error = err->error; - return 0; -} - -static void -rtnl_sync_reset (rtnl_ns_t *ns) -{ - if (ns->sync_state == RTNL_SS_OPENING) - return; - - rtnl_socket_close (ns); - ns->sync_state = RTNL_SS_OPENING; -} - -static void -rtnl_sync_done (rtnl_ns_t *ns) -{ - rtnl_main_t *rm = &rtnl_main; - struct ifaddrmsg addrmsg; - struct rtmsg rtmsg; - struct ndmsg ndmsg; - switch (ns->sync_state) - { - case RTNL_SS_OPENING: - // Cannot happen here - break; - case RTNL_SS_LINK: - memset (&addrmsg, 0, sizeof (addrmsg)); - addrmsg.ifa_family = AF_UNSPEC; - if (rtnl_dump_request (ns, RTM_GETADDR, &addrmsg, sizeof (addrmsg))) - { - rtnl_sync_reset (ns); - rtnl_schedule_timeout (ns, rm->now + 1); - return; - } - rtnl_schedule_timeout (ns, rm->now + RTNL_DUMP_TIMEOUT); - ns->sync_state = RTNL_SS_ADDR; - break; - case RTNL_SS_ADDR: - case RTNL_SS_ROUTE4: - memset (&rtmsg, 0, sizeof (rtmsg)); - rtmsg.rtm_family = (ns->sync_state == RTNL_SS_ADDR) ? AF_INET : AF_INET6; - rtmsg.rtm_table = RT_TABLE_UNSPEC; - if (rtnl_dump_request (ns, RTM_GETROUTE, &rtmsg, sizeof (rtmsg))) - { - rtnl_sync_reset (ns); - rtnl_schedule_timeout (ns, rm->now + 1); - return; - } - rtnl_schedule_timeout (ns, rm->now + RTNL_DUMP_TIMEOUT); - ns->sync_state = - (ns->sync_state == RTNL_SS_ADDR) ? RTNL_SS_ROUTE4 : RTNL_SS_ROUTE6; - break; - case RTNL_SS_ROUTE6: - memset (&ndmsg, 0, sizeof (ndmsg)); - ndmsg.ndm_family = AF_UNSPEC; - if (rtnl_dump_request (ns, RTM_GETNEIGH, &ndmsg, sizeof (ndmsg))) - { - rtnl_sync_reset (ns); - rtnl_schedule_timeout (ns, rm->now + 1); - return; - } - rtnl_schedule_timeout (ns, rm->now + RTNL_DUMP_TIMEOUT); - ns->sync_state = RTNL_SS_NEIGH; - break; - case RTNL_SS_NEIGH: - ns->state = RTNL_S_READY; - ns->sync_state = 0; - rtnl_cancel_timeout (ns); - break; - } -} - -static void -rtnl_sync_timeout (rtnl_ns_t *ns) -{ - rtnl_main_t *rm = &rtnl_main; - struct ifinfomsg imsg = {}; - switch (ns->sync_state) - { - case RTNL_SS_OPENING: - if (rtnl_socket_open (ns)) - { - rtnl_schedule_timeout (ns, rm->now + 10); - return; - } - imsg.ifi_family = AF_UNSPEC; - if (rtnl_dump_request (ns, RTM_GETLINK, &imsg, sizeof (imsg))) - { - rtnl_sync_reset (ns); - rtnl_schedule_timeout (ns, rm->now + 10); - } - ns->sync_state = RTNL_SS_LINK; - rtnl_schedule_timeout (ns, rm->now + 2); - break; - case RTNL_SS_LINK: - case RTNL_SS_ADDR: - case RTNL_SS_ROUTE4: - case RTNL_SS_ROUTE6: - case RTNL_SS_NEIGH: - // Timeout happened while synchronizing - rtnl_sync_reset (ns); - rtnl_schedule_timeout (ns, rm->now + 1); - break; - } -} - -static int -rtnl_ns_recv (rtnl_ns_t *ns, struct nlmsghdr *hdr) -{ - rtnl_main_t *rm = &rtnl_main; - int ret, error = 0; - - if (ns->state == RTNL_S_SYNC && ((hdr->nlmsg_flags & RTM_F_NOTIFY) || - (hdr->nlmsg_seq != (ns->rtnl_seq)))) - { - clib_warning ( - "Received notification while in sync. Restart synchronization."); - rtnl_sync_reset (ns); - rtnl_schedule_timeout (ns, rm->now); - } - - switch (hdr->nlmsg_type) - { - case NLMSG_DONE: - rtnl_sync_done (ns); - break; - case NLMSG_ERROR: - if ((ret = rtnl_rcv_error (ns, hdr, &error))) - return ret; - break; - case RTM_NEWROUTE: - case RTM_DELROUTE: - case RTM_NEWLINK: - case RTM_DELLINK: - case RTM_NEWADDR: - case RTM_DELADDR: - case RTM_NEWNEIGH: - case RTM_DELNEIGH: - if (ns->stream.recv_message) - ns->stream.recv_message (hdr, ns->stream.opaque); - break; - default: - clib_warning ("Unknown rtnetlink type %d", hdr->nlmsg_type); - break; - } - return 0; -} - -static void -rtnl_process_open (rtnl_ns_t *ns) -{ - rtnl_main_t *rm = &rtnl_main; - if (ns->state != RTNL_S_INIT) - return; - - ns->state = RTNL_S_SYNC; - ns->sync_state = RTNL_SS_OPENING; - rtnl_schedule_timeout (ns, rm->now); -} - -static void -rtnl_process_close (rtnl_ns_t *ns) -{ - rtnl_main_t *rm = &rtnl_main; - if (ns->state == RTNL_S_INIT) - return; - - rtnl_socket_close (ns); - close (ns->ns_fd); - pool_put (rm->streams, ns); -} - -static int -rtnl_process_read (rtnl_ns_t *ns) -{ - uint8_t buff[RTNL_BUFFSIZ]; - ssize_t len; - struct nlmsghdr *hdr; - while (1) - { - if ((len = recv (ns->rtnl_socket, buff, RTNL_BUFFSIZ, MSG_DONTWAIT)) < 0) - { - if (errno != EAGAIN) - { - clib_warning ("rtnetlink recv error (%d) [%s]: %s", - ns->rtnl_socket, ns->stream.name, - strerror (errno)); - return -1; - } - return 0; - } - - for (hdr = (struct nlmsghdr *) buff; len > 0; - len -= NLMSG_ALIGN (hdr->nlmsg_len), - hdr = (struct nlmsghdr *) (((uint8_t *) hdr) + - NLMSG_ALIGN (hdr->nlmsg_len))) - { - if ((sizeof (*hdr) > (size_t) len) || - (hdr->nlmsg_len > (size_t) len)) - { - clib_warning ("rtnetlink buffer too small (%d Vs %d)", - (int) hdr->nlmsg_len, (int) len); - return -1; - } - if (rtnl_ns_recv (ns, hdr)) - return -1; - } - } - return 0; -} - -static void -rtnl_process_timeout (rtnl_ns_t *ns) -{ - switch (ns->state) - { - case RTNL_S_SYNC: - rtnl_sync_timeout (ns); - break; - case RTNL_S_INIT: - case RTNL_S_READY: - clib_warning ("Should not happen"); - break; - } -} - -static uword -rtnl_process (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame) -{ - rtnl_main_t *rm = &rtnl_main; - uword event_type; - uword *event_data = 0; - rm->now = vlib_time_now (vm); - f64 timeout = DBL_MAX; - rtnl_ns_t *ns; - - // Setting up - while (1) - { - vlib_process_wait_for_event_or_clock (vm, timeout - rm->now); - event_type = vlib_process_get_events (vm, &event_data); - rm->now = vlib_time_now (vm); - - if (event_type == ~0) - { // Clock event or no event - pool_foreach (ns, rm->streams, { - if (ns->timeout < rm->now) - { - ns->timeout = DBL_MAX; - rtnl_process_timeout (ns); - } - }) - ; - } - else - { - rtnl_ns_t *ns; - uword *d; - vec_foreach (d, event_data) - { - ns = &rm->streams[d[0]]; - switch (event_type) - { - case RTNL_E_CLOSE: - rtnl_process_close (ns); - break; - case RTNL_E_OPEN: - rtnl_process_open (ns); - break; - case RTNL_E_READ: - rtnl_process_read (ns); - break; - } - } - } - - vec_reset_length (event_data); - - timeout = DBL_MAX; - pool_foreach (ns, rm->streams, { - if (ns->timeout < timeout) - timeout = ns->timeout; - }) - ; - } - return frame->n_vectors; -} - -VLIB_REGISTER_NODE (rtnl_process_node, static) = { - .function = rtnl_process, - .name = "rtnl-process", - .type = VLIB_NODE_TYPE_PROCESS, -}; - -u32 -rtnl_stream_open (rtnl_stream_t *template) -{ - vlib_main_t *vm = vlib_get_main (); - rtnl_main_t *rm = &rtnl_main; - rtnl_ns_t *ns; - int fd; - u8 *s = format ((u8 *) 0, "%U", format_rtnl_nsname2path, template->name); - vec_add1 (s, 0); - - if ((fd = open ((char *) s, O_RDONLY)) < 0) - { - clib_unix_warning ("open stream %s: ", s); - vec_free (s); - return ~0; - } - - vec_free (s); - pool_get (rm->streams, ns); - ns->state = RTNL_S_INIT; - ns->ns_fd = fd; - ns->stream = *template; - vlib_process_signal_event (vm, rtnl_process_node.index, RTNL_E_OPEN, - (uword) (ns - rm->streams)); - return ns - rm->streams; -} - -void -rtnl_stream_close (u32 stream_index) -{ - vlib_main_t *vm = vlib_get_main (); - rtnl_main_t *rm = &rtnl_main; - ASSERT (!pool_is_free_index (rm->streams, stream_index)); - vlib_process_signal_event (vm, rtnl_process_node.index, RTNL_E_CLOSE, - stream_index); -} - -clib_error_t * -rtnl_init (vlib_main_t *vm) -{ - rtnl_main_t *rm = &rtnl_main; - rm->streams = 0; - return 0; -} - -VLIB_INIT_FUNCTION (rtnl_init); diff --git a/extras/router-plugin/devices/rtnetlink/rtnl.h b/extras/router-plugin/devices/rtnetlink/rtnl.h deleted file mode 100644 index 4c22b912a..000000000 --- a/extras/router-plugin/devices/rtnetlink/rtnl.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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 RTNL_H_ -#define RTNL_H_ - -#include <vlib/vlib.h> - -#include <linux/netlink.h> -#include <vppinfra/clib.h> - -typedef enum -{ - RTNL_ERR_UNKNOWN, -} rtnl_error_t; - -#define RTNL_NETNS_NAMELEN 128 - -/* - * RTNL stream implements an RTNL overlay - * for receiving continuous updates for a given namespace. - * When the stream is initially opened, dump requests are sent - * in order to retrieve the original state. - * handle_error is called any time synchronization cannot be - * achieved. When called, state is reset to its original state and - * new dump requests are sent. - */ - -typedef struct rtnl_stream_s -{ - char name[RTNL_NETNS_NAMELEN + 1]; - void (*recv_message) (struct nlmsghdr *hdr, uword opaque); - void (*error) (rtnl_error_t err, uword opaque); - uword opaque; -} rtnl_stream_t; - -u32 rtnl_stream_open (rtnl_stream_t *template); -void rtnl_stream_close (u32 handle); - -/* - * Executes a function in a synchronously executed thread in the - * given namespace. - * Returns 0 on success, and -errno on error. - */ -int rtnl_exec_in_namespace (u32 handle, void *(*fn) (void *), void *arg, - void **ret); -int rtnl_exec_in_namespace_by_name (char *nsname, void *(*fn) (void *), - void *arg, void **ret); - -u8 *format_rtnl_nsname2path (u8 *s, va_list *args); - -#endif diff --git a/extras/router-plugin/devices/rtnetlink/test.c b/extras/router-plugin/devices/rtnetlink/test.c deleted file mode 100644 index c969f6108..000000000 --- a/extras/router-plugin/devices/rtnetlink/test.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * 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 <librtnl/netns.h> - -#include <librtnl/mapper.h> -#include <vnet/fib/fib.h> -#include <vnet/fib/ip4_fib.h> -#include <vnet/fib/ip6_fib.h> -#include <vnet/ip/ip.h> -#include <vnet/plugin/plugin.h> - -u32 handles[10]; - -static void -test_notify (void *obj, netns_type_t type, u32 flags, uword opaque) -{ - u32 index = (u32) opaque; - const char *action = (flags & NETNS_F_ADD) ? "add" : - (flags & NETNS_F_DEL) ? "del" : - "mod"; - - switch (type) - { - case NETNS_TYPE_ADDR: - clib_warning ("%d: addr %s %U", index, action, format_ns_addr, - (ns_addr_t *) obj); - break; - case NETNS_TYPE_ROUTE: - clib_warning ("%d: route %s %U", index, action, format_ns_route, - (ns_route_t *) obj); - break; - case NETNS_TYPE_LINK: - clib_warning ("%d:link %s %U", index, action, format_ns_link, - (ns_link_t *) obj); - break; - case NETNS_TYPE_NEIGH: - clib_warning ("%d: neigh %s %U", index, action, format_ns_neigh, - (ns_neigh_t *) obj); - break; - } -} - -static clib_error_t * -test_enable_command_fn (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) -{ - char *nsname = 0; - u32 index; - if (!unformat (input, "%s", &nsname)) - { - return clib_error_return (0, "unknown input `%U'", format_unformat_error, - input); - } - if (!unformat (input, "%d", &index)) - { - return clib_error_return (0, "unknown input `%U'", format_unformat_error, - input); - } - - if (!strcmp (nsname, "default")) - nsname[0] = 0; - - netns_sub_t sub; - sub.notify = test_notify; - sub.opaque = index; - handles[index] = netns_open (nsname, &sub); - if (handles[index] == ~0) - { - return clib_error_create ("Could not open netns with name %s", nsname); - } - return 0; -} - -static clib_error_t * -test_disable_command_fn (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) -{ - u32 index; - if (!unformat (input, "%d", &index)) - { - return clib_error_return (0, "unknown input `%U'", format_unformat_error, - input); - } - - netns_close (handles[index]); - return 0; -} - -VLIB_CLI_COMMAND (rtnl_enable_command, static) = { - .path = "test netns enable", - .short_help = "test netns enable [<ns-name>|default] <index>", - .function = test_enable_command_fn, -}; - -VLIB_CLI_COMMAND (rtnl_disable_command, static) = { - .path = "test netns disable", - .short_help = "test rtnl disable <index>", - .function = test_disable_command_fn, -}; - -u32 mapper_indexes[10]; - -static clib_error_t * -mapper_ns_add_command_fn (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) -{ - u32 index; - char *nsname; - u32 table_id; - if (!unformat (input, "%d", &index)) - return clib_error_return (0, "invalid index `%U'", format_unformat_error, - input); - if (!unformat (input, "%s", &nsname)) - return clib_error_return (0, "invalid nsname `%U'", format_unformat_error, - input); - if (!unformat (input, "%d", &table_id)) - return clib_error_return (0, "invalid fib index `%U'", - format_unformat_error, input); - - if (!strcmp (nsname, "default")) - nsname[0] = 0; - - u32 fib4 = ip4_fib_index_from_table_id (table_id); - u32 fib6 = ip6_fib_index_from_table_id (table_id); - - if (mapper_add_ns (nsname, fib4, fib6, &mapper_indexes[index])) - return clib_error_return (0, "Could not add ns %s", nsname); - return 0; -} - -VLIB_CLI_COMMAND (mapper_ns_add_command, static) = { - .path = "test mapper ns add", - .short_help = "test mapper ns add <index> <nsname> <table-id>", - .function = mapper_ns_add_command_fn, -}; - -static clib_error_t * -mapper_ns_del_command_fn (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) -{ - u32 index; - if (!unformat (input, "%d", &index)) - return clib_error_return (0, "invalid index `%U'", format_unformat_error, - input); - - if (mapper_del_ns (mapper_indexes[index])) - return clib_error_return (0, "Could not del ns %d", index); - return 0; -} - -VLIB_CLI_COMMAND (mapper_ns_del_command, static) = { - .path = "test mapper ns delete", - .short_help = "test mapper ns delete <index>", - .function = mapper_ns_del_command_fn, -}; - -static clib_error_t * -mapper_iface_command_fn (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) -{ - u32 nsindex; - u32 ifindex; - u32 sw_if_index; - int del = 0; - if (!unformat (input, "%d", &nsindex)) - return clib_error_return (0, "invalid nsindex `%U'", format_unformat_error, - input); - if (!unformat (input, "%d", &ifindex)) - return clib_error_return (0, "invalid ifindex `%U'", format_unformat_error, - input); - if (!unformat (input, "%d", &sw_if_index)) - return clib_error_return (0, "invalid sw_if_index `%U'", - format_unformat_error, input); - if (unformat (input, "del")) - del = 1; - - clib_warning ("mapper_add_del %d %d %d %d", mapper_indexes[nsindex], ifindex, - sw_if_index, del); - - if (mapper_add_del (mapper_indexes[nsindex], ifindex, sw_if_index, del)) - return clib_error_return (0, "Could not add iface"); - return 0; -} - -VLIB_CLI_COMMAND (mapper_iface_command, static) = { - .path = "test mapper iface", - .short_help = - "test mapper iface <nsindex> <linux-ifindex> <sw_if_index> [del]", - .function = mapper_iface_command_fn, -}; - -/* *INDENT-OFF* */ -VLIB_PLUGIN_REGISTER () = { - //.version = VPP_BUILD_VER, FIXME - .description = "netlink", -}; -/* *INDENT-ON* */ diff --git a/extras/router-plugin/rtinject/tap_inject.c b/extras/router-plugin/rtinject/tap_inject.c deleted file mode 100644 index 7befb3862..000000000 --- a/extras/router-plugin/rtinject/tap_inject.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * Copyright 2016 Intel Corporation - * - * 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 "tap_inject.h" - -#include <vnet/fib/fib.h> -#include <vnet/ip/ip.h> -#include <vnet/ip/lookup.h> -#include <vnet/mfib/mfib_table.h> - -static tap_inject_main_t tap_inject_main; -extern dpo_type_t tap_inject_dpo_type; - -tap_inject_main_t * -tap_inject_get_main (void) -{ - return &tap_inject_main; -} - -void -tap_inject_insert_tap (u32 sw_if_index, u32 tap_fd, u32 tap_if_index) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - vec_validate_init_empty (im->sw_if_index_to_tap_fd, sw_if_index, ~0); - vec_validate_init_empty (im->sw_if_index_to_tap_if_index, sw_if_index, ~0); - - vec_validate_init_empty (im->tap_fd_to_sw_if_index, tap_fd, ~0); - - im->sw_if_index_to_tap_fd[sw_if_index] = tap_fd; - im->sw_if_index_to_tap_if_index[sw_if_index] = tap_if_index; - - im->tap_fd_to_sw_if_index[tap_fd] = sw_if_index; - - hash_set (im->tap_if_index_to_sw_if_index, tap_if_index, sw_if_index); -} - -void -tap_inject_delete_tap (u32 sw_if_index) -{ - tap_inject_main_t *im = tap_inject_get_main (); - u32 tap_fd = im->sw_if_index_to_tap_fd[sw_if_index]; - u32 tap_if_index = im->sw_if_index_to_tap_if_index[sw_if_index]; - - im->sw_if_index_to_tap_if_index[sw_if_index] = ~0; - im->sw_if_index_to_tap_fd[sw_if_index] = ~0; - im->tap_fd_to_sw_if_index[tap_fd] = ~0; - - hash_unset (im->tap_if_index_to_sw_if_index, tap_if_index); -} - -u32 -tap_inject_lookup_tap_fd (u32 sw_if_index) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - vec_validate_init_empty (im->sw_if_index_to_tap_fd, sw_if_index, ~0); - return im->sw_if_index_to_tap_fd[sw_if_index]; -} - -u32 -tap_inject_lookup_sw_if_index_from_tap_fd (u32 tap_fd) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - vec_validate_init_empty (im->tap_fd_to_sw_if_index, tap_fd, ~0); - return im->tap_fd_to_sw_if_index[tap_fd]; -} - -u32 -tap_inject_lookup_sw_if_index_from_tap_if_index (u32 tap_if_index) -{ - tap_inject_main_t *im = tap_inject_get_main (); - uword *sw_if_index; - - sw_if_index = hash_get (im->tap_if_index_to_sw_if_index, tap_if_index); - return sw_if_index ? *(u32 *) sw_if_index : ~0; -} - -/* *INDENT-OFF* */ -VLIB_PLUGIN_REGISTER () = { - // .version = VPP_BUILD_VER, FIXME - .description = "router", -}; -/* *INDENT-ON* */ - -static void -tap_inject_disable (void) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - im->flags &= ~TAP_INJECT_F_ENABLED; - - clib_warning ("tap-inject is not actually disabled."); -} - -static clib_error_t * -tap_inject_enable (void) -{ - vlib_main_t *vm = vlib_get_main (); - tap_inject_main_t *im = tap_inject_get_main (); - - if (tap_inject_is_enabled ()) - return 0; - - tap_inject_enable_netlink (); - - /* Only enable netlink? */ - if (im->flags & TAP_INJECT_F_CONFIG_NETLINK) - { - im->flags |= TAP_INJECT_F_ENABLED; - return 0; - } - - /* Register ARP and ICMP6 as neighbor nodes. */ - ethernet_register_input_type (vm, ETHERNET_TYPE_ARP, - im->neighbor_node_index); - ip6_register_protocol (IP_PROTOCOL_ICMP6, im->neighbor_node_index); - - /* Register remaining protocols. */ - ip4_register_protocol (IP_PROTOCOL_ICMP, im->tx_node_index); - - ip4_register_protocol (IP_PROTOCOL_OSPF, im->tx_node_index); - ip4_register_protocol (IP_PROTOCOL_TCP, im->tx_node_index); - ip4_register_protocol (IP_PROTOCOL_UDP, im->tx_node_index); - - ip6_register_protocol (IP_PROTOCOL_OSPF, im->tx_node_index); - ip6_register_protocol (IP_PROTOCOL_TCP, im->tx_node_index); - ip6_register_protocol (IP_PROTOCOL_UDP, im->tx_node_index); - - { - dpo_id_t dpo = DPO_INVALID; - - const mfib_prefix_t pfx_224_0_0_0 = { - .fp_len = 24, - .fp_proto = FIB_PROTOCOL_IP4, - .fp_grp_addr = - { - .ip4.as_u32 = clib_host_to_net_u32(0xe0000000), - }, - .fp_src_addr = - { - .ip4.as_u32 = 0, - }, - }; - - dpo_set (&dpo, tap_inject_dpo_type, DPO_PROTO_IP4, ~0); - - index_t repi = replicate_create (1, DPO_PROTO_IP4); - replicate_set_bucket (repi, 0, &dpo); - - mfib_table_entry_special_add (0, &pfx_224_0_0_0, MFIB_SOURCE_API, - MFIB_ENTRY_FLAG_ACCEPT_ALL_ITF, repi); - - dpo_reset (&dpo); - } - - im->flags |= TAP_INJECT_F_ENABLED; - - return 0; -} - -static uword -tap_inject_iface_isr (vlib_main_t *vm, vlib_node_runtime_t *node, - vlib_frame_t *f) -{ - tap_inject_main_t *im = tap_inject_get_main (); - vnet_hw_interface_t *hw; - u32 *hw_if_index; - clib_error_t *err = 0; - - vec_foreach (hw_if_index, im->interfaces_to_enable) - { - hw = vnet_get_hw_interface (vnet_get_main (), *hw_if_index); - - if (hw->hw_class_index == ethernet_hw_interface_class.index) - { - err = tap_inject_tap_connect (hw); - if (err) - break; - } - } - - vec_foreach (hw_if_index, im->interfaces_to_disable) - tap_inject_tap_disconnect (*hw_if_index); - - vec_free (im->interfaces_to_enable); - vec_free (im->interfaces_to_disable); - - return err ? -1 : 0; -} - -VLIB_REGISTER_NODE (tap_inject_iface_isr_node, static) = { - .function = tap_inject_iface_isr, - .name = "tap-inject-iface-isr", - .type = VLIB_NODE_TYPE_INPUT, - .state = VLIB_NODE_STATE_INTERRUPT, - .vector_size = sizeof (u32), -}; - -static clib_error_t * -tap_inject_interface_add_del (struct vnet_main_t *vnet_main, u32 hw_if_index, - u32 add) -{ - vlib_main_t *vm = vlib_get_main (); - tap_inject_main_t *im = tap_inject_get_main (); - - if (!tap_inject_is_config_enabled ()) - return 0; - - tap_inject_enable (); - - if (add) - vec_add1 (im->interfaces_to_enable, hw_if_index); - else - vec_add1 (im->interfaces_to_disable, hw_if_index); - - vlib_node_set_interrupt_pending (vm, tap_inject_iface_isr_node.index); - - return 0; -} - -VNET_HW_INTERFACE_ADD_DEL_FUNCTION (tap_inject_interface_add_del); - -static clib_error_t * -tap_inject_enable_disable_all_interfaces (int enable) -{ - vnet_main_t *vnet_main = vnet_get_main (); - tap_inject_main_t *im = tap_inject_get_main (); - vnet_hw_interface_t *interfaces; - vnet_hw_interface_t *hw; - u32 **indices; - - if (enable) - tap_inject_enable (); - else - tap_inject_disable (); - - /* Collect all the interface indices. */ - interfaces = vnet_main->interface_main.hw_interfaces; - indices = enable ? &im->interfaces_to_enable : &im->interfaces_to_disable; - pool_foreach (hw, interfaces, vec_add1 (*indices, hw - interfaces)) - ; - - if (tap_inject_iface_isr (vlib_get_main (), 0, 0)) - return clib_error_return (0, "tap-inject interface add del isr failed"); - - return 0; -} - -static clib_error_t * -tap_inject_cli (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - if (cmd->function_arg) - { - clib_error_t *err; - - if (tap_inject_is_config_disabled ()) - return clib_error_return ( - 0, "tap-inject is disabled in config, thus cannot be enabled."); - - /* Enable */ - err = tap_inject_enable_disable_all_interfaces (1); - if (err) - { - tap_inject_enable_disable_all_interfaces (0); - return err; - } - - im->flags |= TAP_INJECT_F_CONFIG_ENABLE; - } - else - { - /* Disable */ - tap_inject_enable_disable_all_interfaces (0); - im->flags &= ~TAP_INJECT_F_CONFIG_ENABLE; - } - - return 0; -} - -VLIB_CLI_COMMAND (tap_inject_enable_cmd, static) = { - .path = "enable tap-inject", - .short_help = "enable tap-inject", - .function = tap_inject_cli, - .function_arg = 1, -}; - -VLIB_CLI_COMMAND (tap_inject_disable_cmd, static) = { - .path = "disable tap-inject", - .short_help = "disable tap-inject", - .function = tap_inject_cli, - .function_arg = 0, -}; - -static clib_error_t * -show_tap_inject (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) -{ - vnet_main_t *vnet_main = vnet_get_main (); - tap_inject_main_t *im = tap_inject_get_main (); - u32 k, v; - - if (tap_inject_is_config_disabled ()) - { - vlib_cli_output (vm, "tap-inject is disabled in config.\n"); - return 0; - } - - if (!tap_inject_is_enabled ()) - { - vlib_cli_output (vm, "tap-inject is not enabled.\n"); - return 0; - } - - hash_foreach (k, v, im->tap_if_index_to_sw_if_index, { - vlib_cli_output (vm, "%U -> %U", format_vnet_sw_interface_name, vnet_main, - vnet_get_sw_interface (vnet_main, v), - format_tap_inject_tap_name, k); - }); - - return 0; -} - -VLIB_CLI_COMMAND (show_tap_inject_cmd, static) = { - .path = "show tap-inject", - .short_help = "show tap-inject", - .function = show_tap_inject, -}; - -static clib_error_t * -tap_inject_config (vlib_main_t *vm, unformat_input_t *input) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "enable")) - im->flags |= TAP_INJECT_F_CONFIG_ENABLE; - - else if (unformat (input, "disable")) - im->flags |= TAP_INJECT_F_CONFIG_DISABLE; - - else if (unformat (input, "netlink-only")) - im->flags |= TAP_INJECT_F_CONFIG_NETLINK; - - else - return clib_error_return (0, "syntax error `%U'", - format_unformat_error, input); - } - - if (tap_inject_is_config_enabled () && tap_inject_is_config_disabled ()) - return clib_error_return ( - 0, "tap-inject cannot be both enabled and disabled."); - - return 0; -} - -VLIB_CONFIG_FUNCTION (tap_inject_config, "tap-inject"); diff --git a/extras/router-plugin/rtinject/tap_inject.h b/extras/router-plugin/rtinject/tap_inject.h deleted file mode 100644 index 6226a0aad..000000000 --- a/extras/router-plugin/rtinject/tap_inject.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2016 Intel Corporation - * - * 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 _TAP_INJECT_H -#define _TAP_INJECT_H - -#include <vnet/ip/ip.h> -#include <vnet/plugin/plugin.h> - -#ifndef ETHER_ADDR_LEN -#define ETHER_ADDR_LEN 6 -#endif - -typedef struct -{ - /* - * tap-inject can be enabled or disabled in config file or during runtime. - * When disabled in config, it is not possible to enable during runtime. - * - * When the netlink-only option is used, netlink configuration is monitored - * and mirrored to the data plane but no traffic is passed between the host - * and the data plane. - */ -#define TAP_INJECT_F_CONFIG_ENABLE (1U << 0) -#define TAP_INJECT_F_CONFIG_DISABLE (1U << 1) -#define TAP_INJECT_F_CONFIG_NETLINK (1U << 2) -#define TAP_INJECT_F_ENABLED (1U << 3) - - u32 flags; - - u32 *sw_if_index_to_tap_fd; - u32 *sw_if_index_to_tap_if_index; - u32 *tap_fd_to_sw_if_index; - u32 *tap_if_index_to_sw_if_index; - - u32 *interfaces_to_enable; - u32 *interfaces_to_disable; - - u32 *rx_file_descriptors; - - u32 rx_node_index; - u32 tx_node_index; - u32 neighbor_node_index; - - u32 *rx_buffers; - -} tap_inject_main_t; - -tap_inject_main_t *tap_inject_get_main (void); - -void tap_inject_insert_tap (u32 sw_if_index, u32 tap_fd, u32 tap_if_index); -void tap_inject_delete_tap (u32 sw_if_index); - -u32 tap_inject_lookup_tap_fd (u32 sw_if_index); -u32 tap_inject_lookup_sw_if_index_from_tap_fd (u32 tap_fd); -u32 tap_inject_lookup_sw_if_index_from_tap_if_index (u32 tap_if_index); - -static inline int -tap_inject_is_enabled (void) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - return !!(im->flags & TAP_INJECT_F_ENABLED); -} - -static inline int -tap_inject_is_config_enabled (void) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - return !!(im->flags & TAP_INJECT_F_CONFIG_ENABLE); -} - -static inline int -tap_inject_is_config_disabled (void) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - return !!(im->flags & TAP_INJECT_F_CONFIG_DISABLE); -} - -/* Netlink */ - -void tap_inject_enable_netlink (void); - -/* Tap */ - -clib_error_t *tap_inject_tap_connect (vnet_hw_interface_t *hw); -clib_error_t *tap_inject_tap_disconnect (u32 sw_if_index); - -u8 *format_tap_inject_tap_name (u8 *s, va_list *args); - -#endif /* _TAP_INJECT_H */ diff --git a/extras/router-plugin/rtinject/tap_inject_netlink.c b/extras/router-plugin/rtinject/tap_inject_netlink.c deleted file mode 100644 index 92ffdc6e5..000000000 --- a/extras/router-plugin/rtinject/tap_inject_netlink.c +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright 2016 Intel Corporation - * - * 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 "../devices/rtnetlink/netns.h" -#include <arpa/inet.h> -#include <linux/mpls.h> -#include <vlibmemory/api.h> -#include <vnet/ethernet/arp.h> -#include <vnet/fib/fib.h> -#include <vnet/ip/ip6_neighbor.h> -#include <vnet/ip/lookup.h> -#include <vnet/mpls/packet.h> - -#include "tap_inject.h" - -static void -add_del_addr (ns_addr_t *a, int is_del) -{ - vlib_main_t *vm = vlib_get_main (); - u32 sw_if_index; - - sw_if_index = - tap_inject_lookup_sw_if_index_from_tap_if_index (a->ifaddr.ifa_index); - - if (sw_if_index == ~0) - return; - - if (a->ifaddr.ifa_family == AF_INET) - { - ip4_add_del_interface_address (vm, sw_if_index, - (ip4_address_t *) a->local, - a->ifaddr.ifa_prefixlen, is_del); - } - else if (a->ifaddr.ifa_family == AF_INET6) - { - ip6_add_del_interface_address (vm, sw_if_index, - (ip6_address_t *) a->addr, - a->ifaddr.ifa_prefixlen, is_del); - } -} - -struct set_flags_args -{ - u32 index; - u8 flags; -}; - -static void -set_flags_cb (struct set_flags_args *a) -{ - vnet_sw_interface_set_flags (vnet_get_main (), a->index, a->flags); -} - -static void -add_del_link (ns_link_t *l, int is_del) -{ - struct set_flags_args args = { ~0, 0 }; - vnet_sw_interface_t *sw; - u8 flags = 0; - u32 sw_if_index; - - sw_if_index = - tap_inject_lookup_sw_if_index_from_tap_if_index (l->ifi.ifi_index); - - if (sw_if_index == ~0) - return; - - sw = vnet_get_sw_interface (vnet_get_main (), sw_if_index); - - flags = sw->flags; - - if (l->ifi.ifi_flags & IFF_UP) - flags |= VNET_SW_INTERFACE_FLAG_ADMIN_UP; - else - flags &= ~VNET_SW_INTERFACE_FLAG_ADMIN_UP; - - args.index = sw_if_index; - args.flags = flags; - - vl_api_rpc_call_main_thread (set_flags_cb, (u8 *) &args, sizeof (args)); -} - -static void -add_del_neigh (ns_neigh_t *n, int is_del) -{ - vnet_main_t *vnet_main = vnet_get_main (); - vlib_main_t *vm = vlib_get_main (); - u32 sw_if_index; - - sw_if_index = - tap_inject_lookup_sw_if_index_from_tap_if_index (n->nd.ndm_ifindex); - - if (sw_if_index == ~0) - return; - - if (n->nd.ndm_family == AF_INET) - { - ethernet_arp_ip4_over_ethernet_address_t a; - - memset (&a, 0, sizeof (a)); - - clib_memcpy (&a.mac, n->lladdr, ETHER_ADDR_LEN); - clib_memcpy (&a.ip4, n->dst, sizeof (a.ip4)); - - if (n->nd.ndm_state & NUD_REACHABLE) - { - vnet_arp_set_ip4_over_ethernet (vnet_main, sw_if_index, &a, - IP_NEIGHBOR_FLAG_NO_FIB_ENTRY); - } - else if (n->nd.ndm_state & NUD_FAILED) - { - vnet_arp_unset_ip4_over_ethernet (vnet_main, sw_if_index, &a); - } - } - else if (n->nd.ndm_family == AF_INET6) - { - if (n->nd.ndm_state & NUD_REACHABLE) - { - - mac_address_t *mac1; - mac1 = malloc (sizeof (mac_address_t)); - memcpy (mac1, n->lladdr, ETHER_ADDR_LEN); - vnet_set_ip6_ethernet_neighbor ( - vm, sw_if_index, (ip6_address_t *) n->dst, (mac_address_t *) mac1, - IP_NEIGHBOR_FLAG_NONE); - } - else - vnet_unset_ip6_ethernet_neighbor (vm, sw_if_index, - (ip6_address_t *) n->dst); - } -} - -#define TAP_INJECT_HOST_ROUTE_TABLE_MAIN 254 - -static void -get_mpls_label_stack (struct mpls_label *addr, u32 *l) -{ - u32 entry = ntohl (addr[0].entry); - u32 label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT; - - for (int i = 1; label != 0; i++) - { - *l++ = label; - if (entry & MPLS_LS_S_MASK) - return; - entry = ntohl (addr[i].entry); - label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT; - } -} - -static void -add_del_route (ns_route_t *r, int is_del) -{ - u32 sw_if_index; - - sw_if_index = tap_inject_lookup_sw_if_index_from_tap_if_index (r->oif); - - if (sw_if_index == ~0) - return; - - if (r->rtm.rtm_family == AF_INET) - { - u32 stack[MPLS_STACK_DEPTH] = { 0 }; - - fib_prefix_t prefix; - ip_address_t nh; - - memset (&prefix, 0, sizeof (prefix)); - prefix.fp_len = r->rtm.rtm_dst_len; - prefix.fp_proto = FIB_PROTOCOL_IP4; - clib_memcpy (&prefix.fp_addr.ip4, r->dst, sizeof (prefix.fp_addr.ip4)); - get_mpls_label_stack (r->encap, stack); - memset (&nh, 0, sizeof (nh)); - clib_memcpy (&nh.ip4, r->gateway, sizeof (nh.ip4)); - if (*stack == 0) - fib_table_entry_path_add ( - 0, &prefix, FIB_SOURCE_API, FIB_ENTRY_FLAG_NONE, prefix.fp_proto, - &nh, sw_if_index, 0, 0 /* weight */, NULL, FIB_ROUTE_PATH_FLAG_NONE); - else - { - fib_route_path_t *rpaths = NULL, rpath; - memset (&rpath, 0, sizeof (rpath)); - rpath.frp_weight = 1; - rpath.frp_proto = DPO_PROTO_IP4; - clib_memcpy (&rpath.frp_addr.ip4, r->gateway, - sizeof (rpath.frp_addr.ip4)); - rpath.frp_sw_if_index = sw_if_index; - for (int i = 0; i < MPLS_STACK_DEPTH && stack[i] != 0; i++) - { - fib_mpls_label_t fib_label = { stack[i], 0, 0, 0 }; - vec_add1 (rpath.frp_label_stack, fib_label); - } - vec_add1 (rpaths, rpath); - fib_table_entry_path_add2 (0, &prefix, FIB_SOURCE_API, - FIB_ENTRY_FLAG_NONE, rpaths); - } - } - else if (r->rtm.rtm_family == AF_INET6) - { - fib_prefix_t prefix; - ip_address_t nh; - memset (&prefix, 0, sizeof (prefix)); - prefix.fp_len = r->rtm.rtm_dst_len; - prefix.fp_proto = FIB_PROTOCOL_IP6; - clib_memcpy (&prefix.fp_addr.ip6, r->dst, sizeof (prefix.fp_addr.ip6)); - memset (&nh, 0, sizeof (nh)); - clib_memcpy (&nh.ip6, r->gateway, sizeof (nh.ip6)); - fib_table_entry_path_add ( - 0, &prefix, FIB_SOURCE_API, FIB_ENTRY_FLAG_NONE, prefix.fp_proto, &nh, - sw_if_index, 0, 0 /* weight */, NULL, FIB_ROUTE_PATH_FLAG_NONE); - } - /* else if (r->rtm.rtm_family == AF_MPLS) - { - u32 dst_label; - get_mpls_label_stack((struct mpls_label*) r->dst, &dst_label); - struct rtvia *via = (struct rtvia*) r->via; - fib_prefix_t prefix; - fib_route_path_t *rpaths = NULL, rpath; - memset (&prefix, 0, sizeof (prefix)); - prefix.fp_len = 21; - prefix.fp_label = dst_label; - prefix.fp_proto = FIB_PROTOCOL_MPLS; - prefix.fp_payload_proto = DPO_PROTO_IP4; - memset(&rpath, 0, sizeof(rpath)); - clib_memcpy (&rpath.frp_addr.ip4, via->rtvia_addr, sizeof - (rpath.frp_addr.ip4)); rpath.frp_weight = 1; rpath.frp_proto = - DPO_PROTO_IP4; rpath.frp_fib_index = 0; rpath.frp_sw_if_index = - sw_if_index; vec_add1(rpaths, rpath); fib_table_entry_path_add2(0, - &prefix, FIB_SOURCE_API, FIB_ENTRY_FLAG_NONE, rpaths); - }*/ -} - -static void -netns_notify_cb (void *obj, netns_type_t type, u32 flags, uword opaque) -{ - if (type == NETNS_TYPE_ADDR) - add_del_addr ((ns_addr_t *) obj, flags & NETNS_F_DEL); - - else if (type == NETNS_TYPE_LINK) - add_del_link ((ns_link_t *) obj, flags & NETNS_F_DEL); - - else if (type == NETNS_TYPE_NEIGH) - add_del_neigh ((ns_neigh_t *) obj, flags & NETNS_F_DEL); - - else if (type == NETNS_TYPE_ROUTE) - add_del_route ((ns_route_t *) obj, flags & NETNS_F_DEL); -} - -void -tap_inject_enable_netlink (void) -{ - char nsname = 0; - netns_sub_t sub = { - .notify = netns_notify_cb, - .opaque = 0, - }; - - netns_open (&nsname, &sub); -} diff --git a/extras/router-plugin/rtinject/tap_inject_node.c b/extras/router-plugin/rtinject/tap_inject_node.c deleted file mode 100644 index b888b9223..000000000 --- a/extras/router-plugin/rtinject/tap_inject_node.c +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright 2016 Intel Corporation - * - * 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 "tap_inject.h" -#include <netinet/in.h> -#include <sys/uio.h> -#include <vnet/ethernet/arp_packet.h> - -vlib_node_registration_t tap_inject_rx_node; -vlib_node_registration_t tap_inject_tx_node; -vlib_node_registration_t tap_inject_neighbor_node; - -enum -{ - NEXT_NEIGHBOR_ARP, - NEXT_NEIGHBOR_ICMP6, -}; - -/** - * @brief Dynamically added tap_inject DPO type - */ -dpo_type_t tap_inject_dpo_type; - -static inline void -tap_inject_tap_send_buffer (int fd, vlib_buffer_t *b) -{ - struct iovec iov; - ssize_t n_bytes; - - iov.iov_base = vlib_buffer_get_current (b); - iov.iov_len = b->current_length; - - n_bytes = writev (fd, &iov, 1); - - if (n_bytes < 0) - clib_warning ("writev failed"); - else if (n_bytes < b->current_length || b->flags & VLIB_BUFFER_NEXT_PRESENT) - clib_warning ("buffer truncated"); -} - -static uword -tap_inject_tx (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *f) -{ - vlib_buffer_t *b; - u32 *pkts; - u32 fd; - u32 i; - - pkts = vlib_frame_vector_args (f); - - for (i = 0; i < f->n_vectors; ++i) - { - b = vlib_get_buffer (vm, pkts[i]); - - fd = tap_inject_lookup_tap_fd (vnet_buffer (b)->sw_if_index[VLIB_RX]); - if (fd == ~0) - continue; - - /* Re-wind the buffer to the start of the Ethernet header. */ - vlib_buffer_advance (b, -b->current_data); - - tap_inject_tap_send_buffer (fd, b); - } - - vlib_buffer_free (vm, pkts, f->n_vectors); - return f->n_vectors; -} - -VLIB_REGISTER_NODE (tap_inject_tx_node) = { - .function = tap_inject_tx, - .name = "tap-inject-tx", - .vector_size = sizeof (u32), - .type = VLIB_NODE_TYPE_INTERNAL, -}; - -static uword -tap_inject_neighbor (vlib_main_t *vm, vlib_node_runtime_t *node, - vlib_frame_t *f) -{ - vlib_buffer_t *b; - u32 *pkts; - u32 fd; - u32 i; - u32 bi; - u32 next_index = node->cached_next_index; - u32 next = ~0; - u32 n_left; - u32 *to_next; - - pkts = vlib_frame_vector_args (f); - - for (i = 0; i < f->n_vectors; ++i) - { - bi = pkts[i]; - b = vlib_get_buffer (vm, bi); - - fd = tap_inject_lookup_tap_fd (vnet_buffer (b)->sw_if_index[VLIB_RX]); - if (fd == ~0) - { - vlib_buffer_free (vm, &bi, 1); - continue; - } - - /* Re-wind the buffer to the start of the Ethernet header. */ - vlib_buffer_advance (b, -b->current_data); - - tap_inject_tap_send_buffer (fd, b); - - /* Send the buffer to a neighbor node too? */ - { - ethernet_header_t *eth = vlib_buffer_get_current (b); - u16 ether_type = htons (eth->type); - - if (ether_type == ETHERNET_TYPE_ARP) - { - ethernet_arp_header_t *arp = (void *) (eth + 1); - - if (arp->opcode == ntohs (ETHERNET_ARP_OPCODE_reply)) - next = NEXT_NEIGHBOR_ARP; - } - else if (ether_type == ETHERNET_TYPE_IP6) - { - ip6_header_t *ip = (void *) (eth + 1); - icmp46_header_t *icmp = (void *) (ip + 1); - - if (ip->protocol == IP_PROTOCOL_ICMP6 && - icmp->type == ICMP6_neighbor_advertisement) - next = NEXT_NEIGHBOR_ICMP6; - } - } - - if (next == ~0) - { - vlib_buffer_free (vm, &bi, 1); - continue; - } - - /* ARP and ICMP6 expect to start processing after the Ethernet header. */ - vlib_buffer_advance (b, sizeof (ethernet_header_t)); - - vlib_get_next_frame (vm, node, next_index, to_next, n_left); - - *(to_next++) = bi; - --n_left; - - vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, n_left, - bi, next); - vlib_put_next_frame (vm, node, next_index, n_left); - } - - return f->n_vectors; -} - -VLIB_REGISTER_NODE(tap_inject_neighbor_node) = { - .function = tap_inject_neighbor, - .name = "tap-inject-neighbor", - .vector_size = sizeof(u32), - .type = VLIB_NODE_TYPE_INTERNAL, - .n_next_nodes = 2, - .next_nodes = - { - [NEXT_NEIGHBOR_ARP] = "arp-input", - [NEXT_NEIGHBOR_ICMP6] = "icmp6-neighbor-solicitation", - }, -}; - -#define MTU 1500 -#define MTU_BUFFERS \ - ((MTU + vlib_buffer_get_default_data_size (vm) - 1) / \ - vlib_buffer_get_default_data_size (vm)) -#define NUM_BUFFERS_TO_ALLOC 32 - -static inline uword -tap_rx (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *f, int fd) -{ - tap_inject_main_t *im = tap_inject_get_main (); - u32 sw_if_index; - struct iovec iov[MTU_BUFFERS]; - u32 bi[MTU_BUFFERS]; - vlib_buffer_t *b; - ssize_t n_bytes; - ssize_t n_bytes_left; - u32 i, j; - - sw_if_index = tap_inject_lookup_sw_if_index_from_tap_fd (fd); - if (sw_if_index == ~0) - return 0; - - /* Allocate buffers in bulk when there are less than enough to rx an MTU. */ - if (vec_len (im->rx_buffers) < MTU_BUFFERS) - { - u32 len = vec_len (im->rx_buffers); - - u8 index = vlib_buffer_pool_get_default_for_numa (vm, 0); - len = vlib_buffer_alloc_from_pool (vm, &im->rx_buffers[len], - NUM_BUFFERS_TO_ALLOC, index); - - _vec_len (im->rx_buffers) += len; - - if (vec_len (im->rx_buffers) < MTU_BUFFERS) - { - clib_warning ("failed to allocate buffers"); - return 0; - } - } - - /* Fill buffers from the end of the list to make it easier to resize. */ - for (i = 0, j = vec_len (im->rx_buffers) - 1; i < MTU_BUFFERS; ++i, --j) - { - vlib_buffer_t *b; - - bi[i] = im->rx_buffers[j]; - - b = vlib_get_buffer (vm, bi[i]); - - iov[i].iov_base = b->data; - iov[i].iov_len = VLIB_BUFFER_DEFAULT_DATA_SIZE; - } - - n_bytes = readv (fd, iov, MTU_BUFFERS); - if (n_bytes < 0) - { - clib_warning ("readv failed"); - return 0; - } - - b = vlib_get_buffer (vm, bi[0]); - - vnet_buffer (b)->sw_if_index[VLIB_RX] = sw_if_index; - vnet_buffer (b)->sw_if_index[VLIB_TX] = sw_if_index; - - n_bytes_left = n_bytes - VLIB_BUFFER_DEFAULT_DATA_SIZE; - - if (n_bytes_left > 0) - { - b->total_length_not_including_first_buffer = n_bytes_left; - b->flags |= VLIB_BUFFER_TOTAL_LENGTH_VALID; - } - - b->current_length = n_bytes; - - /* If necessary, configure any remaining buffers in the chain. */ - for (i = 1; n_bytes_left > 0; - ++i, n_bytes_left -= VLIB_BUFFER_DEFAULT_DATA_SIZE) - { - b = vlib_get_buffer (vm, bi[i - 1]); - b->current_length = VLIB_BUFFER_DEFAULT_DATA_SIZE; - b->flags |= VLIB_BUFFER_NEXT_PRESENT; - b->next_buffer = bi[i]; - - b = vlib_get_buffer (vm, bi[i]); - b->current_length = n_bytes_left; - } - - _vec_len (im->rx_buffers) -= i; - - /* Get the packet to the output node. */ - { - vnet_hw_interface_t *hw; - vlib_frame_t *new_frame; - u32 *to_next; - - hw = vnet_get_hw_interface (vnet_get_main (), sw_if_index); - - new_frame = vlib_get_frame_to_node (vm, hw->output_node_index); - to_next = vlib_frame_vector_args (new_frame); - to_next[0] = bi[0]; - new_frame->n_vectors = 1; - - vlib_put_frame_to_node (vm, hw->output_node_index, new_frame); - } - - return 1; -} - -static uword -tap_inject_rx (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *f) -{ - tap_inject_main_t *im = tap_inject_get_main (); - u32 *fd; - uword count = 0; - - vec_foreach (fd, im->rx_file_descriptors) - { - if (tap_rx (vm, node, f, *fd) != 1) - { - clib_warning ("rx failed"); - count = 0; - break; - } - ++count; - } - - vec_free (im->rx_file_descriptors); - - return count; -} - -VLIB_REGISTER_NODE (tap_inject_rx_node) = { - .function = tap_inject_rx, - .name = "tap-inject-rx", - .type = VLIB_NODE_TYPE_INPUT, - .state = VLIB_NODE_STATE_INTERRUPT, - .vector_size = sizeof (u32), -}; - -/** - * @brief no-op lock function. - */ -static void -tap_inject_dpo_lock (dpo_id_t *dpo) -{ -} - -/** - * @brief no-op unlock function. - */ -static void -tap_inject_dpo_unlock (dpo_id_t *dpo) -{ -} - -u8 * -format_tap_inject_dpo (u8 *s, va_list *args) -{ - return (format (s, "tap-inject:[%d]", 0)); -} - -const static dpo_vft_t tap_inject_vft = { - .dv_lock = tap_inject_dpo_lock, - .dv_unlock = tap_inject_dpo_unlock, - .dv_format = format_tap_inject_dpo, -}; - -const static char *const tap_inject_tx_nodes[] = { - "tap-inject-tx", - NULL, -}; - -const static char *const *const tap_inject_nodes[DPO_PROTO_NUM] = { - [DPO_PROTO_IP4] = tap_inject_tx_nodes, - [DPO_PROTO_IP6] = tap_inject_tx_nodes, -}; - -static clib_error_t * -tap_inject_init (vlib_main_t *vm) -{ - tap_inject_main_t *im = tap_inject_get_main (); - - im->rx_node_index = tap_inject_rx_node.index; - im->tx_node_index = tap_inject_tx_node.index; - im->neighbor_node_index = tap_inject_neighbor_node.index; - - tap_inject_dpo_type = - dpo_register_new_type (&tap_inject_vft, tap_inject_nodes); - - vec_alloc (im->rx_buffers, NUM_BUFFERS_TO_ALLOC); - vec_reset_length (im->rx_buffers); - - return 0; -} - -VLIB_INIT_FUNCTION (tap_inject_init); diff --git a/extras/router-plugin/rtinject/tap_inject_tap.c b/extras/router-plugin/rtinject/tap_inject_tap.c deleted file mode 100644 index 44c494347..000000000 --- a/extras/router-plugin/rtinject/tap_inject_tap.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2016 Intel Corporation - * - * 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 "tap_inject.h" - -#include <fcntl.h> -#include <linux/if.h> -#include <linux/if_arp.h> -#include <linux/if_ether.h> -#include <linux/if_tun.h> -#include <netinet/in.h> -#include <sys/ioctl.h> -#include <sys/socket.h> -#include <vnet/unix/tuntap.h> - -#include <hicn/util/sstrncpy.h> -#include <vlib/unix/unix.h> - -static clib_error_t * -tap_inject_tap_read (clib_file_t *f) -{ - vlib_main_t *vm = vlib_get_main (); - tap_inject_main_t *im = tap_inject_get_main (); - - vec_add1 (im->rx_file_descriptors, f->file_descriptor); - - vlib_node_set_interrupt_pending (vm, im->rx_node_index); - - return 0; -} - -#define TAP_INJECT_TAP_BASE_NAME "vpp" - -clib_error_t * -tap_inject_tap_connect (vnet_hw_interface_t *hw) -{ - vnet_main_t *vnet_main = vnet_get_main (); - vnet_sw_interface_t *sw = vnet_get_sw_interface (vnet_main, hw->hw_if_index); - static const int one = 1; - int fd; - struct ifreq ifr; - clib_file_t template; - u32 tap_fd; - u8 *name; - - memset (&ifr, 0, sizeof (ifr)); - memset (&template, 0, sizeof (template)); - - ASSERT (hw->hw_if_index == sw->sw_if_index); - - /* Create the tap. */ - tap_fd = open ("/dev/net/tun", O_RDWR); - - if ((int) tap_fd < 0) - return clib_error_return (0, "failed to open tun device"); - - name = format (0, TAP_INJECT_TAP_BASE_NAME "%u%c", hw->hw_instance, 0); - - strcpy_s (ifr.ifr_name, IFNAMSIZ, (char *) name); - ifr.ifr_name[IFNAMSIZ - 1] = '\0'; - ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - - if (ioctl (tap_fd, TUNSETIFF, (void *) &ifr) < 0) - { - close (tap_fd); - return clib_error_return (0, "failed to create tap"); - } - - if (ioctl (tap_fd, FIONBIO, &one) < 0) - { - close (tap_fd); - return clib_error_return (0, "failed to set tap to non-blocking io"); - } - - /* Open a socket to configure the device. */ - fd = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL)); - - if (fd < 0) - { - close (tap_fd); - return clib_error_return (0, "failed to configure tap"); - } - - if (hw->hw_address) - clib_memcpy (ifr.ifr_hwaddr.sa_data, hw->hw_address, ETHER_ADDR_LEN); - - ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; - - /* Set the hardware address. */ - if (ioctl (fd, SIOCSIFHWADDR, &ifr) < 0) - { - close (tap_fd); - close (fd); - return clib_error_return (0, "failed to set tap hardware address"); - } - - /* Get the tap if index. */ - if (ioctl (fd, SIOCGIFINDEX, &ifr) < 0) - { - close (tap_fd); - close (fd); - return clib_error_return (0, "failed to procure tap if index"); - } - - close (fd); - - /* Get notified when the tap needs to be read. */ - template.read_function = tap_inject_tap_read; - template.file_descriptor = tap_fd; - - clib_file_add (&file_main, &template); - - tap_inject_insert_tap (sw->sw_if_index, tap_fd, ifr.ifr_ifindex); - - return 0; -} - -clib_error_t * -tap_inject_tap_disconnect (u32 sw_if_index) -{ - u32 tap_fd; - - tap_fd = tap_inject_lookup_tap_fd (sw_if_index); - if (tap_fd == ~0) - return clib_error_return (0, "failed to disconnect tap"); - - tap_inject_delete_tap (sw_if_index); - - close (tap_fd); - return 0; -} - -u8 * -format_tap_inject_tap_name (u8 *s, va_list *args) -{ - int fd; - struct ifreq ifr; - - fd = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL)); - - if (fd < 0) - return 0; - - memset (&ifr, 0, sizeof (ifr)); - - ifr.ifr_ifindex = va_arg (*args, u32); - - if (ioctl (fd, SIOCGIFNAME, &ifr) < 0) - { - close (fd); - return 0; - } - - close (fd); - - return format (s, "%s", ifr.ifr_name); -} diff --git a/extras/sysrepo/CMakeLists.txt b/extras/sysrepo/CMakeLists.txt deleted file mode 100644 index 803b2ae3e..000000000 --- a/extras/sysrepo/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -# 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. -cmake_minimum_required(VERSION 3.10) -project(sysrepo) - -list(APPEND MODULE_PATH - ${CMAKE_MODULE_PATH} - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules -) - -string(REPLACE ";" "|" MODULE_PATH "${MODULE_PATH}") - -include(ExternalProject) - -ExternalProject_Add(sysrepo - GIT_REPOSITORY https://github.com/sysrepo/sysrepo.git - GIT_TAG devel - GIT_SHALLOW TRUE - DEPENDS libyang - PREFIX ${CMAKE_CURRENT_BINARY_DIR}/sysrepo - PATCH_COMMAND git apply ${CMAKE_CURRENT_SOURCE_DIR}/sysrepo.patch - # Use the alternate list separator - # (https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#lists) - LIST_SEPARATOR | - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_MODULE_PATH=${MODULE_PATH} -DBUILD_EXAMPLES=OFF -DCMAKE_PREFIX_PATH=${DESTDIR}/usr - BUILD_COMMAND make package - INSTALL_COMMAND make DESTDIR=${DESTDIR} install -) - -if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) - include(Packager) - make_packages() -endif()
\ No newline at end of file diff --git a/extras/sysrepo/cmake/Modules/Packaging.cmake b/extras/sysrepo/cmake/Modules/Packaging.cmake deleted file mode 100644 index d7ef2c79c..000000000 --- a/extras/sysrepo/cmake/Modules/Packaging.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# 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. - -# Generate DEB / RPM packages - -###################### -# Packages section -###################### - -set(sysrepo_DESCRIPTION -"Sysrepo is a YANG-based configuration and operational datastore." - CACHE STRING "Description for deb/rpm package." -) - -set(sysrepo_DEB_DEPENDENCIES - "libyang (>= 1.0)" - CACHE STRING "Dependencies for deb/rpm package." -) - -set(sysrepo_RPM_DEPENDENCIES - "libyang >= 1.0" - CACHE STRING "Dependencies for deb/rpm package." -) diff --git a/extras/sysrepo/sysrepo.patch b/extras/sysrepo/sysrepo.patch deleted file mode 100644 index ef3fa510d..000000000 --- a/extras/sysrepo/sysrepo.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 181387b0..356bf32c 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -6,6 +6,11 @@ include(CheckSymbolExists) - include(CheckIncludeFile) - include(CheckStructHasMember) - -+set(CMAKE_MODULE_PATH -+ ${CMAKE_MODULE_PATH} -+ "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules" -+) -+ - # osx specific - set(CMAKE_MACOSX_RPATH TRUE) - -@@ -81,7 +86,7 @@ endif() - option(GEN_LANGUAGE_BINDINGS "Enable library bindings for different languages." OFF) - - option(GEN_CPP_BINDINGS "Enable C++ bindings." ON) --option(BUILD_CPP_EXAMPLES "Enable C++ example application compilation." ON) -+option(BUILD_CPP_EXAMPLES "Enable C++ example application compilation." OFF) - - option(GEN_PYTHON_BINDINGS "Enable Python bindings." ON) - option(ENABLE_PYTHON_TESTS "Enable Python tests." ON) -@@ -206,13 +211,13 @@ add_executable(sysrepo-plugind ${SYSREPOPLUGIND_SRC}) - target_link_libraries(sysrepo-plugind sysrepo dl) - - # installation --install(TARGETS sysrepo DESTINATION ${CMAKE_INSTALL_LIBDIR}) --install(FILES ${PROJECT_SOURCE_DIR}/src/sysrepo.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -+install(TARGETS sysrepo DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sysrepo) -+install(FILES ${PROJECT_SOURCE_DIR}/src/sysrepo.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT sysrepo) - install(FILES ${PROJECT_SOURCE_DIR}/src/utils/values.h ${PROJECT_SOURCE_DIR}/src/utils/xpath.h -- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sysrepo) --install(TARGETS sysrepoctl sysrepocfg sysrepo-plugind DESTINATION ${CMAKE_INSTALL_BINDIR}) -+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sysrepo COMPONENT sysrepo) -+install(TARGETS sysrepoctl sysrepocfg sysrepo-plugind DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT sysrepo) - --install(FILES "${PROJECT_BINARY_DIR}/libsysrepo.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -+install(FILES "${PROJECT_BINARY_DIR}/libsysrepo.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" COMPONENT sysrepo) - - # doxygen documentation - find_package(Doxygen) -@@ -266,3 +271,9 @@ add_custom_target(sr_clean - add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_MODULE_PATH}/uninstall.cmake") - add_custom_target(uninstall_with_repo "${CMAKE_COMMAND}" -P "${CMAKE_MODULE_PATH}/uninstall.cmake" - COMMAND rm -rf ${REPOSITORY_LOC}) -+ -+ include(Packaging) -+ if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) -+ include(Packager) -+ make_packages() -+ endif() -\ No newline at end of file |