summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Muscariello <muscariello@ieee.org>2022-08-11 18:30:53 +0200
committerLuca Muscariello <muscariello@ieee.org>2022-08-11 18:30:53 +0200
commit55343701359194493fbd9ff4950ac4f941bbdae3 (patch)
tree4583baaebd2a715d225054c845a36dc9f63c86ba
parentb9ed4b7dd6c2342bc87209d415b840d65ea5ccf0 (diff)
feat: drop sysrepo and netconf/yang support
Signed-off-by: Luca Muscariello <muscariello@ieee.org> Change-Id: I215af1b77a3f9da878f3894708f687a7e7ea03a2
-rw-r--r--CMakeLists.txt7
-rw-r--r--ctrl/sysrepo-plugins/AUTHORS5
-rw-r--r--ctrl/sysrepo-plugins/CMakeLists.txt69
-rw-r--r--ctrl/sysrepo-plugins/cmake/Modules/Packaging.cmake31
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/CMakeLists.txt61
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/CMakeLists.txt59
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.c112
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light.h25
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.c30
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/hicn_light_comm.h55
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.c181
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/model/hicn_model.h40
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.c16
-rw-r--r--ctrl/sysrepo-plugins/hicn-light/plugin/model/tlock.h29
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/CMakeLists.txt49
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/Doxyfile2494
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.c116
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_plugin.h45
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.c49
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/hicn_vpp_comm.h86
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.c621
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/ietf/ietf_interface.h22
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/mainpage.dox211
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.c875
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/model/hicn_model.h174
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.c16
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/plugin/model/tlock.h60
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/README.md32
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aface.xml7
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/apunt.xml6
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/aroute.xml13
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dface.xml3
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/dpunt.xml6
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/droute.xml6
-rwxr-xr-xctrl/sysrepo-plugins/hicn-plugin/test/netconf-test/test.py66
-rwxr-xr-xctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/Makefile2
-rw-r--r--ctrl/sysrepo-plugins/hicn-plugin/test/vapi-test/test.c258
-rw-r--r--ctrl/sysrepo-plugins/yang/hicn/hicn.yang247
-rw-r--r--ctrl/sysrepo-plugins/yang/hicn/rpc_call_samples.xml78
-rw-r--r--ctrl/sysrepo-plugins/yang/hicn/sysrepo_startup.xml11
-rw-r--r--ctrl/sysrepo-plugins/yang/ietf/iana-if-type@2014-05-08.yang1704
-rw-r--r--ctrl/sysrepo-plugins/yang/ietf/ietf-interfaces.yang1123
-rw-r--r--ctrl/sysrepo-plugins/yang/ietf/ietf-ip@2014-06-16.yang742
-rw-r--r--ctrl/sysrepo-plugins/yang/ietf/ietf-yang-types@2013-07-15.yang474
-rw-r--r--docs/source/control.md318
-rw-r--r--extras/CMakeLists.txt4
-rw-r--r--extras/libyang/CMakeLists.txt42
-rw-r--r--extras/libyang/cmake/Modules/Packaging.cmake33
-rw-r--r--extras/libyang/libyang.patch50
-rw-r--r--extras/router-plugin/.clang-format20
-rw-r--r--extras/router-plugin/CMakeLists.txt102
-rw-r--r--extras/router-plugin/cmake/Modules/Packaging.cmake31
-rw-r--r--extras/router-plugin/devices/rtnetlink/mapper.c289
-rw-r--r--extras/router-plugin/devices/rtnetlink/mapper.h36
-rw-r--r--extras/router-plugin/devices/rtnetlink/netns.c840
-rw-r--r--extras/router-plugin/devices/rtnetlink/netns.h152
-rw-r--r--extras/router-plugin/devices/rtnetlink/rtnl.c661
-rw-r--r--extras/router-plugin/devices/rtnetlink/rtnl.h64
-rw-r--r--extras/router-plugin/devices/rtnetlink/test.c210
-rw-r--r--extras/router-plugin/rtinject/tap_inject.c375
-rw-r--r--extras/router-plugin/rtinject/tap_inject.h106
-rw-r--r--extras/router-plugin/rtinject/tap_inject_netlink.c272
-rw-r--r--extras/router-plugin/rtinject/tap_inject_node.c376
-rw-r--r--extras/router-plugin/rtinject/tap_inject_tap.c170
-rw-r--r--extras/sysrepo/CMakeLists.txt43
-rw-r--r--extras/sysrepo/cmake/Modules/Packaging.cmake33
-rw-r--r--extras/sysrepo/sysrepo.patch55
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