Refactor folder structure of NTS, tot align with scp-oam/modeling repo.
Issue-ID: SIM-19
Change-Id: I21b0a5bb137e6fe9738f8d90d20a3109c1935a96
Signed-off-by: Alex Stancu <alexandru.stancu@highstreet-technologies.com>
+++ /dev/null
-docker build -t o-ran-sc_ntsim_manager -f ntsimulator/deploy/manager/Dockerfile .
+++ /dev/null
-docker build -t o-ran-sc_ntsim_oran -f ntsimulator/deploy/Dockerfile .
# add subdirectories
add_subdirectory(src)
-# Configure install file
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scripts/model-install.sh.in" "${PROJECT_BINARY_DIR}/model-install.sh" ESCAPE_QUOTES @ONLY)
-
# find sysrepoctl
if (NOT SYSREPOCTL_EXECUTABLE)
find_program(SYSREPOCTL_EXECUTABLE sysrepoctl)
+++ /dev/null
-################################################################################
-#
-# Copyright 2019 highstreet technologies GmbH and others
-#
-# 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.
-################################################################################
-FROM ubuntu:18.04
-
-MAINTAINER alexandru.stancu@highstreet-technologies.com
-LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
-
-#ARG BUILD_DATE
-#LABEL build-date=$BUILD_DATE
-
-ENV NETCONF_BASE=40000
-ENV NTS_IP="127.0.0.1"
-ENV SCRIPTS_DIR=/opt/dev/scripts
-ENV DOCKER_ENGINE_VERSION="1.40"
-ENV MODELS_IMAGE="ntsim_oran"
-
-RUN \
- apt-get update && apt-get install -y \
- # general tools
- git \
- cmake \
- build-essential \
- vim \
- supervisor \
- # libyang
- libpcre3-dev \
- pkg-config \
- # sysrepo
- libavl-dev \
- libev-dev \
- libprotobuf-c-dev \
- protobuf-c-compiler \
- # netopeer2 \
- libssh-dev \
- libssl-dev \
- # bindings
- swig \
- python-dev \
- libcurl4 \
- libcurl4-openssl-dev \
- curl \
- bc \
- python-setuptools \
- python-pip
-
-# add netconf user
-RUN \
- adduser --system netconf && \
- echo "netconf:netconf" | chpasswd
-
-# generate ssh keys for netconf user
-RUN \
- mkdir -p /home/netconf/.ssh && \
- ssh-keygen -A && \
- ssh-keygen -t dsa -P '' -f /home/netconf/.ssh/id_dsa && \
- cat /home/netconf/.ssh/id_dsa.pub > /home/netconf/.ssh/authorized_keys && \
-#echo "Host *\n StrictHostKeyChecking accept-new" >> /home/netconf/.ssh/config
- echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \
- mkdir -p /root/.ssh && \
- cat /home/netconf/.ssh/id_dsa.pub > /root/.ssh/authorized_keys
-
-# use /opt/dev as working directory
-RUN mkdir /opt/dev
-WORKDIR /opt/dev
-
-# libcjson
-RUN \
- git clone https://github.com/Melacon/cJSON.git && \
- cd cJSON && mkdir build && cd build && \
- cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DCMAKE_INSTALL_PREFIX=/usr .. && \
- make -j2 && \
- make install && \
- ldconfig
-
-# libyang
-RUN \
- git clone https://github.com/Melacon/libyang.git && \
- cd libyang && mkdir build && cd build && \
- cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
- make -j2 && \
- make install && \
- ldconfig
-
-# sysrepo
-RUN \
- git clone https://github.com/Melacon/sysrepo.git && \
- sed -i 's/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 3/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 6/g' ./sysrepo/src/common/sr_mem_mgmt.h && \
- cd sysrepo && mkdir build && cd build && \
- cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_TESTS=OFF -DREPOSITORY_LOC:PATH=/etc/sysrepo -DREQUEST_TIMEOUT=60 -DOPER_DATA_PROVIDE_TIMEOUT=60 .. && \
- make -j2 && \
- make install && \
- ldconfig
-
-# libnetconf2
-RUN \
- git clone https://github.com/Melacon/libnetconf2.git && \
- cd libnetconf2 && mkdir build && cd build && \
- cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
- make -j2 && \
- make install && \
- ldconfig
-
-# keystore
-RUN \
- cd /opt/dev && \
- git clone https://github.com/Melacon/Netopeer2.git && \
- cd /opt/dev && \
- cd Netopeer2 && \
- cd keystored && mkdir build && cd build && \
- cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
- make -j2 && \
- make install && \
- ldconfig
-
-# netopeer2
-RUN \
- cd /opt/dev && \
- cd Netopeer2/server && mkdir build && cd build && \
- cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
- make -j2 && \
- make install && \
- cd ../../cli && mkdir build && cd build && \
- cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
- make -j2 && \
- make install
-
-#NTSimulator Manager
-COPY . /opt/dev/ntsimulator
-RUN \
- cd /opt/dev && \
- cd ntsimulator && mkdir build && cd build && \
- cmake .. && \
- make -j2 && \
- make install
-
-COPY deploy/manager/supervisord.conf.manager /etc/supervisord.conf
-
-ENV EDITOR vim
-EXPOSE 830
-
-CMD ["sh", "-c", "/usr/bin/supervisord -c /etc/supervisord.conf"]
+++ /dev/null
----
-tag: 0.0.2
--- /dev/null
+cmake_minimum_required(VERSION 2.8.12)
+project(ntsimulator)
+set(PROJECT_DESC "Network Topology Simulator using sysrepo and netopeer2")
+include(GNUInstallDirs)
+
+# setup version
+set(NTSIMULATOR_MAJOR_VERSION 1)
+set(NTSIMULATOR_MINOR_VERSION 1)
+set(NTSIMULATOR_PATCH_VERSION 1)
+set(NTSIMULATOR_VERSION ${NTSIMULATOR_MAJOR_VERSION}.${NTSIMULATOR_MINOR_VERSION}.${NTSIMULATOR_PATCH_VERSION})
+set(NTSIMULATOR_SOVERSION ${NTSIMULATOR_MAJOR_VERSION}.${NTSIMULATOR_MINOR_VERSION})
+
+# osx specific
+set(CMAKE_MACOSX_RPATH TRUE)
+
+# set default build type if not specified by user
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE debug)
+endif()
+string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
+
+set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
+
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wpedantic -std=gnu11 -Wno-language-extension-token")
+if(CMAKE_COMPILER_IS_GNUCC)
+ # disable strict aliasing in GCC, since it produces false alarams in libev
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-strict-aliasing")
+endif()
+set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2")
+set(CMAKE_C_FLAGS_DEBUG "-g -O0")
+
+if(NOT UNIX)
+ message(FATAL_ERROR "Only Unix-like systems are supported.")
+endif()
+
+if(NOT DEFINED IS_DEVELOPER_CONFIGURATION)
+ if(CMAKE_BUILD_TYPE_LOWER MATCHES "debug" AND NOT CMAKE_BUILD_TYPE_LOWER MATCHES "^rel")
+ set(IS_DEVELOPER_CONFIGURATION true)
+ else()
+ set(IS_DEVELOPER_CONFIGURATION false)
+ endif()
+endif()
+
+# location of system repository
+if(${IS_DEVELOPER_CONFIGURATION})
+ set(REPOSITORY_LOC "${CMAKE_BINARY_DIR}/repository" CACHE PATH "System repository location, contains configuration schema and data files.")
+else()
+ set(REPOSITORY_LOC "/etc/sysrepo" CACHE PATH "System repository location, contains configuration schema and data files.")
+endif()
+
+# include custom Modules
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/")
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/inc")
+
+# find required libraries
+find_package(SYSREPO REQUIRED)
+include_directories(${SYSREPO_INCLUDE_DIR})
+
+# add subdirectories
+add_subdirectory(src)
+
+### NTS SPECIFIC ###
+# Configure install file for NTS Manager
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/deploy/nts-manager/model-install.sh.in" "${PROJECT_BINARY_DIR}/model-install.sh" ESCAPE_QUOTES @ONLY)
+### END NTS SPECIFIC ###
+
+# find sysrepoctl
+if (NOT SYSREPOCTL_EXECUTABLE)
+ find_program(SYSREPOCTL_EXECUTABLE sysrepoctl)
+endif()
+if (NOT SYSREPOCTL_EXECUTABLE)
+ message(FATAL_ERROR "Unable to find sysrepoctl, set SYSREPOCTL_EXECUTABLE manually.")
+endif()
+
+# find sysrepocfg
+if (NOT SYSREPOCFG_EXECUTABLE)
+ find_program(SYSREPOCFG_EXECUTABLE sysrepocfg)
+endif()
+if (NOT SYSREPOCFG_EXECUTABLE)
+ message(FATAL_ERROR "Unable to find sysrepocfg, set SYSREPOCFG_EXECUTABLE manually.")
+endif()
+
+# Command line options to be passed to `sysrepoctl` when working with modules
+# which should only be accessible by an administrator
+if (NOT SYSREPOCTL_ROOT_PERMS)
+ set(SYSREPOCTL_ROOT_PERMS "-o root:root -p 600")
+endif()
+
+install(CODE "
+ set(ENV{SYSREPOCTL} ${SYSREPOCTL_EXECUTABLE})
+ set(ENV{SYSREPOCFG} ${SYSREPOCFG_EXECUTABLE})
+ set(ENV{SYSREPOCTL_ROOT_PERMS} SYSREPOCTL_ROOT_PERMS)
+ execute_process(COMMAND ${PROJECT_BINARY_DIR}/model-install.sh)")
+
+
+
--- /dev/null
+FROM ubuntu:18.04 AS builder
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+ENV NETCONF_BASE=40000
+ENV NTS_IP="127.0.0.1"
+ENV SCRIPTS_DIR=/opt/dev/scripts
+ENV DOCKER_ENGINE_VERSION="1.40"
+ENV MODELS_IMAGE="ntsim_oran"
+
+RUN \
+ apt-get update && apt-get install -y \
+ # general tools
+ git \
+ cmake \
+ build-essential \
+ vim \
+ supervisor \
+ # libyang
+ libpcre3-dev \
+ pkg-config \
+ # sysrepo
+ libavl-dev \
+ libev-dev \
+ libprotobuf-c-dev \
+ protobuf-c-compiler \
+ # netopeer2 \
+ libssh-dev \
+ libssl-dev \
+ # bindings
+ swig \
+ python-dev \
+ libcurl4 \
+ libcurl4-openssl-dev \
+ curl \
+ bc \
+ python-setuptools \
+ python-pip
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh && \
+ ssh-keygen -A && \
+ ssh-keygen -t dsa -P '' -f /home/netconf/.ssh/id_dsa && \
+ cat /home/netconf/.ssh/id_dsa.pub > /home/netconf/.ssh/authorized_keys && \
+#echo "Host *\n StrictHostKeyChecking accept-new" >> /home/netconf/.ssh/config
+ echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \
+ mkdir -p /root/.ssh && \
+ cat /home/netconf/.ssh/id_dsa.pub > /root/.ssh/authorized_keys
+
+# use /opt/dev as working directory
+RUN mkdir /opt/dev
+WORKDIR /opt/dev
+
+# libcjson
+RUN \
+ git clone https://github.com/Melacon/cJSON.git && \
+ cd cJSON && mkdir build && cd build && \
+ cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DCMAKE_INSTALL_PREFIX=/usr .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libyang
+RUN \
+ git clone https://github.com/Melacon/libyang.git && \
+ cd libyang && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# sysrepo
+RUN \
+ git clone https://github.com/Melacon/sysrepo.git && \
+ sed -i 's/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 3/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 6/g' ./sysrepo/src/common/sr_mem_mgmt.h && \
+ cd sysrepo && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_TESTS=OFF -DREPOSITORY_LOC:PATH=/etc/sysrepo -DREQUEST_TIMEOUT=60 -DOPER_DATA_PROVIDE_TIMEOUT=60 .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libnetconf2
+RUN \
+ git clone https://github.com/Melacon/libnetconf2.git && \
+ cd libnetconf2 && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# keystore
+RUN \
+ git clone https://github.com/Melacon/Netopeer2.git && \
+ cd Netopeer2 && \
+ cd keystored && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# netopeer2
+RUN \
+ cd /opt/dev/Netopeer2/server && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ cd ../../cli && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install
+
+# NTSimulator Manager
+COPY . /opt/dev/ntsimulator
+COPY ./deploy/nts-manager/CMakeLists.txt /opt/dev/ntsimulator/CMakeLists.txt
+RUN \
+ cd /opt/dev && \
+ cd ntsimulator && mkdir build && cd build && \
+ cmake .. && \
+ make -j2 && \
+ make install
+
+
+# Second stage
+FROM ubuntu:18.04
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+ENV NETCONF_BASE=40000
+ENV NTS_IP="127.0.0.1"
+ENV SCRIPTS_DIR=/opt/dev/scripts
+ENV DOCKER_ENGINE_VERSION="1.40"
+ENV MODELS_IMAGE="ntsim_oran"
+
+RUN \
+ apt-get update && apt-get install -y supervisor
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh
+
+COPY --from=builder /home/netconf/.ssh /home/netconf/.ssh
+COPY --from=builder /usr/local/lib /usr/local/lib
+COPY --from=builder /usr/local/bin /usr/local/bin
+COPY --from=builder /usr/local/include /usr/local/include
+COPY --from=builder /usr/lib/libavl.so /usr/lib/libavl.so
+COPY --from=builder /usr/lib/libavl.so.1 /usr/lib/libavl.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so /usr/lib/x86_64-linux-gnu/libev.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so.4 /usr/lib/x86_64-linux-gnu/libev.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so.4 /usr/lib/x86_64-linux-gnu/libcurl.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so /usr/lib/x86_64-linux-gnu/libcurl.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1 /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so /usr/lib/x86_64-linux-gnu/libcjson_utils.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so.1 /usr/lib/x86_64-linux-gnu/libcjson.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so /usr/lib/x86_64-linux-gnu/libcjson.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf.so.10 /usr/lib/x86_64-linux-gnu/libprotobuf.so.10
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so /usr/lib/x86_64-linux-gnu/libprotobuf-c.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so.4 /usr/lib/x86_64-linux-gnu/libssh_threads.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so /usr/lib/x86_64-linux-gnu/libssh_threads.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so.4 /usr/lib/x86_64-linux-gnu/libssh.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so /usr/lib/x86_64-linux-gnu/libssh.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 /usr/lib/x86_64-linux-gnu/libnghttp2.so.14
+COPY --from=builder /usr/lib/x86_64-linux-gnu/librtmp.so.1 /usr/lib/x86_64-linux-gnu/librtmp.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libpsl.so.5 /usr/lib/x86_64-linux-gnu/libpsl.so.5
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.3 /usr/lib/x86_64-linux-gnu/libkrb5.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libsasl2.so.2 /usr/lib/x86_64-linux-gnu/libsasl2.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi.so.3 /usr/lib/x86_64-linux-gnu/libgssapi.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.26 /usr/lib/x86_64-linux-gnu/libkrb5.so.26
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libasn1.so.8 /usr/lib/x86_64-linux-gnu/libasn1.so.8
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libroken.so.18 /usr/lib/x86_64-linux-gnu/libroken.so.18
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libwind.so.0 /usr/lib/x86_64-linux-gnu/libwind.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimbase.so.1 /usr/lib/x86_64-linux-gnu/libheimbase.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhx509.so.5 /usr/lib/x86_64-linux-gnu/libhx509.so.5
+
+COPY --from=builder /lib/x86_64-linux-gnu/libkeyutils.so.1 /lib/x86_64-linux-gnu/libkeyutils.so.1
+COPY --from=builder /etc/sysrepo /etc/sysrepo
+COPY --from=builder /var/run /var/run
+
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub
+COPY --from=builder /usr/local/share/libnetconf2 /usr/local/share/libnetconf2
+
+RUN ldconfig
+
+COPY ./deploy/nts-manager/supervisord.conf /etc/supervisord.conf
+
+ARG BUILD_DATE
+LABEL build-date=$BUILD_DATE
+
+ENV EDITOR vim
+EXPOSE 830
+
+CMD ["sh", "-c", "/usr/bin/supervisord -c /etc/supervisord.conf"]
--- /dev/null
+---
+tag: 0.1.1
--- /dev/null
+#!/bin/bash
+
+set -eu -o pipefail
+
+shopt -s failglob
+
+: ${SYSREPOCTL:=sysrepoctl}
+: ${SYSREPOCFG:=sysrepocfg}
+: ${SYSREPOCTL_ROOT_PERMS:=-o root:root -p 600}
+: ${YANG_DIR:=@CMAKE_CURRENT_SOURCE_DIR@/yang/nts-manager}
+
+is_yang_module_installed() {
+ module=$1
+
+ $SYSREPOCTL -l | grep --count "^$module [^|]*|[^|]*| Installed .*$" > /dev/null
+}
+
+install_yang_module() {
+ module=$1
+
+ if ! is_yang_module_installed $module; then
+ echo "- Installing module $module..."
+ $SYSREPOCTL -i -g ${YANG_DIR}/$module.yang $SYSREPOCTL_ROOT_PERMS
+ else
+ echo "- Module $module already installed."
+ fi
+}
+
+uninstall_yang_module() {
+ module=$1
+
+ if is_yang_module_installed $module; then
+ echo "- Uninstalling module $module..."
+ $SYSREPOCTL -u -m $module
+ else
+ echo "- Module $module is not installed."
+ fi
+}
+
+enable_yang_module_feature() {
+ module=$1
+ feature=$2
+
+ if ! $SYSREPOCTL -l | grep --count "^$module [^|]*|[^|]*|[^|]*|[^|]*|[^|]*|[^|]*|.* $feature.*$" > /dev/null; then
+ echo "- Enabling feature $feature in $module..."
+ $SYSREPOCTL -m $module -e $feature
+ else
+ echo "- Feature $feature in $module already enabled."
+ fi
+}
+
+echo "- Installing network-topology-simulator..."
+install_yang_module network-topology-simulator
+
+echo "- Adding startup datastore in network-topology-simulator..."
+$SYSREPOCFG -d startup -i $YANG_DIR/network-topology-simulator.xml -f xml network-topology-simulator
--- /dev/null
+set(UTILS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/utils")
+
+include_directories(
+ "${PROJECT_SOURCE_DIR}/inc/utils"
+ "/usr/include"
+)
+
+# sources
+set (UTILS_SOURCES
+ ${UTILS_DIR}/utils.c
+)
+
+add_library(utils STATIC ${UTILS_SOURCES})
+set_property(TARGET utils PROPERTY COMPILE_FLAGS "-fPIC")
+target_link_libraries(utils m)
+target_link_libraries(utils cjson)
\ No newline at end of file
--- /dev/null
+FROM ubuntu:18.04 AS builder
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+RUN \
+ apt-get update && apt-get install -y \
+ # general tools
+ git \
+ cmake \
+ build-essential \
+ vim \
+ supervisor \
+ # libyang
+ libpcre3-dev \
+ pkg-config \
+ # sysrepo
+ libavl-dev \
+ libev-dev \
+ libprotobuf-c-dev \
+ protobuf-c-compiler \
+ # netopeer2 \
+ libssh-dev \
+ libssl-dev \
+ # bindings
+ swig \
+ python-dev \
+ libcurl4 \
+ libcurl4-openssl-dev \
+ curl \
+ bc
+
+RUN \
+ apt-get install -y \
+ python-setuptools \
+ python-pip
+
+# pyang dependencies
+RUN pip install rstr && \
+ pip install exrex && \
+ pip install ipaddress && \
+ pip install lxml
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh && \
+ ssh-keygen -A && \
+ ssh-keygen -t dsa -P '' -f /home/netconf/.ssh/id_dsa && \
+ cat /home/netconf/.ssh/id_dsa.pub > /home/netconf/.ssh/authorized_keys && \
+#echo "Host *\n StrictHostKeyChecking accept-new" >> /home/netconf/.ssh/config
+ echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \
+ mkdir -p /root/.ssh && \
+ cat /home/netconf/.ssh/id_dsa.pub > /root/.ssh/authorized_keys
+
+# use /opt/dev as working directory
+RUN mkdir /opt/dev
+WORKDIR /opt/dev
+
+# libcjson
+RUN \
+ git clone https://github.com/Melacon/cJSON.git && \
+ cd cJSON && mkdir build && cd build && \
+ cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DCMAKE_INSTALL_PREFIX=/usr .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libyang
+RUN \
+ git clone https://github.com/Melacon/libyang.git && \
+ cd libyang && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# sysrepo
+RUN \
+ git clone https://github.com/Melacon/sysrepo.git && \
+ sed -i 's/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 3/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 6/g' ./sysrepo/src/common/sr_mem_mgmt.h && \
+ cd sysrepo && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_TESTS=OFF -DREPOSITORY_LOC:PATH=/etc/sysrepo -DREQUEST_TIMEOUT=60 -DOPER_DATA_PROVIDE_TIMEOUT=60 .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libnetconf2
+RUN \
+ git clone https://github.com/Melacon/libnetconf2.git && \
+ cd libnetconf2 && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# keystore
+RUN \
+ git clone https://github.com/Melacon/Netopeer2.git && \
+ cd Netopeer2 && \
+ cd keystored && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# overwrite number of endpoints exposed by the NETCONF server
+COPY ./deploy/o-ran-sc/o-ran-ru/stock_config.xml /opt/dev/Netopeer2/server/stock_config.xml
+# netopeer2
+RUN \
+ cd /opt/dev/Netopeer2/server && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ cd ../../cli && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install
+
+# pyang
+RUN \
+ git clone https://github.com/Melacon/pyang.git && \
+ cd pyang && python setup.py build && python setup.py install
+
+# NTSimulator device
+COPY . /opt/dev/ntsimulator
+COPY ./deploy/o-ran-sc/o-ran-ru/CMakeLists.txt /opt/dev/ntsimulator/src/CMakeLists.txt
+RUN \
+ cd /opt/dev/ntsimulator && mkdir build && cd build && \
+ cmake .. && \
+ make -j2 && \
+ make install
+
+# Second stage
+FROM ubuntu:18.04
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+RUN \
+ apt-get update && apt-get install -y supervisor
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh
+
+COPY --from=builder /home/netconf/.ssh /home/netconf/.ssh
+COPY --from=builder /usr/local/lib /usr/local/lib
+COPY --from=builder /usr/local/bin /usr/local/bin
+COPY --from=builder /usr/local/include /usr/local/include
+COPY --from=builder /usr/lib/libavl.so /usr/lib/libavl.so
+COPY --from=builder /usr/lib/libavl.so.1 /usr/lib/libavl.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so /usr/lib/x86_64-linux-gnu/libev.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so.4 /usr/lib/x86_64-linux-gnu/libev.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so.4 /usr/lib/x86_64-linux-gnu/libcurl.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so /usr/lib/x86_64-linux-gnu/libcurl.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1 /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so /usr/lib/x86_64-linux-gnu/libcjson_utils.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so.1 /usr/lib/x86_64-linux-gnu/libcjson.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so /usr/lib/x86_64-linux-gnu/libcjson.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf.so.10 /usr/lib/x86_64-linux-gnu/libprotobuf.so.10
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so /usr/lib/x86_64-linux-gnu/libprotobuf-c.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so.4 /usr/lib/x86_64-linux-gnu/libssh_threads.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so /usr/lib/x86_64-linux-gnu/libssh_threads.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so.4 /usr/lib/x86_64-linux-gnu/libssh.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so /usr/lib/x86_64-linux-gnu/libssh.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 /usr/lib/x86_64-linux-gnu/libnghttp2.so.14
+COPY --from=builder /usr/lib/x86_64-linux-gnu/librtmp.so.1 /usr/lib/x86_64-linux-gnu/librtmp.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libpsl.so.5 /usr/lib/x86_64-linux-gnu/libpsl.so.5
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.3 /usr/lib/x86_64-linux-gnu/libkrb5.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libsasl2.so.2 /usr/lib/x86_64-linux-gnu/libsasl2.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi.so.3 /usr/lib/x86_64-linux-gnu/libgssapi.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.26 /usr/lib/x86_64-linux-gnu/libkrb5.so.26
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libasn1.so.8 /usr/lib/x86_64-linux-gnu/libasn1.so.8
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libroken.so.18 /usr/lib/x86_64-linux-gnu/libroken.so.18
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libwind.so.0 /usr/lib/x86_64-linux-gnu/libwind.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimbase.so.1 /usr/lib/x86_64-linux-gnu/libheimbase.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhx509.so.5 /usr/lib/x86_64-linux-gnu/libhx509.so.5
+
+COPY --from=builder /lib/x86_64-linux-gnu/libkeyutils.so.1 /lib/x86_64-linux-gnu/libkeyutils.so.1
+COPY --from=builder /etc/sysrepo /etc/sysrepo
+COPY --from=builder /var/run /var/run
+
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub
+COPY --from=builder /usr/local/share/libnetconf2 /usr/local/share/libnetconf2
+
+RUN ldconfig
+
+WORKDIR /tmp
+RUN apt-get install -yqq wget \
+ openssh-client
+
+RUN mkdir py_install && cd py_install && \
+ wget https://files.pythonhosted.org/packages/b9/9a/3e9da40ea28b8210dd6504d3fe9fe7e013b62bf45902b458d1cdc3c34ed9/ipaddress-1.0.23.tar.gz && \
+ tar -xvzf ipaddress-1.0.23.tar.gz && cd ipaddress-1.0.23 && \
+ python setup.py install
+
+COPY --from=builder /etc/ssh /etc/ssh
+COPY --from=builder /root/.ssh /root/.ssh
+
+WORKDIR /opt/dev
+# run only specific programs in this image
+COPY ./deploy/o-ran-sc/o-ran-ru/supervisord.conf /etc/supervisord.conf
+
+# tls configuratoin
+COPY ./deploy/tls /home/netconf/.ssh
+
+COPY --from=builder /opt/dev/sysrepo/build/examples/application_example /opt/dev/sysrepo/build/examples/application_example
+
+# YANG models and related scripts
+COPY ./yang/o-ran-sc/o-ran-ru /opt/dev/yang
+COPY ./yang/auto-load-yangs.sh /opt/dev/yang
+COPY ./deploy/o-ran-sc/o-ran-ru/sysrepo-configuration-load.sh /opt/dev/yang
+WORKDIR /opt/dev
+RUN \
+ cd yang && \
+ ./auto-load-yangs.sh
+
+ARG BUILD_DATE
+LABEL build-date=$BUILD_DATE
+
+ENV EDITOR vim
+EXPOSE 830-839
+
+CMD ["sh", "-c", "/usr/bin/supervisord -c /etc/supervisord.conf"]
--- /dev/null
+---
+tag: 0.1.1
--- /dev/null
+<netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server">
+ <listen>
+ <endpoint>
+ <name>MNG0</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>830</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG1</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>831</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG2</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>832</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG3</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>833</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG4</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>834</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG5</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>835</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG6</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>836</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ </listen>
+</netconf-server>
--- /dev/null
+[supervisord]
+nodaemon=true
+logfile=/var/log/supervisord.log
+loglevel=debug
+
+[program:sysrepod]
+command=/usr/local/bin/sysrepod -d
+autorestart=true
+redirect_stderr=true
+priority=1
+
+[program:sysrepo-plugind]
+command=/usr/local/bin/sysrepo-plugind -d
+autorestart=true
+redirect_stderr=true
+priority=2
+
+[program:netopeer2-server]
+command=/usr/local/bin/netopeer2-server -d
+autorestart=true
+redirect_stderr=true
+priority=3
+
+[program:enable-ssh]
+directory=/home/netconf/.ssh
+command=/home/netconf/.ssh/enable_ssh_key.sh
+startsecs=0
+autorestart=false
+redirect_stderr=false
+priority=4
+
+[program:enable-tls]
+directory=/home/netconf/.ssh
+command=/home/netconf/.ssh/enable_tls.sh
+startsecs=0
+autorestart=false
+redirect_stderr=false
+priority=5
+
+[program:sysrepo-config-load]
+directory=/opt/dev/yang
+command=/opt/dev/yang/sysrepo-configuration-load.sh
+autorestart=false
+redirect_stderr=true
+startretries=1
+priority=6
--- /dev/null
+#!/bin/bash
+
+sleep 20
+
+echo "Loading data into sysrepo..."
+
+: ${SYSREPOCFG:=sysrepocfg}
+
+pyang -f sample-xml-skeleton --sample-xml-list-entries 1 *.yang
+
+mapfile -t modelList < <(ls -S -lr *.xml | awk {'print $9'})
+
+if [ ${#modelList[@]} -eq 0 ]; then
+ echo "No modules present, nothing to do..."
+ exit 0
+else
+ for model in ${modelList[@]}
+ do
+ modelName=${model%".xml"}
+
+ echo "Importing data for module: $model"
+ $SYSREPOCFG --import=$model --format=xml $modelName
+
+ done
+fi
+
+echo "Finished loading data into sysrepo..."
+
+exit 0
\ No newline at end of file
--- /dev/null
+set(UTILS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/utils")
+
+include_directories(
+ "${PROJECT_SOURCE_DIR}/inc/utils"
+ "/usr/include"
+)
+
+add_subdirectory(o-ran-notifications)
+add_subdirectory(ves-messages)
+add_subdirectory(software-management-oran)
+
+# sources
+set (UTILS_SOURCES
+ ${UTILS_DIR}/utils.c
+)
+
+add_library(utils STATIC ${UTILS_SOURCES})
+set_property(TARGET utils PROPERTY COMPILE_FLAGS "-fPIC")
+target_link_libraries(utils m)
+target_link_libraries(utils cjson)
\ No newline at end of file
--- /dev/null
+FROM ubuntu:18.04 AS builder
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+RUN \
+ apt-get update && apt-get install -y \
+ # general tools
+ git \
+ cmake \
+ build-essential \
+ vim \
+ supervisor \
+ # libyang
+ libpcre3-dev \
+ pkg-config \
+ # sysrepo
+ libavl-dev \
+ libev-dev \
+ libprotobuf-c-dev \
+ protobuf-c-compiler \
+ # netopeer2 \
+ libssh-dev \
+ libssl-dev \
+ # bindings
+ swig \
+ python-dev \
+ libcurl4 \
+ libcurl4-openssl-dev \
+ curl \
+ bc
+
+RUN \
+ apt-get install -y \
+ python-setuptools \
+ python-pip
+
+# pyang dependencies
+RUN pip install rstr && \
+ pip install exrex && \
+ pip install ipaddress && \
+ pip install lxml
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh && \
+ ssh-keygen -A && \
+ ssh-keygen -t dsa -P '' -f /home/netconf/.ssh/id_dsa && \
+ cat /home/netconf/.ssh/id_dsa.pub > /home/netconf/.ssh/authorized_keys && \
+#echo "Host *\n StrictHostKeyChecking accept-new" >> /home/netconf/.ssh/config
+ echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \
+ mkdir -p /root/.ssh && \
+ cat /home/netconf/.ssh/id_dsa.pub > /root/.ssh/authorized_keys
+
+# use /opt/dev as working directory
+RUN mkdir /opt/dev
+WORKDIR /opt/dev
+
+# libcjson
+RUN \
+ git clone https://github.com/Melacon/cJSON.git && \
+ cd cJSON && mkdir build && cd build && \
+ cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DCMAKE_INSTALL_PREFIX=/usr .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libyang
+RUN \
+ git clone https://github.com/Melacon/libyang.git && \
+ cd libyang && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# sysrepo
+RUN \
+ git clone https://github.com/Melacon/sysrepo.git && \
+ sed -i 's/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 3/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 6/g' ./sysrepo/src/common/sr_mem_mgmt.h && \
+ cd sysrepo && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_TESTS=OFF -DREPOSITORY_LOC:PATH=/etc/sysrepo -DREQUEST_TIMEOUT=60 -DOPER_DATA_PROVIDE_TIMEOUT=60 .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libnetconf2
+RUN \
+ git clone https://github.com/Melacon/libnetconf2.git && \
+ cd libnetconf2 && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# keystore
+RUN \
+ git clone https://github.com/Melacon/Netopeer2.git && \
+ cd Netopeer2 && \
+ cd keystored && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# overwrite number of endpoints exposed by the NETCONF server
+COPY ./deploy/o-ran/ru-fh/stock_config.xml /opt/dev/Netopeer2/server/stock_config.xml
+# netopeer2
+RUN \
+ cd /opt/dev/Netopeer2/server && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ cd ../../cli && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install
+
+# pyang
+RUN \
+ git clone https://github.com/Melacon/pyang.git && \
+ cd pyang && python setup.py build && python setup.py install
+
+# NTSimulator device
+COPY . /opt/dev/ntsimulator
+COPY ./deploy/o-ran/ru-fh/CMakeLists.txt /opt/dev/ntsimulator/src/CMakeLists.txt
+RUN \
+ cd /opt/dev/ntsimulator && mkdir build && cd build && \
+ cmake .. && \
+ make -j2 && \
+ make install
+
+# Second stage
+FROM ubuntu:18.04
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+RUN \
+ apt-get update && apt-get install -y supervisor
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh
+
+COPY --from=builder /home/netconf/.ssh /home/netconf/.ssh
+COPY --from=builder /usr/local/lib /usr/local/lib
+COPY --from=builder /usr/local/bin /usr/local/bin
+COPY --from=builder /usr/local/include /usr/local/include
+COPY --from=builder /usr/lib/libavl.so /usr/lib/libavl.so
+COPY --from=builder /usr/lib/libavl.so.1 /usr/lib/libavl.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so /usr/lib/x86_64-linux-gnu/libev.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so.4 /usr/lib/x86_64-linux-gnu/libev.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so.4 /usr/lib/x86_64-linux-gnu/libcurl.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so /usr/lib/x86_64-linux-gnu/libcurl.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1 /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so /usr/lib/x86_64-linux-gnu/libcjson_utils.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so.1 /usr/lib/x86_64-linux-gnu/libcjson.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so /usr/lib/x86_64-linux-gnu/libcjson.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf.so.10 /usr/lib/x86_64-linux-gnu/libprotobuf.so.10
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so /usr/lib/x86_64-linux-gnu/libprotobuf-c.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so.4 /usr/lib/x86_64-linux-gnu/libssh_threads.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so /usr/lib/x86_64-linux-gnu/libssh_threads.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so.4 /usr/lib/x86_64-linux-gnu/libssh.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so /usr/lib/x86_64-linux-gnu/libssh.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 /usr/lib/x86_64-linux-gnu/libnghttp2.so.14
+COPY --from=builder /usr/lib/x86_64-linux-gnu/librtmp.so.1 /usr/lib/x86_64-linux-gnu/librtmp.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libpsl.so.5 /usr/lib/x86_64-linux-gnu/libpsl.so.5
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.3 /usr/lib/x86_64-linux-gnu/libkrb5.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libsasl2.so.2 /usr/lib/x86_64-linux-gnu/libsasl2.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi.so.3 /usr/lib/x86_64-linux-gnu/libgssapi.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.26 /usr/lib/x86_64-linux-gnu/libkrb5.so.26
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libasn1.so.8 /usr/lib/x86_64-linux-gnu/libasn1.so.8
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libroken.so.18 /usr/lib/x86_64-linux-gnu/libroken.so.18
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libwind.so.0 /usr/lib/x86_64-linux-gnu/libwind.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimbase.so.1 /usr/lib/x86_64-linux-gnu/libheimbase.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhx509.so.5 /usr/lib/x86_64-linux-gnu/libhx509.so.5
+
+COPY --from=builder /lib/x86_64-linux-gnu/libkeyutils.so.1 /lib/x86_64-linux-gnu/libkeyutils.so.1
+COPY --from=builder /etc/sysrepo /etc/sysrepo
+COPY --from=builder /var/run /var/run
+
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub
+COPY --from=builder /usr/local/share/libnetconf2 /usr/local/share/libnetconf2
+
+RUN ldconfig
+
+WORKDIR /tmp
+RUN apt-get install -yqq wget \
+ openssh-client
+
+RUN mkdir py_install && cd py_install && \
+ wget https://files.pythonhosted.org/packages/b9/9a/3e9da40ea28b8210dd6504d3fe9fe7e013b62bf45902b458d1cdc3c34ed9/ipaddress-1.0.23.tar.gz && \
+ tar -xvzf ipaddress-1.0.23.tar.gz && cd ipaddress-1.0.23 && \
+ python setup.py install
+
+COPY --from=builder /etc/ssh /etc/ssh
+COPY --from=builder /root/.ssh /root/.ssh
+
+WORKDIR /opt/dev
+# run only specific programs in this image
+COPY ./deploy/o-ran/ru-fh/supervisord.conf /etc/supervisord.conf
+
+# tls configuratoin
+COPY ./deploy/tls /home/netconf/.ssh
+
+COPY --from=builder /opt/dev/sysrepo/build/examples/application_example /opt/dev/sysrepo/build/examples/application_example
+
+# YANG models and related scripts
+COPY ./yang/o-ran/ru-fh /opt/dev/yang
+COPY ./yang/auto-load-yangs.sh /opt/dev/yang
+COPY ./yang/sysrepo-configuration-load.sh /opt/dev/yang
+
+# scripts for Software Management RPCs
+COPY ./deploy/o-ran/ru-fh/edit-config-after-activate.sh /opt/dev
+COPY ./deploy/o-ran/ru-fh/edit-config-after-activate.xml /opt/dev
+COPY ./deploy/o-ran/ru-fh/edit-config-after-download.sh /opt/dev
+COPY ./deploy/o-ran/ru-fh/edit-config-after-download.xml /opt/dev
+COPY ./deploy/o-ran/ru-fh/edit-config-demo-start.sh /opt/dev
+COPY ./deploy/o-ran/ru-fh/edit-config-demo-start.xml /opt/dev
+
+WORKDIR /opt/dev
+RUN \
+ cd yang && \
+ ./auto-load-yangs.sh
+
+ARG BUILD_DATE
+LABEL build-date=$BUILD_DATE
+
+ENV EDITOR vim
+EXPOSE 830-839
+
+CMD ["sh", "-c", "/usr/bin/supervisord -c /etc/supervisord.conf"]
--- /dev/null
+---
+tag: 0.1.1
--- /dev/null
+#!/bin/bash
+
+echo "Loading config data into the NETCONF Server..."
+
+result=$(netopeer2-cli <<-END
+ connect --host 127.0.0.1 --login netconf
+ user-rpc --content=/opt/dev/edit-config-after-activate.xml
+ disconnect
+END
+)
+
+echo $result
+echo "Done!"
+
+exit 0
--- /dev/null
+<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <target>
+ <running/>
+ </target>
+ <config>
+ <software-inventory xmlns="urn:o-ran:software-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="merge">
+ <software-slot>
+ <name>Slot1</name>
+ <active>false</active>
+ <running>false</running>
+ <access>READ_WRITE</access>
+ </software-slot>
+ <software-slot>
+ <name>Slot2</name>
+ <active>true</active>
+ <running>true</running>
+ <access>READ_ONLY</access>
+ </software-slot>
+</software-inventory>
+ </config>
+</edit-config>
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+echo "Loading config data into the NETCONF Server..."
+
+result=$(netopeer2-cli <<-END
+ connect --host 127.0.0.1 --login netconf
+ user-rpc --content=/opt/dev/edit-config-after-download.xml
+ disconnect
+END
+)
+
+echo $result
+echo "Done!"
+
+exit 0
\ No newline at end of file
--- /dev/null
+<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <target>
+ <running/>
+ </target>
+ <config>
+ <software-inventory xmlns="urn:o-ran:software-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="replace">
+ <software-slot>
+ <name>Slot1</name>
+ <status>VALID</status>
+ <active>true</active>
+ <running>true</running>
+ <access>READ_ONLY</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2020-01-23T14:04:23</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-5645-32</build-name>
+ <build-version>19.7.123</build-version>
+ <files>
+ <name>manifest-v1.0.1.cfg</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.1.swm</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+ <software-slot>
+ <name>Slot2</name>
+ <status>VALID</status>
+ <active>false</active>
+ <running>false</running>
+ <access>READ_WRITE</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2020-02-05T09:02:33</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-5790-44</build-name>
+ <build-version>19.7.123</build-version>
+ <files>
+ <name>manifest-v1.0.2.cfg</name>
+ <version>2349-5790-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.2.swm</name>
+ <version>2349-5790-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+</software-inventory>
+ </config>
+</edit-config>
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+echo "Loading config data into the NETCONF Server..."
+
+result=$(netopeer2-cli <<-END
+ connect --host 127.0.0.1 --login netconf
+ user-rpc --content=/opt/dev/edit-config-demo-start.xml
+ disconnect
+END
+)
+
+echo $result
+echo "Done!"
+
+exit 0
--- /dev/null
+<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <target>
+ <running/>
+ </target>
+ <config>
+ <performance-measurement-objects xmlns="urn:o-ran:performance-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="replace">
+ </performance-measurement-objects>
+ <hardware xmlns="urn:ietf:params:xml:ns:yang:ietf-hardware" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="merge">
+ <component>
+ <name>softwareSlot1</name>
+ <class xmlns:ianahw="urn:ietf:params:xml:ns:yang:iana-hardware">ianahw:storage-drive</class>
+ <physical-index>4207123</physical-index>
+ <description>ddesdvlkmvdfkvf</description>
+ <parent>xAxAxxAxA</parent>
+ <parent-rel-pos>33250247</parent-rel-pos>
+ <hardware-rev>12.2.3</hardware-rev>
+ <firmware-rev>7.1.2</firmware-rev>
+ <software-rev>19.7.123</software-rev>
+ <serial-num>35VU5</serial-num>
+ <mfg-name>xqxSSJSqJ</mfg-name>
+ <model-name>trttrttttrtrtttt</model-name>
+ <alias>btsWtsWstBFFWs</alias>
+ <asset-id>Q446g</asset-id>
+ <is-fru>true</is-fru>
+ <mfg-date>2020-02-06T06:06:32.3Z</mfg-date>
+ <uri>JJuaJa</uri>
+ <uri>6cc66c66cZc6</uri>
+ <uuid>d8de752d-a6ee-74ed-fdac-2c8a9c88afba</uuid>
+ <state>
+ <state-last-changed>2020-02-11T11:02:45.3Z</state-last-changed>
+ <admin-state>locked</admin-state>
+ <oper-state>disabled</oper-state>
+ <usage-state>active</usage-state>
+ <alarm-state>critical major minor warning</alarm-state>
+ <standby-state>hot-standby</standby-state>
+ </state>
+</component>
+<component>
+ <name>softwareSlot2</name>
+ <class xmlns:ianahw="urn:ietf:params:xml:ns:yang:iana-hardware">ianahw:storage-drive</class>
+ <physical-index>4207123</physical-index>
+ <description>ddesdvlkmvdfkvf</description>
+ <parent>xAxAxxAxA</parent>
+ <parent-rel-pos>12350247</parent-rel-pos>
+ <hardware-rev>12.2.3</hardware-rev>
+ <firmware-rev>7.1.2</firmware-rev>
+ <software-rev>19.2.33</software-rev>
+ <serial-num>35VU5</serial-num>
+ <mfg-name>xqxSSJSqJ</mfg-name>
+ <model-name>trttrttttrtrtttt</model-name>
+ <alias>btsWtsWstBFFWs</alias>
+ <asset-id>Q446g</asset-id>
+ <is-fru>true</is-fru>
+ <mfg-date>2020-02-06T06:06:32.3Z</mfg-date>
+ <uri>JJuaJa</uri>
+ <uri>6cc66c66cZc6</uri>
+ <uuid>d8de752d-a6ee-74ed-fdac-2c8a9c88afba</uuid>
+ <state>
+ <state-last-changed>2020-02-11T11:02:45.3Z</state-last-changed>
+ <admin-state>locked</admin-state>
+ <oper-state>disabled</oper-state>
+ <usage-state>active</usage-state>
+ <alarm-state>critical major minor warning</alarm-state>
+ <standby-state>hot-standby</standby-state>
+ </state>
+</component>
+</hardware>
+<software-inventory xmlns="urn:o-ran:software-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="replace">
+ <software-slot>
+ <name>Slot1</name>
+ <status>VALID</status>
+ <active>true</active>
+ <running>true</running>
+ <access>READ_ONLY</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2020-01-23T14:04:23</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-5645-32</build-name>
+ <build-version>19.7.123</build-version>
+ <files>
+ <name>manifest-v1.0.1.cfg</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.1.swm</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+ <software-slot>
+ <name>Slot2</name>
+ <status>VALID</status>
+ <active>false</active>
+ <running>false</running>
+ <access>READ_WRITE</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2019-07-02T14:04:23</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-2345-44</build-name>
+ <build-version>19.2.33</build-version>
+ <files>
+ <name>manifest-v1.0.0.cfg</name>
+ <version>2349-2345-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.0.swm</name>
+ <version>2349-2345-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+</software-inventory>
+</config>
+</edit-config>
\ No newline at end of file
--- /dev/null
+<netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server">
+ <listen>
+ <endpoint>
+ <name>MNG0</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>830</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG1</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>831</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG2</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>832</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG3</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>833</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG4</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>834</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG5</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>835</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG6</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>836</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ </listen>
+</netconf-server>
--- /dev/null
+[supervisord]
+nodaemon=true
+logfile=/var/log/supervisord.log
+loglevel=debug
+
+[program:sysrepod]
+command=/usr/local/bin/sysrepod -d
+autorestart=true
+redirect_stderr=true
+priority=1
+
+[program:sysrepo-plugind]
+command=/usr/local/bin/sysrepo-plugind -d
+autorestart=true
+redirect_stderr=true
+priority=2
+
+[program:netopeer2-server]
+command=/usr/local/bin/netopeer2-server -d
+autorestart=true
+redirect_stderr=true
+priority=3
+
+[program:enable-ssh]
+directory=/home/netconf/.ssh
+command=/home/netconf/.ssh/enable_ssh_key.sh
+startsecs=0
+autorestart=false
+redirect_stderr=false
+priority=4
+
+[program:enable-tls]
+directory=/home/netconf/.ssh
+command=/home/netconf/.ssh/enable_tls.sh
+startsecs=0
+autorestart=false
+redirect_stderr=false
+priority=5
+
+[program:sysrepo-config-load]
+directory=/opt/dev/yang
+command=/opt/dev/yang/sysrepo-configuration-load.sh
+autorestart=false
+redirect_stderr=true
+startretries=1
+priority=6
+
+[program:o-ran-notifications]
+command=/usr/local/bin/o-ran-notifications
+autorestart=true
+redirect_stderr=true
+priority=7
+
+[program:ves-heartbeat]
+command=/usr/local/bin/ves-heartbeat
+autorestart=true
+redirect_stderr=true
+priority=8
+
+[program:software-management]
+command=/usr/local/bin/software-management
+autorestart=true
+redirect_stderr=true
+priority=9
\ No newline at end of file
--- /dev/null
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEArD3TDHPAMT2Z84orK4lMlarbgooIUCcRZyLe+QM+8KY8Hn+m
+GaxPEOTSL3ywszqefB/Utm2hPKLHX684iRC14ID9WDGHxPjvoPArhgFhfV+qnPfx
+KTgxZC12uOj4u1V9y+SkTCocFbRfXVBGpojrBuDHXkDMDEWNvr8/52YCv7bGaiBw
+UHolcLCUbmtKILCG0RNJyTaJpXQdAeq5Z1SJotpbfYFFtAXB32hVoLug1dzl2tjG
+9sb1wq3QaDExcbC5w6P65qOkNoyym9ne6QlQagCqVDyFn3vcqkRaTjvZmxauCeUx
+XgJoXkyWcm0lM1KMHdoTArmchw2Dz0yHHSyDAQIDAQABAoIBAFH65y3hFhQZxuHU
+3LFPG0WNWgdq3YQQ5EaboVcSRW3TIYA+r3c+vS9ESgpSJeRYvUBFAkCGM50huRWA
+177dVkPyASNuB7on5h5K0dxpYdaDpzgpBv7ggRm2TfC66lB343UdcVnTHSTzggRv
+BgGT35GZgSsKWlRo8otcifUAZ8SJWRv6UxmX0zuvqSj3Q49ucevb57/CmYdgGxCP
+5flP/fqAdKen8/A03KPaltMERdo5xXbs5f7iBjcCZM1427Ta5cjiBW1zDWU4zbzn
+9+unwWPEuuPaGGtS6500qBJy6mIgM/9nYP9LKz9sJMEVJJZLZc1/2pjbJSNEiNJV
+SlJrvbECgYEA2u+xyfMsc2iE+dC8913NvIJnK7v7ixh5eu86SjJoYvflBvnEpPoX
+XxWlWUkO5jR1Hk2v1Z4U4hD/OR1kUwAqbN3MdCDd00hkhgVns8AgZtH0aXmdz+xq
+M0CKGXU7L/XS5mpiI8g24im1+1/rQjLxxUQjv0nfMxixa/ENmmtuisUCgYEAyWZ2
+CzAROlhxjaCbe+WopjG0AevCcrAPAeRgqIOm9sJ51q0cg2B6E/Zn27CvzKxsFzgM
++Vu3MoC0vVMK+Dc3o7idaQ0ew7kY5KO6LY8wDu5s3EGiS0KGJum2iIStE3lee/dd
+TDcX6yE/3WYvvNf7w7uN7nme3s3EuSDDKpPFCw0CgYAaSnpxI/CMk1qUnUpz8iHI
+p2g4SkS0uWWtK5k2W8NJTzeDlO7WWOoBkxneFPXjEx2VXALnhio/04aylyL7DKQL
+mr74mxHIU4MuzOtdHI9HiaLuH5qh42QFb5Sl5fwLkFuZK+FJJrvggN3HqAcaVf/O
+jpY0XGyfODHmInZdutT1eQKBgBAVoMPP+PBB8/+tnf1NICT1vzyQCZ2DNg+en6GV
+shXu/jAI70gGwnkpqq2+9KtR8egAz/hyPLVJ1iVwpmWgc08eBWRIafaTp8tK0Cmn
+T91BaWxFyaJdE72z2KIahoARp1wbK1ZU6BIdO66A5LsePLsrFXDAQdHleRqX5T5X
+QttZAoGASjKxjcbfZN9Q4jfvof2tacpdKbof9K03tbcRRkcBBF/mtiK4ER+c7dPU
+YcGJwOCT9YofASM0Qnq3F118Ic7DJAB332R1/UMY1krkCLAGfjAndL5XguFLpDQx
+c3dqfZ38rGw4GIr/rGJsPInYzkLxTfoYit/9dZjLLoxxvwlLTLs=
+-----END RSA PRIVATE KEY-----
--- /dev/null
+-----BEGIN CERTIFICATE-----
+MIID7TCCAtWgAwIBAgIJAMtE1NGAR5KoMA0GCSqGSIb3DQEBBQUAMIGMMQswCQYD
+VQQGEwJDWjEWMBQGA1UECAwNU291dGggTW9yYXZpYTENMAsGA1UEBwwEQnJubzEP
+MA0GA1UECgwGQ0VTTkVUMQwwCgYDVQQLDANUTUMxEzARBgNVBAMMCmV4YW1wbGUg
+Q0ExIjAgBgkqhkiG9w0BCQEWE2V4YW1wbGVjYUBsb2NhbGhvc3QwHhcNMTQwNzI0
+MTQxOTAyWhcNMjQwNzIxMTQxOTAyWjCBjDELMAkGA1UEBhMCQ1oxFjAUBgNVBAgM
+DVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoMBkNFU05FVDEM
+MAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJKoZIhvcNAQkB
+FhNleGFtcGxlY2FAbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEArD3TDHPAMT2Z84orK4lMlarbgooIUCcRZyLe+QM+8KY8Hn+mGaxPEOTS
+L3ywszqefB/Utm2hPKLHX684iRC14ID9WDGHxPjvoPArhgFhfV+qnPfxKTgxZC12
+uOj4u1V9y+SkTCocFbRfXVBGpojrBuDHXkDMDEWNvr8/52YCv7bGaiBwUHolcLCU
+bmtKILCG0RNJyTaJpXQdAeq5Z1SJotpbfYFFtAXB32hVoLug1dzl2tjG9sb1wq3Q
+aDExcbC5w6P65qOkNoyym9ne6QlQagCqVDyFn3vcqkRaTjvZmxauCeUxXgJoXkyW
+cm0lM1KMHdoTArmchw2Dz0yHHSyDAQIDAQABo1AwTjAdBgNVHQ4EFgQUc1YQIqjZ
+sHVwlea0AB4N+ilNI2gwHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gw
+DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAI/1KH60qnw9Xs2RGfi0/
+IKf5EynXt4bQX8EIyVKwSkYKe04zZxYfLIl/Q2HOPYoFmm3daj5ddr0ZS1i4p4fT
+UhstjsYWvXs3W/HhVmFUslakkn3PrswhP77fCk6eEJLxdfyJ1C7Uudq2m1isZbKi
+h+XF0mG1LxJaDMocSz4eAya7M5brwjy8DoOmA1TnLQFCVcpn+sCr7VC4wE/JqxyV
+hBCk/MuGqqM3B1j90bGFZ112ZOecyE0EDSr6IbiRBtmeNbEwOFjKXhNLYdxpBZ9D
+8A/368OckZkCrVLGuJNxK9UwCVTe8IhotHUqU9EqFDmxdV8oIdU/OzUwwNPA/Bd/
+9g==
+-----END CERTIFICATE-----
--- /dev/null
+91390D611074ACC8
--- /dev/null
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEBhMCQ1ox
+FjAUBgNVBAgMDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNVBAoM
+BkNFU05FVDEMMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIwIAYJ
+KoZIhvcNAQkBFhNleGFtcGxlY2FAbG9jYWxob3N0MB4XDTE1MDczMDA3MjcxOFoX
+DTM1MDcyNTA3MjcxOFowgYUxCzAJBgNVBAYTAkNaMRYwFAYDVQQIDA1Tb3V0aCBN
+b3JhdmlhMQ8wDQYDVQQKDAZDRVNORVQxDDAKBgNVBAsMA1RNQzEXMBUGA1UEAwwO
+ZXhhbXBsZSBjbGllbnQxJjAkBgkqhkiG9w0BCQEWF2V4YW1wbGVjbGllbnRAbG9j
+YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueCQaNQWoNmF
+K6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68SfFNaY06zZl8QB9W02nr5kWeeMY0
+VA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt6jAWZDzVfopwpJPAzRPxACDftIqF
+GagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4VDUHSNVbglc+u4UbEzNIFXMdEFsJ
+ZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuHQwAHdubuB07ObM2z01UhyEdDvEYG
+HwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UEFI1yTYw+xZ42HgFx3uGwApCImxhb
+j69GBYWFqwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVu
+U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUXGpLeLnh2cSDARAV
+A7KrBxGYpo8wHwYDVR0jBBgwFoAUc1YQIqjZsHVwlea0AB4N+ilNI2gwDQYJKoZI
+hvcNAQELBQADggEBAJPV3RTXFRtNyOU4rjPpYeBAIAFp2aqGc4t2J1c7oPp/1n+l
+ZvjnwtlJpZHxMM783e2ryDQ6dkvXDf8kpwKlg3U3mkJ3xKkDdWrM4QwghXdCN519
+aa9qmu0zdFL+jUAaWlQ5tsceOrvbusCcbMqiFGk/QfpHqPv52SVWbYyUx7IX7DE+
+UjgsLHycfV/tlcx4ZE6soTzl9VdgSL/zmzG3rjsr58J80rXckLgBhvijgBlIAJvW
+fC7D0vaouvBInSFXymdPVoUDZ30cdGLf+hI/i/TfsEMOinLrXVdkSGNo6FXAHKSv
+XeB9oFKSzhQ7OPyRyqvEPycUSw/qD6FVr80oDDc=
+-----END CERTIFICATE-----
--- /dev/null
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAueCQaNQWoNmFK6LKu1p8U8ZWdWg/PvDdLsJyzfzl/Qw4UA68
+SfFNaY06zZl8QB9W02nr5kWeeMY0VA3adrPgOlvfx3oWlFbkETnMaN4OT3WTQ0Wt
+6jAWZDzVfopwpJPAzRPxACDftIqFGagYcF32hZlVNqqnVdbXh0S0EViweqp/dbG4
+VDUHSNVbglc+u4UbEzNIFXMdEFsJZpkynOmSiTsIATqIhb+2srkVgLwhfkC2qkuH
+QwAHdubuB07ObM2z01UhyEdDvEYGHwtYAGDBL2TAcsI0oGeVkRyuOkV0QY0UN7UE
+FI1yTYw+xZ42HgFx3uGwApCImxhbj69GBYWFqwIDAQABAoIBAQCZN9kR8DGu6V7y
+t0Ax68asL8O5B/OKaHWKQ9LqpVrXmikZJOxkbzoGldow/CIFoU+q+Zbwu9aDa65a
+0wiP7Hoa4Py3q5XNNUrOQDyU/OYC7cI0I83WS0lJ2zOJGYj8wKae5Z81IeQFKGHK
+4lsy1OGPAvPRGh7RjUUgRavA2MCwe07rWRuDb/OJFe4Oh56UMEjwMiNBtMNtncog
+j1vr/qgRJdf9tf0zlJmLvUJ9+HSFFV9I/97LJyFhb95gAfHkjdVroLVgT3Cho+4P
+WtZaKCIGD0OwfOG2nLV4leXvRUk62/LMlB8NI9+JF7Xm+HCKbaWHNWC7mvWSLV58
+Zl4AbUWRAoGBANyJ6SFHFRHSPDY026SsdMzXR0eUxBAK7G70oSBKKhY+O1j0ocLE
+jI2krHJBhHbLlnvJVyMUaCUOTS5m0uDw9hgSsAqeSL3hL38kxVZw+KNG9Ouno1Fl
+KnE/xXHlPQyeGs/P8nAMzHZxQtEsQdQayJEhK2XXHTsy7Q3MxDisfVJ1AoGBANfD
+34gB+OMx6pwj7zk3qWbYXSX8xjCZMR0ciko+h4xeMP2N8B0oyoqC+v1ABMAtJ3wG
+sGZd0hV9gwM7OUM3SEwkn6oeg1GemWLcn4rlSmTnZc4aeVwrEWlnSNFX3s4g9l4u
+k8Ugu4MVJYqH8HuDQ5Ggl6/QAwPzMSEdCW0O+jOfAoGAIBRbegC5+t6m7Yegz4Ja
+dxV1g98K6f58x+MDsQu4tYWV4mmrQgaPH2dtwizvlMwmdpkh+LNWNtWuumowkJHc
+akIFo3XExQIFg6wYnGtQb4e5xrGa2xMpKlIJaXjb+YLiCYqJDG2ALFZrTrvuU2kV
+9a5qfqTc1qigvNolTM0iaaUCgYApmrZWhnLUdEKV2wP813PNxfioI4afxlpHD8LG
+sCn48gymR6E+Lihn7vuwq5B+8fYEH1ISWxLwW+RQUjIneNhy/jjfV8TgjyFqg7or
+0Sy4KjpiNI6kLBXOakELRNNMkeSPopGR2E7v5rr3bGD9oAD+aqX1G7oJH/KgPPYd
+Vl7+ZwKBgQDcHyWYrimjyUgKaQD2GmoO9wdcJYQ59ke9K+OuGlp4ti5arsi7N1tP
+B4f09aeELM2ASIuk8Q/Mx0jQFnm8lzRFXdewgvdPoZW/7VufM9O7dGPOc41cm2Dh
+yrTcXx/VmUBb+/fnXVEgCv7gylp/wtdTGHQBQJHR81jFBz0lnLj+gg==
+-----END RSA PRIVATE KEY-----
--- /dev/null
+#! /bin/bash
+################################################################################
+#
+# Copyright 2020 highstreet technologies GmbH and others
+#
+# 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.
+
+################################################################################
+# Script to enable SSH publicKey authentication in the localhost NETCONF server
+
+sleep 5
+
+SSH_PUB_KEY="$(cat /home/netconf/.ssh/id_dsa.pub| awk '{print $2}')"
+
+echo '<system xmlns="urn:ietf:params:xml:ns:yang:ietf-system"><authentication><user><name>netconf</name><authorized-key><name>ssh_key</name><algorithm>ssh-dss</algorithm>' >> load_auth_pubkey.xml
+echo '<key-data>'"$SSH_PUB_KEY"'</key-data></authorized-key></user></authentication></system>' >> load_auth_pubkey.xml
+
+sysrepocfg --merge=load_auth_pubkey.xml --format=xml ietf-system
+rm load_auth_pubkey.xml
+
+ssh-keyscan -p 830 127.0.0.1 >> ~/.ssh/known_hosts
+
+echo 'Done'
+exit 0
\ No newline at end of file
--- /dev/null
+#! /bin/bash
+################################################################################
+#
+# Copyright 2020 highstreet technologies GmbH and others
+#
+# 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.
+
+################################################################################
+
+sleep 10
+
+openssl genrsa -out melacon.server.key 2048
+
+openssl req -new -sha256 -key melacon.server.key -subj "/C=US/ST=CA/O=MeLaCon, Inc./CN=melacon.com" -out melacon.server.csr
+openssl x509 -req -in melacon.server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out melacon.server.crt -days 500 -sha256
+rm melacon.server.csr
+
+MELACON_SERVER_KEY="$(sed '1d;$d' melacon.server.key)"
+
+echo '<action xmlns="urn:ietf:params:xml:ns:yang:1"><keystore xmlns="urn:ietf:params:xml:ns:yang:ietf-keystore"><private-keys><load-private-key><name>melacon_server_key</name>' >> load_private_key.xml
+echo '<private-key>'"$MELACON_SERVER_KEY"'</private-key></load-private-key></private-keys></keystore></action>' >> load_private_key.xml
+
+netopeer2-cli <<END
+auth pref publickey 1000
+auth keys add /home/netconf/.ssh/id_dsa.pub /home/netconf/.ssh/id_dsa
+connect --host 127.0.0.1 --login netconf
+user-rpc --content=load_private_key.xml
+disconnect
+END
+
+rm load_private_key.xml
+
+MELACON_CERT="$(sed '1d;$d' melacon.server.crt)"
+CA_CERT="$(sed '1d;$d' ca.pem)"
+
+echo '<keystore xmlns="urn:ietf:params:xml:ns:yang:ietf-keystore"><private-keys><private-key><name>melacon_server_key</name><certificate-chains><certificate-chain><name>melacon_server_cert</name>' >> load_server_certs.xml
+echo '<certificate>'"$MELACON_CERT"'</certificate></certificate-chain></certificate-chains></private-key></private-keys><trusted-certificates><name>trusted_ca_list</name><trusted-certificate><name>ca</name>' >> load_server_certs.xml
+echo '<certificate>'"$CA_CERT"'</certificate></trusted-certificate></trusted-certificates></keystore>' >> load_server_certs.xml
+
+sysrepocfg --merge=load_server_certs.xml --format=xml ietf-keystore
+rm load_server_certs.xml
+
+echo '<netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server"><listen>' >> tls_endpoints.xml
+echo '<endpoint><name>MNG_TLS_1</name><tls><address>0.0.0.0</address><port>837</port><certificates><certificate><name>melacon_server_cert</name></certificate></certificates><client-auth><trusted-ca-certs>trusted_ca_list</trusted-ca-certs><cert-maps><cert-to-name><id>1</id><fingerprint>02:E9:38:1F:F6:8B:62:DE:0A:0B:C5:03:81:A8:03:49:A0:00:7F:8B:F3</fingerprint><map-type xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name">x509c2n:specified</map-type><name>netconf</name></cert-to-name></cert-maps></client-auth></tls></endpoint>' >> tls_endpoints.xml
+echo '<endpoint><name>MNG_TLS_2</name><tls><address>0.0.0.0</address><port>838</port><certificates><certificate><name>melacon_server_cert</name></certificate></certificates><client-auth><trusted-ca-certs>trusted_ca_list</trusted-ca-certs><cert-maps><cert-to-name><id>1</id><fingerprint>02:E9:38:1F:F6:8B:62:DE:0A:0B:C5:03:81:A8:03:49:A0:00:7F:8B:F3</fingerprint><map-type xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name">x509c2n:specified</map-type><name>netconf</name></cert-to-name></cert-maps></client-auth></tls></endpoint>' >> tls_endpoints.xml
+echo '<endpoint><name>MNG_TLS_3</name><tls><address>0.0.0.0</address><port>839</port><certificates><certificate><name>melacon_server_cert</name></certificate></certificates><client-auth><trusted-ca-certs>trusted_ca_list</trusted-ca-certs><cert-maps><cert-to-name><id>1</id><fingerprint>02:E9:38:1F:F6:8B:62:DE:0A:0B:C5:03:81:A8:03:49:A0:00:7F:8B:F3</fingerprint><map-type xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name">x509c2n:specified</map-type><name>netconf</name></cert-to-name></cert-maps></client-auth></tls></endpoint>' >> tls_endpoints.xml
+echo '</listen></netconf-server>' >> tls_endpoints.xml
+
+sysrepocfg --merge=tls_endpoints.xml --format=xml ietf-netconf-server
+rm tls_endpoints.xml
+
+echo 'Done'
+exit 0
\ No newline at end of file
--- /dev/null
+-----BEGIN CERTIFICATE-----
+MIIDGDCCAgACCQCROQ1hEHSsyDANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEBhMC
+Q1oxFjAUBgNVBAgMDVNvdXRoIE1vcmF2aWExDTALBgNVBAcMBEJybm8xDzANBgNV
+BAoMBkNFU05FVDEMMAoGA1UECwwDVE1DMRMwEQYDVQQDDApleGFtcGxlIENBMSIw
+IAYJKoZIhvcNAQkBFhNleGFtcGxlY2FAbG9jYWxob3N0MB4XDTE5MDYxNzEyNDMy
+N1oXDTIwMTAyOTEyNDMyN1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAIKxdFmW7Cr4x7txXrHgaIZYpfsI9QwkwX+3q4h9
+kbY1QVaram/AlGWgXe/42q1z0UVRGGSsnwZvIv+daT4XE47Q/7JfUcYyo1EdGORc
+ym++D+gmIy37cUzB1oe9zZrxJ3zSZnwcQV13kZMwyOAs5DT1MpqPSypclv8t3c0Z
+H0mdzpcF4sJXBg14MoQqZSwSeZZrg9tAe36hhyrKhIVXReY+Lse0X72XS/qwCnA9
+26hjm//8d7j9nskzou9xOLeBh/umZUXHkUVmY1iGQ4jt7HAvg0yZ+2zg02YyZNfY
+Xb21jGB21qy1Jf2roFCn2+7bAjqpI8+Y4C8nm+fl/sScugUCAwEAATANBgkqhkiG
+9w0BAQsFAAOCAQEAX1Gf0xZDTrUVHITSc/sRC03e+Ju658p4fx9BlP2KqqnoZHdh
+zJhmps05FAnvHx/7c4tIABBt3puLl6CofznaE2+QAUxeCiTv2vm/4O3nLU4As5jP
+udfKU+XgVI5PTEorDgVsHnv3/JBmZUxuR4VM63hBJtBvSl4QvNXRtpXjjkljwPvJ
+r+Ea9z712F2dw48c/tzRLUIp7n/py0zhSLiBLBmwsT8fkr5hKmhenqqgY5Vkfa36
+UmfEeOVhhdy5tfs2jwxy9gNFNIryijbn4HMBJEy0zEfva8VEmrYqDJQ5AYX/xcwf
+8D0Sgg3582eQgbQR7eYl0DMlv2JUn5I4AjUutg==
+-----END CERTIFICATE-----
--- /dev/null
+-----BEGIN CERTIFICATE REQUEST-----
+MIICVDCCATwCAQAwDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAIKxdFmW7Cr4x7txXrHgaIZYpfsI9QwkwX+3q4h9kbY1QVar
+am/AlGWgXe/42q1z0UVRGGSsnwZvIv+daT4XE47Q/7JfUcYyo1EdGORcym++D+gm
+Iy37cUzB1oe9zZrxJ3zSZnwcQV13kZMwyOAs5DT1MpqPSypclv8t3c0ZH0mdzpcF
+4sJXBg14MoQqZSwSeZZrg9tAe36hhyrKhIVXReY+Lse0X72XS/qwCnA926hjm//8
+d7j9nskzou9xOLeBh/umZUXHkUVmY1iGQ4jt7HAvg0yZ+2zg02YyZNfYXb21jGB2
+1qy1Jf2roFCn2+7bAjqpI8+Y4C8nm+fl/sScugUCAwEAAaAAMA0GCSqGSIb3DQEB
+CwUAA4IBAQB4mtqz9WtRqU4IBn+FNFQGBuX6uDSfDhC2Qo6mQB1kdErEnbdL6TYn
+gkgZradYwMAaBPKDwAx74YpWs6C4HgkORP1KPweDIjZNcpEAY0HwtXdUQHzMWFOh
+gdCjVYd7WdWg7CFl01lAx1HHzakIvW6ZxjjKoPm4SaFSGvyKzj0CyH01BoSM7pgt
+ZBbQcFkV6ZYItXPZR6Bi5hJnUkNu/K8rPEQ2Fr/wXUUz3PZhO+ZGG+WZbMFuo64V
+QUMEBwWNNf1I6r9EsLiar6Y1q22P6tLmjcY9Nbca/pD+3pplZ+/j6wpnufLM8ati
+dvWZorvVAKwQim5RFnCZ7VSmqKIaywIO
+-----END CERTIFICATE REQUEST-----
--- /dev/null
+set(UTILS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/utils")
+
+include_directories(
+ "${PROJECT_SOURCE_DIR}/inc/utils"
+ "/usr/include"
+)
+
+add_subdirectory(ves-messages)
+add_subdirectory(software-management-xran)
+
+# sources
+set (UTILS_SOURCES
+ ${UTILS_DIR}/utils.c
+)
+
+add_library(utils STATIC ${UTILS_SOURCES})
+set_property(TARGET utils PROPERTY COMPILE_FLAGS "-fPIC")
+target_link_libraries(utils m)
+target_link_libraries(utils cjson)
\ No newline at end of file
--- /dev/null
+FROM ubuntu:18.04 AS builder
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+RUN \
+ apt-get update && apt-get install -y \
+ # general tools
+ git \
+ cmake \
+ build-essential \
+ vim \
+ supervisor \
+ # libyang
+ libpcre3-dev \
+ pkg-config \
+ # sysrepo
+ libavl-dev \
+ libev-dev \
+ libprotobuf-c-dev \
+ protobuf-c-compiler \
+ # netopeer2 \
+ libssh-dev \
+ libssl-dev \
+ # bindings
+ swig \
+ python-dev \
+ libcurl4 \
+ libcurl4-openssl-dev \
+ curl \
+ bc
+
+RUN \
+ apt-get install -y \
+ python-setuptools \
+ python-pip
+
+# pyang dependencies
+RUN pip install rstr && \
+ pip install exrex && \
+ pip install ipaddress && \
+ pip install lxml
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh && \
+ ssh-keygen -A && \
+ ssh-keygen -t dsa -P '' -f /home/netconf/.ssh/id_dsa && \
+ cat /home/netconf/.ssh/id_dsa.pub > /home/netconf/.ssh/authorized_keys && \
+#echo "Host *\n StrictHostKeyChecking accept-new" >> /home/netconf/.ssh/config
+ echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \
+ mkdir -p /root/.ssh && \
+ cat /home/netconf/.ssh/id_dsa.pub > /root/.ssh/authorized_keys
+
+# use /opt/dev as working directory
+RUN mkdir /opt/dev
+WORKDIR /opt/dev
+
+# libcjson
+RUN \
+ git clone https://github.com/Melacon/cJSON.git && \
+ cd cJSON && mkdir build && cd build && \
+ cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DCMAKE_INSTALL_PREFIX=/usr .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libyang
+RUN \
+ git clone https://github.com/Melacon/libyang.git && \
+ cd libyang && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# sysrepo
+RUN \
+ git clone https://github.com/Melacon/sysrepo.git && \
+ sed -i 's/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 3/#define MAX_BLOCKS_AVAIL_FOR_ALLOC 6/g' ./sysrepo/src/common/sr_mem_mgmt.h && \
+ cd sysrepo && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_TESTS=OFF -DREPOSITORY_LOC:PATH=/etc/sysrepo -DREQUEST_TIMEOUT=60 -DOPER_DATA_PROVIDE_TIMEOUT=60 .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# libnetconf2
+RUN \
+ git clone https://github.com/Melacon/libnetconf2.git && \
+ cd libnetconf2 && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# keystore
+RUN \
+ git clone https://github.com/Melacon/Netopeer2.git && \
+ cd Netopeer2 && \
+ cd keystored && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ ldconfig
+
+# overwrite number of endpoints exposed by the NETCONF server
+COPY ./deploy/x-ran/stock_config.xml /opt/dev/Netopeer2/server/stock_config.xml
+# netopeer2
+RUN \
+ cd /opt/dev/Netopeer2/server && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install && \
+ cd ../../cli && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Release" .. && \
+ make -j2 && \
+ make install
+
+# pyang
+RUN \
+ git clone https://github.com/Melacon/pyang.git && \
+ cd pyang && python setup.py build && python setup.py install
+
+# NTSimulator device
+COPY . /opt/dev/ntsimulator
+COPY ./deploy/x-ran/CMakeLists.txt /opt/dev/ntsimulator/src/CMakeLists.txt
+RUN \
+ cd /opt/dev/ntsimulator && mkdir build && cd build && \
+ cmake .. && \
+ make -j2 && \
+ make install
+
+# Second stage
+FROM ubuntu:18.04
+
+LABEL maintainer="alexandru.stancu@highstreet-technologies.com"
+
+RUN \
+ apt-get update && apt-get install -y supervisor
+
+# add netconf user
+RUN \
+ adduser --system netconf && \
+ echo "netconf:netconf" | chpasswd
+
+# generate ssh keys for netconf user
+RUN \
+ mkdir -p /home/netconf/.ssh
+
+COPY --from=builder /home/netconf/.ssh /home/netconf/.ssh
+COPY --from=builder /usr/local/lib /usr/local/lib
+COPY --from=builder /usr/local/bin /usr/local/bin
+COPY --from=builder /usr/local/include /usr/local/include
+COPY --from=builder /usr/lib/libavl.so /usr/lib/libavl.so
+COPY --from=builder /usr/lib/libavl.so.1 /usr/lib/libavl.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so /usr/lib/x86_64-linux-gnu/libev.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libev.so.4 /usr/lib/x86_64-linux-gnu/libev.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so.4 /usr/lib/x86_64-linux-gnu/libcurl.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl.so /usr/lib/x86_64-linux-gnu/libcurl.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1 /usr/lib/x86_64-linux-gnu/libcjson_utils.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson_utils.so /usr/lib/x86_64-linux-gnu/libcjson_utils.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so.1 /usr/lib/x86_64-linux-gnu/libcjson.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libcjson.so /usr/lib/x86_64-linux-gnu/libcjson.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf.so.10 /usr/lib/x86_64-linux-gnu/libprotobuf.so.10
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1 /usr/lib/x86_64-linux-gnu/libprotobuf-c.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libprotobuf-c.so /usr/lib/x86_64-linux-gnu/libprotobuf-c.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so.4 /usr/lib/x86_64-linux-gnu/libssh_threads.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh_threads.so /usr/lib/x86_64-linux-gnu/libssh_threads.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so.4 /usr/lib/x86_64-linux-gnu/libssh.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libssh.so /usr/lib/x86_64-linux-gnu/libssh.so
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 /usr/lib/x86_64-linux-gnu/libnghttp2.so.14
+COPY --from=builder /usr/lib/x86_64-linux-gnu/librtmp.so.1 /usr/lib/x86_64-linux-gnu/librtmp.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libpsl.so.5 /usr/lib/x86_64-linux-gnu/libpsl.so.5
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.3 /usr/lib/x86_64-linux-gnu/libkrb5.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libsasl2.so.2 /usr/lib/x86_64-linux-gnu/libsasl2.so.2
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libgssapi.so.3 /usr/lib/x86_64-linux-gnu/libgssapi.so.3
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libkrb5.so.26 /usr/lib/x86_64-linux-gnu/libkrb5.so.26
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libasn1.so.8 /usr/lib/x86_64-linux-gnu/libasn1.so.8
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libroken.so.18 /usr/lib/x86_64-linux-gnu/libroken.so.18
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libwind.so.0 /usr/lib/x86_64-linux-gnu/libwind.so.0
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libheimbase.so.1 /usr/lib/x86_64-linux-gnu/libheimbase.so.1
+COPY --from=builder /usr/lib/x86_64-linux-gnu/libhx509.so.5 /usr/lib/x86_64-linux-gnu/libhx509.so.5
+
+COPY --from=builder /lib/x86_64-linux-gnu/libkeyutils.so.1 /lib/x86_64-linux-gnu/libkeyutils.so.1
+COPY --from=builder /etc/sysrepo /etc/sysrepo
+COPY --from=builder /var/run /var/run
+
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem
+COPY --from=builder /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub /usr/local/etc/keystored/keys/ssh_host_rsa_key.pem.pub
+COPY --from=builder /usr/local/share/libnetconf2 /usr/local/share/libnetconf2
+
+RUN ldconfig
+
+WORKDIR /tmp
+RUN apt-get install -yqq wget \
+ openssh-client
+
+RUN mkdir py_install && cd py_install && \
+ wget https://files.pythonhosted.org/packages/b9/9a/3e9da40ea28b8210dd6504d3fe9fe7e013b62bf45902b458d1cdc3c34ed9/ipaddress-1.0.23.tar.gz && \
+ tar -xvzf ipaddress-1.0.23.tar.gz && cd ipaddress-1.0.23 && \
+ python setup.py install
+
+COPY --from=builder /etc/ssh /etc/ssh
+COPY --from=builder /root/.ssh /root/.ssh
+
+WORKDIR /opt/dev
+# run only specific programs in this image
+COPY ./deploy/x-ran/supervisord.conf /etc/supervisord.conf
+
+# tls configuratoin
+COPY ./deploy/tls /home/netconf/.ssh
+
+COPY --from=builder /opt/dev/sysrepo/build/examples/application_example /opt/dev/sysrepo/build/examples/application_example
+
+# YANG models and related scripts
+COPY ./yang/x-ran /opt/dev/yang
+COPY ./yang/auto-load-yangs.sh /opt/dev/yang
+COPY ./yang/sysrepo-configuration-load.sh /opt/dev/yang
+
+# scripts for Software Management RPCs
+COPY ./deploy/x-ran/edit-config-after-activate.sh /opt/dev
+COPY ./deploy/x-ran/edit-config-after-activate.xml /opt/dev
+COPY ./deploy/x-ran/edit-config-after-download.sh /opt/dev
+COPY ./deploy/x-ran/edit-config-after-download.xml /opt/dev
+COPY ./deploy/x-ran/edit-config-demo-start.sh /opt/dev
+COPY ./deploy/x-ran/edit-config-demo-start.xml /opt/dev
+
+WORKDIR /opt/dev
+RUN \
+ cd yang && \
+ ./auto-load-yangs.sh
+
+ARG BUILD_DATE
+LABEL build-date=$BUILD_DATE
+
+ENV EDITOR vim
+EXPOSE 830-839
+
+CMD ["sh", "-c", "/usr/bin/supervisord -c /etc/supervisord.conf"]
--- /dev/null
+---
+tag: 0.1.1
--- /dev/null
+#!/bin/bash
+
+echo "Loading config data into the NETCONF Server..."
+
+result=$(netopeer2-cli <<-END
+ connect --host 127.0.0.1 --login netconf
+ user-rpc --content=/opt/dev/edit-config-after-activate.xml
+ disconnect
+END
+)
+
+echo $result
+echo "Done!"
+
+exit 0
--- /dev/null
+<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <target>
+ <running/>
+ </target>
+ <config>
+ <software-inventory xmlns="urn:xran:software-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="merge">
+ <software-slot>
+ <name>Slot1</name>
+ <active>false</active>
+ <running>false</running>
+ <access>READ_WRITE</access>
+ </software-slot>
+ <software-slot>
+ <name>Slot2</name>
+ <active>true</active>
+ <running>true</running>
+ <access>READ_ONLY</access>
+ </software-slot>
+</software-inventory>
+ </config>
+</edit-config>
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+echo "Loading config data into the NETCONF Server..."
+
+result=$(netopeer2-cli <<-END
+ connect --host 127.0.0.1 --login netconf
+ user-rpc --content=/opt/dev/edit-config-after-download.xml
+ disconnect
+END
+)
+
+echo $result
+echo "Done!"
+
+exit 0
\ No newline at end of file
--- /dev/null
+<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <target>
+ <running/>
+ </target>
+ <config>
+ <software-inventory xmlns="urn:xran:software-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="replace">
+ <software-slot>
+ <name>Slot1</name>
+ <status>VALID</status>
+ <active>true</active>
+ <running>true</running>
+ <access>READ_ONLY</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2020-01-23T14:04:23</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-5645-32</build-name>
+ <build-version>19.7.123</build-version>
+ <files>
+ <name>manifest-v1.0.1.cfg</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.1.swm</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+ <software-slot>
+ <name>Slot2</name>
+ <status>VALID</status>
+ <active>false</active>
+ <running>false</running>
+ <access>READ_WRITE</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2020-02-05T09:02:33</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-5790-44</build-name>
+ <build-version>19.7.123</build-version>
+ <files>
+ <name>manifest-v1.0.2.cfg</name>
+ <version>2349-5790-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.2.swm</name>
+ <version>2349-5790-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+</software-inventory>
+ </config>
+</edit-config>
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+echo "Loading config data into the NETCONF Server..."
+
+result=$(netopeer2-cli <<-END
+ connect --host 127.0.0.1 --login netconf
+ user-rpc --content=/opt/dev/edit-config-demo-start.xml
+ disconnect
+END
+)
+
+echo $result
+echo "Done!"
+
+exit 0
--- /dev/null
+<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <target>
+ <running/>
+ </target>
+ <config>
+ <performance-measurement-objects xmlns="urn:xran:performance-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="replace">
+ </performance-measurement-objects>
+ <hardware xmlns="urn:ietf:params:xml:ns:yang:ietf-hardware" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="merge">
+ <component>
+ <name>softwareSlot1</name>
+ <class xmlns:ianahw="urn:ietf:params:xml:ns:yang:iana-hardware">ianahw:storage-drive</class>
+ <physical-index>4207123</physical-index>
+ <description>ddesdvlkmvdfkvf</description>
+ <parent>xAxAxxAxA</parent>
+ <parent-rel-pos>33250247</parent-rel-pos>
+ <hardware-rev>12.2.3</hardware-rev>
+ <firmware-rev>7.1.2</firmware-rev>
+ <software-rev>19.7.123</software-rev>
+ <serial-num>35VU5</serial-num>
+ <mfg-name>xqxSSJSqJ</mfg-name>
+ <model-name>trttrttttrtrtttt</model-name>
+ <alias>btsWtsWstBFFWs</alias>
+ <asset-id>Q446g</asset-id>
+ <is-fru>true</is-fru>
+ <mfg-date>2020-02-06T06:06:32.3Z</mfg-date>
+ <uri>JJuaJa</uri>
+ <uri>6cc66c66cZc6</uri>
+ <uuid>d8de752d-a6ee-74ed-fdac-2c8a9c88afba</uuid>
+ <state>
+ <state-last-changed>2020-02-11T11:02:45.3Z</state-last-changed>
+ <admin-state>locked</admin-state>
+ <oper-state>disabled</oper-state>
+ <usage-state>active</usage-state>
+ <alarm-state>critical major minor warning</alarm-state>
+ <standby-state>hot-standby</standby-state>
+ </state>
+</component>
+<component>
+ <name>softwareSlot2</name>
+ <class xmlns:ianahw="urn:ietf:params:xml:ns:yang:iana-hardware">ianahw:storage-drive</class>
+ <physical-index>4207123</physical-index>
+ <description>ddesdvlkmvdfkvf</description>
+ <parent>xAxAxxAxA</parent>
+ <parent-rel-pos>12350247</parent-rel-pos>
+ <hardware-rev>12.2.3</hardware-rev>
+ <firmware-rev>7.1.2</firmware-rev>
+ <software-rev>19.2.33</software-rev>
+ <serial-num>35VU5</serial-num>
+ <mfg-name>xqxSSJSqJ</mfg-name>
+ <model-name>trttrttttrtrtttt</model-name>
+ <alias>btsWtsWstBFFWs</alias>
+ <asset-id>Q446g</asset-id>
+ <is-fru>true</is-fru>
+ <mfg-date>2020-02-06T06:06:32.3Z</mfg-date>
+ <uri>JJuaJa</uri>
+ <uri>6cc66c66cZc6</uri>
+ <uuid>d8de752d-a6ee-74ed-fdac-2c8a9c88afba</uuid>
+ <state>
+ <state-last-changed>2020-02-11T11:02:45.3Z</state-last-changed>
+ <admin-state>locked</admin-state>
+ <oper-state>disabled</oper-state>
+ <usage-state>active</usage-state>
+ <alarm-state>critical major minor warning</alarm-state>
+ <standby-state>hot-standby</standby-state>
+ </state>
+</component>
+</hardware>
+<software-inventory xmlns="urn:xran:software-management:1.0" xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="replace">
+ <software-slot>
+ <name>Slot1</name>
+ <status>VALID</status>
+ <active>true</active>
+ <running>true</running>
+ <access>READ_ONLY</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2020-01-23T14:04:23</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-5645-32</build-name>
+ <build-version>19.7.123</build-version>
+ <files>
+ <name>manifest-v1.0.1.cfg</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.1.swm</name>
+ <version>2349-5645-32</version>
+ <local-path>/home/system/slot1</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+ <software-slot>
+ <name>Slot2</name>
+ <status>VALID</status>
+ <active>false</active>
+ <running>false</running>
+ <access>READ_WRITE</access>
+ <vendor-code>SA</vendor-code>
+ <build-id>2019-07-02T14:04:23</build-id>
+ <build-name>SAMSUNG-XRAN-FH-2349-2345-44</build-name>
+ <build-version>19.2.33</build-version>
+ <files>
+ <name>manifest-v1.0.0.cfg</name>
+ <version>2349-2345-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ <files>
+ <name>image-v1.0.0.swm</name>
+ <version>2349-2345-44</version>
+ <local-path>/home/system/slot2</local-path>
+ <integrity>OK</integrity>
+ </files>
+ </software-slot>
+</software-inventory>
+</config>
+</edit-config>
\ No newline at end of file
--- /dev/null
+<netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server">
+ <listen>
+ <endpoint>
+ <name>MNG0</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>830</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG1</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>831</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG2</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>832</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG3</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>833</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG4</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>834</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG5</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>835</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ <endpoint>
+ <name>MNG6</name>
+ <ssh>
+ <address>0.0.0.0</address>
+ <port>836</port>
+ <host-keys>
+ <host-key>
+ <name>imported SSH key</name>
+ <public-key>ssh_host_rsa_key</public-key>
+ </host-key>
+ </host-keys>
+ </ssh>
+ </endpoint>
+ </listen>
+</netconf-server>
--- /dev/null
+[supervisord]
+nodaemon=true
+logfile=/var/log/supervisord.log
+loglevel=debug
+
+[program:sysrepod]
+command=/usr/local/bin/sysrepod -d
+autorestart=true
+redirect_stderr=true
+priority=1
+
+[program:sysrepo-plugind]
+command=/usr/local/bin/sysrepo-plugind -d
+autorestart=true
+redirect_stderr=true
+priority=2
+
+[program:netopeer2-server]
+command=/usr/local/bin/netopeer2-server -d
+autorestart=true
+redirect_stderr=true
+priority=3
+
+[program:enable-ssh]
+directory=/home/netconf/.ssh
+command=/home/netconf/.ssh/enable_ssh_key.sh
+startsecs=0
+autorestart=false
+redirect_stderr=false
+priority=4
+
+[program:enable-tls]
+directory=/home/netconf/.ssh
+command=/home/netconf/.ssh/enable_tls.sh
+startsecs=0
+autorestart=false
+redirect_stderr=false
+priority=5
+
+[program:sysrepo-config-load]
+directory=/opt/dev/yang
+command=/opt/dev/yang/sysrepo-configuration-load.sh
+autorestart=false
+redirect_stderr=true
+startretries=1
+priority=6
+
+[program:ves-heartbeat]
+command=/usr/local/bin/ves-heartbeat
+autorestart=true
+redirect_stderr=true
+priority=7
+
+[program:software-management]
+command=/usr/local/bin/software-management
+autorestart=true
+redirect_stderr=true
+priority=8
\ No newline at end of file
--- /dev/null
+docker build -t o-ran-sc/ntsim-manager -f deploy/nts-manager/Dockerfile .
--- /dev/null
+docker build -t o-ran-sc/ntsim-o-ran-ru-fh -f deploy/o-ran/ru-fh/Dockerfile .
--- /dev/null
+docker build -t o-ran-sc/ntsim-o-ran-sc-o-ran-ru -f deploy/o-ran-sc/o-ran-ru/Dockerfile .
--- /dev/null
+docker build -t o-ran-sc/ntsim-x-ran -f deploy/x-ran/Dockerfile .
# See the License for the specific language governing permissions and
# limitations under the License.
################################################################################
+
if [ "$#" -ne 1 ]; then
echo "ID Parameter missing."
- echo "Usage: $0 id
+ echo "Usage: $0 id/all
-where id is the docker container id of the NTS Manager instance that we want to clean. "
+where id is the docker container id of the NTS Manager instance that we want to clean. Use 'all' if you want to clean all containers and all managers."
exit 1
fi
-echo "Cleaning up containers started by the NTS Manager $1..."
+if [ "$1" = "all" ]; then
+ echo "Cleaning up all NTS simulated devices..."
-mapfile -t NTS_containers < <( docker ps -a --filter "label=NTS_Manager=$1" --format "{{.ID}}" )
+ mapfile -t NTS_containers < <( docker ps -a --filter "label=NTS_Manager" --format "{{.ID}}" )
-CONTAINERS=""
+ CONTAINERS=""
-if [ ${#NTS_containers[@]} -gt 0 ]
-then
+ if [ ${#NTS_containers[@]} -gt 0 ]
+ then
- for container in "${NTS_containers[@]}"
- do
- CONTAINERS="$CONTAINERS $container"
- done
- echo "Cleaning up containers: $CONTAINERS"
- docker kill $CONTAINERS > /dev/null 2>&1
- docker rm $CONTAINERS > /dev/null 2>&1
-fi
+ for container in "${NTS_containers[@]}"
+ do
+ CONTAINERS="$CONTAINERS $container"
+ done
+ echo "Cleaning up containers: $CONTAINERS"
+ docker kill $CONTAINERS > /dev/null 2>&1
+ docker rm $CONTAINERS > /dev/null 2>&1
+ fi
+
+ echo "Cleaning up all NTS Managers..."
+
+ mapfile -t NTS_containers < <( docker ps -a --filter "label=NTS-manager" --format "{{.ID}}" )
+
+ CONTAINERS=""
+
+ if [ ${#NTS_containers[@]} -gt 0 ]
+ then
+
+ for container in "${NTS_containers[@]}"
+ do
+ CONTAINERS="$CONTAINERS $container"
+ done
+ echo "Cleaning up containers: $CONTAINERS"
+ docker kill $CONTAINERS > /dev/null 2>&1
+ docker rm $CONTAINERS > /dev/null 2>&1
+ fi
-echo "Cleaning NTS Manager $1..."
-docker kill $1 > /dev/null 2>&1
-docker rm $1 > /dev/null 2>&1
+else
+ echo "Cleaning up containers started by the NTS Manager $1..."
+
+ mapfile -t NTS_containers < <( docker ps -a --filter "label=NTS_Manager=$1" --format "{{.ID}}" )
+
+ CONTAINERS=""
+
+ if [ ${#NTS_containers[@]} -gt 0 ]
+ then
+
+ for container in "${NTS_containers[@]}"
+ do
+ CONTAINERS="$CONTAINERS $container"
+ done
+ echo "Cleaning up containers: $CONTAINERS"
+ docker kill $CONTAINERS > /dev/null 2>&1
+ docker rm $CONTAINERS > /dev/null 2>&1
+ fi
+
+ echo "Cleaning NTS Manager $1..."
+ docker kill $1 > /dev/null 2>&1
+ docker rm $1 > /dev/null 2>&1
+fi
echo "All cleaned up!"
sr_free_val(odl_username);
sr_free_val(odl_password);
- sr_free_values(values, count);
+ sr_free_values(values, count);
}
static void clean_current_docker_configuration(void);
printf("\n\n ========== CONFIG HAS CHANGED, CURRENT RUNNING CONFIG %s: ==========\n\n", module_name);
print_current_config(session, module_name);
- sr_val_t *val;
+ sr_val_t *val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/simulated-devices", &val);
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/mounted-devices", &val);
{
printf("Cannot set mount value greater than number of simulated devices.\n");
sr_free_val(val);
+ val = NULL;
return SR_ERR_OK;
}
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/notification-config/fault-notification-delay-period", &val);
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/notification-config/ves-heartbeat-period", &val);
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-ip", &val);
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-endpoint-port", &val);
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/ves-endpoint-details/ves-registration", &val);
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/notification-config/is-netconf-available", &val);
}
sr_free_val(val);
+ val = NULL;
/* get the value from sysrepo, we do not care if the value did not change in our case */
rc = sr_get_item(session, "/network-topology-simulator:simulator-config/notification-config/is-ves-available", &val);
}
sr_free_val(val);
+ val = NULL;
return SR_ERR_OK;
sr_error:
printf("NTSimulator config change callback failed: %s.", sr_strerror(rc));
+ if (val != NULL)
+ {
+ sr_free_val(val);
+ val = NULL;
+ }
return rc;
}
if (rc != SR_ERR_OK)
{
printf("Could not get the operational state for the devices simulated.\n");
+ return SR_ERR_OPERATION_FAILED;
}
device_t *current_device = device_list->head;
sr_val_t **output, size_t *output_cnt, void *private_ctx)
{
int rc = SR_ERR_OK;
- sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx;
controller_t controller_list[CONTROLLER_LIST_MAX_LEN];
int controller_list_size = 0;
if (rc != SR_ERR_OK)
{
printf("Failed to add key pair to ODL.\n");
+ return SR_ERR_OPERATION_FAILED;
}
return rc;
if (rc != SR_ERR_OK)
{
printf("Could not set the operational state for the device with uuid=\"%s\"\n", container_id_short);
+ return SR_ERR_OPERATION_FAILED;
}
}
}
if (!cJSON_IsObject(notifConfig))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsNumber(faultNotifDelay))
{
printf("Configuration JSON is not as expected: fault-notification-delay-period is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
stringConfiguration = cJSON_Print(jsonConfig);
writeConfigFile(stringConfiguration);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OK;
}
if (!cJSON_IsObject(notifConfig))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsNumber(vesHeartbeatPeriod))
{
printf("Configuration JSON is not as expected: ves-heartbeat-period is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
stringConfiguration = cJSON_Print(jsonConfig);
writeConfigFile(stringConfiguration);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OK;
}
if (!cJSON_IsObject(vesDetails))
{
printf("Configuration JSON is not as expected: ves-endpoint-details is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsString(vesIp))
{
printf("Configuration JSON is not as expected: ves-endpoint-ip is not a string");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
stringConfiguration = cJSON_Print(jsonConfig);
writeConfigFile(stringConfiguration);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OK;
}
if (!cJSON_IsObject(vesDetails))
{
printf("Configuration JSON is not as expected: ves-endpoint-details is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsNumber(vesPort))
{
printf("Configuration JSON is not as expected: ves-endpoint-port is not a number.");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
stringConfiguration = cJSON_Print(jsonConfig);
writeConfigFile(stringConfiguration);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OK;
}
if (!cJSON_IsObject(vesDetails))
{
printf("Configuration JSON is not as expected: ves-endpoint-details is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsBool(vesRegistration))
{
printf("Configuration JSON is not as expected: ves-registration is not a bool.");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
stringConfiguration = cJSON_Print(jsonConfig);
writeConfigFile(stringConfiguration);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OK;
}
if (!cJSON_IsObject(notifConfig))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsBool(isNetconfAvailable))
{
printf("Configuration JSON is not as expected: is-netconf-available is not a bool.");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
stringConfiguration = cJSON_Print(jsonConfig);
writeConfigFile(stringConfiguration);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OK;
}
if (!cJSON_IsObject(notifConfig))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsBool(isVesAvailable))
{
printf("Configuration JSON is not as expected: is-ves-available is not a bool.");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
stringConfiguration = cJSON_Print(jsonConfig);
writeConfigFile(stringConfiguration);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OK;
}
{
int rc = SR_ERR_OK;
CURLcode res;
- static sequence_id = 0;
+ static int sequence_id = 0;
int netconf_port_base = 0;
prepare_ves_message_curl(curl);
if (faultFields == NULL)
{
printf("Could not create JSON object: faultFields\n");
+ if (postDataJson != NULL)
+ {
+ cJSON_Delete(postDataJson);
+ }
return 1;
}
cJSON_AddItemToObject(event, "faultFields", faultFields);
return SR_ERR_OK;
}
-static int send_dummy_notif_file_mgmt(sr_session_ctx_t *sess)
-{
- int rc;
-
- sr_val_t *vnotif;
- size_t current_num_of_values= 0;
-
- CREATE_NEW_VALUE(rc, vnotif, current_num_of_values);
-
- sr_val_build_xpath(&vnotif[current_num_of_values - 1], "%s", "/o-ran-file-management:file-upload-notification/local-logical-file-path");
- sr_val_set_str_data(&vnotif[current_num_of_values - 1], SR_STRING_T, "odsanzucjsdoj");
-
- CREATE_NEW_VALUE(rc, vnotif, current_num_of_values);
-
- sr_val_build_xpath(&vnotif[current_num_of_values - 1], "%s", "/o-ran-file-management:file-upload-notification/remote-file-path");
- sr_val_set_str_data(&vnotif[current_num_of_values - 1], SR_STRING_T, "jsdknvjnkfd");
-
- CREATE_NEW_VALUE(rc, vnotif, current_num_of_values);
-
- sr_val_build_xpath(&vnotif[current_num_of_values - 1], "%s", "/o-ran-file-management:file-upload-notification/status");
- sr_val_set_str_data(&vnotif[current_num_of_values - 1], SR_ENUM_T, "SUCCESS");
-
- rc = sr_event_notif_send(sess, "/o-ran-file-management:file-upload-notification", vnotif, current_num_of_values, SR_EV_NOTIF_DEFAULT);
- if (rc != SR_ERR_OK) {
- printf("Failed to send notification send_dummy_notif_file_mgmt\n");
- return SR_ERR_OPERATION_FAILED;
- }
-
- printf("Successfully sent notification...\n");
-
- sr_free_values(vnotif, current_num_of_values);
-
- return SR_ERR_OK;
-}
-
static int send_dummy_notif(sr_session_ctx_t *sess)
{
int rc;
if (notification_delay_period > 0)
{
send_dummy_notif(session);
-// send_dummy_notif_file_mgmt(session);
sleep(notification_delay_period);
}
--- /dev/null
+set (SW_MANAGEMENT_SOURCES
+ sw-management-rpc.c
+)
+
+include_directories(
+ "/usr/include/x86_64-linux-gnu"
+ "/usr/local/include/cjson"
+ "${PROJECT_SOURCE_DIR}/inc/utils"
+)
+
+add_executable(software-management ${SW_MANAGEMENT_SOURCES})
+target_link_libraries(software-management utils)
+target_link_libraries(software-management sysrepo)
+target_link_libraries(software-management pthread)
+
+install(TARGETS software-management DESTINATION ${CMAKE_INSTALL_BINDIR})
\ No newline at end of file
--- /dev/null
+/**
+ * @file sw-management-rpc.c
+ * @author Rastislav Szabo <raszabo@cisco.com>, Lukas Macko <lmacko@cisco.com>,
+ * Milan Lenco <milan.lenco@pantheon.tech>
+ * @brief Example usage of RPC API.
+ *
+ * @copyright
+ * Copyright 2016 Cisco Systems, Inc.
+ *
+ * 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 <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+
+#include <pthread.h>
+
+#include "sysrepo.h"
+#include "sysrepo/values.h"
+
+#include "utils.h"
+
+#define LINE_BUFSIZE 128
+
+volatile int exit_application = 0;
+
+pthread_mutex_t lock;
+
+static int sw_download_error_count, sw_install_error_count, sw_activate_error_count;
+
+void call_software_management_script(char *script_name)
+{
+ char line[LINE_BUFSIZE];
+ int linenr;
+ FILE *pipe;
+
+ /* Get a pipe where the output from the scripts comes in */
+ char script[200];
+ sprintf(script, "/opt/dev/%s", script_name);
+
+ pipe = popen(script, "r");
+ if (pipe == NULL) { /* check for errors */
+ printf("Could not open script.\n");
+ return; /* return with exit code indicating error */
+ }
+
+ /* Read script output from the pipe line by line */
+ linenr = 1;
+ while (fgets(line, LINE_BUFSIZE, pipe) != NULL) {
+ printf("Script output line %d: %s", linenr, line);
+ ++linenr;
+ }
+
+ /* Once here, out of the loop, the script has ended. */
+ pclose(pipe); /* Close the pipe */
+ return; /* return with exit code indicating success. */
+}
+
+struct sw_download_struct
+{
+ sr_session_ctx_t *sess;
+ char *filename;
+};
+
+void* sw_download_notification_send(void *arguments)
+{
+ // create the values to be sent in the notification
+ struct sw_download_struct *args = (struct sw_download_struct *)arguments;
+ int rc = SR_ERR_OK;
+
+ sw_download_error_count++;
+
+ sr_val_t *notif = NULL;
+ size_t current_num_of_values_notif = 0;
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ char *trunc_filename;
+ trunc_filename = strrchr(args->filename, '/');
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:download-event/file-name");
+ if (trunc_filename != NULL)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, trunc_filename + 1);
+
+ if (strcmp(trunc_filename+1, "reset") == 0)
+ {
+ call_software_management_script("edit-config-demo-start.sh");
+ }
+ else
+ {
+ call_software_management_script("edit-config-after-download.sh");
+ }
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->filename);
+ if (strcmp(args->filename, "reset") == 0)
+ {
+ call_software_management_script("edit-config-demo-start.sh");
+ }
+ else
+ {
+ call_software_management_script("edit-config-after-download.sh");
+ }
+ }
+
+ if (args->filename != NULL)
+ {
+ free(args->filename);
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:download-event/status");
+ //every 5 RPCs we send an error
+ if (sw_download_error_count % 5 == 0)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "AUTHENTICATION_ERROR");
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED");
+ }
+
+
+ // wait 5 seconds before sending the notification
+ sleep(5);
+
+ /* send notification for event_notif_sub(_tree)_example */
+ printf(">>> Sending event notification for '/o-ran-software-management:download-event'...\n");
+ rc = sr_event_notif_send(args->sess, "/o-ran-software-management:download-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT);
+ if (SR_ERR_NOT_FOUND == rc) {
+ printf("No application subscribed for '/o-ran-software-management:download-event', skipping.\n");
+ rc = SR_ERR_OK;
+ }
+ sr_free_values(notif, current_num_of_values_notif);
+
+ return NULL;
+}
+
+struct sw_install_struct
+{
+ sr_session_ctx_t *sess;
+ char *slot_name;
+};
+
+void* sw_install_notification_send(void *arguments)
+{
+ // create the values to be sent in the notification
+ struct sw_install_struct *args = (struct sw_install_struct *)arguments;
+ int rc = SR_ERR_OK;
+ sw_install_error_count++;
+
+ sr_val_t *notif = NULL;
+ size_t current_num_of_values_notif = 0;
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:install-event/slot-name");
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name);
+
+ if (args->slot_name != NULL)
+ {
+ free(args->slot_name);
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:install-event/status");
+
+ //every 5 RPCs we send an error
+ if (sw_install_error_count % 5 == 0)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "INTEGRITY_ERROR");
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED");
+ }
+
+ // wait 5 seconds before sending the notification
+ sleep(5);
+
+ /* send notification for event_notif_sub(_tree)_example */
+ printf(">>> Sending event notification for '/o-ran-software-management:install-event'...\n");
+ rc = sr_event_notif_send(args->sess, "/o-ran-software-management:install-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT);
+ if (SR_ERR_NOT_FOUND == rc) {
+ printf("No application subscribed for '/o-ran-software-management:install-event', skipping.\n");
+ rc = SR_ERR_OK;
+ }
+ sr_free_values(notif, current_num_of_values_notif);
+
+ return NULL;
+}
+
+struct sw_activate_struct
+{
+ sr_session_ctx_t *sess;
+ char *slot_name;
+};
+
+void* sw_activate_notification_send(void *arguments)
+{
+ // create the values to be sent in the notification
+ struct sw_activate_struct *args = (struct sw_activate_struct *)arguments;
+ int rc = SR_ERR_OK;
+ sw_activate_error_count++;
+
+ sr_val_t *notif = NULL;
+ size_t current_num_of_values_notif = 0;
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:activation-event/slot-name");
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name);
+
+ if (args->slot_name != NULL)
+ {
+ free(args->slot_name);
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:activation-event/status");
+ //every 5 RPCs we send an error
+ if (sw_activate_error_count % 5 == 0)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "APPLICATION_ERROR");
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED");
+
+ call_software_management_script("edit-config-after-activate.sh");
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:activation-event/return-code");
+ notif[current_num_of_values_notif - 1].type = SR_UINT8_T;
+ notif[current_num_of_values_notif - 1].data.uint8_val = 200;
+
+ // wait 5 seconds before sending the notification
+ sleep(5);
+
+ /* send notification for event_notif_sub(_tree)_example */
+ printf(">>> Sending event notification for '/o-ran-software-management:activation-event'...\n");
+ rc = sr_event_notif_send(args->sess, "/o-ran-software-management:activation-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT);
+ if (SR_ERR_NOT_FOUND == rc) {
+ printf("No application subscribed for '/o-ran-software-management:activation-event', skipping.\n");
+ rc = SR_ERR_OK;
+ }
+ sr_free_values(notif, current_num_of_values_notif);
+
+ return NULL;
+}
+
+static int
+sw_download_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
+ sr_val_t **output, size_t *output_cnt, void *private_ctx)
+{
+ int rc = SR_ERR_OK;
+ sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx;
+
+ /**
+ * Here you would actually run the operation against the provided input values
+ * and obtained the output values.
+ */
+
+ /* allocate output values */
+ rc = sr_new_values(2, output);
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+
+ rc = sr_val_set_xpath(&(*output)[0], "/o-ran-software-management:software-download/status");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[0].type = SR_ENUM_T;
+ (*output)[0].data.enum_val = "STARTED";
+
+ rc = sr_val_set_xpath(&(*output)[1], "/o-ran-software-management:software-download/notification-timeout");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[1].type = SR_INT32_T;
+ (*output)[1].data.int32_val = 10;
+
+ /* inform sysrepo about the number of output values */
+ *output_cnt = 2;
+
+ struct sw_download_struct *args = (struct sw_download_struct *)malloc(sizeof(struct sw_download_struct));
+ args->sess = session;
+ args->filename = strdup(input[0].data.string_val);
+
+ pthread_t sw_download_thread;
+ if(pthread_create(&sw_download_thread, NULL, &sw_download_notification_send, (void *)args))
+ {
+ fprintf(stderr, "Could not create thread for SW Download thread\n");
+ return SR_ERR_OPERATION_FAILED;
+ }
+
+ /**
+ * Do not deallocate input values!
+ * They will get freed automatically by sysrepo.
+ */
+ return rc;
+}
+
+static int
+sw_install_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
+ sr_val_t **output, size_t *output_cnt, void *private_ctx)
+{
+ int rc = SR_ERR_OK;
+ sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx;
+
+ /**
+ * Here you would actually run the operation against the provided input values
+ * and obtained the output values.
+ */
+
+ /* allocate output values */
+ rc = sr_new_values(1, output);
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+
+ rc = sr_val_set_xpath(&(*output)[0], "/o-ran-software-management:software-install/status");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[0].type = SR_ENUM_T;
+ (*output)[0].data.enum_val = "STARTED";
+
+ /* inform sysrepo about the number of output values */
+ *output_cnt = 1;
+
+ struct sw_install_struct *args = (struct sw_install_struct *)malloc(sizeof(struct sw_install_struct));
+ args->sess = session;
+ args->slot_name = strdup(input[0].data.string_val);
+
+ pthread_t sw_install_thread;
+ if(pthread_create(&sw_install_thread, NULL, &sw_install_notification_send, (void *)args))
+ {
+ fprintf(stderr, "Could not create thread for SW Install thread\n");
+ return SR_ERR_OPERATION_FAILED;
+ }
+
+ /**
+ * Do not deallocate input values!
+ * They will get freed automatically by sysrepo.
+ */
+ return rc;
+}
+
+static int
+sw_activate_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
+ sr_val_t **output, size_t *output_cnt, void *private_ctx)
+{
+ int rc = SR_ERR_OK;
+ sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx;
+
+ /**
+ * Here you would actually run the operation against the provided input values
+ * and obtained the output values.
+ */
+
+ /* allocate output values */
+ rc = sr_new_values(2, output);
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+
+ rc = sr_val_set_xpath(&(*output)[0], "/o-ran-software-management:software-activate/status");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[0].type = SR_ENUM_T;
+ (*output)[0].data.enum_val = "STARTED";
+
+ rc = sr_val_set_xpath(&(*output)[1], "/o-ran-software-management:software-activate/notification-timeout");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[1].type = SR_INT32_T;
+ (*output)[1].data.int32_val = 10;
+
+ /* inform sysrepo about the number of output values */
+ *output_cnt = 2;
+
+ struct sw_activate_struct *args = (struct sw_activate_struct *)malloc(sizeof(struct sw_activate_struct));
+ args->sess = session;
+ args->slot_name = strdup(input[0].data.string_val);
+
+ pthread_t sw_activate_thread;
+ if(pthread_create(&sw_activate_thread, NULL, &sw_activate_notification_send, (void *)args))
+ {
+ fprintf(stderr, "Could not create thread for SW Activate thread\n");
+ return SR_ERR_OPERATION_FAILED;
+ }
+
+ /**
+ * Do not deallocate input values!
+ * They will get freed automatically by sysrepo.
+ */
+ return rc;
+}
+
+static void
+sigint_handler(int signum)
+{
+ exit_application = 1;
+}
+
+static int
+rpc_handler(sr_session_ctx_t *session)
+{
+ sr_subscription_ctx_t *subscription = NULL;
+ int rc = SR_ERR_OK;
+
+ /* subscribe for handling software-download RPC */
+ rc = sr_rpc_subscribe(session, "/o-ran-software-management:software-download", sw_download_rpc_cb,
+ (void *)session, SR_SUBSCR_DEFAULT, &subscription);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ /* subscribe for handling software-install RPC */
+ rc = sr_rpc_subscribe(session, "/o-ran-software-management:software-install", sw_install_rpc_cb,
+ (void *)session, SR_SUBSCR_DEFAULT, &subscription);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ /* subscribe for handling software-activate RPC */
+ rc = sr_rpc_subscribe(session, "/o-ran-software-management:software-activate", sw_activate_rpc_cb,
+ (void *)session, SR_SUBSCR_DEFAULT, &subscription);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ printf("\n\n ========== SUBSCRIBED FOR HANDLING RPC ==========\n\n");
+
+ /* loop until ctrl-c is pressed / SIGINT is received */
+ signal(SIGINT, sigint_handler);
+ signal(SIGPIPE, SIG_IGN);
+ while (!exit_application) {
+ sleep(1000); /* or do some more useful work... */
+ }
+
+ printf("Application exit requested, exiting.\n");
+
+cleanup:
+ if (NULL != subscription) {
+ sr_unsubscribe(session, subscription);
+ }
+ return rc;
+}
+
+int
+main(int argc, char **argv)
+{
+ sr_conn_ctx_t *connection = NULL;
+ sr_session_ctx_t *session = NULL;
+ int rc = SR_ERR_OK;
+
+ setbuf(stdout, NULL);
+
+ if (pthread_mutex_init(&lock, NULL) != 0)
+ {
+ printf("Mutex init failed...\n");
+ goto cleanup;
+ }
+
+ /* connect to sysrepo */
+ rc = sr_connect("sw_management_rpc_app", 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_RUNNING, SR_SESS_DEFAULT, &session);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ /* run as a RPC handler */
+ printf("This application will be an RPC handler for 'software-download' operation of 'o-ran-software-management'.\n");
+ rc = rpc_handler(session);
+
+cleanup:
+ if (NULL != session) {
+ sr_session_stop(session);
+ }
+ if (NULL != connection) {
+ sr_disconnect(connection);
+ }
+ return rc;
+}
--- /dev/null
+set (SW_MANAGEMENT_SOURCES
+ sw-management-rpc.c
+)
+
+include_directories(
+ "/usr/include/x86_64-linux-gnu"
+ "/usr/local/include/cjson"
+ "${PROJECT_SOURCE_DIR}/inc/utils"
+)
+
+add_executable(software-management ${SW_MANAGEMENT_SOURCES})
+target_link_libraries(software-management utils)
+target_link_libraries(software-management sysrepo)
+target_link_libraries(software-management pthread)
+
+install(TARGETS software-management DESTINATION ${CMAKE_INSTALL_BINDIR})
\ No newline at end of file
--- /dev/null
+/**
+ * @file sw-management-rpc.c
+ * @author Rastislav Szabo <raszabo@cisco.com>, Lukas Macko <lmacko@cisco.com>,
+ * Milan Lenco <milan.lenco@pantheon.tech>
+ * @brief Example usage of RPC API.
+ *
+ * @copyright
+ * Copyright 2016 Cisco Systems, Inc.
+ *
+ * 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 <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+
+#include <pthread.h>
+
+#include "sysrepo.h"
+#include "sysrepo/values.h"
+
+#include "utils.h"
+
+#define LINE_BUFSIZE 128
+
+volatile int exit_application = 0;
+
+pthread_mutex_t lock;
+
+static int sw_download_error_count, sw_install_error_count, sw_activate_error_count;
+
+void call_software_management_script(char *script_name)
+{
+ char line[LINE_BUFSIZE];
+ int linenr;
+ FILE *pipe;
+
+ /* Get a pipe where the output from the scripts comes in */
+ char script[200];
+ sprintf(script, "/opt/dev/%s", script_name);
+
+ pipe = popen(script, "r");
+ if (pipe == NULL) { /* check for errors */
+ printf("Could not open script.\n");
+ return; /* return with exit code indicating error */
+ }
+
+ /* Read script output from the pipe line by line */
+ linenr = 1;
+ while (fgets(line, LINE_BUFSIZE, pipe) != NULL) {
+ printf("Script output line %d: %s", linenr, line);
+ ++linenr;
+ }
+
+ /* Once here, out of the loop, the script has ended. */
+ pclose(pipe); /* Close the pipe */
+ return; /* return with exit code indicating success. */
+}
+
+struct sw_download_struct
+{
+ sr_session_ctx_t *sess;
+ char *filename;
+};
+
+void* sw_download_notification_send(void *arguments)
+{
+ // create the values to be sent in the notification
+ struct sw_download_struct *args = (struct sw_download_struct *)arguments;
+ int rc = SR_ERR_OK;
+
+ sw_download_error_count++;
+
+ sr_val_t *notif = NULL;
+ size_t current_num_of_values_notif = 0;
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ char *trunc_filename;
+ trunc_filename = strrchr(args->filename, '/');
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:download-event/file-name");
+ if (trunc_filename != NULL)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, trunc_filename + 1);
+
+ if (strcmp(trunc_filename+1, "reset") == 0)
+ {
+ call_software_management_script("edit-config-demo-start.sh");
+ }
+ else
+ {
+ call_software_management_script("edit-config-after-download.sh");
+ }
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->filename);
+ if (strcmp(args->filename, "reset") == 0)
+ {
+ call_software_management_script("edit-config-demo-start.sh");
+ }
+ else
+ {
+ call_software_management_script("edit-config-after-download.sh");
+ }
+ }
+
+ if (args->filename != NULL)
+ {
+ free(args->filename);
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:download-event/status");
+ //every 5 RPCs we send an error
+ if (sw_download_error_count % 5 == 0)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "AUTHENTICATION_ERROR");
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED");
+ }
+
+
+ // wait 5 seconds before sending the notification
+ sleep(5);
+
+ /* send notification for event_notif_sub(_tree)_example */
+ printf(">>> Sending event notification for '/xran-software-management:download-event'...\n");
+ rc = sr_event_notif_send(args->sess, "/xran-software-management:download-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT);
+ if (SR_ERR_NOT_FOUND == rc) {
+ printf("No application subscribed for '/xran-software-management:download-event', skipping.\n");
+ rc = SR_ERR_OK;
+ }
+ sr_free_values(notif, current_num_of_values_notif);
+
+ return NULL;
+}
+
+struct sw_install_struct
+{
+ sr_session_ctx_t *sess;
+ char *slot_name;
+};
+
+void* sw_install_notification_send(void *arguments)
+{
+ // create the values to be sent in the notification
+ struct sw_install_struct *args = (struct sw_install_struct *)arguments;
+ int rc = SR_ERR_OK;
+ sw_install_error_count++;
+
+ sr_val_t *notif = NULL;
+ size_t current_num_of_values_notif = 0;
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:install-event/slot-name");
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name);
+
+ if (args->slot_name != NULL)
+ {
+ free(args->slot_name);
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:install-event/status");
+
+ //every 5 RPCs we send an error
+ if (sw_install_error_count % 5 == 0)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "INTEGRITY_ERROR");
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED");
+ }
+
+ // wait 5 seconds before sending the notification
+ sleep(5);
+
+ /* send notification for event_notif_sub(_tree)_example */
+ printf(">>> Sending event notification for '/xran-software-management:install-event'...\n");
+ rc = sr_event_notif_send(args->sess, "/xran-software-management:install-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT);
+ if (SR_ERR_NOT_FOUND == rc) {
+ printf("No application subscribed for '/xran-software-management:install-event', skipping.\n");
+ rc = SR_ERR_OK;
+ }
+ sr_free_values(notif, current_num_of_values_notif);
+
+ return NULL;
+}
+
+struct sw_activate_struct
+{
+ sr_session_ctx_t *sess;
+ char *slot_name;
+};
+
+void* sw_activate_notification_send(void *arguments)
+{
+ // create the values to be sent in the notification
+ struct sw_activate_struct *args = (struct sw_activate_struct *)arguments;
+ int rc = SR_ERR_OK;
+ sw_activate_error_count++;
+
+ sr_val_t *notif = NULL;
+ size_t current_num_of_values_notif = 0;
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:activation-event/slot-name");
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name);
+
+ if (args->slot_name != NULL)
+ {
+ free(args->slot_name);
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:activation-event/status");
+ //every 5 RPCs we send an error
+ if (sw_activate_error_count % 5 == 0)
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "APPLICATION_ERROR");
+ }
+ else
+ {
+ sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED");
+
+ call_software_management_script("edit-config-after-activate.sh");
+ }
+
+ CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif);
+
+ sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:activation-event/return-code");
+ notif[current_num_of_values_notif - 1].type = SR_UINT8_T;
+ notif[current_num_of_values_notif - 1].data.uint8_val = 200;
+
+ // wait 5 seconds before sending the notification
+ sleep(5);
+
+ /* send notification for event_notif_sub(_tree)_example */
+ printf(">>> Sending event notification for '/xran-software-management:activation-event'...\n");
+ rc = sr_event_notif_send(args->sess, "/xran-software-management:activation-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT);
+ if (SR_ERR_NOT_FOUND == rc) {
+ printf("No application subscribed for '/xran-software-management:activation-event', skipping.\n");
+ rc = SR_ERR_OK;
+ }
+ sr_free_values(notif, current_num_of_values_notif);
+
+ return NULL;
+}
+
+static int
+sw_download_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
+ sr_val_t **output, size_t *output_cnt, void *private_ctx)
+{
+ int rc = SR_ERR_OK;
+ sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx;
+
+ /**
+ * Here you would actually run the operation against the provided input values
+ * and obtained the output values.
+ */
+
+ /* allocate output values */
+ rc = sr_new_values(2, output);
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+
+ rc = sr_val_set_xpath(&(*output)[0], "/xran-software-management:software-download/status");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[0].type = SR_ENUM_T;
+ (*output)[0].data.enum_val = "STARTED";
+
+ rc = sr_val_set_xpath(&(*output)[1], "/xran-software-management:software-download/notification-timeout");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[1].type = SR_INT32_T;
+ (*output)[1].data.int32_val = 10;
+
+ /* inform sysrepo about the number of output values */
+ *output_cnt = 2;
+
+ struct sw_download_struct *args = (struct sw_download_struct *)malloc(sizeof(struct sw_download_struct));
+ args->sess = session;
+ args->filename = strdup(input[0].data.string_val);
+
+ pthread_t sw_download_thread;
+ if(pthread_create(&sw_download_thread, NULL, &sw_download_notification_send, (void *)args))
+ {
+ fprintf(stderr, "Could not create thread for SW Download thread\n");
+ return SR_ERR_OPERATION_FAILED;
+ }
+
+ /**
+ * Do not deallocate input values!
+ * They will get freed automatically by sysrepo.
+ */
+ return rc;
+}
+
+static int
+sw_install_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
+ sr_val_t **output, size_t *output_cnt, void *private_ctx)
+{
+ int rc = SR_ERR_OK;
+ sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx;
+
+ /**
+ * Here you would actually run the operation against the provided input values
+ * and obtained the output values.
+ */
+
+ /* allocate output values */
+ rc = sr_new_values(1, output);
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+
+ rc = sr_val_set_xpath(&(*output)[0], "/xran-software-management:software-install/status");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[0].type = SR_ENUM_T;
+ (*output)[0].data.enum_val = "STARTED";
+
+ /* inform sysrepo about the number of output values */
+ *output_cnt = 1;
+
+ struct sw_install_struct *args = (struct sw_install_struct *)malloc(sizeof(struct sw_install_struct));
+ args->sess = session;
+ args->slot_name = strdup(input[0].data.string_val);
+
+ pthread_t sw_install_thread;
+ if(pthread_create(&sw_install_thread, NULL, &sw_install_notification_send, (void *)args))
+ {
+ fprintf(stderr, "Could not create thread for SW Install thread\n");
+ return SR_ERR_OPERATION_FAILED;
+ }
+
+ /**
+ * Do not deallocate input values!
+ * They will get freed automatically by sysrepo.
+ */
+ return rc;
+}
+
+static int
+sw_activate_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt,
+ sr_val_t **output, size_t *output_cnt, void *private_ctx)
+{
+ int rc = SR_ERR_OK;
+ sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx;
+
+ /**
+ * Here you would actually run the operation against the provided input values
+ * and obtained the output values.
+ */
+
+ /* allocate output values */
+ rc = sr_new_values(2, output);
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+
+ rc = sr_val_set_xpath(&(*output)[0], "/xran-software-management:software-activate/status");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[0].type = SR_ENUM_T;
+ (*output)[0].data.enum_val = "STARTED";
+
+ rc = sr_val_set_xpath(&(*output)[1], "/xran-software-management:software-activate/notification-timeout");
+ if (SR_ERR_OK != rc) {
+ return rc;
+ }
+ (*output)[1].type = SR_INT32_T;
+ (*output)[1].data.int32_val = 10;
+
+ /* inform sysrepo about the number of output values */
+ *output_cnt = 2;
+
+ struct sw_activate_struct *args = (struct sw_activate_struct *)malloc(sizeof(struct sw_activate_struct));
+ args->sess = session;
+ args->slot_name = strdup(input[0].data.string_val);
+
+ pthread_t sw_activate_thread;
+ if(pthread_create(&sw_activate_thread, NULL, &sw_activate_notification_send, (void *)args))
+ {
+ fprintf(stderr, "Could not create thread for SW Activate thread\n");
+ return SR_ERR_OPERATION_FAILED;
+ }
+
+ /**
+ * Do not deallocate input values!
+ * They will get freed automatically by sysrepo.
+ */
+ return rc;
+}
+
+static void
+sigint_handler(int signum)
+{
+ exit_application = 1;
+}
+
+static int
+rpc_handler(sr_session_ctx_t *session)
+{
+ sr_subscription_ctx_t *subscription = NULL;
+ int rc = SR_ERR_OK;
+
+ /* subscribe for handling software-download RPC */
+ rc = sr_rpc_subscribe(session, "/xran-software-management:software-download", sw_download_rpc_cb,
+ (void *)session, SR_SUBSCR_DEFAULT, &subscription);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ /* subscribe for handling software-install RPC */
+ rc = sr_rpc_subscribe(session, "/xran-software-management:software-install", sw_install_rpc_cb,
+ (void *)session, SR_SUBSCR_DEFAULT, &subscription);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ /* subscribe for handling software-activate RPC */
+ rc = sr_rpc_subscribe(session, "/xran-software-management:software-activate", sw_activate_rpc_cb,
+ (void *)session, SR_SUBSCR_DEFAULT, &subscription);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ printf("\n\n ========== SUBSCRIBED FOR HANDLING RPC ==========\n\n");
+
+ /* loop until ctrl-c is pressed / SIGINT is received */
+ signal(SIGINT, sigint_handler);
+ signal(SIGPIPE, SIG_IGN);
+ while (!exit_application) {
+ sleep(1000); /* or do some more useful work... */
+ }
+
+ printf("Application exit requested, exiting.\n");
+
+cleanup:
+ if (NULL != subscription) {
+ sr_unsubscribe(session, subscription);
+ }
+ return rc;
+}
+
+int
+main(int argc, char **argv)
+{
+ sr_conn_ctx_t *connection = NULL;
+ sr_session_ctx_t *session = NULL;
+ int rc = SR_ERR_OK;
+
+ setbuf(stdout, NULL);
+
+ if (pthread_mutex_init(&lock, NULL) != 0)
+ {
+ printf("Mutex init failed...\n");
+ goto cleanup;
+ }
+
+ /* connect to sysrepo */
+ rc = sr_connect("sw_management_rpc_app", 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_RUNNING, SR_SESS_DEFAULT, &session);
+ if (SR_ERR_OK != rc) {
+ fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc));
+ goto cleanup;
+ }
+
+ /* run as a RPC handler */
+ printf("This application will be an RPC handler for 'software-download' operation of 'xran-software-management'.\n");
+ rc = rpc_handler(session);
+
+cleanup:
+ if (NULL != session) {
+ sr_session_stop(session);
+ }
+ if (NULL != connection) {
+ sr_disconnect(connection);
+ }
+ return rc;
+}
#include <time.h>
#include <sys/time.h>
#include <stdio.h>
+#include <string.h>
void set_curl_common_info_ves(CURL *curl)
{
long int getMicrosecondsSinceEpoch(void)
{
time_t t = time(NULL);
- struct tm tm = *localtime(&t);
struct timeval tv;
long int useconds;
free(ves_ip);
-// curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
-
return;
}
+/*
+ * Dynamically allocated memory;
+ * Caller needs to free the memory after it uses the value.
+ *
+*/
cJSON* vesCreateCommonEventHeader(char *domain, char *event_type, char *source_name, int seq_id)
{
char dateAndTime[50];
getCurrentDateAndTime(dateAndTime);
- long int useconds = getMicrosecondsSinceEpoch;
+ long useconds = getMicrosecondsSinceEpoch();
cJSON *commonEventHeader = cJSON_CreateObject();
if (commonEventHeader == NULL)
if (cJSON_AddStringToObject(commonEventHeader, "domain", domain) == NULL)
{
printf("Could not create JSON object: domain\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "eventId", eventId) == NULL)
{
printf("Could not create JSON object: eventId\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "eventName", event_name) == NULL)
{
printf("Could not create JSON object: eventName\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "eventType", event_type) == NULL)
{
printf("Could not create JSON object: eventType\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddNumberToObject(commonEventHeader, "sequence", (double)(seq_id)) == NULL)
{
printf("Could not create JSON object: sequence\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "priority", "Low") == NULL)
{
printf("Could not create JSON object: priority\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "reportingEntityId", "") == NULL)
{
printf("Could not create JSON object: reportingEntityId\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "reportingEntityName", source_name) == NULL)
{
printf("Could not create JSON object: reportingEntityName\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "sourceId", "") == NULL)
{
printf("Could not create JSON object: sourceId\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "sourceName", source_name) == NULL)
{
printf("Could not create JSON object: sourceName\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddNumberToObject(commonEventHeader, "startEpochMicrosec", (double)(useconds)) == NULL)
{
printf("Could not create JSON object: startEpochMicrosec\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddNumberToObject(commonEventHeader, "lastEpochMicrosec", (double)(useconds)) == NULL)
{
printf("Could not create JSON object: lastEpochMicrosec\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "nfNamingCode", "sdn controller") == NULL)
{
printf("Could not create JSON object: nfNamingCode\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "nfVendorName", "sdn") == NULL)
{
printf("Could not create JSON object: nfVendorName\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "timeZoneOffset", "+00:00") == NULL)
{
printf("Could not create JSON object: timeZoneOffset\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "version", "4.0.1") == NULL)
{
printf("Could not create JSON object: version\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
if (cJSON_AddStringToObject(commonEventHeader, "vesEventListenerVersion", "7.0.1") == NULL)
{
printf("Could not create JSON object: vesEventListenerVersion\n");
+ cJSON_Delete(commonEventHeader);
return NULL;
}
return commonEventHeader;
}
+/*
+ * Dynamically allocated memory;
+ * Caller needs to free the memory after it uses the value.
+ *
+*/
cJSON* vesCreateHeartbeatFields(int heartbeat_interval)
{
char dateAndTime[50];
if (cJSON_AddStringToObject(heartbeatFields, "heartbeatFieldsVersion", "3.0") == NULL)
{
printf("Could not create JSON object: heartbeatFieldsVersion\n");
+ cJSON_Delete(heartbeatFields);
return NULL;
}
if (cJSON_AddNumberToObject(heartbeatFields, "heartbeatInterval", (double)(heartbeat_interval)) == NULL)
{
printf("Could not create JSON object: heartbeatInterval\n");
+ cJSON_Delete(heartbeatFields);
return NULL;
}
if (additionalFields == NULL)
{
printf("Could not create JSON object: additionalFields\n");
+ cJSON_Delete(heartbeatFields);
return NULL;
}
cJSON_AddItemToObject(heartbeatFields, "additionalFields", additionalFields);
if (cJSON_AddStringToObject(additionalFields, "eventTime", dateAndTime) == NULL)
{
printf("Could not create JSON object: eventTime\n");
+ cJSON_Delete(heartbeatFields);
return NULL;
}
return heartbeatFields;
}
+/*
+ * Dynamically allocated memory;
+ * Caller needs to free the memory after it uses the value.
+ *
+*/
char* readConfigFileInString(void)
{
char * buffer = 0;
void writeConfigFile(char *config)
{
- char * buffer = 0;
- long length;
char config_file[200];
sprintf(config_file, "%s/configuration.json", getenv("SCRIPTS_DIR"));
FILE * f = fopen (config_file, "w");
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *notifConfig = cJSON_GetObjectItemCaseSensitive(jsonConfig, "notification-config");
if (!cJSON_IsObject(notifConfig))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsNumber(faultNotifDelay))
{
printf("Configuration JSON is not as expected: fault-notification-delay-period is not a number");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
notificationDelay = (int)(faultNotifDelay->valuedouble);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return notificationDelay;
}
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *notifConfig = cJSON_GetObjectItemCaseSensitive(jsonConfig, "notification-config");
if (!cJSON_IsObject(notifConfig))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsNumber(vesHeartbeatPeriod))
{
printf("Configuration JSON is not as expected: ves-heartbeat-period is not a number");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
vesHeartbeat = (int)(vesHeartbeatPeriod->valuedouble);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return vesHeartbeat;
}
{
fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr);
}
- return SR_ERR_OPERATION_FAILED;
+ return NULL;
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details");
if (!cJSON_IsObject(vesDetails))
{
printf("Configuration JSON is not as expected: ves-endpoint-details is not an object");
- free(jsonConfig);
- return SR_ERR_OPERATION_FAILED;
+ cJSON_Delete(jsonConfig);
+ return NULL;
}
cJSON *vesAuthMethod = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-endpoint-auth-method");
if (!cJSON_IsString(vesAuthMethod))
{
printf("Configuration JSON is not as expected: ves-endpoint-auth-method is not an object");
- free(jsonConfig);
- return SR_ERR_OPERATION_FAILED;
+ cJSON_Delete(jsonConfig);
+ return NULL;
}
char *auth_method_string = strdup(cJSON_GetStringValue(vesAuthMethod));
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return auth_method_string;
}
{
fprintf(stderr, "Could not parse JSON configuration! Error before: %s\n", error_ptr);
}
- return SR_ERR_OPERATION_FAILED;
+ return NULL;
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details");
if (!cJSON_IsObject(vesDetails))
{
printf("Configuration JSON is not as expected: ves-endpoint-details is not an object");
- free(jsonConfig);
- return SR_ERR_OPERATION_FAILED;
+ cJSON_Delete(jsonConfig);
+ return NULL;
}
cJSON *vesIp = cJSON_GetObjectItemCaseSensitive(vesDetails, "ves-endpoint-ip");
if (!cJSON_IsString(vesIp))
{
printf("Configuration JSON is not as expected: ves-endpoint-ip is not an object");
- free(jsonConfig);
- return SR_ERR_OPERATION_FAILED;
+ cJSON_Delete(jsonConfig);
+ return NULL;
}
char *ves_ip = strdup(cJSON_GetStringValue(vesIp));
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return ves_ip;
}
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details");
if (!cJSON_IsObject(vesDetails))
{
printf("Configuration JSON is not as expected: ves-endpoint-details is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsNumber(vesPort))
{
printf("Configuration JSON is not as expected: ves-endpoint-port is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
int port = (int)(vesPort->valuedouble);
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return port;
}
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *vesDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "ves-endpoint-details");
if (!cJSON_IsObject(vesDetails))
{
printf("Configuration JSON is not as expected: ves-endpoint-details is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsBool(vesReg))
{
printf("Configuration JSON is not as expected: ves-registration is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
int is_ves_reg = (cJSON_IsTrue(vesReg)) ? TRUE : FALSE;
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return is_ves_reg;
}
+/*
+ * Dynamically allocated memory;
+ * Caller needs to free the memory after it uses the value.
+ *
+*/
cJSON* vesCreatePnfRegistrationFields(int port, bool is_tls)
{
cJSON *pnfRegistrationFields = cJSON_CreateObject();
if (cJSON_AddStringToObject(pnfRegistrationFields, "pnfRegistrationFieldsVersion", "2.0") == NULL)
{
printf("Could not create JSON object: pnfRegistrationFieldsVersion\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "lastServiceDate", "2019-08-16") == NULL)
{
printf("Could not create JSON object: lastServiceDate\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "macAddress", mac_addr) == NULL)
{
printf("Could not create JSON object: macAddress\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "manufactureDate", "2019-08-16") == NULL)
{
printf("Could not create JSON object: manufactureDate\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "modelNumber", "Simulated Device Melacon") == NULL)
{
printf("Could not create JSON object: manufactureDate\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "oamV4IpAddress", getenv("NTS_IP")) == NULL)
{
printf("Could not create JSON object: oamV4IpAddress\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "oamV6IpAddress", "0:0:0:0:0:ffff:a0a:011") == NULL)
{
printf("Could not create JSON object: oamV6IpAddress\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "serialNumber", serial_number) == NULL)
{
printf("Could not create JSON object: serialNumber\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "softwareVersion", "2.3.5") == NULL)
{
printf("Could not create JSON object: softwareVersion\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "unitFamily", "Simulated Device") == NULL)
{
printf("Could not create JSON object: unitFamily\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "unitType", "O-RAN-sim") == NULL)
{
printf("Could not create JSON object: unitType\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(pnfRegistrationFields, "vendorName", "Melacon") == NULL)
{
printf("Could not create JSON object: vendorName\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (additionalFields == NULL)
{
printf("Could not create JSON object: additionalFields\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
cJSON_AddItemToObject(pnfRegistrationFields, "additionalFields", additionalFields);
if (cJSON_AddStringToObject(additionalFields, "oamPort", portString) == NULL)
{
printf("Could not create JSON object: oamPort\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "protocol", "TLS") == NULL)
{
printf("Could not create JSON object: protocol\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "username", "netconf") == NULL)
{
printf("Could not create JSON object: username\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "keyId", "device-key") == NULL)
{
printf("Could not create JSON object: keyId\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
}
if (cJSON_AddStringToObject(additionalFields, "protocol", "SSH") == NULL)
{
printf("Could not create JSON object: protocol\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "username", "netconf") == NULL)
{
printf("Could not create JSON object: username\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "password", "netconf") == NULL)
{
printf("Could not create JSON object: password\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
}
if (cJSON_AddStringToObject(additionalFields, "reconnectOnChangedSchema", "false") == NULL)
{
printf("Could not create JSON object: reconnectOnChangedSchema\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "sleep-factor", "1.5") == NULL)
{
printf("Could not create JSON object: sleep-factor\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "tcpOnly", "false") == NULL)
{
printf("Could not create JSON object: tcpOnly\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "connectionTimeout", "20000") == NULL)
{
printf("Could not create JSON object: connectionTimeout\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "maxConnectionAttempts", "100") == NULL)
{
printf("Could not create JSON object: maxConnectionAttempts\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "betweenAttemptsTimeout", "2000") == NULL)
{
printf("Could not create JSON object: betweenAttemptsTimeout\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
if (cJSON_AddStringToObject(additionalFields, "keepaliveDelay", "120") == NULL)
{
printf("Could not create JSON object: keepaliveDelay\n");
+ cJSON_Delete(pnfRegistrationFields);
return NULL;
}
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *notifDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "notification-config");
if (!cJSON_IsObject(notifDetails))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsBool(isNetconfAvailable))
{
printf("Configuration JSON is not as expected: is-netconf-available is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
int is_netconf_available = (cJSON_IsTrue(isNetconfAvailable)) ? TRUE : FALSE;
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return is_netconf_available;
}
}
//we don't need the string anymore
free(stringConfig);
+ stringConfig = NULL;
cJSON *notifDetails = cJSON_GetObjectItemCaseSensitive(jsonConfig, "notification-config");
if (!cJSON_IsObject(notifDetails))
{
printf("Configuration JSON is not as expected: notification-config is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
if (!cJSON_IsBool(isVesAvailable))
{
printf("Configuration JSON is not as expected: is-ves-available is not an object");
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return SR_ERR_OPERATION_FAILED;
}
int is_netconf_available = (cJSON_IsTrue(isVesAvailable)) ? TRUE : FALSE;
- free(jsonConfig);
+ cJSON_Delete(jsonConfig);
return is_netconf_available;
}
+/*
+ * Dynamically allocated memory;
+ * Caller needs to free the memory after it uses the value.
+ *
+*/
cJSON* vesCreateFaultFields(char *alarm_condition, char *alarm_object, char *severity, char *date_time, char *specific_problem)
{
cJSON *faultFields = cJSON_CreateObject();
if (cJSON_AddStringToObject(faultFields, "faultFieldsVersion", "4.0") == NULL)
{
printf("Could not create JSON object: faultFieldsVersion\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(faultFields, "alarmCondition", alarm_condition) == NULL)
{
printf("Could not create JSON object: alarmCondition\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(faultFields, "alarmInterfaceA", alarm_object) == NULL)
{
printf("Could not create JSON object: alarmInterfaceA\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(faultFields, "eventSourceType", "O_RAN_COMPONENT") == NULL)
{
printf("Could not create JSON object: eventSourceType\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(faultFields, "specificProblem", specific_problem) == NULL)
{
printf("Could not create JSON object: specificProblem\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(faultFields, "eventSeverity", severity) == NULL)
{
printf("Could not create JSON object: eventSeverity\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(faultFields, "vfStatus", "Active") == NULL)
{
printf("Could not create JSON object: vfStatus\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (alarmAdditionalInformation == NULL)
{
printf("Could not create JSON object: alarmAdditionalInformation\n");
+ cJSON_Delete(faultFields);
return NULL;
}
cJSON_AddItemToObject(faultFields, "alarmAdditionalInformation", alarmAdditionalInformation);
if (cJSON_AddStringToObject(alarmAdditionalInformation, "eventTime", date_time) == NULL)
{
printf("Could not create JSON object: eventTime\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(alarmAdditionalInformation, "equipType", "O-RAN-sim") == NULL)
{
printf("Could not create JSON object: equipType\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(alarmAdditionalInformation, "vendor", "Melacon") == NULL)
{
printf("Could not create JSON object: vendor\n");
+ cJSON_Delete(faultFields);
return NULL;
}
if (cJSON_AddStringToObject(alarmAdditionalInformation, "model", "Simulated Device") == NULL)
{
printf("Could not create JSON object: model\n");
+ cJSON_Delete(faultFields);
return NULL;
}
return SR_ERR_OK;
}
-//static void prepare_ves_message_curl(void)
-//{
-// curl_easy_reset(curl);
-// set_curl_common_info();
-//
-// char *ves_ip = getVesIpFromConfigJson();
-// int ves_port = getVesPortFromConfigJson();
-//
-// char url[100];
-// sprintf(url, "http://%s:%d/eventListener/v7", ves_ip, ves_port);
-// curl_easy_setopt(curl, CURLOPT_URL, url);
-//
-// free(ves_ip);
-//
-//// curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
-//
-// return;
-//}
/*
* Heartbeat payload example
*
prepare_ves_message_curl(curl);
cJSON *postDataJson = cJSON_CreateObject();
+ if (postDataJson == NULL)
+ {
+ printf("Could not create JSON object: postDataJson\n");
+ return 1;
+ }
cJSON *event = cJSON_CreateObject();
if (event == NULL)
if (commonEventHeader == NULL)
{
printf("Could not create JSON object: commonEventHeader\n");
+ cJSON_Delete(postDataJson);
return 1;
}
cJSON_AddItemToObject(event, "commonEventHeader", commonEventHeader);
if (heartbeatFields == NULL)
{
printf("Could not create JSON object: heartbeatFields\n");
+ cJSON_Delete(postDataJson);
return 1;
}
cJSON_AddItemToObject(event, "heartbeatFields", heartbeatFields);
if (res != CURLE_OK)
{
- printf("Failed to send cURL...\n");
return SR_ERR_OPERATION_FAILED;
}
prepare_ves_message_curl(curl);
cJSON *postDataJson = cJSON_CreateObject();
+ if (postDataJson == NULL)
+ {
+ printf("Could not create JSON object: postDataJson\n");
+ return 1;
+ }
cJSON *event = cJSON_CreateObject();
if (event == NULL)
{
printf("Could not create JSON object: event\n");
+ cJSON_Delete(postDataJson);
return 1;
}
cJSON_AddItemToObject(postDataJson, "event", event);
if (commonEventHeader == NULL)
{
printf("Could not create JSON object: commonEventHeader\n");
+ cJSON_Delete(postDataJson);
return 1;
}
cJSON_AddItemToObject(event, "commonEventHeader", commonEventHeader);
if (pnfRegistrationFields == NULL)
{
printf("Could not create JSON object: pnfRegistrationFields\n");
+ cJSON_Delete(postDataJson);
return 1;
}
cJSON_AddItemToObject(event, "pnfRegistrationFields", pnfRegistrationFields);
declare -a excludedModules=()
-# Uninstall the NTS Manager YANG model
-$SYSREPOCTL -u -m network-topology-simulator
-# $SYSREPOCTL -u -m iana-if-type
-# $SYSREPOCTL -u -m ietf-ip
-# $SYSREPOCTL -u -m ietf-interfaces
-
-
sleep 5
pyang -f clearmust *.yang
--- /dev/null
+module ietf-alarms {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-alarms";
+ prefix al;
+
+ import ietf-yang-types {
+ prefix yang;
+ reference
+ "RFC 6991: Common YANG Data Types.";
+ }
+
+ organization
+ "IETF CCAMP Working Group";
+ contact
+ "WG Web: <https://trac.ietf.org/trac/ccamp>
+ WG List: <mailto:ccamp@ietf.org>
+
+ Editor: Stefan Vallin
+ <mailto:stefan@wallan.se>
+
+ Editor: Martin Bjorklund
+ <mailto:mbj@tail-f.com>";
+ description
+ "This module defines an interface for managing alarms. Main
+ inputs to the module design are the 3GPP Alarm Integration
+ Reference Point (IRP), ITU-T X.733, and ANSI/ISA-18.2 alarm
+ standards.
+ Main features of this module include:
+
+ * Alarm list:
+ A list of all alarms. Cleared alarms stay in
+ the list until explicitly purged.
+
+ * Operator actions on alarms:
+ Acknowledging and closing alarms.
+
+ * Administrative actions on alarms:
+ Purging alarms from the list according to specific
+ criteria.
+
+ * Alarm inventory:
+ A management application can read all
+ alarm types implemented by the system.
+
+ * Alarm shelving:
+ Shelving (blocking) alarms according
+ to specific criteria.
+
+ * Alarm profiles:
+ A management system can attach further
+ information to alarm types, for example,
+ overriding system-default severity
+ levels.
+
+ This module uses a stateful view on alarms. An alarm is a state
+ for a specific resource (note that an alarm is not a
+ notification). An alarm type is a possible alarm state for a
+ resource. For example, the tuple:
+
+ ('link-alarm', 'GigabitEthernet0/25')
+
+ is an alarm of type 'link-alarm' on the resource
+ 'GigabitEthernet0/25'.
+
+ Alarm types are identified using YANG identities and an optional
+ string-based qualifier. The string-based qualifier allows for
+ dynamic extension of the statically defined alarm types. Alarm
+ types identify a possible alarm state and not the individual
+ notifications. For example, the traditional 'link-down' and
+ 'link-up' notifications are two notifications referring to the
+ same alarm type 'link-alarm'.
+
+ With this design, there is no ambiguity about how alarm and
+ alarm clear correlation should be performed; notifications that
+ report the same resource and alarm type are considered updates
+ of the same alarm, e.g., clearing an active alarm or changing
+ the severity of an alarm. The instrumentation can update the
+ severity and alarm text on an existing alarm. The above alarm
+ example can therefore look like the following:
+
+ (('link-alarm', 'GigabitEthernet0/25'),
+ warning,
+ 'interface down while interface admin state is up')
+
+ There is a clear separation between updates on the alarm from
+ the underlying resource, like clear, and updates from an
+ operator, like acknowledging or closing an alarm:
+
+ (('link-alarm', 'GigabitEthernet0/25'),
+ warning,
+ 'interface down while interface admin state is up',
+ cleared,
+ closed)
+
+ Administrative actions like removing closed alarms older than a
+ given time is supported.
+
+ This YANG module does not define how the underlying
+ instrumentation detects and clears the specific alarms. That
+ belongs to the Standards Development Organization (SDO) or
+ enterprise that owns that specific technology.
+
+ The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
+ NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
+ 'MAY', and 'OPTIONAL' in this document are to be interpreted as
+ described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
+ they appear in all capitals, as shown here.
+
+ Copyright (c) 2019 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 8632; see
+ the RFC itself for full legal notices.";
+
+ revision 2019-09-11 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8632: A YANG Data Model for Alarm Management";
+ }
+
+ /*
+ * Features
+ */
+
+ feature operator-actions {
+ description
+ "This feature indicates that the system supports operator
+ states on alarms.";
+ }
+
+ feature alarm-shelving {
+ description
+ "This feature indicates that the system supports shelving
+ (blocking) alarms.
+
+ Alarm shelving may have an impact on server processing
+ resources in order to match alarms against shelf
+ criteria.";
+ }
+
+ feature alarm-history {
+ description
+ "This feature indicates that the server maintains a history
+ of state changes for each alarm. For example, if an alarm
+ toggles between cleared and active 10 times, these state
+ changes are present in a separate list in the alarm.
+
+ Keeping the alarm history may have an impact on server
+ memory resources.";
+ }
+
+ feature alarm-summary {
+ description
+ "This feature indicates that the server summarizes the number
+ of alarms per severity and operator state.";
+ }
+
+ feature alarm-profile {
+ description
+ "The system enables clients to configure further information
+ to each alarm type.";
+ }
+
+ feature severity-assignment {
+ description
+ "The system supports configurable alarm severity levels.";
+ reference
+ "ITU-T Recommendation M.3100:
+ Generic network information model
+ ITU-T Recommendation M.3160:
+ Generic, protocol-neutral management information model";
+ }
+
+ feature root-cause-analysis {
+ description
+ "The system supports identifying candidate root-cause
+ resources for an alarm, for example, a disk partition
+ root cause for a logger failure alarm.";
+ }
+
+ feature service-impact-analysis {
+ description
+ "The system supports identifying candidate-impacted
+ resources for an alarm, for example, an interface state change
+ resulting in a link alarm, which can refer to a link as being
+ impacted.";
+ }
+
+ feature alarm-correlation {
+ description
+ "The system supports correlating/grouping alarms
+ that belong together.";
+ }
+
+ /*
+ * Identities
+ */
+
+ identity alarm-type-id {
+ description
+ "Base identity for alarm types. A unique identification of
+ the alarm, not including the resource. Different resources
+ can share alarm types. If the resource reports the same
+ alarm type, it is considered to be the same alarm. The alarm
+ type is a simplification of the different X.733 and 3GPP Alarm
+ IRP correlation mechanisms, and it allows for
+ hierarchical extensions.
+
+ A string-based qualifier can be used in addition to the
+ identity in order to have different alarm types based on
+ information not known at design time, such as values in
+ textual SNMP Notification varbinds.
+
+ Standards and vendors can define sub-identities to clearly
+ identify specific alarm types.
+
+ This identity is abstract and MUST NOT be used for alarms.";
+ }
+
+ /*
+ * Common types
+ */
+
+ typedef resource {
+ type union {
+ type instance-identifier {
+ require-instance false;
+ }
+ type yang:object-identifier;
+ type string;
+ type yang:uuid;
+ }
+ description
+ "This is an identification of the alarming resource, such as an
+ interface. It should be as fine-grained as possible to both
+ guide the operator and guarantee uniqueness of the alarms.
+
+ If the alarming resource is modeled in YANG, this type will
+ be an instance-identifier.
+
+ If the resource is an SNMP object, the type will be an
+ 'object-identifier'.
+
+ If the resource is anything else, for example, a distinguished
+ name or a Common Information Model (CIM) path, this type will
+ be a string.
+
+ If the alarming object is identified by a Universally Unique
+ Identifier (UUID), use the uuid type. Be cautious when using
+ this type, since a UUID is hard to use for an operator.
+
+ If the server supports several models, the precedence should
+ be in the order as given in the union definition.";
+ }
+
+ typedef resource-match {
+ type union {
+ type yang:xpath1.0;
+ type yang:object-identifier;
+ type string;
+ }
+ description
+ "This type is used to match resources of type 'resource'.
+ Since the type 'resource' is a union of different types, the
+ 'resource-match' type is also a union of corresponding types.
+
+ If the type is given as an XPath 1.0 expression, a resource
+ of type 'instance-identifier' matches if the instance is part
+ of the node set that is the result of evaluating the XPath 1.0
+ expression. For example, the XPath 1.0 expression:
+
+ /ietf-interfaces:interfaces/ietf-interfaces:interface
+ [ietf-interfaces:type='ianaift:ethernetCsmacd']
+
+ would match the resource instance-identifier:
+
+ /if:interfaces/if:interface[if:name='eth1'],
+
+ assuming that the interface 'eth1' is of type
+ 'ianaift:ethernetCsmacd'.
+
+ If the type is given as an object identifier, a resource of
+ type 'object-identifier' matches if the match object
+ identifier is a prefix of the resource's object identifier.
+ For example, the value:
+
+ 1.3.6.1.2.1.2.2
+
+ would match the resource object identifier:
+
+ 1.3.6.1.2.1.2.2.1.1.5
+
+ If the type is given as an UUID or a string, it is interpreted
+ as an XML Schema regular expression, which matches a resource
+ of type 'yang:uuid' or 'string' if the given regular
+ expression matches the resource string.
+
+ If the type is given as an XPath expression, it is evaluated
+ in the following XPath context:
+
+ o The set of namespace declarations is the set of prefix
+ and namespace pairs for all YANG modules implemented by
+ the server, where the prefix is the YANG module name and
+ the namespace is as defined by the 'namespace' statement
+ in the YANG module.
+
+ If a leaf of this type is encoded in XML, all namespace
+ declarations in scope on the leaf element are added to
+ the set of namespace declarations. If a prefix found in
+ the XML is already present in the set of namespace
+ declarations, the namespace in the XML is used.
+
+ o The set of variable bindings is empty.
+
+ o The function library is the core function library, and
+ the functions are defined in Section 10 of RFC 7950.
+
+ o The context node is the root node in the data tree.";
+ reference
+ "XML Schema Part 2: Datatypes Second Edition,
+ World Wide Web Consortium Recommendation
+ REC-xmlschema-2-20041028";
+ }
+
+ typedef alarm-text {
+ type string;
+ description
+ "The string used to inform operators about the alarm. This
+ MUST contain enough information for an operator to be able to
+ understand the problem and how to resolve it. If this string
+ contains structure, this format should be clearly documented
+ for programs to be able to parse that information.";
+ }
+
+ typedef severity {
+ type enumeration {
+ enum indeterminate {
+ value 2;
+ description
+ "Indicates that the severity level could not be
+ determined. This level SHOULD be avoided.";
+ }
+ enum warning {
+ value 3;
+ description
+ "The 'warning' severity level indicates the detection of a
+ potential or impending service-affecting fault, before any
+ significant effects have been felt. Action should be
+ taken to further diagnose (if necessary) and correct the
+ problem in order to prevent it from becoming a more
+ serious service-affecting fault.";
+ }
+ enum minor {
+ value 4;
+ description
+ "The 'minor' severity level indicates the existence of a
+ non-service-affecting fault condition and that corrective
+ action should be taken in order to prevent a more serious
+ (for example, service-affecting) fault. Such a severity
+ can be reported, for example, when the detected alarm
+ condition is not currently degrading the capacity of the
+ resource.";
+ }
+ enum major {
+ value 5;
+ description
+ "The 'major' severity level indicates that a service-
+ affecting condition has developed and an urgent corrective
+ action is required. Such a severity can be reported, for
+ example, when there is a severe degradation in the
+ capability of the resource and its full capability must be
+ restored.";
+ }
+ enum critical {
+ value 6;
+ description
+ "The 'critical' severity level indicates that a service-
+ affecting condition has occurred and an immediate
+ corrective action is required. Such a severity can be
+ reported, for example, when a resource becomes totally out
+ of service and its capability must be restored.";
+ }
+ }
+ description
+ "The severity level of the alarm. Note well that the value
+ 'clear' is not included. Whether or not an alarm is cleared
+ is a separate boolean flag.";
+ reference
+ "ITU-T Recommendation X.733: Information Technology
+ - Open Systems Interconnection
+ - System Management: Alarm Reporting Function";
+ }
+
+ typedef severity-with-clear {
+ type union {
+ type enumeration {
+ enum cleared {
+ value 1;
+ description
+ "The alarm is cleared by the instrumentation.";
+ }
+ }
+ type severity;
+ }
+ description
+ "The severity level of the alarm including clear. This is used
+ only in notifications reporting state changes for an alarm.";
+ }
+
+ typedef writable-operator-state {
+ type enumeration {
+ enum none {
+ value 1;
+ description
+ "The alarm is not being taken care of.";
+ }
+ enum ack {
+ value 2;
+ description
+ "The alarm is being taken care of. Corrective action not
+ taken yet or has failed";
+ }
+ enum closed {
+ value 3;
+ description
+ "Corrective action taken successfully.";
+ }
+ }
+ description
+ "Operator states on an alarm. The 'closed' state indicates
+ that an operator considers the alarm being resolved. This is
+ separate from the alarm's 'is-cleared' leaf.";
+ }
+
+ typedef operator-state {
+ type union {
+ type writable-operator-state;
+ type enumeration {
+ enum shelved {
+ value 4;
+ description
+ "The alarm is shelved. Alarms in /alarms/shelved-alarms/
+ MUST be assigned this operator state by the server as
+ the last entry in the 'operator-state-change' list. The
+ text for that entry SHOULD include the shelf name.";
+ }
+ enum un-shelved {
+ value 5;
+ description
+ "The alarm is moved back to 'alarm-list' from a shelf.
+ Alarms that are moved from /alarms/shelved-alarms/ to
+ /alarms/alarm-list MUST be assigned this state by the
+ server as the last entry in the 'operator-state-change'
+ list. The text for that entry SHOULD include the shelf
+ name.";
+ }
+ }
+ }
+ description
+ "Operator states on an alarm. The 'closed' state indicates
+ that an operator considers the alarm being resolved. This is
+ separate from the alarm's 'is-cleared' leaf.";
+ }
+
+ /* Alarm type */
+
+ typedef alarm-type-id {
+ type identityref {
+ base alarm-type-id;
+ }
+ description
+ "Identifies an alarm type. The description of the alarm type
+ id MUST indicate whether or not the alarm type is abstract.
+ An abstract alarm type is used as a base for other alarm type
+ ids and will not be used as a value for an alarm or be present
+ in the alarm inventory.";
+ }
+
+ typedef alarm-type-qualifier {
+ type string;
+ description
+ "If an alarm type cannot be fully specified at design time by
+ 'alarm-type-id', this string qualifier is used in addition to
+ fully define a unique alarm type.
+
+ The definition of alarm qualifiers is considered to be part of
+ the instrumentation and is out of scope for this module. An
+ empty string is used when this is part of a key.";
+ }
+
+ /*
+ * Groupings
+ */
+
+ grouping common-alarm-parameters {
+ description
+ "Common parameters for an alarm.
+
+ This grouping is used both in the alarm list and in the
+ notification representing an alarm-state change.";
+ leaf resource {
+ type resource;
+ mandatory true;
+ description
+ "The alarming resource. See also 'alt-resource'. This could
+ be, for example, a reference to the alarming interface";
+ }
+ leaf alarm-type-id {
+ type alarm-type-id;
+ mandatory true;
+ description
+ "This leaf and the leaf 'alarm-type-qualifier' together
+ provide a unique identification of the alarm type.";
+ }
+ leaf alarm-type-qualifier {
+ type alarm-type-qualifier;
+ description
+ "This leaf is used when the 'alarm-type-id' leaf cannot
+ uniquely identify the alarm type. Normally, this is not the
+ case, and this leaf is the empty string.";
+ }
+ leaf-list alt-resource {
+ type resource;
+ description
+ "Used if the alarming resource is available over other
+ interfaces. This field can contain SNMP OIDs, CIM paths, or
+ 3GPP distinguished names, for example.";
+ }
+ list related-alarm {
+ if-feature "alarm-correlation";
+ key "resource alarm-type-id alarm-type-qualifier";
+ description
+ "References to related alarms. Note that the related alarm
+ might have been purged from the alarm list.";
+ leaf resource {
+ type leafref {
+ path "/alarms/alarm-list/alarm/resource";
+ require-instance false;
+ }
+ description
+ "The alarming resource for the related alarm.";
+ }
+ leaf alarm-type-id {
+ type leafref {
+ path "/alarms/alarm-list/alarm"
+ + "[resource=current()/../resource]"
+ + "/alarm-type-id";
+ require-instance false;
+ }
+ description
+ "The alarm type identifier for the related alarm.";
+ }
+ leaf alarm-type-qualifier {
+ type leafref {
+ path "/alarms/alarm-list/alarm"
+ + "[resource=current()/../resource]"
+ + "[alarm-type-id=current()/../alarm-type-id]"
+ + "/alarm-type-qualifier";
+ require-instance false;
+ }
+ description
+ "The alarm qualifier for the related alarm.";
+ }
+ }
+ leaf-list impacted-resource {
+ if-feature "service-impact-analysis";
+ type resource;
+ description
+ "Resources that might be affected by this alarm. If the
+ system creates an alarm on a resource and also has a mapping
+ to other resources that might be impacted, these resources
+ can be listed in this leaf-list. In this way, the system
+ can create one alarm instead of several. For example, if an
+ interface has an alarm, the 'impacted-resource' can
+ reference the aggregated port channels.";
+ }
+ leaf-list root-cause-resource {
+ if-feature "root-cause-analysis";
+ type resource;
+ description
+ "Resources that are candidates for causing the alarm. If the
+ system has a mechanism to understand the candidate root
+ causes of an alarm, this leaf-list can be used to list the
+ root-cause candidate resources. In this way, the system can
+ create one alarm instead of several. An example might be a
+ logging system (alarm resource) that fails; the alarm can
+ reference the file system in the 'root-cause-resource'
+ leaf-list. Note that the intended use is not to also send
+ an alarm with the 'root-cause-resource' as an alarming
+ resource. The 'root-cause-resource' leaf-list is a hint and
+ should not also generate an alarm for the same problem.";
+ }
+ }
+
+ grouping alarm-state-change-parameters {
+ description
+ "Parameters for an alarm-state change.
+
+ This grouping is used both in the alarm list's status-change
+ list and in the notification representing an alarm-state
+ change.";
+ leaf time {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "The time the status of the alarm changed. The value
+ represents the time the real alarm-state change appeared in
+ the resource and not when it was added to the alarm
+ list. The /alarm-list/alarm/last-changed MUST be set to the
+ same value.";
+ }
+ leaf perceived-severity {
+ type severity-with-clear;
+ mandatory true;
+ description
+ "The severity of the alarm as defined by X.733. Note that
+ this may not be the original severity since the alarm may
+ have changed severity.";
+ reference
+ "ITU-T Recommendation X.733: Information Technology
+ - Open Systems Interconnection
+ - System Management: Alarm Reporting Function";
+ }
+ leaf alarm-text {
+ type alarm-text;
+ mandatory true;
+ description
+ "A user-friendly text describing the alarm-state change.";
+ reference
+ "ITU-T Recommendation X.733: Information Technology
+ - Open Systems Interconnection
+ - System Management: Alarm Reporting Function";
+ }
+ }
+
+ grouping operator-parameters {
+ description
+ "This grouping defines parameters that can be changed by an
+ operator.";
+ leaf time {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "Timestamp for operator action on the alarm.";
+ }
+ leaf operator {
+ type string;
+ mandatory true;
+ description
+ "The name of the operator that has acted on this alarm.";
+ }
+ leaf state {
+ type operator-state;
+ mandatory true;
+ description
+ "The operator's view of the alarm state.";
+ }
+ leaf text {
+ type string;
+ description
+ "Additional optional textual information provided by the
+ operator.";
+ }
+ }
+
+ grouping resource-alarm-parameters {
+ description
+ "Alarm parameters that originate from the resource view.";
+ leaf is-cleared {
+ type boolean;
+ mandatory true;
+ description
+ "Indicates the current clearance state of the alarm. An
+ alarm might toggle from active alarm to cleared alarm and
+ back to active again.";
+ }
+ leaf last-raised {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "An alarm may change severity level and toggle between
+ active and cleared during its lifetime. This leaf indicates
+ the last time it was raised ('is-cleared' = 'false').";
+ }
+ leaf last-changed {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "A timestamp when the 'status-change' or
+ 'operator-state-change' list was last changed.";
+ }
+ leaf perceived-severity {
+ type severity;
+ mandatory true;
+ description
+ "The last severity of the alarm.
+
+ If an alarm was raised with severity 'warning' but later
+ changed to 'major', this leaf will show 'major'.";
+ }
+ leaf alarm-text {
+ type alarm-text;
+ mandatory true;
+ description
+ "The last reported alarm text. This text should contain
+ information for an operator to be able to understand the
+ problem and how to resolve it.";
+ }
+ list status-change {
+ if-feature "alarm-history";
+ key "time";
+ min-elements 1;
+ description
+ "A list of status-change events for this alarm.
+
+ The entry with latest timestamp in this list MUST
+ correspond to the leafs 'is-cleared', 'perceived-severity',
+ and 'alarm-text' for the alarm.
+
+ This list is ordered according to the timestamps of alarm
+ state changes. The first item corresponds to the latest
+ state change.
+
+ The following state changes create an entry in this
+ list:
+ - changed severity (warning, minor, major, critical)
+ - clearance status; this also updates the 'is-cleared'
+ leaf
+ - alarm-text update";
+ uses alarm-state-change-parameters;
+ }
+ }
+
+ grouping filter-input {
+ description
+ "Grouping to specify a filter construct on alarm information.";
+ leaf alarm-clearance-status {
+ type enumeration {
+ enum any {
+ description
+ "Ignore alarm-clearance status.";
+ }
+ enum cleared {
+ description
+ "Filter cleared alarms.";
+ }
+ enum not-cleared {
+ description
+ "Filter not-cleared alarms.";
+ }
+ }
+ mandatory true;
+ description
+ "The clearance status of the alarm.";
+ }
+ container older-than {
+ presence "Age specification";
+ description
+ "Matches the 'last-status-change' leaf in the alarm.";
+ choice age-spec {
+ description
+ "Filter using date and time age.";
+ case seconds {
+ leaf seconds {
+ type uint16;
+ description
+ "Age expressed in seconds.";
+ }
+ }
+ case minutes {
+ leaf minutes {
+ type uint16;
+ description
+ "Age expressed in minutes.";
+ }
+ }
+ case hours {
+ leaf hours {
+ type uint16;
+ description
+ "Age expressed in hours.";
+ }
+ }
+ case days {
+ leaf days {
+ type uint16;
+ description
+ "Age expressed in days.";
+ }
+ }
+ case weeks {
+ leaf weeks {
+ type uint16;
+ description
+ "Age expressed in weeks.";
+ }
+ }
+ }
+ }
+ container severity {
+ presence "Severity filter";
+ choice sev-spec {
+ description
+ "Filter based on severity level.";
+ leaf below {
+ type severity;
+ description
+ "Severity less than this leaf.";
+ }
+ leaf is {
+ type severity;
+ description
+ "Severity level equal to this leaf.";
+ }
+ leaf above {
+ type severity;
+ description
+ "Severity level higher than this leaf.";
+ }
+ }
+ description
+ "Filter based on severity.";
+ }
+ container operator-state-filter {
+ if-feature "operator-actions";
+ presence "Operator state filter";
+ leaf state {
+ type operator-state;
+ description
+ "Filter on operator state.";
+ }
+ leaf user {
+ type string;
+ description
+ "Filter based on which operator.";
+ }
+ description
+ "Filter based on operator state.";
+ }
+ }
+
+ /*
+ * The /alarms data tree
+ */
+
+ container alarms {
+ description
+ "The top container for this module.";
+ container control {
+ description
+ "Configuration to control the alarm behavior.";
+ leaf max-alarm-status-changes {
+ type union {
+ type uint16;
+ type enumeration {
+ enum infinite {
+ description
+ "The status-change entries are accumulated
+ infinitely.";
+ }
+ }
+ }
+ default "32";
+ description
+ "The 'status-change' entries are kept in a circular list
+ per alarm. When this number is exceeded, the oldest
+ status change entry is automatically removed. If the
+ value is 'infinite', the status-change entries are
+ accumulated infinitely.";
+ }
+ leaf notify-status-changes {
+ type enumeration {
+ enum all-state-changes {
+ description
+ "Send notifications for all status changes.";
+ }
+ enum raise-and-clear {
+ description
+ "Send notifications only for raise, clear, and
+ re-raise. Notifications for severity-level changes or
+ alarm-text changes are not sent.";
+ }
+ enum severity-level {
+ description
+ "Only send notifications for alarm-state changes
+ crossing the level specified in
+ 'notify-severity-level'. Always send clear
+ notifications.";
+ }
+ }
+ must '. != "severity-level" or ../notify-severity-level' {
+ description
+ "When notify-status-changes is 'severity-level', a value
+ must be given for 'notify-severity-level'.";
+ }
+ default "all-state-changes";
+ description
+ "This leaf controls the notifications sent for alarm status
+ updates. There are three options:
+
+ 1. Notifications are sent for all updates, severity-level
+ changes, and alarm-text changes.
+
+ 2. Notifications are only sent for alarm raise and clear.
+
+ 3. Notifications are sent for status changes equal to or
+ above the specified severity level. Clear
+ notifications shall always be sent. Notifications
+ shall also be sent for state changes that make an
+ alarm less severe than the specified level.
+
+ For example, in option 3, assume that the severity level
+ is set to major and that the alarm has the following state
+ changes:
+
+ [(Time, severity, clear)]:
+ [(T1, major, -), (T2, minor, -), (T3, warning, -),
+ (T4, minor, -), (T5, major, -), (T6, critical, -),
+ (T7, major. -), (T8, major, clear)]
+
+ In that case, notifications will be sent at times
+ T1, T2, T5, T6, T7, and T8.";
+ }
+ leaf notify-severity-level {
+ when '../notify-status-changes = "severity-level"';
+ type severity;
+ description
+ "Only send notifications for alarm-state changes crossing
+ the specified level. Always send clear notifications.";
+ }
+ container alarm-shelving {
+ if-feature "alarm-shelving";
+ description
+ "The 'alarm-shelving/shelf' list is used to shelve
+ (block/filter) alarms. The conditions in the shelf
+ criteria are logically ANDed. The first matching shelf is
+ used, and an alarm is shelved only for this first match.
+ Matching alarms MUST appear in the
+ /alarms/shelved-alarms/shelved-alarm list, and
+ non-matching /alarms MUST appear in the
+ /alarms/alarm-list/alarm list. The server does not send
+ any notifications for shelved alarms.
+
+ The server MUST maintain states (e.g., severity
+ changes) for the shelved alarms.
+
+ Alarms that match the criteria shall have an
+ operator state 'shelved'. When the shelf
+ configuration removes an alarm from the shelf, the server
+ shall add the operator state 'un-shelved'.";
+ list shelf {
+ key "name";
+ //ordered-by user;
+ leaf name {
+ type string;
+ description
+ "An arbitrary name for the alarm shelf.";
+ }
+ description
+ "Each entry defines the criteria for shelving alarms.
+ Criteria are ANDed. If no criteria are specified,
+ all alarms will be shelved.";
+ leaf-list resource {
+ type resource-match;
+ description
+ "Shelve alarms for matching resources.";
+ }
+ list alarm-type {
+ key "alarm-type-id alarm-type-qualifier-match";
+ description
+ "Any alarm matching the combined criteria of
+ 'alarm-type-id' and 'alarm-type-qualifier-match'
+ MUST be matched.";
+ leaf alarm-type-id {
+ type alarm-type-id;
+ description
+ "Shelve all alarms that have an 'alarm-type-id' that
+ is equal to or derived from the given
+ 'alarm-type-id'.";
+ }
+ leaf alarm-type-qualifier-match {
+ type string;
+ description
+ "An XML Schema regular expression that is used to
+ match an alarm type qualifier. Shelve all alarms
+ that match this regular expression for the alarm
+ type qualifier.";
+ reference
+ "XML Schema Part 2: Datatypes Second Edition,
+ World Wide Web Consortium Recommendation
+ REC-xmlschema-2-20041028";
+ }
+ }
+ leaf description {
+ type string;
+ description
+ "An optional textual description of the shelf. This
+ description should include the reason for shelving
+ these alarms.";
+ }
+ }
+ }
+ }
+ container alarm-inventory {
+ config false;
+ description
+ "The 'alarm-inventory/alarm-type' list contains all possible
+ alarm types for the system.
+
+ If the system knows for which resources a specific alarm
+ type can appear, it is also identified in the inventory.
+ The list also tells if each alarm type has a corresponding
+ clear state. The inventory shall only contain concrete
+ alarm types.
+
+ The alarm inventory MUST be updated by the system when new
+ alarms can appear. This can be the case when installing new
+ software modules or inserting new card types. A
+ notification 'alarm-inventory-changed' is sent when the
+ inventory is changed.";
+ list alarm-type {
+ key "alarm-type-id alarm-type-qualifier";
+ description
+ "An entry in this list defines a possible alarm.";
+ leaf alarm-type-id {
+ type alarm-type-id;
+ description
+ "The statically defined alarm type identifier for this
+ possible alarm.";
+ }
+ leaf alarm-type-qualifier {
+ type alarm-type-qualifier;
+ description
+ "The optionally dynamically defined alarm type identifier
+ for this possible alarm.";
+ }
+ leaf-list resource {
+ type resource-match;
+ description
+ "Optionally, specifies for which resources the alarm type
+ is valid.";
+ }
+ leaf will-clear {
+ type boolean;
+ mandatory true;
+ description
+ "This leaf tells the operator if the alarm will be
+ cleared when the correct corrective action has been
+ taken. Implementations SHOULD strive for detecting the
+ cleared state for all alarm types.
+
+ If this leaf is 'true', the operator can monitor the
+ alarm until it becomes cleared after the corrective
+ action has been taken.
+
+ If this leaf is 'false', the operator needs to validate
+ that the alarm is no longer active using other
+ mechanisms. Alarms can lack a corresponding clear due
+ to missing instrumentation or no logical
+ corresponding clear state.";
+ }
+ leaf-list severity-level {
+ type severity;
+ description
+ "This leaf-list indicates the possible severity levels of
+ this alarm type. Note well that 'clear' is not part of
+ the severity type. In general, the severity level
+ should be defined by the instrumentation based on the
+ dynamic state, rather than being defined statically by
+ the alarm type, in order to provide a relevant severity
+ level based on dynamic state and context. However, most
+ alarm types have a defined set of possible severity
+ levels, and this should be provided here.";
+ }
+ leaf description {
+ type string;
+ mandatory true;
+ description
+ "A description of the possible alarm. It SHOULD include
+ information on possible underlying root causes and
+ corrective actions.";
+ }
+ }
+ }
+ container summary {
+ if-feature "alarm-summary";
+ config false;
+ description
+ "This container gives a summary of the number of alarms.";
+ list alarm-summary {
+ key "severity";
+ description
+ "A global summary of all alarms in the system. The summary
+ does not include shelved alarms.";
+ leaf severity {
+ type severity;
+ description
+ "Alarm summary for this severity level.";
+ }
+ leaf total {
+ type yang:gauge32;
+ description
+ "Total number of alarms of this severity level.";
+ }
+ leaf not-cleared {
+ type yang:gauge32;
+ description
+ "Total number of alarms of this severity level
+ that are not cleared.";
+ }
+ leaf cleared {
+ type yang:gauge32;
+ description
+ "For this severity level, the number of alarms that are
+ cleared.";
+ }
+ leaf cleared-not-closed {
+ if-feature "operator-actions";
+ type yang:gauge32;
+ description
+ "For this severity level, the number of alarms that are
+ cleared but not closed.";
+ }
+ leaf cleared-closed {
+ if-feature "operator-actions";
+ type yang:gauge32;
+ description
+ "For this severity level, the number of alarms that are
+ cleared and closed.";
+ }
+ leaf not-cleared-closed {
+ if-feature "operator-actions";
+ type yang:gauge32;
+ description
+ "For this severity level, the number of alarms that are
+ not cleared but closed.";
+ }
+ leaf not-cleared-not-closed {
+ if-feature "operator-actions";
+ type yang:gauge32;
+ description
+ "For this severity level, the number of alarms that are
+ not cleared and not closed.";
+ }
+ }
+ leaf shelves-active {
+ if-feature "alarm-shelving";
+ type empty;
+ description
+ "This is a hint to the operator that there are active
+ alarm shelves. This leaf MUST exist if the
+ /alarms/shelved-alarms/number-of-shelved-alarms is > 0.";
+ }
+ }
+ container alarm-list {
+ config false;
+ description
+ "The alarms in the system.";
+ leaf number-of-alarms {
+ type yang:gauge32;
+ description
+ "This object shows the total number of
+ alarms in the system, i.e., the total number
+ of entries in the alarm list.";
+ }
+ leaf last-changed {
+ type yang:date-and-time;
+ description
+ "A timestamp when the alarm list was last
+ changed. The value can be used by a manager to
+ initiate an alarm resynchronization procedure.";
+ }
+ list alarm {
+ key "resource alarm-type-id alarm-type-qualifier";
+ description
+ "The list of alarms. Each entry in the list holds one
+ alarm for a given alarm type and resource. An alarm can
+ be updated from the underlying resource or by the user.
+ The following leafs are maintained by the resource:
+ 'is-cleared', 'last-change', 'perceived-severity', and
+ 'alarm-text'. An operator can change 'operator-state' and
+ 'operator-text'.
+
+ Entries appear in the alarm list the first time an alarm
+ becomes active for a given alarm type and resource.
+ Entries do not get deleted when the alarm is cleared.
+ Clear status is represented as a boolean flag.
+
+ Alarm entries are removed, i.e., purged, from the list by
+ an explicit purge action. For example, purge all alarms
+ that are cleared and in closed operator state that are
+ older than 24 hours. Purged alarms are removed from the
+ alarm list. If the alarm resource state changes after a
+ purge, the alarm will reappear in the alarm list.
+
+ Systems may also remove alarms based on locally configured
+ policies; this is out of scope for this module.";
+ uses common-alarm-parameters;
+ leaf time-created {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "The timestamp when this alarm entry was created. This
+ represents the first time the alarm appeared; it can
+ also represent that the alarm reappeared after a purge.
+ Further state changes of the same alarm do not change
+ this leaf; these changes will update the 'last-changed'
+ leaf.";
+ }
+ uses resource-alarm-parameters;
+ list operator-state-change {
+ if-feature "operator-actions";
+ key "time";
+ description
+ "This list is used by operators to indicate the state of
+ human intervention on an alarm. For example, if an
+ operator has seen an alarm, the operator can add a new
+ item to this list indicating that the alarm is
+ acknowledged.";
+ uses operator-parameters;
+ }
+ action set-operator-state {
+ if-feature "operator-actions";
+ description
+ "This is a means for the operator to indicate the level
+ of human intervention on an alarm.";
+ input {
+ leaf state {
+ type writable-operator-state;
+ mandatory true;
+ description
+ "Set this operator state.";
+ }
+ leaf text {
+ type string;
+ description
+ "Additional optional textual information.";
+ }
+ }
+ }
+ notification operator-action {
+ if-feature "operator-actions";
+ description
+ "This notification is used to report that an operator
+ acted upon an alarm.";
+ uses operator-parameters;
+ }
+ }
+ action purge-alarms {
+ description
+ "This operation requests that the server delete entries
+ from the alarm list according to the supplied criteria.
+
+ Typically, this operation is used to delete alarms that
+ are in closed operator state and older than a specified
+ time.
+
+ The number of purged alarms is returned as an output
+ parameter.";
+ input {
+ uses filter-input;
+ }
+ output {
+ leaf purged-alarms {
+ type uint32;
+ description
+ "Number of purged alarms.";
+ }
+ }
+ }
+ action compress-alarms {
+ if-feature "alarm-history";
+ description
+ "This operation requests that the server compress
+ entries in the alarm list by removing all but the
+ latest 'status-change' entry for all matching alarms.
+ Conditions in the input are logically ANDed. If no
+ input condition is given, all alarms are compressed.";
+ input {
+ leaf resource {
+ type resource-match;
+ description
+ "Compress the alarms matching this resource.";
+ }
+ leaf alarm-type-id {
+ type leafref {
+ path "/alarms/alarm-list/alarm/alarm-type-id";
+ require-instance false;
+ }
+ description
+ "Compress alarms with this 'alarm-type-id'.";
+ }
+ leaf alarm-type-qualifier {
+ type leafref {
+ path "/alarms/alarm-list/alarm/alarm-type-qualifier";
+ require-instance false;
+ }
+ description
+ "Compress the alarms with this
+ 'alarm-type-qualifier'.";
+ }
+ }
+ output {
+ leaf compressed-alarms {
+ type uint32;
+ description
+ "Number of compressed alarm entries.";
+ }
+ }
+ }
+ }
+ container shelved-alarms {
+ if-feature "alarm-shelving";
+ config false;
+ description
+ "The shelved alarms. Alarms appear here if they match the
+ criteria in /alarms/control/alarm-shelving. This list does
+ not generate any notifications. The list represents alarms
+ that are considered not relevant by the operator. Alarms in
+ this list have an 'operator-state' of 'shelved'. This
+ cannot be changed.";
+ leaf number-of-shelved-alarms {
+ type yang:gauge32;
+ description
+ "This object shows the total number of current
+ alarms, i.e., the total number of entries
+ in the alarm list.";
+ }
+ leaf shelved-alarms-last-changed {
+ type yang:date-and-time;
+ description
+ "A timestamp when the shelved-alarm list was last changed.
+ The value can be used by a manager to initiate an alarm
+ resynchronization procedure.";
+ }
+ list shelved-alarm {
+ key "resource alarm-type-id alarm-type-qualifier";
+ description
+ "The list of shelved alarms. Shelved alarms can only be
+ updated from the underlying resource; no operator actions
+ are supported.";
+ uses common-alarm-parameters;
+ leaf shelf-name {
+ type leafref {
+ path "/alarms/control/alarm-shelving/shelf/name";
+ require-instance false;
+ }
+ description
+ "The name of the shelf.";
+ }
+ uses resource-alarm-parameters;
+ list operator-state-change {
+ if-feature "operator-actions";
+ key "time";
+ description
+ "This list is used by operators to indicate the state of
+ human intervention on an alarm. For shelved alarms, the
+ system has set the list item in the list to 'shelved'.";
+ uses operator-parameters;
+ }
+ }
+ action purge-shelved-alarms {
+ description
+ "This operation requests that the server delete entries from
+ the shelved-alarm list according to the supplied criteria.
+ In the shelved-alarm list, it makes sense to delete alarms
+ that are not relevant anymore.
+
+ The number of purged alarms is returned as an output
+ parameter.";
+ input {
+ uses filter-input;
+ }
+ output {
+ leaf purged-alarms {
+ type uint32;
+ description
+ "Number of purged alarms.";
+ }
+ }
+ }
+ action compress-shelved-alarms {
+ if-feature "alarm-history";
+ description
+ "This operation requests that the server compress entries
+ in the shelved-alarm list by removing all but the latest
+ 'status-change' entry for all matching shelved alarms.
+ Conditions in the input are logically ANDed. If no input
+ condition is given, all alarms are compressed.";
+ input {
+ leaf resource {
+ type leafref {
+ path "/alarms/shelved-alarms/shelved-alarm/resource";
+ require-instance false;
+ }
+ description
+ "Compress the alarms with this resource.";
+ }
+ leaf alarm-type-id {
+ type leafref {
+ path "/alarms/shelved-alarms/shelved-alarm"
+ + "/alarm-type-id";
+ require-instance false;
+ }
+ description
+ "Compress alarms with this 'alarm-type-id'.";
+ }
+ leaf alarm-type-qualifier {
+ type leafref {
+ path "/alarms/shelved-alarms/shelved-alarm"
+ + "/alarm-type-qualifier";
+ require-instance false;
+ }
+ description
+ "Compress the alarms with this
+ 'alarm-type-qualifier'.";
+ }
+ }
+ output {
+ leaf compressed-alarms {
+ type uint32;
+ description
+ "Number of compressed alarm entries.";
+ }
+ }
+ }
+ }
+ list alarm-profile {
+ if-feature "alarm-profile";
+ key "alarm-type-id alarm-type-qualifier-match resource";
+ //ordered-by user;
+ description
+ "This list is used to assign further information or
+ configuration for each alarm type. This module supports a
+ mechanism where the client can override the system-default
+ alarm severity levels. The 'alarm-profile' is also a useful
+ augmentation point for specific additions to alarm types.";
+ leaf alarm-type-id {
+ type alarm-type-id;
+ description
+ "The alarm type identifier to match.";
+ }
+ leaf alarm-type-qualifier-match {
+ type string;
+ description
+ "An XML Schema regular expression that is used to match the
+ alarm type qualifier.";
+ reference
+ "XML Schema Part 2: Datatypes Second Edition,
+ World Wide Web Consortium Recommendation
+ REC-xmlschema-2-20041028";
+ }
+ leaf resource {
+ type resource-match;
+ description
+ "Specifies which resources to match.";
+ }
+ leaf description {
+ type string;
+ mandatory true;
+ description
+ "A description of the alarm profile.";
+ }
+ container alarm-severity-assignment-profile {
+ if-feature "severity-assignment";
+ description
+ "The client can override the system-default severity
+ level.";
+ reference
+ "ITU-T Recommendation M.3100:
+ Generic network information model
+ ITU-T Recommendation M.3160:
+ Generic, protocol-neutral management information model";
+ leaf-list severity-level {
+ type severity;
+ //ordered-by user;
+ description
+ "Specifies the configured severity level(s) for the
+ matching alarm. If the alarm has several severity
+ levels, the leaf-list shall be given in rising severity
+ order. The original M3100/M3160 ASAP function only
+ allows for a one-to-one mapping between alarm type and
+ severity, but since YANG module supports stateful
+ alarms, the mapping must allow for several severity
+ levels.
+
+ Assume a high-utilization alarm type with two thresholds
+ with the system-default severity levels of threshold1 =
+ warning and threshold2 = minor. Setting this leaf-list
+ to (minor, major) will assign the severity levels as
+ threshold1 = minor and threshold2 = major";
+ }
+ }
+ }
+ }
+
+ /*
+ * Notifications
+ */
+
+ notification alarm-notification {
+ description
+ "This notification is used to report a state change for an
+ alarm. The same notification is used for reporting a newly
+ raised alarm, a cleared alarm, or changing the text and/or
+ severity of an existing alarm.";
+ uses common-alarm-parameters;
+ uses alarm-state-change-parameters;
+ }
+
+ notification alarm-inventory-changed {
+ description
+ "This notification is used to report that the list of possible
+ alarms has changed. This can happen when, for example, a new
+ software module is installed or a new physical card is
+ inserted.";
+ }
+}
--- /dev/null
+module o-ran-sc-alarms-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran:sc:alarms:1.0";
+ prefix oal;
+
+ import o-ran-sc-root-v1 {
+ prefix root;
+ }
+ import ietf-alarms {
+ prefix al;
+ reference
+ "RFC 8632: A YANG Data Model for Alarm Management";
+ }
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran-sc.org";
+ description
+ "This module augements the o-ran-sc-controlled-element and
+ o-ran-sc-controlled-function object by adding ietf-alarms.
+
+ Copyright 2020 the O-RAN Alliance.
+
+ 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.";
+
+ revision 2020-03-09 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ grouping alarms-grp {
+ list alarm-reference {
+ key "resource alarm-type-id alarm-type-qualifier";
+ config false;
+ description
+ "References to related alarms. Note that the related alarm
+ might have been purged from the alarm list.";
+ leaf resource {
+ type leafref {
+ path "/al:alarms/al:alarm-list/al:alarm/al:resource";
+ require-instance false;
+ }
+ description
+ "The alarming resource for the related alarm.";
+ }
+ leaf alarm-type-id {
+ type leafref {
+ path "/al:alarms/al:alarm-list/al:alarm"
+ + "[al:resource=current()/../resource]"
+ + "/al:alarm-type-id";
+ require-instance false;
+ }
+ description
+ "The alarm type identifier for the related alarm.";
+ }
+ leaf alarm-type-qualifier {
+ type leafref {
+ path "/al:alarms/al:alarm-list/al:alarm"
+ + "[al:resource=current()/../resource]"
+ + "[al:alarm-type-id=current()/../alarm-type-id]"
+ + "/al:alarm-type-qualifier";
+ require-instance false;
+ }
+ description
+ "The alarm qualifier for the related alarm.";
+ }
+ }
+ description
+ "A group adding ietf-alarm references.";
+ }
+
+ augment "/root:controlled-element" {
+ uses alarms-grp;
+ description
+ "An augmentation, which adds ietf-alarms
+ to root:controlled-element.";
+ }
+
+ augment "/root:controlled-element/root:controlled-function" {
+ uses alarms-grp;
+ description
+ "An augmentation, which adds ietf-alarms
+ to root:controlled-function.";
+ }
+}
--- /dev/null
+module o-ran-sc-common-alarms-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran-sc:alarms:1.0";
+ prefix osc-al;
+
+ import ietf-alarms {
+ prefix al;
+ }
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran-sc.org";
+ description
+ "This module defines the alarm identities for the O-RAN-SC Components.
+
+ Copyright 2020 the O-RAN Software Community.
+
+ 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.";
+
+ revision 2020-01-18 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ identity alarm-type-id {
+ base al:alarm-type-id;
+ description
+ "An abstract alarm type use for all O-RAN-SC alarm types which are
+ common across the O-RAN managed functions.";
+ }
+
+ identity smo-o1-ves-collector-not-reachable {
+ base alarm-type-id;
+ description
+ "The configured VES end-point for asynchron messages is not reachable.
+ Instructions:
+ 1) Verify the VES configuration on the O-RAN component.
+ 2) Verify the connectivity between the O-RAN component and the
+ SMO in terms of routing and firewall settings along the path.
+ 3) Check the credentials of the O-RAN component (user, password,
+ certificate). Did changes happen on SMO level recently?";
+ }
+}
--- /dev/null
+module o-ran-sc-hardware-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran:sc:hardware:1.0";
+ prefix ohw;
+
+ import o-ran-sc-root-v1 {
+ prefix root;
+ }
+ import ietf-hardware {
+ prefix hw;
+ reference
+ "RFC 8348: A YANG Data Model for Hardware Management";
+ }
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran-sc.org";
+ description
+ "This module augements the o-ran-sc-controlled-element and
+ o-ran-sc-controlled-function object by adding ietf-hardware.
+
+ Copyright 2020 the O-RAN Alliance.
+
+ 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.";
+
+ revision 2020-03-09 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ /*
+ * Typedefs
+ */
+
+ typedef hardware-ref {
+ type leafref {
+ path "/hw:hardware/hw:component/hw:name";
+ }
+ description
+ "This type is used by data models that need to reference
+ hardware.";
+ }
+
+ /*
+ * Groupings
+ */
+
+ grouping hardware-grp {
+ leaf-list hardware-reference {
+ type hardware-ref;
+ config false;
+ description
+ "A list of ietf-hardware references using the hardware name as key.";
+ }
+ description
+ "A group adding ietf-hardware references.";
+ }
+
+ /*
+ * Data nodes
+ */
+
+ augment "/root:controlled-element" {
+ uses hardware-grp;
+ description
+ "An augmentation, which adds ietf-hardware
+ to root:controlled-element.";
+ }
+
+ augment "/root:controlled-element/root:controlled-function" {
+ uses hardware-grp;
+ description
+ "An augmentation, which adds ietf-hardware
+ to root:controlled-function.";
+ }
+}
--- /dev/null
+module o-ran-sc-interfaces-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran:sc:interfaces:1.0";
+ prefix oif;
+
+ import o-ran-sc-root-v1 {
+ prefix root;
+ }
+ import ietf-interfaces {
+ prefix if;
+ reference
+ "RFC 8343: A YANG Data Model for Interface Management";
+ }
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran-sc.org";
+ description
+ "This module augements the o-ran-sc-controlled-function object by adding
+ ietf-interfaces.
+
+ Copyright 2020 the O-RAN Alliance.
+
+ 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.";
+
+ revision 2020-03-09 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ identity a1-interface {
+ base if:interface-type;
+ description
+ "Represents an O-RAN A1 interface towards SMO.";
+ reference
+ "O-RAN OAM interface specification.";
+ }
+
+ identity e1-interface {
+ base if:interface-type;
+ description
+ "Represents an O-RAN E1 interface.";
+ reference
+ "O-RAN OAM interface specification.";
+ }
+
+ identity e2-interface {
+ base if:interface-type;
+ description
+ "Represents an O-RAN E2 interface towards Near Real Time RIC.";
+ reference
+ "O-RAN OAM interface specification.";
+ }
+
+ identity f1-interface {
+ base if:interface-type;
+ description
+ "Represents an O-RAN F1 interface.";
+ reference
+ "O-RAN OAM interface specification.";
+ }
+
+ identity o1-interface {
+ base if:interface-type;
+ description
+ "Represents an O-RAN OAM interface towards SMO.";
+ reference
+ "O-RAN OAM interface specification.";
+ }
+
+ identity open-fronthaul-interface {
+ base if:interface-type;
+ description
+ "Represents an O-RAN Open Fronthaul interface towards an O-DU.";
+ reference
+ "O-RAN OAM interface specification.";
+ }
+
+ grouping interfaces-grp {
+ leaf-list interface-reference {
+ type if:interface-ref;
+ config false;
+ description
+ "A list of ietf-interfaces references using the interface name as key.";
+ }
+ description
+ "A group adding ietf-interface references.";
+ }
+ augment "/root:controlled-element/root:controlled-function" {
+ uses interfaces-grp;
+ description
+ "An augmentation, which adds ietf-interfaces
+ to root:controlled-function.";
+ }
+}
--- /dev/null
+module o-ran-sc-root-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran:sc:root:1.0";
+ prefix or;
+
+ import o-ran-sc-types-v1 {
+ prefix ot;
+ }
+ import ietf-yang-types {
+ prefix yang;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran-sc.org";
+ description
+ "This module defines the root controlled object classes for a
+ disaggregated RAN.
+
+ Copyright 2020 the O-RAN Alliance.
+
+ 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.";
+
+ revision 2020-02-20 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ // Groupings
+
+ grouping controlled-identifier-grp {
+ leaf authority-ref {
+ type ot:sized-printable-string;
+ description
+ "A name or indentifier referencing the authority to which is
+ responsable to create, modify or delete
+ the controlled identifier. ";
+ }
+ leaf identifer {
+ type string {
+ length "1..255";
+ }
+ description
+ "The external controlled identifier value for this controlled
+ object.";
+ }
+ description
+ "An object class specifiing an object identifier, which is caluculated
+ or generated by the consumer of the API..";
+ }
+
+ grouping state-grp {
+ leaf operational-state {
+ type identityref {
+ base ot:operational-state;
+ }
+ config false;
+ description
+ "The operational state is used to indicate whether or not the
+ resource is installed and working.";
+ }
+ leaf administrative-control {
+ type identityref {
+ base ot:administrative-control;
+ }
+ description
+ "The administrative-control state provides control of the
+ availability of specific resources without modification to the
+ provisioning of those resources.
+ The value is the current control target. The actual
+ administrative-state may or may not be at target.";
+ }
+ leaf administrative-state {
+ type identityref {
+ base ot:administrative-state;
+ }
+ config false;
+ description
+ "Shows whether or not the client has permission to use or has a
+ prohibition against using the resource.
+ The administrative state expresses usage permissions for
+ specific resources without modification to the provisioning
+ of those resources.";
+ }
+ leaf lifecycle-state {
+ type identityref {
+ base ot:lifecycle-state;
+ }
+ description
+ "Used to track the planned deployment, allocation to clients and
+ withdrawal of resources.";
+ }
+ description
+ "Provides general state attributes.";
+ }
+
+ grouping control-base-grp {
+ leaf identifier {
+ type yang:uuid;
+ mandatory true;
+ description
+ "The network wide unique identifier an object. The value will
+ never change and maybe used as reference even long time after
+ the object instance itself was deleted.
+ The value is calculated of generated by the provider of this
+ API.";
+ }
+ list controlled-identifier {
+ key "authority-ref";
+ uses controlled-identifier-grp;
+ description
+ "A list of external controlled identifiers, set by an external
+ authority. There must not be any function implemented on the
+ API provider itself next to updating the list on request and
+ storing it persistently. ";
+ }
+ leaf name {
+ type ot:sized-printable-string;
+ description
+ "A user defined human readable identifier. The value may chance
+ during the lifetime of the object and must not be used by any
+ software for references.";
+ }
+ leaf label {
+ type string {
+ length "1..64";
+ }
+ description
+ "A human readable value that is not expected to be unique and is
+ allowed to change. A label carries no semantics with respect to
+ the purpose of the object and has no effect on the object
+ behavior or state.";
+ }
+ uses state-grp;
+ description
+ "The control-base object class representation an abstract object class,
+ which all is used by all important control object classes.";
+ }
+
+ container controlled-element {
+ presence "Enables O-RAN";
+ uses control-base-grp;
+ list controlled-function {
+ key "identifier";
+ uses control-base-grp;
+ leaf function-type {
+ type identityref {
+ base ot:control-function-type;
+ }
+ description
+ "The reference to the O-RAN Alliance functions of the OAM
+ Architecture specification.";
+ }
+ description
+ "A list of abstract object classes which needs to be
+ augmented by the authority of providing the function.";
+ }
+ description
+ "The root container of an element (network-element,
+ manged-element, network-function, ...). it groups the
+ functions provided by the element. in a most disaggregated RAN
+ the each element provides only one function.";
+ }
+}
--- /dev/null
+module o-ran-sc-ru-alarms-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran-sc:ru:alarms:1.0";
+ prefix osc-ru-al;
+
+ import ietf-alarms {
+ prefix al;
+ }
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran-sc.org";
+ description
+ "This module defines the alarm identities for the O-RAN-SC Components.
+
+ Copyright 2020 the O-RAN Software Community.
+
+ 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.";
+
+ revision 2020-01-18 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ identity alarm-type-id {
+ base al:alarm-type-id;
+ description
+ "An abstract alarm type used for all O-RAN-SC specific alarm types for
+ Managed Function O-RU.";
+ }
+
+ identity huston-we-have-a-problem {
+ base alarm-type-id;
+ description
+ "A generic alarm which is under development and analysis,
+ must not happen in production environment.
+ Instructions:
+ Create an JIRA issue and provide the following intormation:
+ - SMO version, build number or git hash
+ - O-RU version, build number or git hash
+ - A procedure to reproduce the alarm.";
+ }
+}
--- /dev/null
+module o-ran-sc-ru-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran:sc:radio-unit:1.0";
+ prefix oru;
+
+ import o-ran-sc-root-v1 {
+ prefix root;
+ }
+ import o-ran-sc-types-v1 {
+ prefix ot;
+ }
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran.org";
+ description
+ "This module contains the O-RAN Software Community RadioUnit specific
+ O1 interface APIs.
+
+ Copyright 2020 the O-RAN Alliance.
+
+ 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.";
+
+ revision 2020-02-20 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ // identity
+
+ identity o-ru {
+ base ot:control-function-type;
+ description
+ "TODO: Nice description";
+ }
+
+ // grouping
+
+ grouping o-ru-specific-grp {
+ description
+ "TODO: add your specific leafs, lists, containers here.";
+ }
+
+ // Inherit from controlled-function
+ augment "/root:controlled-element/root:controlled-function" {
+ when "derived-from-or-self(./root:function-type, 'oru:o-ru')";
+ uses o-ru-specific-grp;
+ description
+ "TODO: Nice description";
+ }
+}
--- /dev/null
+module o-ran-sc-types-v1 {
+ yang-version 1.1;
+ namespace "urn:o-ran:sc:types:1.0";
+ prefix ot;
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran-sc.org";
+ description
+ "This module defines common type definitions related to O-RAN.
+
+ Copyright 2020 the O-RAN Alliance.
+
+ 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.";
+
+ revision 2020-02-20 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ // Identity
+ identity control-element-type {
+ description
+ "Base identity for the different and upcoming control-element types.";
+ }
+
+ identity e-node-b {
+ base control-element-type;
+ description
+ "Indicates a control element representing an eNodeB.";
+ reference
+ "O-RAN OAM Architecture Specification";
+ }
+
+ identity g-node-b {
+ base control-element-type;
+ description
+ "Indicates a managed element representing an gNodeB.";
+ reference
+ "O-RAN OAM Architecture Specification";
+ }
+
+ identity control-function-type {
+ description
+ "Base identity for the different and upcoming control-function types.";
+ }
+
+ // administrative-state
+ identity administrative-state {
+ description
+ "The administrative state is used to show whether use of a resource
+ is allowed or prohibited.
+ The administrative state can be observed and directly controlled by
+ certain operational roles.
+ Typically, only a user in the provider context with administrative
+ privileges is allowed to write the administrative state,
+ any other users are restricted to read only.";
+ reference
+ "ftp://www.3gpp.org/tsg_ran/WG3_Iu/TSGR3_07/Docs/Pdfs/R3-99b77.PDF";
+ }
+
+ identity administrative-state-locked {
+ base administrative-state;
+ description
+ "Users are administratively prohibited from making use of the
+ resource.";
+ }
+
+ identity administrative-state-unlocked {
+ base administrative-state;
+ description
+ "Users are allowed to use the resource.";
+ }
+
+ identity administrative-state-shutting-down {
+ base administrative-state;
+ description
+ "The entity is administratively restricted to existing instances of
+ use only. There may be specific actions to remove existing uses.
+ No new instances of use can be enabled.
+ The resource automatically transitions to “locked” when the last
+ user quits.
+ The administrative state is not visible in the client context.
+ The life cycle state “pending removal” should be used to indicate to
+ the client that the provider intends to remove the resource.";
+ }
+
+ // administrative-control
+ identity administrative-control {
+ description
+ "Reflects the current control action when the entity is not in the
+ desired state.";
+ }
+
+ identity administrative-control-unlock {
+ base administrative-control;
+ description
+ "The intention is for the entity to become unlocked.
+ The entity may already be UNLOCKED.";
+ }
+
+ identity administrative-control-lock-passive {
+ base administrative-control;
+ description
+ "The intention is for the entity to become locked but no effort is
+ expected to move to the Locked state (the state will be achieved once
+ all users stop using the resource).
+ The entity may be LOCKED.";
+ }
+
+ identity administrative-control-lock-active {
+ base administrative-control;
+ description
+ "The intention is for the entity to become locked and it is expected
+ that effort will be made to move to the Locked state (users will be
+ actively removed).
+ The entity may already be LOCKED.";
+ }
+
+ identity administrative-control-lock-immediate {
+ base administrative-control;
+ description
+ "The intention is for the entity to become locked and it is expected
+ to move to the Locked state immediately (users will be force removed).
+ The entity may already be LOCKED.";
+ }
+
+ identity administrative-control-quiescent {
+ base administrative-control;
+ description
+ "The administrative state is at a stable value (LOCKED/UNLOCKED) and
+ no action is being taken.";
+ }
+
+ // operational-state
+ identity operational-state {
+ description
+ "The operational state base identity to be used to indicate whether
+ or not the resource is installed and working.";
+ reference
+ "https://www.3gpp.org/ftp/tsg_ran/WG3_Iu/TSGR3_06/Docs/Pdfs/r3-99994.pdf";
+ }
+
+ identity operational-state-disabled {
+ base operational-state;
+ description
+ "The resource is unable to meet the SLA of the user of the resource.
+ If no (explicit) SLA is defined the resource is disabled if it is
+ totally inoperable and unable to provide service to the user.";
+ }
+
+ identity operational-state-enabled {
+ base operational-state;
+ description
+ "The resource is partially or fully operable and available for use.";
+ }
+
+ identity lifecycle-state {
+ description
+ "This state is used to track the planned deployment, allocation to
+ clients and withdrawal of resources.";
+ }
+
+ identity lifecycle-state-planned {
+ base lifecycle-state;
+ description
+ "The resource is planned but is not present in the network.
+ Should include a 'time' when the resources are expected to be
+ installed.";
+ }
+
+ identity lifecycle-state-potential-available {
+ base lifecycle-state;
+ description
+ "The supporting resources are present in the network but are shared
+ with other clients; or require further configuration before they can
+ be used; or both.
+ (1) When a potential resource is configured and allocated to a
+ client it is moved to the INSTALLED state for that client.
+ (2) If the potential resource has been consumed (e.g. allocated to
+ another client) it is moved to the POTENTIAL BUSY state for all
+ other clients.";
+ }
+
+ identity lifecycle-state-potential-busy {
+ base lifecycle-state;
+ description
+ "The supporting resources are present in the network but have been
+ allocated to other clients.";
+ }
+
+ identity lifecycle-state-installed {
+ base lifecycle-state;
+ description
+ "The resource is present in the network and is capable of providing
+ the service.";
+ }
+
+ identity lifecycle-state-pending-removal {
+ base lifecycle-state;
+ description
+ "The resource has been marked for removal. Should include a 'time'
+ when the resources are expected to be removed.";
+ }
+
+ // Type definitions
+ typedef e2ap-protocol-type {
+ // TODO switch to identity
+ type enumeration {
+ enum not-specified {
+ description
+ "None";
+ }
+ enum x2-setup-request {
+ description
+ "X2 setup request";
+ }
+ enum endc-x2-setup-request {
+ description
+ "ENDC X2 setup request";
+ }
+ }
+ description
+ "The E2AP protocol setup types";
+ }
+
+ typedef connection-status-type {
+ // TODO swtitch to identity
+ type enumeration {
+ enum not-specified {
+ description
+ "None";
+ }
+ enum connected {
+ description
+ "Connected";
+ }
+ enum connecting {
+ description
+ "Connecting";
+ }
+ enum disconnected {
+ description
+ "Disconnected";
+ }
+ enum setup-failed {
+ description
+ "Setup failed";
+ }
+ enum shutting-down {
+ description
+ "Shutting down";
+ }
+ enum shutdown {
+ description
+ "Shutdown";
+ }
+ }
+ description
+ "The connection status of gNB";
+ }
+
+ typedef sized-printable-string {
+ type string {
+ length "1..63";
+ pattern
+ '[\\x20-\\x7E]';
+ }
+ description
+ "A string of printable ASCII characters with a size of
+ 1 to 64 characters.";
+ }
+}
--- /dev/null
+module iana-hardware {
+yang-version 1.1;
+namespace "urn:ietf:params:xml:ns:yang:iana-hardware";
+prefix ianahw;
+
+organization "IANA";
+contact
+ " Internet Assigned Numbers Authority
+ Postal: ICANN
+ 12025 Waterfront Drive, Suite 300
+ Los Angeles, CA 90094-2536
+ United States of America
+ Tel: +1 310 301 5800
+ E-Mail: iana@iana.org>";
+
+description
+ "IANA-defined identities for hardware class.
+ The latest revision of this YANG module can be obtained from
+ the IANA website.
+ Requests for new values should be made to IANA via
+ email (iana@iana.org).
+ Copyright (c) 2018 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).
+ The initial version of this YANG module is part of RFC 8348;
+ see the RFC itself for full legal notices.";
+reference
+ "https://www.iana.org/assignments/yang-parameters";
+
+revision 2018-03-13 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8348: A YANG Data Model for Hardware Management";
+}
+
+/*
+ * Identities
+ */
+
+identity hardware-class {
+ description
+ "This identity is the base for all hardware class
+ identifiers.";
+}
+
+identity unknown {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is unknown
+ to the server.";
+}
+
+identity chassis {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is an
+ overall container for networking equipment. Any class of
+ physical component, except a stack, may be contained within a
+ chassis; a chassis may only be contained within a stack.";
+}
+
+identity backplane {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of device for aggregating and forwarding networking traffic,
+ such as a shared backplane in a modular ethernet switch. Note
+ that an implementation may model a backplane as a single
+ physical component, which is actually implemented as multiple
+ discrete physical components (within a chassis or stack).";
+}
+
+identity container {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is capable
+ of containing one or more removable physical entities,
+ possibly of different types. For example, each (empty or
+ full) slot in a chassis will be modeled as a container. Note
+ that all removable physical components should be modeled
+ within a container component, such as field-replaceable
+ modules, fans, or power supplies. Note that all known
+ containers should be modeled by the agent, including empty
+ containers.";
+}
+
+identity power-supply {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is a
+ power-supplying component.";
+}
+
+identity fan {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is a fan or
+ other heat-reduction component.";
+}
+
+identity sensor {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of sensor, such as a temperature sensor within a router
+ chassis.";
+}
+
+identity module {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of self-contained sub-system. If a module component is
+ removable, then it should be modeled within a container
+ component; otherwise, it should be modeled directly within
+ another physical component (e.g., a chassis or another
+ module).";
+}
+
+identity port {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of networking port capable of receiving and/or transmitting
+ networking traffic.";
+}
+
+identity stack {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of super-container (possibly virtual) intended to group
+ together multiple chassis entities. A stack may be realized
+ by a virtual cable, a real interconnect cable attached to
+ multiple chassis, or multiple interconnect cables. A stack
+ should not be modeled within any other physical components,
+ but a stack may be contained within another stack. Only
+ chassis components should be contained within a stack.";
+}
+
+identity cpu {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of central processing unit.";
+}
+
+identity energy-object {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of energy object, i.e., it is a piece of equipment that is
+ part of or attached to a communications network that is
+ monitored, it is controlled, or it aids in the management of
+ another device for Energy Management.";
+}
+
+identity battery {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of battery.";
+}
+
+identity storage-drive {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of component with data storage capability as its main
+ functionality, e.g., hard disk drive (HDD), solid-state device
+ (SSD), solid-state hybrid drive (SSHD), object storage device
+ (OSD), or other.";
+}
+}
--- /dev/null
+module ietf-hardware {
+yang-version 1.1;
+namespace "urn:ietf:params:xml:ns:yang:ietf-hardware";
+prefix hw;
+
+import ietf-inet-types {
+ prefix inet;
+}
+import ietf-yang-types {
+ prefix yang;
+}
+import iana-hardware {
+ prefix ianahw;
+}
+
+organization
+ "IETF NETMOD (Network Modeling) Working Group";
+
+contact
+ "WG Web: <https://datatracker.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+ Editor: Andy Bierman
+ <mailto:andy@yumaworks.com>
+ Editor: Martin Bjorklund
+ <mailto:mbj@tail-f.com>
+ Editor: Jie Dong
+ <mailto:jie.dong@huawei.com>
+ Editor: Dan Romascanu
+ <mailto:dromasca@gmail.com>";
+
+description
+ "This module contains a collection of YANG definitions for
+ managing hardware.
+ This data model is designed for the Network Management Datastore
+ Architecture (NMDA) defined in RFC 8342.
+ Copyright (c) 2018 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 8348; see
+ the RFC itself for full legal notices.";
+
+revision 2018-03-13 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8348: A YANG Data Model for Hardware Management";
+}
+
+/*
+ * Features
+ */
+
+feature entity-mib {
+ description
+ "This feature indicates that the device implements
+ the ENTITY-MIB.";
+ reference
+ "RFC 6933: Entity MIB (Version 4)";
+}
+
+feature hardware-state {
+ description
+ "Indicates that ENTITY-STATE-MIB objects are supported";
+ reference
+ "RFC 4268: Entity State MIB";
+}
+
+feature hardware-sensor {
+ description
+ "Indicates that ENTITY-SENSOR-MIB objects are supported";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base";
+}
+
+/*
+ * Typedefs
+ */
+
+typedef admin-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report administrative state.";
+ }
+ enum locked {
+ value 2;
+ description
+ "The resource is administratively prohibited from use.";
+ }
+ enum shutting-down {
+ value 3;
+ description
+ "The resource usage is administratively limited to current
+ instances of use.";
+ }
+ enum unlocked {
+ value 4;
+ description
+ "The resource is not administratively prohibited from
+ use.";
+ }
+ }
+ description
+ "Represents the various possible administrative states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityAdminState";
+}
+
+typedef oper-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report its operational state.";
+ }
+ enum disabled {
+ value 2;
+ description
+ "The resource is totally inoperable.";
+ }
+ enum enabled {
+ value 3;
+
+ description
+ "The resource is partially or fully operable.";
+ }
+ enum testing {
+ value 4;
+ description
+ "The resource is currently being tested and cannot
+ therefore report whether or not it is operational.";
+ }
+ }
+ description
+ "Represents the possible values of operational states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityOperState";
+}
+
+typedef usage-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report usage state.";
+ }
+ enum idle {
+ value 2;
+ description
+ "The resource is servicing no users.";
+ }
+ enum active {
+ value 3;
+ description
+ "The resource is currently in use, and it has sufficient
+ spare capacity to provide for additional users.";
+ }
+ enum busy {
+ value 4;
+ description
+ "The resource is currently in use, but it currently has no
+ spare capacity to provide for additional users.";
+ }
+ }
+ description
+ "Represents the possible values of usage states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityUsageState";
+}
+
+typedef alarm-state {
+ type bits {
+ bit unknown {
+ position 0;
+ description
+ "The resource is unable to report alarm state.";
+ }
+ bit under-repair {
+ position 1;
+ description
+ "The resource is currently being repaired, which, depending
+ on the implementation, may make the other values in this
+ bit string not meaningful.";
+ }
+ bit critical {
+ position 2;
+ description
+ "One or more critical alarms are active against the
+ resource.";
+ }
+ bit major {
+ position 3;
+ description
+ "One or more major alarms are active against the
+ resource.";
+ }
+ bit minor {
+ position 4;
+ description
+ "One or more minor alarms are active against the
+ resource.";
+ }
+ bit warning {
+ position 5;
+ description
+ "One or more warning alarms are active against the
+ resource.";
+ }
+ bit indeterminate {
+ position 6;
+ description
+ "One or more alarms of whose perceived severity cannot be
+ determined are active against this resource.";
+ }
+ }
+ description
+ "Represents the possible values of alarm states. An alarm is a
+ persistent indication of an error or warning condition.
+ When no bits of this attribute are set, then no active alarms
+ are known against this component and it is not under repair.";
+ reference
+ "RFC 4268: Entity State MIB - EntityAlarmStatus";
+}
+
+typedef standby-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report standby state.";
+ }
+ enum hot-standby {
+ value 2;
+ description
+ "The resource is not providing service, but it will be
+ immediately able to take over the role of the resource to
+ be backed up, without the need for initialization
+ activity, and will contain the same information as the
+ resource to be backed up.";
+ }
+ enum cold-standby {
+ value 3;
+ description
+ "The resource is to back up another resource, but it will
+ not be immediately able to take over the role of a
+ resource to be backed up and will require some
+ initialization activity.";
+ }
+ enum providing-service {
+ value 4;
+ description
+ "The resource is providing service.";
+ }
+ }
+ description
+ "Represents the possible values of standby states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityStandbyStatus";
+}
+
+typedef sensor-value-type {
+ type enumeration {
+ enum other {
+ value 1;
+ description
+ "A measure other than those listed below.";
+ }
+ enum unknown {
+ value 2;
+ description
+ "An unknown measurement or arbitrary, relative numbers";
+ }
+ enum volts-AC {
+ value 3;
+ description
+ "A measure of electric potential (alternating current).";
+ }
+ enum volts-DC {
+ value 4;
+ description
+ "A measure of electric potential (direct current).";
+ }
+ enum amperes {
+ value 5;
+ description
+ "A measure of electric current.";
+ }
+ enum watts {
+ value 6;
+ description
+ "A measure of power.";
+ }
+ enum hertz {
+ value 7;
+ description
+ "A measure of frequency.";
+ }
+ enum celsius {
+ value 8;
+ description
+ "A measure of temperature.";
+ }
+ enum percent-RH {
+ value 9;
+ description
+ "A measure of percent relative humidity.";
+ }
+ enum rpm {
+ value 10;
+ description
+ "A measure of shaft revolutions per minute.";
+ }
+ enum cmm {
+ value 11;
+ description
+ "A measure of cubic meters per minute (airflow).";
+ }
+ enum truth-value {
+ value 12;
+ description
+ "Value is one of 1 (true) or 2 (false)";
+ }
+ }
+ description
+ "A node using this data type represents the sensor measurement
+ data type associated with a physical sensor value. The actual
+ data units are determined by examining a node of this type
+ together with the associated sensor-value-scale node.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-scale and type sensor-value-precision.
+ These three types are used to identify the semantics of a node
+ of type sensor-value.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorDataType";
+}
+
+typedef sensor-value-scale {
+ type enumeration {
+ enum yocto {
+ value 1;
+ description
+ "Data scaling factor of 10^-24.";
+ }
+ enum zepto {
+ value 2;
+ description
+ "Data scaling factor of 10^-21.";
+ }
+ enum atto {
+ value 3;
+ description
+ "Data scaling factor of 10^-18.";
+ }
+ enum femto {
+ value 4;
+ description
+ "Data scaling factor of 10^-15.";
+ }
+ enum pico {
+ value 5;
+ description
+ "Data scaling factor of 10^-12.";
+ }
+ enum nano {
+ value 6;
+ description
+ "Data scaling factor of 10^-9.";
+ }
+ enum micro {
+ value 7;
+ description
+ "Data scaling factor of 10^-6.";
+ }
+ enum milli {
+ value 8;
+ description
+ "Data scaling factor of 10^-3.";
+ }
+ enum units {
+ value 9;
+ description
+ "Data scaling factor of 10^0.";
+ }
+ enum kilo {
+ value 10;
+ description
+ "Data scaling factor of 10^3.";
+ }
+ enum mega {
+ value 11;
+ description
+ "Data scaling factor of 10^6.";
+ }
+ enum giga {
+ value 12;
+ description
+ "Data scaling factor of 10^9.";
+ }
+ enum tera {
+ value 13;
+ description
+ "Data scaling factor of 10^12.";
+ }
+ enum peta {
+ value 14;
+ description
+ "Data scaling factor of 10^15.";
+ }
+ enum exa {
+ value 15;
+ description
+ "Data scaling factor of 10^18.";
+ }
+ enum zetta {
+ value 16;
+ description
+ "Data scaling factor of 10^21.";
+ }
+ enum yotta {
+ value 17;
+ description
+ "Data scaling factor of 10^24.";
+ }
+ }
+ description
+ "A node using this data type represents a data scaling factor,
+ represented with an International System of Units (SI) prefix.
+ The actual data units are determined by examining a node of
+ this type together with the associated sensor-value-type.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-type and type sensor-value-precision.
+ Together, associated nodes of these three types are used to
+ identify the semantics of a node of type sensor-value.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorDataScale";
+}
+
+typedef sensor-value-precision {
+ type int8 {
+ range "-8 .. 9";
+ }
+ description
+ "A node using this data type represents a sensor value
+ precision range.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-type and type sensor-value-scale. Together,
+ associated nodes of these three types are used to identify the
+ semantics of a node of type sensor-value.
+ If a node of this type contains a value in the range 1 to 9,
+ it represents the number of decimal places in the fractional
+ part of an associated sensor-value fixed-point number.
+ If a node of this type contains a value in the range -8 to -1,
+ it represents the number of accurate digits in the associated
+ sensor-value fixed-point number.
+ The value zero indicates the associated sensor-value node is
+ not a fixed-point number.
+ Server implementers must choose a value for the associated
+ sensor-value-precision node so that the precision and accuracy
+ of the associated sensor-value node is correctly indicated.
+ For example, a component representing a temperature sensor
+ that can measure 0 to 100 degrees C in 0.1 degree
+ increments, +/- 0.05 degrees, would have a
+ sensor-value-precision value of '1', a sensor-value-scale
+ value of 'units', and a sensor-value ranging from '0' to
+ '1000'. The sensor-value would be interpreted as
+ 'degrees C * 10'.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorPrecision";
+}
+
+typedef sensor-value {
+ type int32 {
+ range "-1000000000 .. 1000000000";
+ }
+ description
+ "A node using this data type represents a sensor value.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-type, type sensor-value-scale, and
+ type sensor-value-precision. Together, associated nodes of
+ those three types are used to identify the semantics of a node
+ of this data type.
+ The semantics of a node using this data type are determined by
+ the value of the associated sensor-value-type node.
+ If the associated sensor-value-type node is equal to 'voltsAC',
+ 'voltsDC', 'amperes', 'watts', 'hertz', 'celsius', or 'cmm',
+ then a node of this type MUST contain a fixed-point number
+ ranging from -999,999,999 to +999,999,999. The value
+ -1000000000 indicates an underflow error. The value
+ +1000000000 indicates an overflow error. The
+ sensor-value-precision indicates how many fractional digits
+ are represented in the associated sensor-value node.
+ If the associated sensor-value-type node is equal to
+ 'percentRH', then a node of this type MUST contain a number
+ ranging from 0 to 100.
+ If the associated sensor-value-type node is equal to 'rpm',
+ then a node of this type MUST contain a number ranging from
+ -999,999,999 to +999,999,999.
+ If the associated sensor-value-type node is equal to
+ 'truth-value', then a node of this type MUST contain either the
+ value 1 (true) or the value 2 (false).
+ If the associated sensor-value-type node is equal to 'other' or
+ 'unknown', then a node of this type MUST contain a number
+ ranging from -1000000000 to 1000000000.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorValue";
+}
+
+typedef sensor-status {
+ type enumeration {
+ enum ok {
+ value 1;
+ description
+ "Indicates that the server can obtain the sensor value.";
+ }
+ enum unavailable {
+ value 2;
+ description
+ "Indicates that the server presently cannot obtain the
+ sensor value.";
+ }
+ enum nonoperational {
+ value 3;
+ description
+ "Indicates that the server believes the sensor is broken.
+ The sensor could have a hard failure (disconnected wire)
+ or a soft failure such as out-of-range, jittery, or wildly
+ fluctuating readings.";
+ }
+ }
+ description
+ "A node using this data type represents the operational status
+ of a physical sensor.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorStatus";
+}
+
+/*
+ * Data nodes
+ */
+
+container hardware {
+ description
+ "Data nodes representing components.
+ If the server supports configuration of hardware components,
+ then this data model is instantiated in the configuration
+ datastores supported by the server. The leaf-list 'datastore'
+ for the module 'ietf-hardware' in the YANG library provides
+ this information.";
+
+ leaf last-change {
+ type yang:date-and-time;
+ config false;
+ description
+ "The time the '/hardware/component' list changed in the
+ operational state.";
+ }
+
+ list component {
+ key name;
+ description
+ "List of components.
+ When the server detects a new hardware component, it
+ initializes a list entry in the operational state.
+ If the server does not support configuration of hardware
+ components, list entries in the operational state are
+ initialized with values for all nodes as detected by the
+ implementation.
+ Otherwise, this procedure is followed:
+ 1. If there is an entry in the '/hardware/component' list
+ in the intended configuration with values for the nodes
+ 'class', 'parent', and 'parent-rel-pos' that are equal
+ to the detected values, then the list entry in the
+ operational state is initialized with the configured
+ values, including the 'name'.
+ 2. Otherwise (i.e., there is no matching configuration
+ entry), the list entry in the operational state is
+ initialized with values for all nodes as detected by
+ the implementation.
+ If the '/hardware/component' list in the intended
+ configuration is modified, then the system MUST behave as if
+ it re-initializes itself and follow the procedure in (1).";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalEntry";
+
+ leaf name {
+ type string;
+ description
+ "The name assigned to this component.
+ This name is not required to be the same as
+ entPhysicalName.";
+ }
+
+ leaf class {
+ type identityref {
+ base ianahw:hardware-class;
+ }
+ mandatory true;
+ description
+ "An indication of the general hardware type of the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalClass";
+ }
+
+ leaf physical-index {
+ if-feature entity-mib;
+ type int32 {
+ range "1..2147483647";
+ }
+ config false;
+ description
+ "The entPhysicalIndex for the entPhysicalEntry represented
+ by this list entry.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalIndex";
+ }
+
+ leaf description {
+ type string;
+ config false;
+ description
+ "A textual description of the component. This node should
+ contain a string that identifies the manufacturer's name
+ for the component and should be set to a distinct value
+ for each version or model of the component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalDescr";
+ }
+
+ leaf parent {
+ type leafref {
+ path "../../component/name";
+ require-instance false;
+ }
+ description
+ "The name of the component that physically contains this
+ component.
+ If this leaf is not instantiated, it indicates that this
+ component is not contained in any other component.
+ In the event that a physical component is contained by
+ more than one physical component (e.g., double-wide
+ modules), this node contains the name of one of these
+ components. An implementation MUST use the same name
+ every time this node is instantiated.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalContainedIn";
+ }
+
+ leaf parent-rel-pos {
+ type int32 {
+ range "0 .. 2147483647";
+ }
+ description
+ "An indication of the relative position of this child
+ component among all its sibling components. Sibling
+ components are defined as components that:
+ o share the same value of the 'parent' node and
+ o share a common base identity for the 'class' node.
+ Note that the last rule gives implementations flexibility
+ in how components are numbered. For example, some
+ implementations might have a single number series for all
+ components derived from 'ianahw:port', while some others
+ might have different number series for different
+ components with identities derived from 'ianahw:port' (for
+ example, one for registered jack 45 (RJ45) and one for
+ small form-factor pluggable (SFP)).";
+
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalParentRelPos";
+ }
+
+ leaf-list contains-child {
+ type leafref {
+ path "../../component/name";
+ }
+ config false;
+ description
+ "The name of the contained component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalChildIndex";
+ }
+
+ leaf hardware-rev {
+ type string;
+ config false;
+ description
+ "The vendor-specific hardware revision string for the
+ component. The preferred value is the hardware revision
+ identifier actually printed on the component itself (if
+ present).";
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalHardwareRev";
+ }
+
+ leaf firmware-rev {
+ type string;
+ config false;
+ description
+ "The vendor-specific firmware revision string for the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalFirmwareRev";
+ }
+
+ leaf software-rev {
+ type string;
+ config false;
+
+ description
+ "The vendor-specific software revision string for the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalSoftwareRev";
+ }
+
+ leaf serial-num {
+ type string;
+ config false;
+ description
+ "The vendor-specific serial number string for the
+ component. The preferred value is the serial number
+ string actually printed on the component itself (if
+ present).";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalSerialNum";
+ }
+
+ leaf mfg-name {
+ type string;
+ config false;
+ description
+ "The name of the manufacturer of this physical component.
+ The preferred value is the manufacturer name string
+ actually printed on the component itself (if present).
+ Note that comparisons between instances of the
+ 'model-name', 'firmware-rev', 'software-rev', and
+ 'serial-num' nodes are only meaningful amongst components
+ with the same value of 'mfg-name'.
+ If the manufacturer name string associated with the
+ physical component is unknown to the server, then this
+ node is not instantiated.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgName";
+ }
+
+ leaf model-name {
+ type string;
+ config false;
+ description
+ "The vendor-specific model name identifier string
+ associated with this physical component. The preferred
+ value is the customer-visible part number, which may be
+ printed on the component itself.
+ If the model name string associated with the physical
+ component is unknown to the server, then this node is not
+ instantiated.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalModelName";
+ }
+
+ leaf alias {
+ type string;
+ description
+ "An 'alias' name for the component, as specified by a
+ network manager, that provides a non-volatile 'handle' for
+ the component.
+ If no configured value exists, the server MAY set the
+ value of this node to a locally unique value in the
+ operational state.
+ A server implementation MAY map this leaf to the
+ entPhysicalAlias MIB object. Such an implementation needs
+ to use some mechanism to handle the differences in size
+ and characters allowed between this leaf and
+ entPhysicalAlias. The definition of such a mechanism is
+ outside the scope of this document.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalAlias";
+ }
+
+ leaf asset-id {
+ type string;
+ description
+ "This node is a user-assigned asset tracking identifier for
+ the component.
+ A server implementation MAY map this leaf to the
+ entPhysicalAssetID MIB object. Such an implementation
+ needs to use some mechanism to handle the differences in
+ size and characters allowed between this leaf and
+ entPhysicalAssetID. The definition of such a mechanism is
+ outside the scope of this document.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalAssetID";
+ }
+
+ leaf is-fru {
+ type boolean;
+ config false;
+
+ description
+ "This node indicates whether or not this component is
+ considered a 'field-replaceable unit' by the vendor. If
+ this node contains the value 'true', then this component
+ identifies a field-replaceable unit. For all components
+ that are permanently contained within a field-replaceable
+ unit, the value 'false' should be returned for this
+ node.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalIsFRU";
+ }
+
+ leaf mfg-date {
+ type yang:date-and-time;
+ config false;
+ description
+ "The date of manufacturing of the managed component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgDate";
+ }
+
+ leaf-list uri {
+ type inet:uri;
+ description
+ "This node contains identification information about the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalUris";
+ }
+
+ leaf uuid {
+ type yang:uuid;
+ config false;
+ description
+ "A Universally Unique Identifier of the component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalUUID";
+ }
+
+ container state {
+ if-feature hardware-state;
+ description
+ "State-related nodes";
+ reference
+ "RFC 4268: Entity State MIB";
+
+ leaf state-last-changed {
+ type yang:date-and-time;
+ config false;
+ description
+ "The date and time when the value of any of the
+ admin-state, oper-state, usage-state, alarm-state, or
+ standby-state changed for this component.
+ If there has been no change since the last
+ re-initialization of the local system, this node
+ contains the date and time of local system
+ initialization. If there has been no change since the
+ component was added to the local system, this node
+ contains the date and time of the insertion.";
+ reference
+ "RFC 4268: Entity State MIB - entStateLastChanged";
+ }
+
+ leaf admin-state {
+ type admin-state;
+ description
+ "The administrative state for this component.
+ This node refers to a component's administrative
+ permission to service both other components within its
+ containment hierarchy as well other users of its
+ services defined by means outside the scope of this
+ module.
+ Some components exhibit only a subset of the remaining
+ administrative state values. Some components cannot be
+ locked; hence, this node exhibits only the 'unlocked'
+ state. Other components cannot be shut down gracefully;
+ hence, this node does not exhibit the 'shutting-down'
+ state.";
+ reference
+ "RFC 4268: Entity State MIB - entStateAdmin";
+ }
+
+ leaf oper-state {
+ type oper-state;
+ config false;
+ description
+ "The operational state for this component.
+ Note that this node does not follow the administrative
+ state. An administrative state of 'down' does not
+ predict an operational state of 'disabled'.
+ Note that some implementations may not be able to
+ accurately report oper-state while the admin-state node
+ has a value other than 'unlocked'. In these cases, this
+ node MUST have a value of 'unknown'.";
+ reference
+ "RFC 4268: Entity State MIB - entStateOper";
+ }
+
+ leaf usage-state {
+ type usage-state;
+ config false;
+ description
+ "The usage state for this component.
+ This node refers to a component's ability to service
+ more components in a containment hierarchy.
+ Some components will exhibit only a subset of the usage
+ state values. Components that are unable to ever
+ service any components within a containment hierarchy
+ will always have a usage state of 'busy'. In some
+ cases, a component will be able to support only one
+ other component within its containment hierarchy and
+ will therefore only exhibit values of 'idle' and
+ 'busy'.";
+ reference
+ "RFC 4268: Entity State MIB - entStateUsage";
+ }
+
+ leaf alarm-state {
+ type alarm-state;
+ config false;
+ description
+ "The alarm state for this component. It does not
+ include the alarms raised on child components within its
+ containment hierarchy.";
+ reference
+ "RFC 4268: Entity State MIB - entStateAlarm";
+ }
+
+ leaf standby-state {
+ type standby-state;
+ config false;
+ description
+ "The standby state for this component.
+ Some components will exhibit only a subset of the
+ remaining standby state values. If this component
+ cannot operate in a standby role, the value of this node
+ will always be 'providing-service'.";
+ reference
+ "RFC 4268: Entity State MIB - entStateStandby";
+ }
+ }
+
+ container sensor-data {
+ when 'derived-from-or-self(../class,
+ "ianahw:sensor")' {
+ description
+ "Sensor data nodes present for any component of type
+ 'sensor'";
+ }
+ if-feature hardware-sensor;
+ config false;
+
+ description
+ "Sensor-related nodes.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base";
+
+ leaf value {
+ type sensor-value;
+ description
+ "The most recent measurement obtained by the server
+ for this sensor.
+ A client that periodically fetches this node should also
+ fetch the nodes 'value-type', 'value-scale', and
+ 'value-precision', since they may change when the value
+ is changed.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorValue";
+ }
+
+ leaf value-type {
+ type sensor-value-type;
+ description
+ "The type of data units associated with the
+ sensor value";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorType";
+ }
+ leaf value-scale {
+ type sensor-value-scale;
+ description
+ "The (power of 10) scaling factor associated
+ with the sensor value";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorScale";
+ }
+
+ leaf value-precision {
+ type sensor-value-precision;
+ description
+ "The number of decimal places of precision
+ associated with the sensor value";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorPrecision";
+ }
+
+ leaf oper-status {
+ type sensor-status;
+ description
+ "The operational status of the sensor.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorOperStatus";
+ }
+
+ leaf units-display {
+ type string;
+ description
+ "A textual description of the data units that should be
+ used in the display of the sensor value.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorUnitsDisplay";
+ }
+
+ leaf value-timestamp {
+ type yang:date-and-time;
+ description
+ "The time the status and/or value of this sensor was last
+ obtained by the server.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorValueTimeStamp";
+ }
+ leaf value-update-rate {
+ type uint32;
+ units "milliseconds";
+ description
+ "An indication of the frequency that the server updates
+ the associated 'value' node, represented in
+ milliseconds. The value zero indicates:
+ - the sensor value is updated on demand (e.g.,
+ when polled by the server for a get-request),
+ - the sensor value is updated when the sensor
+ value changes (event-driven), or
+ - the server does not know the update rate.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorValueUpdateRate";
+ }
+ }
+ }
+}
+
+/*
+ * Notifications
+ */
+
+notification hardware-state-change {
+ description
+ "A hardware-state-change notification is generated when the
+ value of /hardware/last-change changes in the operational
+ state.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entConfigChange";
+}
+
+notification hardware-state-oper-enabled {
+ if-feature hardware-state;
+ description
+ "A hardware-state-oper-enabled notification signifies that a
+ component has transitioned into the 'enabled' state.";
+
+ leaf name {
+ type leafref {
+ path "/hardware/component/name";
+ }
+
+ description
+ "The name of the component that has transitioned into the
+ 'enabled' state.";
+ }
+ leaf admin-state {
+ type leafref {
+ path "/hardware/component/state/admin-state";
+ }
+ description
+ "The administrative state for the component.";
+ }
+ leaf alarm-state {
+ type leafref {
+ path "/hardware/component/state/alarm-state";
+ }
+ description
+ "The alarm state for the component.";
+ }
+ reference
+ "RFC 4268: Entity State MIB - entStateOperEnabled";
+}
+
+notification hardware-state-oper-disabled {
+ if-feature hardware-state;
+ description
+ "A hardware-state-oper-disabled notification signifies that a
+ component has transitioned into the 'disabled' state.";
+
+ leaf name {
+ type leafref {
+ path "/hardware/component/name";
+ }
+ description
+ "The name of the component that has transitioned into the
+ 'disabled' state.";
+ }
+ leaf admin-state {
+ type leafref {
+ path "/hardware/component/state/admin-state";
+ }
+ description
+ "The administrative state for the component.";
+ }
+ leaf alarm-state {
+ type leafref {
+ path "/hardware/component/state/alarm-state";
+ }
+
+ description
+ "The alarm state for the component.";
+ }
+ reference
+ "RFC 4268: Entity State MIB - entStateOperDisabled";
+}
+
+}
--- /dev/null
+module ietf-inet-types {
+
+namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+prefix "inet";
+
+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 for Internet addresses and related things.
+ 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:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+}
+
+revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+}
+
+/*** collection of types related to protocol fields ***/
+
+typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+}
+
+typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+}
+
+typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+}
+
+typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+}
+
+/*** collection of types related to autonomous systems ***/
+
+typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+}
+
+/*** collection of types related to IP addresses and hostnames ***/
+
+typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+}
+
+typedef ipv4-address {
+ 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])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+ The canonical format for the zone index is the numerical
+ format";
+}
+
+typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+}
+
+typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+}
+
+typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+}
+
+typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+}
+
+typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+}
+
+typedef ipv4-prefix {
+ 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])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+}
+
+typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+}
+
+/*** collection of domain name and URI types ***/
+
+typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+}
+
+typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+}
+
+typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+}
+
+}
--- /dev/null
+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) 2018 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";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+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.";
+}
+}
#
#ssh-keyscan -p 830 localhost >> ~/.ssh/known_hosts
-pyang -f sample-xml-skeleton --sample-xml-list-entries 3 *.yang
+pyang -f sample-xml-skeleton --sample-xml-list-entries 2 *.yang
result=$(netopeer2-cli <<-END
connect --host 127.0.0.1 --login netconf
END
)
-while [[ "$result" != "OK" ]]
+count=1
+
+while [[ $count -le 100 ]] && [[ "$result" != "OK" ]]
do
+ ((count++))
pyang -f sample-xml-skeleton --sample-xml-list-entries 2 *.yang
result=$(netopeer2-cli <<-END
END
)
done
-echo "Finished loading data into sysrepo..."
+
+echo "Finished loading data into sysrepo. Removing edit-config XML..."
+rm -f /opt/dev/yang/edit_config_operation.xml
+
+echo "Done..."
+
exit 0
\ No newline at end of file
--- /dev/null
+module iana-hardware {
+yang-version 1.1;
+namespace "urn:ietf:params:xml:ns:yang:iana-hardware";
+prefix ianahw;
+
+organization "IANA";
+contact
+ " Internet Assigned Numbers Authority
+ Postal: ICANN
+ 12025 Waterfront Drive, Suite 300
+ Los Angeles, CA 90094-2536
+ United States of America
+ Tel: +1 310 301 5800
+ E-Mail: iana@iana.org>";
+
+description
+ "IANA-defined identities for hardware class.
+ The latest revision of this YANG module can be obtained from
+ the IANA website.
+ Requests for new values should be made to IANA via
+ email (iana@iana.org).
+ Copyright (c) 2018 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).
+ The initial version of this YANG module is part of RFC 8348;
+ see the RFC itself for full legal notices.";
+reference
+ "https://www.iana.org/assignments/yang-parameters";
+
+revision 2018-03-13 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8348: A YANG Data Model for Hardware Management";
+}
+
+/*
+ * Identities
+ */
+
+identity hardware-class {
+ description
+ "This identity is the base for all hardware class
+ identifiers.";
+}
+
+identity unknown {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is unknown
+ to the server.";
+}
+
+identity chassis {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is an
+ overall container for networking equipment. Any class of
+ physical component, except a stack, may be contained within a
+ chassis; a chassis may only be contained within a stack.";
+}
+
+identity backplane {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of device for aggregating and forwarding networking traffic,
+ such as a shared backplane in a modular ethernet switch. Note
+ that an implementation may model a backplane as a single
+ physical component, which is actually implemented as multiple
+ discrete physical components (within a chassis or stack).";
+}
+
+identity container {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is capable
+ of containing one or more removable physical entities,
+ possibly of different types. For example, each (empty or
+ full) slot in a chassis will be modeled as a container. Note
+ that all removable physical components should be modeled
+ within a container component, such as field-replaceable
+ modules, fans, or power supplies. Note that all known
+ containers should be modeled by the agent, including empty
+ containers.";
+}
+
+identity power-supply {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is a
+ power-supplying component.";
+}
+
+identity fan {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is a fan or
+ other heat-reduction component.";
+}
+
+identity sensor {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of sensor, such as a temperature sensor within a router
+ chassis.";
+}
+
+identity module {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of self-contained sub-system. If a module component is
+ removable, then it should be modeled within a container
+ component; otherwise, it should be modeled directly within
+ another physical component (e.g., a chassis or another
+ module).";
+}
+
+identity port {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of networking port capable of receiving and/or transmitting
+ networking traffic.";
+}
+
+identity stack {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of super-container (possibly virtual) intended to group
+ together multiple chassis entities. A stack may be realized
+ by a virtual cable, a real interconnect cable attached to
+ multiple chassis, or multiple interconnect cables. A stack
+ should not be modeled within any other physical components,
+ but a stack may be contained within another stack. Only
+ chassis components should be contained within a stack.";
+}
+
+identity cpu {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of central processing unit.";
+}
+
+identity energy-object {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of energy object, i.e., it is a piece of equipment that is
+ part of or attached to a communications network that is
+ monitored, it is controlled, or it aids in the management of
+ another device for Energy Management.";
+}
+
+identity battery {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of battery.";
+}
+
+identity storage-drive {
+ base ianahw:hardware-class;
+ description
+ "This identity is applicable if the hardware class is some sort
+ of component with data storage capability as its main
+ functionality, e.g., hard disk drive (HDD), solid-state device
+ (SSD), solid-state hybrid drive (SSHD), object storage device
+ (OSD), or other.";
+}
+}
--- /dev/null
+module iana-if-type {
+ 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
+ 12025 Waterfront Drive, Suite 300
+ Los Angeles, CA 90094-2536
+ United States
+ Tel: +1 310 301 5800
+ <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 2017-01-19 {
+ description
+ "Registered ifType 289.";
+ }
+
+ revision 2016-11-23 {
+ description
+ "Registered ifTypes 283-288.";
+ }
+
+ revision 2016-06-09 {
+ description
+ "Registered ifType 282.";
+ }
+ revision 2016-05-03 {
+ description
+ "Registered ifType 281.";
+ }
+ revision 2015-06-12 {
+ description
+ "Corrected formatting issue.";
+ }
+ revision 2014-09-24 {
+ description
+ "Registered ifType 280.";
+ }
+ revision 2014-09-19 {
+ description
+ "Registered ifType 279.";
+ }
+ revision 2014-07-03 {
+ description
+ "Registered ifTypes 277-278.";
+ }
+ revision 2014-05-19 {
+ description
+ "Updated the contact address.";
+ }
+ 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.";
+ }
+ identity docsOfdmDownstream {
+ base iana-interface-type;
+ description
+ "CATV Downstream OFDM interface.";
+ }
+ identity docsOfdmaUpstream {
+ base iana-interface-type;
+ description
+ "CATV Upstream OFDMA interface.";
+ }
+ identity gfast {
+ base iana-interface-type;
+ description
+ "G.fast port.";
+ reference
+ "ITU-T G.9701";
+ }
+ identity sdci {
+ base iana-interface-type;
+ description
+ "SDCI (IO-Link).";
+ reference
+ "IEC 61131-9 Edition 1.0 2013-09";
+ }
+ identity xboxWireless {
+ base iana-interface-type;
+ description
+ "Xbox wireless.";
+ }
+ identity fastdsl {
+ base iana-interface-type;
+ description
+ "FastDSL.";
+ reference
+ "BBF TR-355";
+ }
+ identity docsCableScte55d1FwdOob {
+ base iana-interface-type;
+ description
+ "Cable SCTE 55-1 OOB Forward Channel.";
+ }
+ identity docsCableScte55d1RetOob {
+ base iana-interface-type;
+ description
+ "Cable SCTE 55-1 OOB Return Channel.";
+ }
+ identity docsCableScte55d2DsOob {
+ base iana-interface-type;
+ description
+ "Cable SCTE 55-2 OOB Downstream Channel.";
+ }
+ identity docsCableScte55d2UsOob {
+ base iana-interface-type;
+ description
+ "Cable SCTE 55-2 OOB Upstream Channel.";
+ }
+ identity docsCableNdf {
+ base iana-interface-type;
+ description
+ "Cable Narrowband Digital Forward.";
+ }
+ identity docsCableNdr {
+ base iana-interface-type;
+ description
+ "Cable Narrowband Digital Return.";
+ }
+ identity ptm {
+ base iana-interface-type;
+ description
+ "Packet Transfer Mode.";
+ }
+}
--- /dev/null
+module ietf-crypto-types {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-crypto-types";
+ prefix ct;
+
+ import ietf-yang-types {
+ prefix yang;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ import ietf-netconf-acm {
+ prefix nacm;
+ reference
+ "RFC 8341: Network Configuration Access Control Model";
+ }
+
+ organization
+ "IETF NETCONF (Network Configuration) Working Group";
+ contact
+ "WG Web: <http://datatracker.ietf.org/wg/netconf/>
+ WG List: <mailto:netconf@ietf.org>
+ Author: Kent Watsen <mailto:kent+ietf@watsen.net>
+ Author: Wang Haiguang <wang.haiguang.shieldlab@huawei.com>";
+
+ description
+ "This module defines common YANG types for cryptographic
+ applications.
+
+ Copyright (c) 2019 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 XXXX
+ (https://www.rfc-editor.org/info/rfcXXXX); see the RFC
+ itself for full legal notices.;
+
+ The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL',
+ 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED',
+ 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this document
+ are to be interpreted as described in BCP 14 (RFC 2119)
+ (RFC 8174) when, and only when, they appear in all
+ capitals, as shown here.";
+
+ revision 2019-10-18 {
+ description
+ "Initial version";
+ reference
+ "RFC XXXX: Common YANG Data Types for Cryptography";
+ }
+
+ /**************************************/
+ /* Identities for Hash Algorithms */
+ /**************************************/
+
+ typedef hash-algorithm-t {
+ type union {
+ type uint16;
+ type enumeration {
+ enum NONE {
+ value 0;
+ description
+ "Hash algorithm is NULL.";
+ }
+ enum sha1 {
+ value 1;
+ status obsolete;
+ description
+ "The SHA1 algorithm.";
+ reference
+ "RFC 3174: US Secure Hash Algorithms 1 (SHA1).";
+ }
+ enum sha-224 {
+ value 2;
+ description
+ "The SHA-224 algorithm.";
+ reference
+ "RFC 6234: US Secure Hash Algorithms.";
+ }
+ enum sha-256 {
+ value 3;
+ description
+ "The SHA-256 algorithm.";
+ reference
+ "RFC 6234: US Secure Hash Algorithms.";
+ }
+ enum sha-384 {
+ value 4;
+ description
+ "The SHA-384 algorithm.";
+ reference
+ "RFC 6234: US Secure Hash Algorithms.";
+ }
+ enum sha-512 {
+ value 5;
+ description
+ "The SHA-512 algorithm.";
+ reference
+ "RFC 6234: US Secure Hash Algorithms.";
+ }
+ enum shake-128 {
+ value 6;
+ description
+ "The SHA3 algorithm with 128-bits output.";
+ reference
+ "National Institute of Standards and Technology,
+ SHA-3 Standard: Permutation-Based Hash and
+ Extendable-Output Functions, FIPS PUB 202, DOI
+ 10.6028/NIST.FIPS.202, August 2015.";
+ }
+ enum shake-224 {
+ value 7;
+ description
+ "The SHA3 algorithm with 224-bits output.";
+ reference
+ "National Institute of Standards and Technology,
+ SHA-3 Standard: Permutation-Based Hash and
+ Extendable-Output Functions, FIPS PUB 202, DOI
+ 10.6028/NIST.FIPS.202, August 2015.";
+ }
+ enum shake-256 {
+ value 8;
+ description
+ "The SHA3 algorithm with 256-bits output.";
+ reference
+ "National Institute of Standards and Technology,
+ SHA-3 Standard: Permutation-Based Hash and
+ Extendable-Output Functions, FIPS PUB 202, DOI
+ 10.6028/NIST.FIPS.202, August 2015.";
+ }
+ enum shake-384 {
+ value 9;
+ description
+ "The SHA3 algorithm with 384-bits output.";
+ reference
+ "National Institute of Standards and Technology,
+ SHA-3 Standard: Permutation-Based Hash and
+ Extendable-Output Functions, FIPS PUB 202, DOI
+ 10.6028/NIST.FIPS.202, August 2015.";
+ }
+ enum shake-512 {
+ value 10;
+ description
+ "The SHA3 algorithm with 384-bits output.";
+ reference
+ "National Institute of Standards and Technology,
+ SHA-3 Standard: Permutation-Based Hash and
+ Extendable-Output Functions, FIPS PUB 202, DOI
+ 10.6028/NIST.FIPS.202, August 2015.";
+ }
+ }
+ }
+ default "0";
+ description
+ "The uint16 filed shall be set by individual protocol families
+ according to the hash algorithm value assigned by IANA. The
+ setting is optional and by default is 0. The enumeration
+ filed is set to the selected hash algorithm.";
+ }
+
+ /***********************************************/
+ /* Identities for Asymmetric Key Algorithms */
+ /***********************************************/
+
+ typedef asymmetric-key-algorithm-t {
+ type union {
+ type uint16;
+ type enumeration {
+ enum NONE {
+ value 0;
+ description
+ "Asymetric key algorithm is NULL.";
+ }
+ enum rsa1024 {
+ value 1;
+ description
+ "The RSA algorithm using a 1024-bit key.";
+ reference
+ "RFC 8017: PKCS #1: RSA Cryptography
+ Specifications Version 2.2.";
+ }
+ enum rsa2048 {
+ value 2;
+ description
+ "The RSA algorithm using a 2048-bit key.";
+ reference
+ "RFC 8017:
+ PKCS #1: RSA Cryptography Specifications Version 2.2.";
+ }
+ enum rsa3072 {
+ value 3;
+ description
+ "The RSA algorithm using a 3072-bit key.";
+ reference
+ "RFC 8017:
+ PKCS #1: RSA Cryptography Specifications Version 2.2.";
+ }
+ enum rsa4096 {
+ value 4;
+ description
+ "The RSA algorithm using a 4096-bit key.";
+ reference
+ "RFC 8017:
+ PKCS #1: RSA Cryptography Specifications Version 2.2.";
+ }
+ enum rsa7680 {
+ value 5;
+ description
+ "The RSA algorithm using a 7680-bit key.";
+ reference
+ "RFC 8017:
+ PKCS #1: RSA Cryptography Specifications Version 2.2.";
+ }
+ enum rsa15360 {
+ value 6;
+ description
+ "The RSA algorithm using a 15360-bit key.";
+ reference
+ "RFC 8017:
+ PKCS #1: RSA Cryptography Specifications Version 2.2.";
+ }
+ enum secp192r1 {
+ value 7;
+ description
+ "The asymmetric algorithm using a NIST P192 Curve.";
+ reference
+ "RFC 6090:
+ Fundamental Elliptic Curve Cryptography Algorithms.
+ RFC 5480:
+ Elliptic Curve Cryptography Subject Public Key
+ Information.";
+ }
+ enum secp224r1 {
+ value 8;
+ description
+ "The asymmetric algorithm using a NIST P224 Curve.";
+ reference
+ "RFC 6090:
+ Fundamental Elliptic Curve Cryptography Algorithms.
+ RFC 5480:
+ Elliptic Curve Cryptography Subject Public Key
+ Information.";
+ }
+ enum secp256r1 {
+ value 9;
+ description
+ "The asymmetric algorithm using a NIST P256 Curve.";
+ reference
+ "RFC 6090:
+ Fundamental Elliptic Curve Cryptography Algorithms.
+ RFC 5480:
+ Elliptic Curve Cryptography Subject Public Key
+ Information.";
+ }
+ enum secp384r1 {
+ value 10;
+ description
+ "The asymmetric algorithm using a NIST P384 Curve.";
+ reference
+ "RFC 6090:
+ Fundamental Elliptic Curve Cryptography Algorithms.
+ RFC 5480:
+ Elliptic Curve Cryptography Subject Public Key
+ Information.";
+ }
+ enum secp521r1 {
+ value 11;
+ description
+ "The asymmetric algorithm using a NIST P521 Curve.";
+ reference
+ "RFC 6090:
+ Fundamental Elliptic Curve Cryptography Algorithms.
+ RFC 5480:
+ Elliptic Curve Cryptography Subject Public Key
+ Information.";
+ }
+ enum x25519 {
+ value 12;
+ description
+ "The asymmetric algorithm using a x.25519 Curve.";
+ reference
+ "RFC 7748:
+ Elliptic Curves for Security.";
+ }
+ enum x448 {
+ value 13;
+ description
+ "The asymmetric algorithm using a x.448 Curve.";
+ reference
+ "RFC 7748:
+ Elliptic Curves for Security.";
+ }
+ }
+ }
+ default "0";
+ description
+ "The uint16 filed shall be set by individual protocol
+ families according to the asymmetric key algorithm value
+ assigned by IANA. The setting is optional and by default
+ is 0. The enumeration filed is set to the selected
+ asymmetric key algorithm.";
+ }
+
+ /*************************************/
+ /* Identities for MAC Algorithms */
+ /*************************************/
+
+ typedef mac-algorithm-t {
+ type union {
+ type uint16;
+ type enumeration {
+ enum NONE {
+ value 0;
+ description
+ "mac algorithm is NULL.";
+ }
+ enum hmac-sha1 {
+ value 1;
+ description
+ "Generating MAC using SHA1 hash function";
+ reference
+ "RFC 3174: US Secure Hash Algorithm 1 (SHA1)";
+ }
+ enum hmac-sha1-96 {
+ value 2;
+ description
+ "Generating MAC using SHA1 hash function";
+ reference
+ "RFC 2404: The Use of HMAC-SHA-1-96 within ESP and AH";
+ }
+ enum hmac-sha2-224 {
+ value 3;
+ description
+ "Generating MAC using SHA2 hash function";
+ reference
+ "RFC 6234: US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)";
+ }
+ enum hmac-sha2-256 {
+ value 4;
+ description
+ "Generating MAC using SHA2 hash function";
+ reference
+ "RFC 6234: US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)";
+ }
+ enum hmac-sha2-256-128 {
+ value 5;
+ description
+ "Generating a 256 bits MAC using SHA2 hash function and
+ truncate it to 128 bits";
+ reference
+ "RFC 4868: Using HMAC-SHA-256, HMAC-SHA-384,
+ and HMAC-SHA-512 with IPsec";
+ }
+ enum hmac-sha2-384 {
+ value 6;
+ description
+ "Generating a 384 bits MAC using SHA2 hash function";
+ reference
+ "RFC 6234: US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)";
+ }
+ enum hmac-sha2-384-192 {
+ value 7;
+ description
+ "Generating a 384 bits MAC using SHA2 hash function and
+ truncate it to 192 bits";
+ reference
+ "RFC 4868: Using HMAC-SHA-256, HMAC-SHA-384,
+ and HMAC-SHA-512 with IPsec";
+ }
+ enum hmac-sha2-512 {
+ value 8;
+ description
+ "Generating a 512 bits MAC using SHA2 hash function";
+ reference
+ "RFC 6234: US Secure Hash Algorithms
+ (SHA and SHA-based HMAC and HKDF)";
+ }
+ enum hmac-sha2-512-256 {
+ value 9;
+ description
+ "Generating a 512 bits MAC using SHA2 hash function and
+ truncate it to 256 bits";
+ reference
+ "RFC 4868: Using HMAC-SHA-256, HMAC-SHA-384,
+ and HMAC-SHA-512 with IPsec";
+ }
+ enum aes-128-gmac {
+ value 10;
+ description
+ "Generating 128-bit MAC using the Advanced Encryption
+ Standard (AES) Galois Message Authentication Code
+ (GMAC) as a mechanism to provide data origin
+ authentication.";
+ reference
+ "RFC 4543:
+ The Use of Galois Message Authentication Code (GMAC)
+ in IPsec ESP and AH";
+ }
+ enum aes-192-gmac {
+ value 11;
+ description
+ "Generating 192-bit MAC using the Advanced Encryption
+ Standard (AES) Galois Message Authentication Code
+ (GMAC) as a mechanism to provide data origin
+ authentication.";
+ reference
+ "RFC 4543:
+ The Use of Galois Message Authentication Code (GMAC)
+ in IPsec ESP and AH";
+ }
+ enum aes-256-gmac {
+ value 12;
+ description
+ "Generating 256-bit MAC using the Advanced Encryption
+ Standard (AES) Galois Message Authentication Code
+ (GMAC) as a mechanism to provide data origin
+ authentication.";
+ reference
+ "RFC 4543:
+ The Use of Galois Message Authentication Code (GMAC)
+ in IPsec ESP and AH";
+ }
+ enum aes-cmac-96 {
+ value 13;
+ description
+ "Generating 96-bit MAC using Advanced Encryption
+ Standard (AES) Cipher-based Message Authentication
+ Code (CMAC)";
+ reference
+ "RFC 4494:
+ The AES-CMAC Algorithm and its Use with IPsec";
+ }
+ enum aes-cmac-128 {
+ value 14;
+ description
+ "Generating 128-bit MAC using Advanced Encryption
+ Standard (AES) Cipher-based Message Authentication
+ Code (CMAC)";
+ reference
+ "RFC 4494:
+ The AES-CMAC Algorithm and its Use with IPsec";
+ }
+ enum sha1-des3-kd {
+ value 15;
+ description
+ "Generating MAC using triple DES encryption function";
+ reference
+ "RFC 3961:
+ Encryption and Checksum Specifications for Kerberos
+ 5";
+ }
+ }
+ }
+ default "0";
+ description
+ "The uint16 filed shall be set by individual protocol
+ families according to the mac algorithm value assigned by
+ IANA. The setting is optional and by default is 0. The
+ enumeration filed is set to the selected mac algorithm.";
+ }
+
+ /********************************************/
+ /* Identities for Encryption Algorithms */
+ /********************************************/
+
+ typedef encryption-algorithm-t {
+ type union {
+ type uint16;
+ type enumeration {
+ enum NONE {
+ value 0;
+ description
+ "Encryption algorithm is NULL.";
+ }
+ enum aes-128-cbc {
+ value 1;
+ description
+ "Encrypt message with AES algorithm in CBC mode with
+ a key length of 128 bits.";
+ reference
+ "RFC 3565: Use of the Advanced Encryption Standard (AES)
+ Encryption Algorithm in Cryptographic Message Syntax
+ (CMS)";
+ }
+ enum aes-192-cbc {
+ value 2;
+ description
+ "Encrypt message with AES algorithm in CBC mode with
+ a key length of 192 bits";
+ reference
+ "RFC 3565: Use of the Advanced Encryption Standard (AES)
+ Encryption Algorithm in Cryptographic Message Syntax
+ (CMS)";
+ }
+ enum aes-256-cbc {
+ value 3;
+ description
+ "Encrypt message with AES algorithm in CBC mode with
+ a key length of 256 bits";
+ reference
+ "RFC 3565: Use of the Advanced Encryption Standard (AES)
+ Encryption Algorithm in Cryptographic Message Syntax
+ (CMS)";
+ }
+ enum aes-128-ctr {
+ value 4;
+ description
+ "Encrypt message with AES algorithm in CTR mode with
+ a key length of 128 bits";
+ reference
+ "RFC 3686:
+ Using Advanced Encryption Standard (AES) Counter
+ Mode with IPsec Encapsulating Security Payload
+ (ESP)";
+ }
+ enum aes-192-ctr {
+ value 5;
+ description
+ "Encrypt message with AES algorithm in CTR mode with
+ a key length of 192 bits";
+ reference
+ "RFC 3686:
+ Using Advanced Encryption Standard (AES) Counter
+ Mode with IPsec Encapsulating Security Payload
+ (ESP)";
+ }
+ enum aes-256-ctr {
+ value 6;
+ description
+ "Encrypt message with AES algorithm in CTR mode with
+ a key length of 256 bits";
+ reference
+ "RFC 3686:
+ Using Advanced Encryption Standard (AES) Counter
+ Mode with IPsec Encapsulating Security Payload
+ (ESP)";
+ }
+ enum des3-cbc-sha1-kd {
+ value 7;
+ description
+ "Encrypt message with 3DES algorithm in CBC mode
+ with sha1 function for key derivation";
+ reference
+ "RFC 3961:
+ Encryption and Checksum Specifications for
+ Kerberos 5";
+ }
+ enum rc4-hmac {
+ value 8;
+ description
+ "Encrypt message with rc4 algorithm";
+ reference
+ "RFC 4757:
+ The RC4-HMAC Kerberos Encryption Types Used by
+ Microsoft Windows";
+ }
+ enum rc4-hmac-exp {
+ value 9;
+ description
+ "Encrypt message with rc4 algorithm that is exportable";
+ reference
+ "RFC 4757:
+ The RC4-HMAC Kerberos Encryption Types Used by
+ Microsoft Windows";
+ }
+ }
+ }
+ default "0";
+ description
+ "The uint16 filed shall be set by individual protocol
+ families according to the encryption algorithm value
+ assigned by IANA. The setting is optional and by default
+ is 0. The enumeration filed is set to the selected
+ encryption algorithm.";
+ }
+
+ /****************************************************/
+ /* Identities for Encryption and MAC Algorithms */
+ /****************************************************/
+
+ typedef encryption-and-mac-algorithm-t {
+ type union {
+ type uint16;
+ type enumeration {
+ enum NONE {
+ value 0;
+ description
+ "Encryption and MAC algorithm is NULL.";
+ reference
+ "None";
+ }
+ enum aes-128-ccm {
+ value 1;
+ description
+ "Encrypt message with AES algorithm in CCM
+ mode with a key length of 128 bits; it can
+ also be used for generating MAC";
+ reference
+ "RFC 4309: Using Advanced Encryption Standard
+ (AES) CCM Mode with IPsec Encapsulating Security
+ Payload (ESP)";
+ }
+ enum aes-192-ccm {
+ value 2;
+ description
+ "Encrypt message with AES algorithm in CCM
+ mode with a key length of 192 bits; it can
+ also be used for generating MAC";
+ reference
+ "RFC 4309: Using Advanced Encryption Standard
+ (AES) CCM Mode with IPsec Encapsulating Security
+ Payload (ESP)";
+ }
+ enum aes-256-ccm {
+ value 3;
+ description
+ "Encrypt message with AES algorithm in CCM
+ mode with a key length of 256 bits; it can
+ also be used for generating MAC";
+ reference
+ "RFC 4309: Using Advanced Encryption Standard
+ (AES) CCM Mode with IPsec Encapsulating Security
+ Payload (ESP)";
+ }
+ enum aes-128-gcm {
+ value 4;
+ description
+ "Encrypt message with AES algorithm in GCM
+ mode with a key length of 128 bits; it can
+ also be used for generating MAC";
+ reference
+ "RFC 4106: The Use of Galois/Counter Mode (GCM)
+ in IPsec Encapsulating Security Payload (ESP)";
+ }
+ enum aes-192-gcm {
+ value 5;
+ description
+ "Encrypt message with AES algorithm in GCM
+ mode with a key length of 192 bits; it can
+ also be used for generating MAC";
+ reference
+ "RFC 4106: The Use of Galois/Counter Mode (GCM)
+ in IPsec Encapsulating Security Payload (ESP)";
+ }
+ enum aes-256-gcm {
+ value 6;
+ description
+ "Encrypt message with AES algorithm in GCM
+ mode with a key length of 256 bits; it can
+ also be used for generating MAC";
+ reference
+ "RFC 4106: The Use of Galois/Counter Mode (GCM)
+ in IPsec Encapsulating Security Payload (ESP)";
+ }
+ enum chacha20-poly1305 {
+ value 7;
+ description
+ "Encrypt message with chacha20 algorithm and generate
+ MAC with POLY1305; it can also be used for generating
+ MAC";
+ reference
+ "RFC 8439: ChaCha20 and Poly1305 for IETF Protocols";
+ }
+ }
+ }
+ default "0";
+ description
+ "The uint16 filed shall be set by individual protocol
+ families according to the encryption and mac algorithm value
+ assigned by IANA. The setting is optional and by default is
+ 0. The enumeration filed is set to the selected encryption
+ and mac algorithm.";
+ }
+
+ /******************************************/
+ /* Identities for signature algorithm */
+ /******************************************/
+
+ typedef signature-algorithm-t {
+ type union {
+ type uint16;
+ type enumeration {
+ enum NONE {
+ value 0;
+ description
+ "Signature algorithm is NULL";
+ }
+ enum dsa-sha1 {
+ value 1;
+ description
+ "The signature algorithm using DSA algorithm with SHA1
+ hash algorithm";
+ reference
+ "RFC 4253:
+ The Secure Shell (SSH) Transport Layer Protocol";
+ }
+ enum rsassa-pkcs1-sha1 {
+ value 2;
+ description
+ "The signature algorithm using RSASSA-PKCS1-v1_5 with
+ the SHA1 hash algorithm.";
+ reference
+ "RFC 4253:
+ The Secure Shell (SSH) Transport Layer Protocol";
+ }
+ enum rsassa-pkcs1-sha256 {
+ value 3;
+ description
+ "The signature algorithm using RSASSA-PKCS1-v1_5 with
+ the SHA256 hash algorithm.";
+ reference
+ "RFC 8332:
+ Use of RSA Keys with SHA-256 and SHA-512 in the
+ Secure Shell (SSH) Protocol
+ RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pkcs1-sha384 {
+ value 4;
+ description
+ "The signature algorithm using RSASSA-PKCS1-v1_5 with
+ the SHA384 hash algorithm.";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pkcs1-sha512 {
+ value 5;
+ description
+ "The signature algorithm using RSASSA-PKCS1-v1_5 with
+ the SHA512 hash algorithm.";
+ reference
+ "RFC 8332:
+ Use of RSA Keys with SHA-256 and SHA-512 in the
+ Secure Shell (SSH) Protocol
+ RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pss-rsae-sha256 {
+ value 6;
+ description
+ "The signature algorithm using RSASSA-PSS with mask
+ generation function 1 and SHA256 hash algorithm. If
+ the public key is carried in an X.509 certificate,
+ it MUST use the rsaEncryption OID";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pss-rsae-sha384 {
+ value 7;
+ description
+ "The signature algorithm using RSASSA-PSS with mask
+ generation function 1 and SHA384 hash algorithm. If
+ the public key is carried in an X.509 certificate,
+ it MUST use the rsaEncryption OID";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pss-rsae-sha512 {
+ value 8;
+ description
+ "The signature algorithm using RSASSA-PSS with mask
+ generation function 1 and SHA512 hash algorithm. If
+ the public key is carried in an X.509 certificate,
+ it MUST use the rsaEncryption OID";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pss-pss-sha256 {
+ value 9;
+ description
+ "The signature algorithm using RSASSA-PSS with mask
+ generation function 1 and SHA256 hash algorithm. If
+ the public key is carried in an X.509 certificate,
+ it MUST use the rsaEncryption OID";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pss-pss-sha384 {
+ value 10;
+ description
+ "The signature algorithm using RSASSA-PSS with mask
+ generation function 1 and SHA384 hash algorithm. If
+ the public key is carried in an X.509 certificate,
+ it MUST use the rsaEncryption OID";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum rsassa-pss-pss-sha512 {
+ value 11;
+ description
+ "The signature algorithm using RSASSA-PSS with mask
+ generation function 1 and SHA512 hash algorithm. If
+ the public key is carried in an X.509 certificate,
+ it MUST use the rsaEncryption OID";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum ecdsa-secp256r1-sha256 {
+ value 12;
+ description
+ "The signature algorithm using ECDSA with curve name
+ secp256r1 and SHA256 hash algorithm.";
+ reference
+ "RFC 5656:
+ Elliptic Curve Algorithm Integration in the Secure
+ Shell Transport Layer
+ RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum ecdsa-secp384r1-sha384 {
+ value 13;
+ description
+ "The signature algorithm using ECDSA with curve name
+ secp384r1 and SHA384 hash algorithm.";
+ reference
+ "RFC 5656:
+ Elliptic Curve Algorithm Integration in the Secure
+ Shell Transport Layer
+ RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum ecdsa-secp521r1-sha512 {
+ value 14;
+ description
+ "The signature algorithm using ECDSA with curve name
+ secp521r1 and SHA512 hash algorithm.";
+ reference
+ "RFC 5656:
+ Elliptic Curve Algorithm Integration in the Secure
+ Shell Transport Layer
+ RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum ed25519 {
+ value 15;
+ description
+ "The signature algorithm using EdDSA with curve x25519";
+ reference
+ "RFC 8032:
+ Edwards-Curve Digital Signature Algorithm (EdDSA)";
+ }
+ enum ed25519-cts {
+ value 16;
+ description
+ "The signature algorithm using EdDSA with curve x25519
+ with phflag = 0";
+ reference
+ "RFC 8032:
+ Edwards-Curve Digital Signature Algorithm (EdDSA)";
+ }
+ enum ed25519-ph {
+ value 17;
+ description
+ "The signature algorithm using EdDSA with curve x25519
+ with phflag = 1";
+ reference
+ "RFC 8032:
+ Edwards-Curve Digital Signature Algorithm (EdDSA)";
+ }
+ enum ed25519-sha512 {
+ value 18;
+ description
+ "The signature algorithm using EdDSA with curve x25519
+ and SHA-512 function";
+ reference
+ "RFC 8419:
+ Use of Edwards-Curve Digital Signature Algorithm
+ (EdDSA) Signatures in the Cryptographic Message
+ Syntax (CMS)";
+ }
+ enum ed448 {
+ value 19;
+ description
+ "The signature algorithm using EdDSA with curve x448";
+ reference
+ "RFC 8032:
+ Edwards-Curve Digital Signature Algorithm (EdDSA)";
+ }
+ enum ed448-ph {
+ value 20;
+ description
+ "The signature algorithm using EdDSA with curve x448
+ and with PH being SHAKE256(x, 64) and phflag being 1";
+ reference
+ "RFC 8032:
+ Edwards-Curve Digital Signature Algorithm (EdDSA)";
+ }
+ enum ed448-shake256 {
+ value 21;
+ description
+ "The signature algorithm using EdDSA with curve x448
+ and SHAKE-256 function";
+ reference
+ "RFC 8419:
+ Use of Edwards-Curve Digital Signature Algorithm
+ (EdDSA) Signatures in the Cryptographic Message
+ Syntax (CMS)";
+ }
+ enum ed448-shake256-len {
+ value 22;
+ description
+ "The signature algorithm using EdDSA with curve x448
+ and SHAKE-256 function and a customized hash output";
+ reference
+ "RFC 8419:
+ Use of Edwards-Curve Digital Signature Algorithm
+ (EdDSA) Signatures in the Cryptographic Message
+ Syntax (CMS)";
+ }
+ enum rsa-sha2-256 {
+ value 23;
+ description
+ "The signature algorithm using RSA with SHA2 function
+ for SSH protocol";
+ reference
+ "RFC 8332:
+ Use of RSA Keys with SHA-256 and SHA-512
+ in the Secure Shell (SSH) Protocol";
+ }
+ enum rsa-sha2-512 {
+ value 24;
+ description
+ "The signature algorithm using RSA with SHA2 function
+ for SSH protocol";
+ reference
+ "RFC 8332:
+ Use of RSA Keys with SHA-256 and SHA-512
+ in the Secure Shell (SSH) Protocol";
+ }
+ enum eccsi {
+ value 25;
+ description
+ "The signature algorithm using ECCSI signature as
+ defined in RFC 6507.";
+ reference
+ "RFC 6507:
+ Elliptic Curve-Based Certificateless Signatures
+ for Identity-based Encryption (ECCSI)";
+ }
+ }
+ }
+ default "0";
+ description
+ "The uint16 filed shall be set by individual protocol
+ families according to the signature algorithm value
+ assigned by IANA. The setting is optional and by default
+ is 0. The enumeration filed is set to the selected
+ signature algorithm.";
+ }
+
+ /**********************************************/
+ /* Identities for key exchange algorithms */
+ /**********************************************/
+
+ typedef key-exchange-algorithm-t {
+ type union {
+ type uint16;
+ type enumeration {
+ enum NONE {
+ value 0;
+ description
+ "Key exchange algorithm is NULL.";
+ }
+ enum psk-only {
+ value 1;
+ description
+ "Using Pre-shared key for authentication and key
+ exchange";
+ reference
+ "RFC 4279:
+ Pre-Shared Key cipher suites for Transport Layer
+ Security (TLS)";
+ }
+ enum dhe-ffdhe2048 {
+ value 2;
+ description
+ "Ephemeral Diffie Hellman key exchange with 2048 bit
+ finite field";
+ reference
+ "RFC 7919:
+ Negotiated Finite Field Diffie-Hellman Ephemeral
+ Parameters for Transport Layer Security (TLS)";
+ }
+ enum dhe-ffdhe3072 {
+ value 3;
+ description
+ "Ephemeral Diffie Hellman key exchange with 3072 bit
+ finite field";
+ reference
+ "RFC 7919:
+ Negotiated Finite Field Diffie-Hellman Ephemeral
+ Parameters for Transport Layer Security (TLS)";
+ }
+ enum dhe-ffdhe4096 {
+ value 4;
+ description
+ "Ephemeral Diffie Hellman key exchange with 4096 bit
+ finite field";
+ reference
+ "RFC 7919:
+ Negotiated Finite Field Diffie-Hellman Ephemeral
+ Parameters for Transport Layer Security (TLS)";
+ }
+ enum dhe-ffdhe6144 {
+ value 5;
+ description
+ "Ephemeral Diffie Hellman key exchange with 6144 bit
+ finite field";
+ reference
+ "RFC 7919:
+ Negotiated Finite Field Diffie-Hellman Ephemeral
+ Parameters for Transport Layer Security (TLS)";
+ }
+ enum dhe-ffdhe8192 {
+ value 6;
+ description
+ "Ephemeral Diffie Hellman key exchange with 8192 bit
+ finite field";
+ reference
+ "RFC 7919:
+ Negotiated Finite Field Diffie-Hellman Ephemeral
+ Parameters for Transport Layer Security (TLS)";
+ }
+ enum psk-dhe-ffdhe2048 {
+ value 7;
+ description
+ "Key exchange using pre-shared key with Diffie-Hellman
+ key generation mechanism, where the DH group is
+ FFDHE2048";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-dhe-ffdhe3072 {
+ value 8;
+ description
+ "Key exchange using pre-shared key with Diffie-Hellman
+ key generation mechanism, where the DH group is
+ FFDHE3072";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-dhe-ffdhe4096 {
+ value 9;
+ description
+ "Key exchange using pre-shared key with Diffie-Hellman
+ key generation mechanism, where the DH group is
+ FFDHE4096";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-dhe-ffdhe6144 {
+ value 10;
+ description
+ "Key exchange using pre-shared key with Diffie-Hellman
+ key generation mechanism, where the DH group is
+ FFDHE6144";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-dhe-ffdhe8192 {
+ value 11;
+ description
+ "Key exchange using pre-shared key with Diffie-Hellman
+ key generation mechanism, where the DH group is
+ FFDHE8192";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum ecdhe-secp256r1 {
+ value 12;
+ description
+ "Ephemeral Diffie Hellman key exchange with elliptic
+ group over curve secp256r1";
+ reference
+ "RFC 8422:
+ Elliptic Curve Cryptography (ECC) Cipher Suites
+ for Transport Layer Security (TLS) Versions 1.2
+ and Earlier";
+ }
+ enum ecdhe-secp384r1 {
+ value 13;
+ description
+ "Ephemeral Diffie Hellman key exchange with elliptic
+ group over curve secp384r1";
+ reference
+ "RFC 8422:
+ Elliptic Curve Cryptography (ECC) Cipher Suites
+ for Transport Layer Security (TLS) Versions 1.2
+ and Earlier";
+ }
+ enum ecdhe-secp521r1 {
+ value 14;
+ description
+ "Ephemeral Diffie Hellman key exchange with elliptic
+ group over curve secp521r1";
+ reference
+ "RFC 8422:
+ Elliptic Curve Cryptography (ECC) Cipher Suites
+ for Transport Layer Security (TLS) Versions 1.2
+ and Earlier";
+ }
+ enum ecdhe-x25519 {
+ value 15;
+ description
+ "Ephemeral Diffie Hellman key exchange with elliptic
+ group over curve x25519";
+ reference
+ "RFC 8422:
+ Elliptic Curve Cryptography (ECC) Cipher Suites
+ for Transport Layer Security (TLS) Versions 1.2
+ and Earlier";
+ }
+ enum ecdhe-x448 {
+ value 16;
+ description
+ "Ephemeral Diffie Hellman key exchange with elliptic
+ group over curve x448";
+ reference
+ "RFC 8422:
+ Elliptic Curve Cryptography (ECC) Cipher Suites
+ for Transport Layer Security (TLS) Versions 1.2
+ and Earlier";
+ }
+ enum psk-ecdhe-secp256r1 {
+ value 17;
+ description
+ "Key exchange using pre-shared key with elliptic
+ group-based Ephemeral Diffie Hellman key exchange
+ over curve secp256r1";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-ecdhe-secp384r1 {
+ value 18;
+ description
+ "Key exchange using pre-shared key with elliptic
+ group-based Ephemeral Diffie Hellman key exchange
+ over curve secp384r1";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-ecdhe-secp521r1 {
+ value 19;
+ description
+ "Key exchange using pre-shared key with elliptic
+ group-based Ephemeral Diffie Hellman key exchange
+ over curve secp521r1";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-ecdhe-x25519 {
+ value 20;
+ description
+ "Key exchange using pre-shared key with elliptic
+ group-based Ephemeral Diffie Hellman key exchange
+ over curve x25519";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum psk-ecdhe-x448 {
+ value 21;
+ description
+ "Key exchange using pre-shared key with elliptic
+ group-based Ephemeral Diffie Hellman key exchange
+ over curve x448";
+ reference
+ "RFC 8446:
+ The Transport Layer Security (TLS) Protocol
+ Version 1.3";
+ }
+ enum diffie-hellman-group14-sha1 {
+ value 22;
+ description
+ "Using DH group14 and SHA1 for key exchange";
+ reference
+ "RFC 4253:
+ The Secure Shell (SSH) Transport Layer Protocol";
+ }
+ enum diffie-hellman-group14-sha256 {
+ value 23;
+ description
+ "Using DH group14 and SHA-256 for key exchange";
+ reference
+ "RFC 8268:
+ More Modular Exponentiation (MODP) Diffie-Hellman (DH)
+ Key Exchange (KEX) Groups for Secure Shell (SSH)";
+ }
+ enum diffie-hellman-group15-sha512 {
+ value 24;
+ description
+ "Using DH group15 and SHA-512 for key exchange";
+ reference
+ "RFC 8268:
+ More Modular Exponentiation (MODP) Diffie-Hellman (DH)
+ Key Exchange (KEX) Groups for Secure Shell (SSH)";
+ }
+ enum diffie-hellman-group16-sha512 {
+ value 25;
+ description
+ "Using DH group16 and SHA-512 for key exchange";
+ reference
+ "RFC 8268:
+ More Modular Exponentiation (MODP) Diffie-Hellman (DH)
+ Key Exchange (KEX) Groups for Secure Shell (SSH)";
+ }
+ enum diffie-hellman-group17-sha512 {
+ value 26;
+ description
+ "Using DH group17 and SHA-512 for key exchange";
+ reference
+ "RFC 8268:
+ More Modular Exponentiation (MODP) Diffie-Hellman (DH)
+ Key Exchange (KEX) Groups for Secure Shell (SSH)";
+ }
+ enum diffie-hellman-group18-sha512 {
+ value 27;
+ description
+ "Using DH group18 and SHA-512 for key exchange";
+ reference
+ "RFC 8268:
+ More Modular Exponentiation (MODP) Diffie-Hellman (DH)
+ Key Exchange (KEX) Groups for Secure Shell (SSH)";
+ }
+ enum ecdh-sha2-secp256r1 {
+ value 28;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve ecp256r1 and using SHA2 for MAC generation";
+ reference
+ "RFC 6239:
+ Suite B Cryptographic Suites for Secure Shell (SSH)";
+ }
+ enum ecdh-sha2-secp384r1 {
+ value 29;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve ecp384r1 and using SHA2 for MAC generation";
+ reference
+ "RFC 6239:
+ Suite B Cryptographic Suites for Secure Shell (SSH)";
+ }
+ enum ecdh-x25519-x9.63-sha256 {
+ value 30;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.25519 and using ANSI x9.63 with SHA256 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x25519-x9.63-sha384 {
+ value 31;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.25519 and using ANSI x9.63 with SHA384 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x25519-x9.63-sha512 {
+ value 32;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.25519 and using ANSI x9.63 with SHA512 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x25519-hkdf-sha256 {
+ value 33;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.25519 and using HKDF with SHA256 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x25519-hkdf-sha384 {
+ value 34;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.25519 and using HKDF with SHA384 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x25519-hkdf-sha512 {
+ value 35;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.25519 and using HKDF with SHA512 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x448-x9.63-sha256 {
+ value 36;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.448 and using ANSI x9.63 with SHA256 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x448-x9.63-sha384 {
+ value 37;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.448 and using ANSI x9.63 with SHA384 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x448-x9.63-sha512 {
+ value 38;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.448 and using ANSI x9.63 with SHA512 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x448-hkdf-sha256 {
+ value 39;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.448 and using HKDF with SHA256 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x448-hkdf-sha384 {
+ value 40;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.448 and using HKDF with SHA384 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+ enum ecdh-x448-hkdf-sha512 {
+ value 41;
+ description
+ "Elliptic curve-based Diffie Hellman key exchange over
+ curve x.448 and using HKDF with SHA512 as KDF";
+ reference
+ "RFC 8418:
+ Use of the Elliptic Curve Diffie-Hellman Key Agreement
+ Algorithm with X25519 and X448 in the Cryptographic
+ Message Syntax (CMS)";
+ }
+
+ enum rsaes-oaep {
+ value 42;
+ description
+ "RSAES-OAEP combines the RSAEP and RSADP primitives with
+ the EME-OAEP encoding method";
+ reference
+ "RFC 8017:
+ PKCS #1:
+ RSA Cryptography Specifications Version 2.2.";
+ }
+ enum rsaes-pkcs1-v1_5 {
+ value 43;
+ description
+ "RSAES-PKCS1-v1_5 combines the RSAEP and RSADP
+ primitives with the EME-PKCS1-v1_5 encoding method";
+ reference
+ "RFC 8017:
+ PKCS #1:
+ RSA Cryptography Specifications Version 2.2.";
+ }
+ }
+ }
+ default "0";
+ description
+ "The uint16 filed shall be set by individual protocol
+ families according to the key exchange algorithm value
+ assigned by IANA. The setting is optional and by default
+ is 0. The enumeration filed is set to the selected key
+ exchange algorithm.";
+ }
+
+ /********************************************/
+ /* Identities for Key Format Structures */
+ /********************************************/
+
+ /*** all key format types ****/
+
+ identity key-format-base {
+ description "Base key-format identity for all keys.";
+ }
+
+ identity public-key-format {
+ base "key-format-base";
+ description "Base key-format identity for public keys.";
+ }
+
+ identity private-key-format {
+ base "key-format-base";
+ description "Base key-format identity for private keys.";
+ }
+
+ identity symmetric-key-format {
+ base "key-format-base";
+ description "Base key-format identity for symmetric keys.";
+ }
+
+ /**** for private keys ****/
+
+ identity rsa-private-key-format {
+ base "private-key-format";
+ description "An RSAPrivateKey (from RFC 3447).";
+ }
+
+ identity ec-private-key-format {
+ base "private-key-format";
+ description "An ECPrivateKey (from RFC 5915)";
+ }
+
+ identity one-asymmetric-key-format {
+ base "private-key-format";
+ description "A OneAsymmetricKey (from RFC 5958).";
+ }
+
+ identity encrypted-private-key-format {
+ base "private-key-format";
+ description
+ "A CMS EncryptedData structure (RFC 5652)
+ containing a OneAsymmetricKey (RFC 5958).";
+ }
+
+ /**** for public keys ****/
+
+ identity ssh-public-key-format {
+ base "public-key-format";
+ description
+ "The public key format described by RFC 4716.";
+ }
+
+ identity subject-public-key-info-format {
+ base "public-key-format";
+ description
+ "A SubjectPublicKeyInfo (from RFC 5280).";
+ }
+
+ /**** for symmetric keys ****/
+
+ identity octet-string-key-format {
+ base "symmetric-key-format";
+ description "An OctetString from ASN.1.";
+ /*
+ // Knowing that it is an "OctetString" isn't really helpful.
+ // Knowing the length of the octet string would be helpful,
+ // as it relates to the algorithm's block size. We may want
+ // to only (for now) use "one-symmetric-key-format" for
+ // symmetric keys...were the usability issues Juergen
+ // mentioned before only apply to asymmetric keys?
+ */
+ }
+
+ identity one-symmetric-key-format {
+ base "symmetric-key-format";
+ description "A OneSymmetricKey (from RFC6031).";
+ }
+
+ identity encrypted-symmetric-key-format {
+ base "symmetric-key-format";
+ description
+ "A CMS EncryptedData structure (RFC 5652)
+ containing a OneSymmetricKey (RFC 6031).";
+ }
+
+ /***************************************************/
+ /* Typedefs for ASN.1 structures from RFC 5280 */
+ /***************************************************/
+
+ typedef x509 {
+ type binary;
+ description
+ "A Certificate structure, as specified in RFC 5280,
+ encoded using ASN.1 distinguished encoding rules (DER),
+ as specified in ITU-T X.690.";
+ reference
+ "RFC 5280:
+ Internet X.509 Public Key Infrastructure Certificate
+ and Certificate Revocation List (CRL) Profile
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+
+ typedef crl {
+ type binary;
+ description
+ "A CertificateList structure, as specified in RFC 5280,
+ encoded using ASN.1 distinguished encoding rules (DER),
+ as specified in ITU-T X.690.";
+ reference
+ "RFC 5280:
+ Internet X.509 Public Key Infrastructure Certificate
+ and Certificate Revocation List (CRL) Profile
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+
+ /***********************************************/
+ /* Typedefs for ASN.1 structures from 5652 */
+ /***********************************************/
+
+ typedef cms {
+ type binary;
+ description
+ "A ContentInfo structure, as specified in RFC 5652,
+ encoded using ASN.1 distinguished encoding rules (DER),
+ as specified in ITU-T X.690.";
+ reference
+ "RFC 5652:
+ Cryptographic Message Syntax (CMS)
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+ typedef data-content-cms {
+ type cms;
+ description
+ "A CMS structure whose top-most content type MUST be the
+ data content type, as described by Section 4 in RFC 5652.";
+ reference
+ "RFC 5652: Cryptographic Message Syntax (CMS)";
+ }
+
+ typedef signed-data-cms {
+ type cms;
+ description
+ "A CMS structure whose top-most content type MUST be the
+ signed-data content type, as described by Section 5 in
+ RFC 5652.";
+ reference
+ "RFC 5652: Cryptographic Message Syntax (CMS)";
+ }
+
+ typedef enveloped-data-cms {
+ type cms;
+ description
+ "A CMS structure whose top-most content type MUST be the
+ enveloped-data content type, as described by Section 6
+ in RFC 5652.";
+ reference
+ "RFC 5652: Cryptographic Message Syntax (CMS)";
+ }
+
+ typedef digested-data-cms {
+ type cms;
+ description
+ "A CMS structure whose top-most content type MUST be the
+ digested-data content type, as described by Section 7
+ in RFC 5652.";
+ reference
+ "RFC 5652: Cryptographic Message Syntax (CMS)";
+ }
+
+ typedef encrypted-data-cms {
+ type cms;
+ description
+ "A CMS structure whose top-most content type MUST be the
+ encrypted-data content type, as described by Section 8
+ in RFC 5652.";
+ reference
+ "RFC 5652: Cryptographic Message Syntax (CMS)";
+ }
+ typedef authenticated-data-cms {
+ type cms;
+ description
+ "A CMS structure whose top-most content type MUST be the
+ authenticated-data content type, as described by Section 9
+ in RFC 5652.";
+ reference
+ "RFC 5652: Cryptographic Message Syntax (CMS)";
+ }
+
+ /***************************************************/
+ /* Typedefs for structures related to RFC 4253 */
+ /***************************************************/
+
+ typedef ssh-host-key {
+ type binary;
+ description
+ "The binary public key data for this SSH key, as
+ specified by RFC 4253, Section 6.6, i.e.:
+
+ string certificate or public key format
+ identifier
+ byte[n] key/certificate data.";
+ reference
+ "RFC 4253: The Secure Shell (SSH) Transport Layer
+ Protocol";
+ }
+
+ /*********************************************************/
+ /* Typedefs for ASN.1 structures related to RFC 5280 */
+ /*********************************************************/
+
+ typedef trust-anchor-cert-x509 {
+ type x509;
+ description
+ "A Certificate structure that MUST encode a self-signed
+ root certificate.";
+ }
+
+ typedef end-entity-cert-x509 {
+ type x509;
+ description
+ "A Certificate structure that MUST encode a certificate
+ that is neither self-signed nor having Basic constraint
+ CA true.";
+ }
+
+ /*********************************************************/
+ /* Typedefs for ASN.1 structures related to RFC 5652 */
+ /*********************************************************/
+
+ typedef trust-anchor-cert-cms {
+ type signed-data-cms;
+ description
+ "A CMS SignedData structure that MUST contain the chain of
+ X.509 certificates needed to authenticate the certificate
+ presented by a client or end-entity.
+
+ The CMS MUST contain only a single chain of certificates.
+ The client or end-entity certificate MUST only authenticate
+ to last intermediate CA certificate listed in the chain.
+
+ In all cases, the chain MUST include a self-signed root
+ certificate. In the case where the root certificate is
+ itself the issuer of the client or end-entity certificate,
+ only one certificate is present.
+
+ This CMS structure MAY (as applicable where this type is
+ used) also contain suitably fresh (as defined by local
+ policy) revocation objects with which the device can
+ verify the revocation status of the certificates.
+
+ This CMS encodes the degenerate form of the SignedData
+ structure that is commonly used to disseminate X.509
+ certificates and revocation objects (RFC 5280).";
+ reference
+ "RFC 5280:
+ Internet X.509 Public Key Infrastructure Certificate
+ and Certificate Revocation List (CRL) Profile.";
+ }
+
+ typedef end-entity-cert-cms {
+ type signed-data-cms;
+ description
+ "A CMS SignedData structure that MUST contain the end
+ entity certificate itself, and MAY contain any number
+ of intermediate certificates leading up to a trust
+ anchor certificate. The trust anchor certificate
+ MAY be included as well.
+
+ The CMS MUST contain a single end entity certificate.
+ The CMS MUST NOT contain any spurious certificates.
+
+ This CMS structure MAY (as applicable where this type is
+ used) also contain suitably fresh (as defined by local
+ policy) revocation objects with which the device can
+ verify the revocation status of the certificates.
+
+ This CMS encodes the degenerate form of the SignedData
+ structure that is commonly used to disseminate X.509
+ certificates and revocation objects (RFC 5280).";
+ reference
+ "RFC 5280:
+ Internet X.509 Public Key Infrastructure Certificate
+ and Certificate Revocation List (CRL) Profile.";
+ }
+
+ typedef ssh-public-key-type { // DELETE?
+ type binary;
+ description
+ "The binary public key data for this SSH key, as
+ specified by RFC 4253, Section 6.6, i.e.:
+
+ string certificate or public key format
+ identifier
+ byte[n] key/certificate data.";
+ reference
+ "RFC 4253: The Secure Shell (SSH) Transport
+ Layer Protocol";
+ }
+
+ /**********************************************/
+ /* Groupings for keys and/or certificates */
+ /**********************************************/
+
+ grouping symmetric-key-grouping {
+ description
+ "A symmetric key and algorithm.";
+ leaf algorithm {
+ type encryption-algorithm-t;
+ mandatory true;
+ description
+ "The algorithm to be used when generating the key.";
+ reference
+ "RFC CCCC: Common YANG Data Types for Cryptography";
+ }
+ leaf key-format {
+ nacm:default-deny-write;
+ when "../key";
+ type identityref {
+ base symmetric-key-format;
+ }
+ description "Identifies the symmetric key's format.";
+ }
+ choice key-type {
+ mandatory true;
+ description
+ "Choice between key types.";
+ leaf key {
+ nacm:default-deny-all;
+ type binary;
+ //must "../key-format"; FIXME: remove comment if approach ok
+ description
+ "The binary value of the key. The interpretation of
+ the value is defined by 'key-format'. For example,
+ FIXME.";
+ reference
+ "RFC XXXX: FIXME";
+ }
+ leaf hidden-key {
+ nacm:default-deny-write;
+ type empty;
+ description
+ "A permanently hidden key. How such keys are created
+ is outside the scope of this module.";
+ }
+ }
+ }
+
+ grouping public-key-grouping {
+ description
+ "A public key and its associated algorithm.";
+ leaf algorithm {
+ nacm:default-deny-write;
+ type asymmetric-key-algorithm-t;
+ mandatory true;
+ description
+ "Identifies the key's algorithm.";
+ reference
+ "RFC CCCC: Common YANG Data Types for Cryptography";
+ }
+ leaf public-key-format {
+ nacm:default-deny-write;
+ when "../public-key";
+ type identityref {
+ base public-key-format;
+ }
+ description "Identifies the key's format.";
+ }
+ leaf public-key {
+ nacm:default-deny-write;
+ type binary;
+ //must "../public-key-format"; FIXME: rm comment if approach ok
+ mandatory true;
+ description
+ "The binary value of the public key. The interpretation
+ of the value is defined by 'public-key-format' field.";
+ }
+ }
+
+ grouping asymmetric-key-pair-grouping {
+ description
+ "A private key and its associated public key and algorithm.";
+ uses public-key-grouping;
+ leaf private-key-format {
+ nacm:default-deny-write;
+ when "../private-key";
+ type identityref {
+ base private-key-format;
+ }
+ description "Identifies the key's format.";
+ }
+ choice private-key-type {
+ mandatory true;
+ description
+ "Choice between key types.";
+ leaf private-key {
+ nacm:default-deny-all;
+ type binary;
+ //must "../private-key-format"; FIXME: rm comment if ok
+ description
+ "The value of the binary key. The key's value is
+ interpreted by the 'private-key-format' field.";
+ }
+ leaf hidden-private-key {
+ nacm:default-deny-write;
+ type empty;
+ description
+ "A permanently hidden key. How such keys are created
+ is outside the scope of this module.";
+ }
+ }
+ }
+
+ grouping trust-anchor-cert-grouping {
+ description
+ "A trust anchor certificate, and a notification for when
+ it is about to (or already has) expire.";
+ leaf cert {
+ nacm:default-deny-write;
+ type trust-anchor-cert-cms;
+ description
+ "The binary certificate data for this certificate.";
+ reference
+ "RFC YYYY: Common YANG Data Types for Cryptography";
+ }
+ notification certificate-expiration {
+ description
+ "A notification indicating that the configured certificate
+ is either about to expire or has already expired. When to
+ send notifications is an implementation specific decision,
+ but it is RECOMMENDED that a notification be sent once a
+ month for 3 months, then once a week for four weeks, and
+ then once a day thereafter until the issue is resolved.";
+ leaf expiration-date {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "Identifies the expiration date on the certificate.";
+ }
+ }
+ }
+
+ grouping trust-anchor-certs-grouping {
+ description
+ "A list of trust anchor certificates, and a notification
+ for when one is about to (or already has) expire.";
+ leaf-list cert {
+ nacm:default-deny-write;
+ type trust-anchor-cert-cms;
+ description
+ "The binary certificate data for this certificate.";
+ reference
+ "RFC YYYY: Common YANG Data Types for Cryptography";
+ }
+ notification certificate-expiration {
+ description
+ "A notification indicating that the configured certificate
+ is either about to expire or has already expired. When to
+ send notifications is an implementation specific decision,
+ but it is RECOMMENDED that a notification be sent once a
+ month for 3 months, then once a week for four weeks, and
+ then once a day thereafter until the issue is resolved.";
+ leaf expiration-date {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "Identifies the expiration date on the certificate.";
+ }
+ }
+ }
+
+ grouping end-entity-cert-grouping {
+ description
+ "An end entity certificate, and a notification for when
+ it is about to (or already has) expire. Implementations
+ SHOULD assert that, where used, the end entity certificate
+ contains the expected public key.";
+ leaf cert {
+ nacm:default-deny-write;
+ type end-entity-cert-cms;
+ description
+ "The binary certificate data for this certificate.";
+ reference
+ "RFC YYYY: Common YANG Data Types for Cryptography";
+ }
+ notification certificate-expiration {
+ description
+ "A notification indicating that the configured certificate
+ is either about to expire or has already expired. When to
+ send notifications is an implementation specific decision,
+ but it is RECOMMENDED that a notification be sent once a
+ month for 3 months, then once a week for four weeks, and
+ then once a day thereafter until the issue is resolved.";
+ leaf expiration-date {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "Identifies the expiration date on the certificate.";
+ }
+ }
+ }
+
+ grouping end-entity-certs-grouping {
+ description
+ "A list of end entity certificates, and a notification for
+ when one is about to (or already has) expire.";
+ leaf-list cert {
+ nacm:default-deny-write;
+ type end-entity-cert-cms;
+ description
+ "The binary certificate data for this certificate.";
+ reference
+ "RFC YYYY: Common YANG Data Types for Cryptography";
+ }
+ notification certificate-expiration {
+ description
+ "A notification indicating that the configured certificate
+ is either about to expire or has already expired. When to
+ send notifications is an implementation specific decision,
+ but it is RECOMMENDED that a notification be sent once a
+ month for 3 months, then once a week for four weeks, and
+ then once a day thereafter until the issue is resolved.";
+ leaf expiration-date {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "Identifies the expiration date on the certificate.";
+ }
+ }
+ }
+
+ grouping asymmetric-key-pair-with-cert-grouping {
+ description
+ "A private/public key pair and an associated certificate.
+ Implementations SHOULD assert that certificates contain
+ the matching public key.";
+ uses asymmetric-key-pair-grouping;
+ uses end-entity-cert-grouping;
+ action generate-certificate-signing-request {
+ nacm:default-deny-all;
+ description
+ "Generates a certificate signing request structure for
+ the associated asymmetric key using the passed subject
+ and attribute values. The specified assertions need
+ to be appropriate for the certificate's use. For
+ example, an entity certificate for a TLS server
+ SHOULD have values that enable clients to satisfy
+ RFC 6125 processing.";
+ input {
+ leaf subject {
+ type binary;
+ mandatory true;
+ description
+ "The 'subject' field per the CertificationRequestInfo
+ structure as specified by RFC 2986, Section 4.1
+ encoded using the ASN.1 distinguished encoding
+ rules (DER), as specified in ITU-T X.690.";
+ reference
+ "RFC 2986:
+ PKCS #10: Certification Request Syntax
+ Specification Version 1.7.
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+ leaf attributes {
+ type binary; // FIXME: does this need to be mandatory?
+ description
+ "The 'attributes' field from the structure
+ CertificationRequestInfo as specified by RFC 2986,
+ Section 4.1 encoded using the ASN.1 distinguished
+ encoding rules (DER), as specified in ITU-T X.690.";
+ reference
+ "RFC 2986:
+ PKCS #10: Certification Request Syntax
+ Specification Version 1.7.
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+ }
+ output {
+ leaf certificate-signing-request {
+ type binary;
+ mandatory true;
+ description
+ "A CertificationRequest structure as specified by
+ RFC 2986, Section 4.2 encoded using the ASN.1
+ distinguished encoding rules (DER), as specified
+ in ITU-T X.690.";
+ reference
+ "RFC 2986:
+ PKCS #10: Certification Request Syntax
+ Specification Version 1.7.
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+ }
+ } // generate-certificate-signing-request
+ } // asymmetric-key-pair-with-cert-grouping
+
+ grouping asymmetric-key-pair-with-certs-grouping {
+ description
+ "A private/public key pair and associated certificates.
+ Implementations SHOULD assert that certificates contain
+ the matching public key.";
+ uses asymmetric-key-pair-grouping;
+ container certificates {
+ nacm:default-deny-write;
+ description
+ "Certificates associated with this asymmetric key.
+ More than one certificate supports, for instance,
+ a TPM-protected asymmetric key that has both IDevID
+ and LDevID certificates associated.";
+ list certificate {
+ key "name";
+ description
+ "A certificate for this asymmetric key.";
+ leaf name {
+ type string;
+ description
+ "An arbitrary name for the certificate. If the name
+ matches the name of a certificate that exists
+ independently in <operational> (i.e., an IDevID),
+ then the 'cert' node MUST NOT be configured.";
+ }
+ uses end-entity-cert-grouping;
+ }
+ } // certificates
+ action generate-certificate-signing-request {
+ nacm:default-deny-all;
+ description
+ "Generates a certificate signing request structure for
+ the associated asymmetric key using the passed subject
+ and attribute values. The specified assertions need
+ to be appropriate for the certificate's use. For
+ example, an entity certificate for a TLS server
+ SHOULD have values that enable clients to satisfy
+ RFC 6125 processing.";
+ input {
+ leaf subject {
+ type binary;
+ mandatory true;
+ description
+ "The 'subject' field per the CertificationRequestInfo
+ structure as specified by RFC 2986, Section 4.1
+ encoded using the ASN.1 distinguished encoding
+ rules (DER), as specified in ITU-T X.690.";
+ reference
+ "RFC 2986:
+ PKCS #10: Certification Request Syntax
+ Specification Version 1.7.
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+ leaf attributes {
+ type binary; // FIXME: does this need to be mandatory?
+ description
+ "The 'attributes' field from the structure
+ CertificationRequestInfo as specified by RFC 2986,
+ Section 4.1 encoded using the ASN.1 distinguished
+ encoding rules (DER), as specified in ITU-T X.690.";
+ reference
+ "RFC 2986:
+ PKCS #10: Certification Request Syntax
+ Specification Version 1.7.
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+ }
+ output {
+ leaf certificate-signing-request {
+ type binary;
+ mandatory true;
+ description
+ "A CertificationRequest structure as specified by
+ RFC 2986, Section 4.2 encoded using the ASN.1
+ distinguished encoding rules (DER), as specified
+ in ITU-T X.690.";
+ reference
+ "RFC 2986:
+ PKCS #10: Certification Request Syntax
+ Specification Version 1.7.
+ ITU-T X.690:
+ Information technology - ASN.1 encoding rules:
+ Specification of Basic Encoding Rules (BER),
+ Canonical Encoding Rules (CER) and Distinguished
+ Encoding Rules (DER).";
+ }
+ }
+ } // generate-certificate-signing-request
+ } // asymmetric-key-pair-with-certs-grouping
+}
\ No newline at end of file
--- /dev/null
+module ietf-dhcpv6-types {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-dhcpv6-types";
+ prefix "dhcpv6-types";
+
+ import ietf-inet-types {
+ prefix inet;
+ }
+ import ietf-yang-types {
+ prefix yang;
+ }
+
+ organization "DHC WG";
+ contact
+ "cuiyong@tsinghua.edu.cn
+ lh.sunlinh@gmail.com
+ ian.farrer@telekom.de
+ sladjana.zechlin@telekom.de
+ hezihao9512@gmail.com";
+
+ description "This model defines a YANG data model that can be
+ used to define some commonly used DHCPv6 types";
+
+ revision 2018-01-30 {
+ description "Initial revision";
+ reference "I-D: draft-ietf-dhc-dhcpv6-yang";
+ }
+
+ /*
+ * Grouping
+ */
+ grouping vendor-infor {
+ description "Vendor information.";
+ container vendor-info {
+ description "";
+ leaf ent-num {
+ type uint32;
+ mandatory true;
+ description "enterprise number";
+ }
+ leaf-list data {
+ type string;
+ description "specific vendor info";
+ }
+ }
+ }
+
+ grouping duid {
+ description
+ "Each server and client has only one DUID (DHCP Unique Identifier).
+ The DUID here identifies a unique DHCPv6 server for clients. DUID
+ consists of a two-octet type field and an arbitrary length (no more
+ than 128 bytes) content field. Currently there are four defined types
+ of DUIDs in RFC3315 and RFC6355 - DUID-LLT, DUID-EN, DUID-LL and
+ DUID-UUID. DUID-Uknown represents those unconventional DUIDs.";
+ reference "RFC3315: Section 9 and RFC6355: Section 4";
+ leaf type-code {
+ type uint16;
+ default 65535;
+ description "Type code of this DUID";
+ }
+ choice duid-type {
+ default duid-unknown;
+ description "Selects the format for the DUID.";
+ case duid-llt {
+ description "DUID Based on Link-layer Address Plus Time
+ (Type 1 - DUID-LLT)";
+ reference "RFC3315 Section 9.2";
+ leaf duid-llt-hardware-type {
+ type uint16;
+ description "Hardware type as assigned by IANA (RFC826).";
+ }
+ leaf duid-llt-time {
+ type yang:timeticks;
+ description "The time value is the time that the DUID is
+ generated represented in seconds since midnight (UTC),
+ January 1, 2000, modulo 2^32.";
+ }
+ leaf duid-llt-link-layer-addr {
+ type yang:mac-address;
+ description "Link-layer address as described in RFC2464";
+ }
+ }
+ case duid-en {
+ description "DUID Assigned by Vendor Based on Enterprise Number
+ (Type 2 - DUID-EN)";
+ reference "RFC3315 Section 9.3";
+ leaf duid-en-enterprise-number {
+ type uint32;
+ description "Vendor's registered Private Enterprise Number as
+ maintained by IANA";
+ }
+ leaf duid-en-identifier {
+ type string;
+ description "Indentifier, unique to the device that is
+ using it";
+ }
+ }
+ case duid-ll {
+ description "DUID Based on Link-layer Address (Type 3 - DUID-LL)";
+ reference "RFC3315 Section 9.4";
+ leaf duid-ll-hardware-type {
+ type uint16;
+ description "Hardware type as assigned by IANA (RFC826).";
+ }
+ leaf duid-ll-link-layer-addr {
+ type yang:mac-address;
+ description "Link-layer address as described in RFC2464";
+ }
+ }
+ case duid-uuid {
+ description "DUID Based on Universally Unique Identifier
+ (Type 4 - DUID-UUID)";
+ reference "RFC6335 Defination of the UUID-Based Unique Identifier";
+ leaf uuid {
+ type yang:uuid;
+ description "A Universally Unique IDentifier in the string
+ representation defined in RFC 4122. The canonical
+ representation uses lowercase characters";
+ }
+ }
+ case duid-unknown {
+ description "DUID based on free raw bytes";
+ leaf data {
+ type binary;
+ description "The bits to be used as the identifier";
+ }
+ }
+ }
+ }
+
+ grouping portset-para {
+ description "portset parameters";
+ container port-parameter {
+ description "port parameter";
+ leaf offset {
+ type uint8;
+ mandatory true;
+ description "offset in a port set";
+ }
+ leaf psid-len {
+ type uint8;
+ mandatory true;
+ description "length of a psid";
+ }
+ leaf psid {
+ type uint16;
+ mandatory true;
+ description "psid value";
+ }
+ }
+ }
+
+ grouping iaid {
+ description "IA is a construct through which a server and a
+ client can identify, group, and manage a set of related IPv6
+ addresses. The key of the list is a 4-byte number IAID defined
+ in [RFC3315].";
+ list identity-association {
+ config "false";
+ description "IA";
+ leaf iaid {
+ type uint32;
+ mandatory true;
+ description "IAID";
+ }
+ leaf ia-type {
+ type string;
+ mandatory true;
+ description "IA type";
+ }
+ leaf-list ipv6-addr {
+ type inet:ipv6-address;
+ description "ipv6 address";
+ }
+ leaf-list ipv6-prefix {
+ type inet:ipv6-prefix;
+ description "ipv6 prefix";
+ }
+ leaf-list prefix-length {
+ type uint8;
+ description "ipv6 prefix length";
+ }
+ leaf t1-time {
+ type yang:timeticks;
+ mandatory true;
+ description "t1 time";
+ }
+ leaf t2-time {
+ type yang:timeticks;
+ mandatory true;
+ description "t2 time";
+ }
+ leaf preferred-lifetime {
+ type yang:timeticks;
+ mandatory true;
+ description "preferred lifetime";
+ }
+ leaf valid-lifetime {
+ type yang:timeticks;
+ mandatory true;
+ description "valid lifetime";
+ }
+ }
+ }
+
+}
--- /dev/null
+module ietf-hardware {
+yang-version 1.1;
+namespace "urn:ietf:params:xml:ns:yang:ietf-hardware";
+prefix hw;
+
+import ietf-inet-types {
+ prefix inet;
+}
+import ietf-yang-types {
+ prefix yang;
+}
+import iana-hardware {
+ prefix ianahw;
+}
+
+organization
+ "IETF NETMOD (Network Modeling) Working Group";
+
+contact
+ "WG Web: <https://datatracker.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+ Editor: Andy Bierman
+ <mailto:andy@yumaworks.com>
+ Editor: Martin Bjorklund
+ <mailto:mbj@tail-f.com>
+ Editor: Jie Dong
+ <mailto:jie.dong@huawei.com>
+ Editor: Dan Romascanu
+ <mailto:dromasca@gmail.com>";
+
+description
+ "This module contains a collection of YANG definitions for
+ managing hardware.
+ This data model is designed for the Network Management Datastore
+ Architecture (NMDA) defined in RFC 8342.
+ Copyright (c) 2018 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 8348; see
+ the RFC itself for full legal notices.";
+
+revision 2018-03-13 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8348: A YANG Data Model for Hardware Management";
+}
+
+/*
+ * Features
+ */
+
+feature entity-mib {
+ description
+ "This feature indicates that the device implements
+ the ENTITY-MIB.";
+ reference
+ "RFC 6933: Entity MIB (Version 4)";
+}
+
+feature hardware-state {
+ description
+ "Indicates that ENTITY-STATE-MIB objects are supported";
+ reference
+ "RFC 4268: Entity State MIB";
+}
+
+feature hardware-sensor {
+ description
+ "Indicates that ENTITY-SENSOR-MIB objects are supported";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base";
+}
+
+/*
+ * Typedefs
+ */
+
+typedef admin-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report administrative state.";
+ }
+ enum locked {
+ value 2;
+ description
+ "The resource is administratively prohibited from use.";
+ }
+ enum shutting-down {
+ value 3;
+ description
+ "The resource usage is administratively limited to current
+ instances of use.";
+ }
+ enum unlocked {
+ value 4;
+ description
+ "The resource is not administratively prohibited from
+ use.";
+ }
+ }
+ description
+ "Represents the various possible administrative states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityAdminState";
+}
+
+typedef oper-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report its operational state.";
+ }
+ enum disabled {
+ value 2;
+ description
+ "The resource is totally inoperable.";
+ }
+ enum enabled {
+ value 3;
+
+ description
+ "The resource is partially or fully operable.";
+ }
+ enum testing {
+ value 4;
+ description
+ "The resource is currently being tested and cannot
+ therefore report whether or not it is operational.";
+ }
+ }
+ description
+ "Represents the possible values of operational states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityOperState";
+}
+
+typedef usage-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report usage state.";
+ }
+ enum idle {
+ value 2;
+ description
+ "The resource is servicing no users.";
+ }
+ enum active {
+ value 3;
+ description
+ "The resource is currently in use, and it has sufficient
+ spare capacity to provide for additional users.";
+ }
+ enum busy {
+ value 4;
+ description
+ "The resource is currently in use, but it currently has no
+ spare capacity to provide for additional users.";
+ }
+ }
+ description
+ "Represents the possible values of usage states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityUsageState";
+}
+
+typedef alarm-state {
+ type bits {
+ bit unknown {
+ position 0;
+ description
+ "The resource is unable to report alarm state.";
+ }
+ bit under-repair {
+ position 1;
+ description
+ "The resource is currently being repaired, which, depending
+ on the implementation, may make the other values in this
+ bit string not meaningful.";
+ }
+ bit critical {
+ position 2;
+ description
+ "One or more critical alarms are active against the
+ resource.";
+ }
+ bit major {
+ position 3;
+ description
+ "One or more major alarms are active against the
+ resource.";
+ }
+ bit minor {
+ position 4;
+ description
+ "One or more minor alarms are active against the
+ resource.";
+ }
+ bit warning {
+ position 5;
+ description
+ "One or more warning alarms are active against the
+ resource.";
+ }
+ bit indeterminate {
+ position 6;
+ description
+ "One or more alarms of whose perceived severity cannot be
+ determined are active against this resource.";
+ }
+ }
+ description
+ "Represents the possible values of alarm states. An alarm is a
+ persistent indication of an error or warning condition.
+ When no bits of this attribute are set, then no active alarms
+ are known against this component and it is not under repair.";
+ reference
+ "RFC 4268: Entity State MIB - EntityAlarmStatus";
+}
+
+typedef standby-state {
+ type enumeration {
+ enum unknown {
+ value 1;
+ description
+ "The resource is unable to report standby state.";
+ }
+ enum hot-standby {
+ value 2;
+ description
+ "The resource is not providing service, but it will be
+ immediately able to take over the role of the resource to
+ be backed up, without the need for initialization
+ activity, and will contain the same information as the
+ resource to be backed up.";
+ }
+ enum cold-standby {
+ value 3;
+ description
+ "The resource is to back up another resource, but it will
+ not be immediately able to take over the role of a
+ resource to be backed up and will require some
+ initialization activity.";
+ }
+ enum providing-service {
+ value 4;
+ description
+ "The resource is providing service.";
+ }
+ }
+ description
+ "Represents the possible values of standby states.";
+ reference
+ "RFC 4268: Entity State MIB - EntityStandbyStatus";
+}
+
+typedef sensor-value-type {
+ type enumeration {
+ enum other {
+ value 1;
+ description
+ "A measure other than those listed below.";
+ }
+ enum unknown {
+ value 2;
+ description
+ "An unknown measurement or arbitrary, relative numbers";
+ }
+ enum volts-AC {
+ value 3;
+ description
+ "A measure of electric potential (alternating current).";
+ }
+ enum volts-DC {
+ value 4;
+ description
+ "A measure of electric potential (direct current).";
+ }
+ enum amperes {
+ value 5;
+ description
+ "A measure of electric current.";
+ }
+ enum watts {
+ value 6;
+ description
+ "A measure of power.";
+ }
+ enum hertz {
+ value 7;
+ description
+ "A measure of frequency.";
+ }
+ enum celsius {
+ value 8;
+ description
+ "A measure of temperature.";
+ }
+ enum percent-RH {
+ value 9;
+ description
+ "A measure of percent relative humidity.";
+ }
+ enum rpm {
+ value 10;
+ description
+ "A measure of shaft revolutions per minute.";
+ }
+ enum cmm {
+ value 11;
+ description
+ "A measure of cubic meters per minute (airflow).";
+ }
+ enum truth-value {
+ value 12;
+ description
+ "Value is one of 1 (true) or 2 (false)";
+ }
+ }
+ description
+ "A node using this data type represents the sensor measurement
+ data type associated with a physical sensor value. The actual
+ data units are determined by examining a node of this type
+ together with the associated sensor-value-scale node.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-scale and type sensor-value-precision.
+ These three types are used to identify the semantics of a node
+ of type sensor-value.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorDataType";
+}
+
+typedef sensor-value-scale {
+ type enumeration {
+ enum yocto {
+ value 1;
+ description
+ "Data scaling factor of 10^-24.";
+ }
+ enum zepto {
+ value 2;
+ description
+ "Data scaling factor of 10^-21.";
+ }
+ enum atto {
+ value 3;
+ description
+ "Data scaling factor of 10^-18.";
+ }
+ enum femto {
+ value 4;
+ description
+ "Data scaling factor of 10^-15.";
+ }
+ enum pico {
+ value 5;
+ description
+ "Data scaling factor of 10^-12.";
+ }
+ enum nano {
+ value 6;
+ description
+ "Data scaling factor of 10^-9.";
+ }
+ enum micro {
+ value 7;
+ description
+ "Data scaling factor of 10^-6.";
+ }
+ enum milli {
+ value 8;
+ description
+ "Data scaling factor of 10^-3.";
+ }
+ enum units {
+ value 9;
+ description
+ "Data scaling factor of 10^0.";
+ }
+ enum kilo {
+ value 10;
+ description
+ "Data scaling factor of 10^3.";
+ }
+ enum mega {
+ value 11;
+ description
+ "Data scaling factor of 10^6.";
+ }
+ enum giga {
+ value 12;
+ description
+ "Data scaling factor of 10^9.";
+ }
+ enum tera {
+ value 13;
+ description
+ "Data scaling factor of 10^12.";
+ }
+ enum peta {
+ value 14;
+ description
+ "Data scaling factor of 10^15.";
+ }
+ enum exa {
+ value 15;
+ description
+ "Data scaling factor of 10^18.";
+ }
+ enum zetta {
+ value 16;
+ description
+ "Data scaling factor of 10^21.";
+ }
+ enum yotta {
+ value 17;
+ description
+ "Data scaling factor of 10^24.";
+ }
+ }
+ description
+ "A node using this data type represents a data scaling factor,
+ represented with an International System of Units (SI) prefix.
+ The actual data units are determined by examining a node of
+ this type together with the associated sensor-value-type.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-type and type sensor-value-precision.
+ Together, associated nodes of these three types are used to
+ identify the semantics of a node of type sensor-value.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorDataScale";
+}
+
+typedef sensor-value-precision {
+ type int8 {
+ range "-8 .. 9";
+ }
+ description
+ "A node using this data type represents a sensor value
+ precision range.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-type and type sensor-value-scale. Together,
+ associated nodes of these three types are used to identify the
+ semantics of a node of type sensor-value.
+ If a node of this type contains a value in the range 1 to 9,
+ it represents the number of decimal places in the fractional
+ part of an associated sensor-value fixed-point number.
+ If a node of this type contains a value in the range -8 to -1,
+ it represents the number of accurate digits in the associated
+ sensor-value fixed-point number.
+ The value zero indicates the associated sensor-value node is
+ not a fixed-point number.
+ Server implementers must choose a value for the associated
+ sensor-value-precision node so that the precision and accuracy
+ of the associated sensor-value node is correctly indicated.
+ For example, a component representing a temperature sensor
+ that can measure 0 to 100 degrees C in 0.1 degree
+ increments, +/- 0.05 degrees, would have a
+ sensor-value-precision value of '1', a sensor-value-scale
+ value of 'units', and a sensor-value ranging from '0' to
+ '1000'. The sensor-value would be interpreted as
+ 'degrees C * 10'.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorPrecision";
+}
+
+typedef sensor-value {
+ type int32 {
+ range "-1000000000 .. 1000000000";
+ }
+ description
+ "A node using this data type represents a sensor value.
+ A node of this type SHOULD be defined together with nodes of
+ type sensor-value-type, type sensor-value-scale, and
+ type sensor-value-precision. Together, associated nodes of
+ those three types are used to identify the semantics of a node
+ of this data type.
+ The semantics of a node using this data type are determined by
+ the value of the associated sensor-value-type node.
+ If the associated sensor-value-type node is equal to 'voltsAC',
+ 'voltsDC', 'amperes', 'watts', 'hertz', 'celsius', or 'cmm',
+ then a node of this type MUST contain a fixed-point number
+ ranging from -999,999,999 to +999,999,999. The value
+ -1000000000 indicates an underflow error. The value
+ +1000000000 indicates an overflow error. The
+ sensor-value-precision indicates how many fractional digits
+ are represented in the associated sensor-value node.
+ If the associated sensor-value-type node is equal to
+ 'percentRH', then a node of this type MUST contain a number
+ ranging from 0 to 100.
+ If the associated sensor-value-type node is equal to 'rpm',
+ then a node of this type MUST contain a number ranging from
+ -999,999,999 to +999,999,999.
+ If the associated sensor-value-type node is equal to
+ 'truth-value', then a node of this type MUST contain either the
+ value 1 (true) or the value 2 (false).
+ If the associated sensor-value-type node is equal to 'other' or
+ 'unknown', then a node of this type MUST contain a number
+ ranging from -1000000000 to 1000000000.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorValue";
+}
+
+typedef sensor-status {
+ type enumeration {
+ enum ok {
+ value 1;
+ description
+ "Indicates that the server can obtain the sensor value.";
+ }
+ enum unavailable {
+ value 2;
+ description
+ "Indicates that the server presently cannot obtain the
+ sensor value.";
+ }
+ enum nonoperational {
+ value 3;
+ description
+ "Indicates that the server believes the sensor is broken.
+ The sensor could have a hard failure (disconnected wire)
+ or a soft failure such as out-of-range, jittery, or wildly
+ fluctuating readings.";
+ }
+ }
+ description
+ "A node using this data type represents the operational status
+ of a physical sensor.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ EntitySensorStatus";
+}
+
+/*
+ * Data nodes
+ */
+
+container hardware {
+ description
+ "Data nodes representing components.
+ If the server supports configuration of hardware components,
+ then this data model is instantiated in the configuration
+ datastores supported by the server. The leaf-list 'datastore'
+ for the module 'ietf-hardware' in the YANG library provides
+ this information.";
+
+ leaf last-change {
+ type yang:date-and-time;
+ config false;
+ description
+ "The time the '/hardware/component' list changed in the
+ operational state.";
+ }
+
+ list component {
+ key name;
+ description
+ "List of components.
+ When the server detects a new hardware component, it
+ initializes a list entry in the operational state.
+ If the server does not support configuration of hardware
+ components, list entries in the operational state are
+ initialized with values for all nodes as detected by the
+ implementation.
+ Otherwise, this procedure is followed:
+ 1. If there is an entry in the '/hardware/component' list
+ in the intended configuration with values for the nodes
+ 'class', 'parent', and 'parent-rel-pos' that are equal
+ to the detected values, then the list entry in the
+ operational state is initialized with the configured
+ values, including the 'name'.
+ 2. Otherwise (i.e., there is no matching configuration
+ entry), the list entry in the operational state is
+ initialized with values for all nodes as detected by
+ the implementation.
+ If the '/hardware/component' list in the intended
+ configuration is modified, then the system MUST behave as if
+ it re-initializes itself and follow the procedure in (1).";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalEntry";
+
+ leaf name {
+ type string;
+ description
+ "The name assigned to this component.
+ This name is not required to be the same as
+ entPhysicalName.";
+ }
+
+ leaf class {
+ type identityref {
+ base ianahw:hardware-class;
+ }
+ mandatory true;
+ description
+ "An indication of the general hardware type of the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalClass";
+ }
+
+ leaf physical-index {
+ if-feature entity-mib;
+ type int32 {
+ range "1..2147483647";
+ }
+ config false;
+ description
+ "The entPhysicalIndex for the entPhysicalEntry represented
+ by this list entry.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalIndex";
+ }
+
+ leaf description {
+ type string;
+ config false;
+ description
+ "A textual description of the component. This node should
+ contain a string that identifies the manufacturer's name
+ for the component and should be set to a distinct value
+ for each version or model of the component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalDescr";
+ }
+
+ leaf parent {
+ type leafref {
+ path "../../component/name";
+ require-instance false;
+ }
+ description
+ "The name of the component that physically contains this
+ component.
+ If this leaf is not instantiated, it indicates that this
+ component is not contained in any other component.
+ In the event that a physical component is contained by
+ more than one physical component (e.g., double-wide
+ modules), this node contains the name of one of these
+ components. An implementation MUST use the same name
+ every time this node is instantiated.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalContainedIn";
+ }
+
+ leaf parent-rel-pos {
+ type int32 {
+ range "0 .. 2147483647";
+ }
+ description
+ "An indication of the relative position of this child
+ component among all its sibling components. Sibling
+ components are defined as components that:
+ o share the same value of the 'parent' node and
+ o share a common base identity for the 'class' node.
+ Note that the last rule gives implementations flexibility
+ in how components are numbered. For example, some
+ implementations might have a single number series for all
+ components derived from 'ianahw:port', while some others
+ might have different number series for different
+ components with identities derived from 'ianahw:port' (for
+ example, one for registered jack 45 (RJ45) and one for
+ small form-factor pluggable (SFP)).";
+
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalParentRelPos";
+ }
+
+ leaf-list contains-child {
+ type leafref {
+ path "../../component/name";
+ }
+ config false;
+ description
+ "The name of the contained component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalChildIndex";
+ }
+
+ leaf hardware-rev {
+ type string;
+ config false;
+ description
+ "The vendor-specific hardware revision string for the
+ component. The preferred value is the hardware revision
+ identifier actually printed on the component itself (if
+ present).";
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalHardwareRev";
+ }
+
+ leaf firmware-rev {
+ type string;
+ config false;
+ description
+ "The vendor-specific firmware revision string for the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalFirmwareRev";
+ }
+
+ leaf software-rev {
+ type string;
+ config false;
+
+ description
+ "The vendor-specific software revision string for the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) -
+ entPhysicalSoftwareRev";
+ }
+
+ leaf serial-num {
+ type string;
+ config false;
+ description
+ "The vendor-specific serial number string for the
+ component. The preferred value is the serial number
+ string actually printed on the component itself (if
+ present).";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalSerialNum";
+ }
+
+ leaf mfg-name {
+ type string;
+ config false;
+ description
+ "The name of the manufacturer of this physical component.
+ The preferred value is the manufacturer name string
+ actually printed on the component itself (if present).
+ Note that comparisons between instances of the
+ 'model-name', 'firmware-rev', 'software-rev', and
+ 'serial-num' nodes are only meaningful amongst components
+ with the same value of 'mfg-name'.
+ If the manufacturer name string associated with the
+ physical component is unknown to the server, then this
+ node is not instantiated.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgName";
+ }
+
+ leaf model-name {
+ type string;
+ config false;
+ description
+ "The vendor-specific model name identifier string
+ associated with this physical component. The preferred
+ value is the customer-visible part number, which may be
+ printed on the component itself.
+ If the model name string associated with the physical
+ component is unknown to the server, then this node is not
+ instantiated.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalModelName";
+ }
+
+ leaf alias {
+ type string;
+ description
+ "An 'alias' name for the component, as specified by a
+ network manager, that provides a non-volatile 'handle' for
+ the component.
+ If no configured value exists, the server MAY set the
+ value of this node to a locally unique value in the
+ operational state.
+ A server implementation MAY map this leaf to the
+ entPhysicalAlias MIB object. Such an implementation needs
+ to use some mechanism to handle the differences in size
+ and characters allowed between this leaf and
+ entPhysicalAlias. The definition of such a mechanism is
+ outside the scope of this document.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalAlias";
+ }
+
+ leaf asset-id {
+ type string;
+ description
+ "This node is a user-assigned asset tracking identifier for
+ the component.
+ A server implementation MAY map this leaf to the
+ entPhysicalAssetID MIB object. Such an implementation
+ needs to use some mechanism to handle the differences in
+ size and characters allowed between this leaf and
+ entPhysicalAssetID. The definition of such a mechanism is
+ outside the scope of this document.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalAssetID";
+ }
+
+ leaf is-fru {
+ type boolean;
+ config false;
+
+ description
+ "This node indicates whether or not this component is
+ considered a 'field-replaceable unit' by the vendor. If
+ this node contains the value 'true', then this component
+ identifies a field-replaceable unit. For all components
+ that are permanently contained within a field-replaceable
+ unit, the value 'false' should be returned for this
+ node.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalIsFRU";
+ }
+
+ leaf mfg-date {
+ type yang:date-and-time;
+ config false;
+ description
+ "The date of manufacturing of the managed component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgDate";
+ }
+
+ leaf-list uri {
+ type inet:uri;
+ description
+ "This node contains identification information about the
+ component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalUris";
+ }
+
+ leaf uuid {
+ type yang:uuid;
+ config false;
+ description
+ "A Universally Unique Identifier of the component.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entPhysicalUUID";
+ }
+
+ container state {
+ if-feature hardware-state;
+ description
+ "State-related nodes";
+ reference
+ "RFC 4268: Entity State MIB";
+
+ leaf state-last-changed {
+ type yang:date-and-time;
+ config false;
+ description
+ "The date and time when the value of any of the
+ admin-state, oper-state, usage-state, alarm-state, or
+ standby-state changed for this component.
+ If there has been no change since the last
+ re-initialization of the local system, this node
+ contains the date and time of local system
+ initialization. If there has been no change since the
+ component was added to the local system, this node
+ contains the date and time of the insertion.";
+ reference
+ "RFC 4268: Entity State MIB - entStateLastChanged";
+ }
+
+ leaf admin-state {
+ type admin-state;
+ description
+ "The administrative state for this component.
+ This node refers to a component's administrative
+ permission to service both other components within its
+ containment hierarchy as well other users of its
+ services defined by means outside the scope of this
+ module.
+ Some components exhibit only a subset of the remaining
+ administrative state values. Some components cannot be
+ locked; hence, this node exhibits only the 'unlocked'
+ state. Other components cannot be shut down gracefully;
+ hence, this node does not exhibit the 'shutting-down'
+ state.";
+ reference
+ "RFC 4268: Entity State MIB - entStateAdmin";
+ }
+
+ leaf oper-state {
+ type oper-state;
+ config false;
+ description
+ "The operational state for this component.
+ Note that this node does not follow the administrative
+ state. An administrative state of 'down' does not
+ predict an operational state of 'disabled'.
+ Note that some implementations may not be able to
+ accurately report oper-state while the admin-state node
+ has a value other than 'unlocked'. In these cases, this
+ node MUST have a value of 'unknown'.";
+ reference
+ "RFC 4268: Entity State MIB - entStateOper";
+ }
+
+ leaf usage-state {
+ type usage-state;
+ config false;
+ description
+ "The usage state for this component.
+ This node refers to a component's ability to service
+ more components in a containment hierarchy.
+ Some components will exhibit only a subset of the usage
+ state values. Components that are unable to ever
+ service any components within a containment hierarchy
+ will always have a usage state of 'busy'. In some
+ cases, a component will be able to support only one
+ other component within its containment hierarchy and
+ will therefore only exhibit values of 'idle' and
+ 'busy'.";
+ reference
+ "RFC 4268: Entity State MIB - entStateUsage";
+ }
+
+ leaf alarm-state {
+ type alarm-state;
+ config false;
+ description
+ "The alarm state for this component. It does not
+ include the alarms raised on child components within its
+ containment hierarchy.";
+ reference
+ "RFC 4268: Entity State MIB - entStateAlarm";
+ }
+
+ leaf standby-state {
+ type standby-state;
+ config false;
+ description
+ "The standby state for this component.
+ Some components will exhibit only a subset of the
+ remaining standby state values. If this component
+ cannot operate in a standby role, the value of this node
+ will always be 'providing-service'.";
+ reference
+ "RFC 4268: Entity State MIB - entStateStandby";
+ }
+ }
+
+ container sensor-data {
+ when 'derived-from-or-self(../class,
+ "ianahw:sensor")' {
+ description
+ "Sensor data nodes present for any component of type
+ 'sensor'";
+ }
+ if-feature hardware-sensor;
+ config false;
+
+ description
+ "Sensor-related nodes.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base";
+
+ leaf value {
+ type sensor-value;
+ description
+ "The most recent measurement obtained by the server
+ for this sensor.
+ A client that periodically fetches this node should also
+ fetch the nodes 'value-type', 'value-scale', and
+ 'value-precision', since they may change when the value
+ is changed.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorValue";
+ }
+
+ leaf value-type {
+ type sensor-value-type;
+ description
+ "The type of data units associated with the
+ sensor value";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorType";
+ }
+ leaf value-scale {
+ type sensor-value-scale;
+ description
+ "The (power of 10) scaling factor associated
+ with the sensor value";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorScale";
+ }
+
+ leaf value-precision {
+ type sensor-value-precision;
+ description
+ "The number of decimal places of precision
+ associated with the sensor value";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorPrecision";
+ }
+
+ leaf oper-status {
+ type sensor-status;
+ description
+ "The operational status of the sensor.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorOperStatus";
+ }
+
+ leaf units-display {
+ type string;
+ description
+ "A textual description of the data units that should be
+ used in the display of the sensor value.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorUnitsDisplay";
+ }
+
+ leaf value-timestamp {
+ type yang:date-and-time;
+ description
+ "The time the status and/or value of this sensor was last
+ obtained by the server.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorValueTimeStamp";
+ }
+ leaf value-update-rate {
+ type uint32;
+ units "milliseconds";
+ description
+ "An indication of the frequency that the server updates
+ the associated 'value' node, represented in
+ milliseconds. The value zero indicates:
+ - the sensor value is updated on demand (e.g.,
+ when polled by the server for a get-request),
+ - the sensor value is updated when the sensor
+ value changes (event-driven), or
+ - the server does not know the update rate.";
+ reference
+ "RFC 3433: Entity Sensor Management Information Base -
+ entPhySensorValueUpdateRate";
+ }
+ }
+ }
+}
+
+/*
+ * Notifications
+ */
+
+notification hardware-state-change {
+ description
+ "A hardware-state-change notification is generated when the
+ value of /hardware/last-change changes in the operational
+ state.";
+ reference
+ "RFC 6933: Entity MIB (Version 4) - entConfigChange";
+}
+
+notification hardware-state-oper-enabled {
+ if-feature hardware-state;
+ description
+ "A hardware-state-oper-enabled notification signifies that a
+ component has transitioned into the 'enabled' state.";
+
+ leaf name {
+ type leafref {
+ path "/hardware/component/name";
+ }
+
+ description
+ "The name of the component that has transitioned into the
+ 'enabled' state.";
+ }
+ leaf admin-state {
+ type leafref {
+ path "/hardware/component/state/admin-state";
+ }
+ description
+ "The administrative state for the component.";
+ }
+ leaf alarm-state {
+ type leafref {
+ path "/hardware/component/state/alarm-state";
+ }
+ description
+ "The alarm state for the component.";
+ }
+ reference
+ "RFC 4268: Entity State MIB - entStateOperEnabled";
+}
+
+notification hardware-state-oper-disabled {
+ if-feature hardware-state;
+ description
+ "A hardware-state-oper-disabled notification signifies that a
+ component has transitioned into the 'disabled' state.";
+
+ leaf name {
+ type leafref {
+ path "/hardware/component/name";
+ }
+ description
+ "The name of the component that has transitioned into the
+ 'disabled' state.";
+ }
+ leaf admin-state {
+ type leafref {
+ path "/hardware/component/state/admin-state";
+ }
+ description
+ "The administrative state for the component.";
+ }
+ leaf alarm-state {
+ type leafref {
+ path "/hardware/component/state/alarm-state";
+ }
+
+ description
+ "The alarm state for the component.";
+ }
+ reference
+ "RFC 4268: Entity State MIB - entStateOperDisabled";
+}
+
+}
--- /dev/null
+module ietf-inet-types {
+
+namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+prefix "inet";
+
+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 for Internet addresses and related things.
+ 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:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+}
+
+revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+}
+
+/*** collection of types related to protocol fields ***/
+
+typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+}
+
+typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+}
+
+typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+}
+
+typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+}
+
+/*** collection of types related to autonomous systems ***/
+
+typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+}
+
+/*** collection of types related to IP addresses and hostnames ***/
+
+typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+}
+
+typedef ipv4-address {
+ 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])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+ The canonical format for the zone index is the numerical
+ format";
+}
+
+typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+}
+
+typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+}
+
+typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+}
+
+typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+}
+
+typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+}
+
+typedef ipv4-prefix {
+ 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])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+}
+
+typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+}
+
+/*** collection of domain name and URI types ***/
+
+typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+}
+
+typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+}
+
+typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+}
+
+}
--- /dev/null
+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) 2018 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";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module ietf-ip {
+ yang-version 1.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 (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 IP implementations.
+ Copyright (c) 2018 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 8344; see
+ the RFC itself for full legal notices.";
+
+ revision 2018-02-22 {
+ description
+ "Updated to support NMDA.";
+ reference
+ "RFC 8344: A YANG Data Model for IP Management";
+ }
+
+ revision 2014-06-16 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 7277: A YANG Data Model for IP Management";
+ }
+
+ /*
+ * Features
+ */
+
+ 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";
+ }
+
+ /*
+ * Typedefs
+ */
+
+ typedef ip-address-origin {
+ type enumeration {
+ enum other {
+ description
+ "None of the following.";
+ }
+
+ enum static {
+ description
+ "Indicates that the address has been statically
+ configured -- for example, using the Network Configuration
+ Protocol (NETCONF) or a command line interface.";
+ }
+ enum dhcp {
+ description
+ "Indicates an address that has been assigned to this
+ system by a DHCP server.";
+ }
+ enum link-layer {
+ description
+ "Indicates an address created by IPv6 stateless
+ autoconfiguration that embeds a link-layer address in its
+ interface identifier.";
+ }
+ enum random {
+ description
+ "Indicates an address chosen by the system at
+ random, e.g., an IPv4 address within 169.254/16, a
+ temporary address as described in RFC 4941, or a
+ semantically opaque address as described in RFC 7217.";
+ 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 {
+ description
+ "None of the following.";
+ }
+ enum static {
+ description
+ "Indicates that the mapping has been statically
+ configured -- for example, using NETCONF or a command line
+ interface.";
+ }
+
+ enum dynamic {
+ description
+ "Indicates that the mapping has been dynamically resolved
+ using, for example, IPv4 ARP or the IPv6 Neighbor
+ Discovery protocol.";
+ }
+ }
+ description
+ "The origin of a neighbor entry.";
+ }
+
+ /*
+ * Data nodes
+ */
+
+ augment "/if:interfaces/if:interface" {
+ description
+ "IP parameters 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 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.";
+ }
+ }
+
+ leaf origin {
+ type ip-address-origin;
+ config false;
+ description
+ "The origin of this address.";
+ }
+ }
+ list neighbor {
+ key "ip";
+ description
+ "A list of mappings from IPv4 addresses to
+ link-layer addresses.
+ Entries in this list in the intended configuration are
+ used as static entries in the ARP Cache.
+ In the operational state, 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;
+ mandatory true;
+ description
+ "The link-layer address of the neighbor node.";
+ }
+ leaf origin {
+ type neighbor-origin;
+ config false;
+ description
+ "The origin of this neighbor entry.";
+ }
+ }
+ }
+
+ 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 8200: 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;
+ config false;
+ description
+ "The origin of this address.";
+ }
+ leaf status {
+ type enumeration {
+ enum preferred {
+ description
+ "This is a valid address that can appear as the
+ destination or source address of a packet.";
+ }
+ enum deprecated {
+ 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 {
+ description
+ "This isn't a valid address, and it shouldn't appear
+ as the destination or source address of a packet.";
+ }
+
+ enum inaccessible {
+ description
+ "The address is not accessible because the interface
+ to which this address is assigned is not
+ operational.";
+ }
+ enum unknown {
+ description
+ "The status cannot be determined for some reason.";
+ }
+ enum tentative {
+ 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 {
+ description
+ "The address has been determined to be non-unique on
+ the link and so must not be used.";
+ }
+ enum optimistic {
+ description
+ "The address is available for use, subject to
+ restrictions, while its uniqueness on a link is
+ being verified.";
+ }
+ }
+ config false;
+ 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 neighbor {
+ key "ip";
+ description
+ "A list of mappings from IPv6 addresses to
+ link-layer addresses.
+ Entries in this list in the intended configuration are
+ used as static entries in the Neighbor Cache.
+ In the operational state, 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;
+ mandatory true;
+ description
+ "The link-layer address of the neighbor node.
+ In the operational state, if the neighbor's 'state' leaf
+ is 'incomplete', this leaf is not instantiated.";
+ }
+ leaf origin {
+ type neighbor-origin;
+ config false;
+ description
+ "The origin of this neighbor entry.";
+ }
+ leaf is-router {
+ type empty;
+ config false;
+ description
+ "Indicates that the neighbor node acts as a router.";
+ }
+
+ leaf state {
+ type enumeration {
+ enum incomplete {
+ description
+ "Address resolution is in progress, and the
+ link-layer address of the neighbor has not yet been
+ determined.";
+ }
+ enum reachable {
+ description
+ "Roughly speaking, the neighbor is known to have been
+ reachable recently (within tens of seconds ago).";
+ }
+ enum stale {
+ 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 {
+ 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 {
+ description
+ "The neighbor is no longer known to be reachable, and
+ unicast Neighbor Solicitation probes are being sent
+ to verify reachability.";
+ }
+ }
+ config false;
+ description
+ "The Neighbor Unreachability Detection state of this
+ entry.";
+ reference
+ "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+ Section 7.3.2";
+ }
+ }
+
+ 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";
+ }
+ }
+ }
+ }
+
+ /*
+ * Legacy operational state data nodes
+ */
+
+ augment "/if:interfaces-state/if:interface" {
+ status deprecated;
+ description
+ "Data nodes for the operational state of IP on interfaces.";
+
+ container ipv4 {
+ presence
+ "Present if IPv4 is enabled on this interface";
+ config false;
+ status deprecated;
+ description
+ "Interface-specific parameters for the IPv4 address family.";
+
+ leaf forwarding {
+ type boolean;
+ status deprecated;
+ description
+ "Indicates whether IPv4 packet forwarding is enabled or
+ disabled on this interface.";
+ }
+ leaf mtu {
+ type uint16 {
+ range "68..max";
+ }
+ units "octets";
+ status deprecated;
+ 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";
+ status deprecated;
+ description
+ "The list of IPv4 addresses on the interface.";
+
+ leaf ip {
+ type inet:ipv4-address-no-zone;
+ status deprecated;
+ description
+ "The IPv4 address on the interface.";
+ }
+ choice subnet {
+ status deprecated;
+ 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";
+ }
+ status deprecated;
+ description
+ "The length of the subnet prefix.";
+ }
+ leaf netmask {
+ if-feature ipv4-non-contiguous-netmasks;
+ type yang:dotted-quad;
+ status deprecated;
+ description
+ "The subnet specified as a netmask.";
+ }
+ }
+ leaf origin {
+ type ip-address-origin;
+ status deprecated;
+ description
+ "The origin of this address.";
+ }
+ }
+ list neighbor {
+ key "ip";
+ status deprecated;
+ 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;
+ status deprecated;
+ description
+ "The IPv4 address of the neighbor node.";
+ }
+
+ leaf link-layer-address {
+ type yang:phys-address;
+ status deprecated;
+ description
+ "The link-layer address of the neighbor node.";
+ }
+ leaf origin {
+ type neighbor-origin;
+ status deprecated;
+ description
+ "The origin of this neighbor entry.";
+ }
+ }
+ }
+
+ container ipv6 {
+ presence
+ "Present if IPv6 is enabled on this interface";
+ config false;
+ status deprecated;
+ description
+ "Parameters for the IPv6 address family.";
+
+ leaf forwarding {
+ type boolean;
+ default false;
+ status deprecated;
+ 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";
+ status deprecated;
+ description
+ "The size, in octets, of the largest IPv6 packet that the
+ interface will send and receive.";
+ reference
+ "RFC 8200: Internet Protocol, Version 6 (IPv6)
+ Specification
+ Section 5";
+ }
+ list address {
+ key "ip";
+ status deprecated;
+ description
+ "The list of IPv6 addresses on the interface.";
+
+ leaf ip {
+ type inet:ipv6-address-no-zone;
+ status deprecated;
+ description
+ "The IPv6 address on the interface.";
+ }
+ leaf prefix-length {
+ type uint8 {
+ range "0..128";
+ }
+ mandatory true;
+ status deprecated;
+ description
+ "The length of the subnet prefix.";
+ }
+ leaf origin {
+ type ip-address-origin;
+ status deprecated;
+ description
+ "The origin of this address.";
+ }
+ leaf status {
+ type enumeration {
+ enum preferred {
+ description
+ "This is a valid address that can appear as the
+ destination or source address of a packet.";
+ }
+ enum deprecated {
+ 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 {
+ description
+ "This isn't a valid address, and it shouldn't appear
+ as the destination or source address of a packet.";
+ }
+
+ enum inaccessible {
+ description
+ "The address is not accessible because the interface
+ to which this address is assigned is not
+ operational.";
+ }
+ enum unknown {
+ description
+ "The status cannot be determined for some reason.";
+ }
+ enum tentative {
+ 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 {
+ description
+ "The address has been determined to be non-unique on
+ the link and so must not be used.";
+ }
+ enum optimistic {
+ description
+ "The address is available for use, subject to
+ restrictions, while its uniqueness on a link is
+ being verified.";
+ }
+ }
+ status deprecated;
+ 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 neighbor {
+ key "ip";
+ status deprecated;
+ 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;
+ status deprecated;
+ description
+ "The IPv6 address of the neighbor node.";
+ }
+ leaf link-layer-address {
+ type yang:phys-address;
+ status deprecated;
+ description
+ "The link-layer address of the neighbor node.";
+ }
+ leaf origin {
+ type neighbor-origin;
+ status deprecated;
+ description
+ "The origin of this neighbor entry.";
+ }
+ leaf is-router {
+ type empty;
+ status deprecated;
+ description
+ "Indicates that the neighbor node acts as a router.";
+ }
+ leaf state {
+ type enumeration {
+ enum incomplete {
+ description
+ "Address resolution is in progress, and the
+ link-layer address of the neighbor has not yet been
+ determined.";
+ }
+ enum reachable {
+ description
+ "Roughly speaking, the neighbor is known to have been
+ reachable recently (within tens of seconds ago).";
+ }
+ enum stale {
+ 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 {
+ 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 {
+ description
+ "The neighbor is no longer known to be reachable, and
+ unicast Neighbor Solicitation probes are being sent
+ to verify reachability.";
+ }
+ }
+ status deprecated;
+ description
+ "The Neighbor Unreachability Detection state of this
+ entry.";
+ reference
+ "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+ Section 7.3.2";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module ietf-netconf-acm {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm";
+
+ prefix nacm;
+
+ import ietf-yang-types {
+ prefix yang;
+ }
+
+ organization
+ "IETF NETCONF (Network Configuration) Working Group";
+
+ contact
+ "WG Web: <https://datatracker.ietf.org/wg/netconf/>
+ WG List: <mailto:netconf@ietf.org>
+ Author: Andy Bierman
+ <mailto:andy@yumaworks.com>
+ Author: Martin Bjorklund
+ <mailto:mbj@tail-f.com>";
+
+ description
+ "Network Configuration Access Control Model.
+ Copyright (c) 2012 - 2018 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 8341; see
+ the RFC itself for full legal notices.";
+
+ revision "2018-02-14" {
+ description
+ "Added support for YANG 1.1 actions and notifications tied to
+ data nodes. Clarified how NACM extensions can be used by
+ other data models.";
+ reference
+ "RFC 8341: Network Configuration Access Control Model";
+ }
+
+ revision "2012-02-22" {
+ description
+ "Initial version.";
+ reference
+ "RFC 6536: Network Configuration Protocol (NETCONF)
+ Access Control Model";
+ }
+
+ /*
+ * Extension statements
+ */
+
+ extension default-deny-write {
+ description
+ "Used to indicate that the data model node
+ represents a sensitive security system parameter.
+ If present, the NETCONF server will only allow the designated
+ 'recovery session' to have write access to the node. An
+ explicit access control rule is required for all other users.
+ If the NACM module is used, then it must be enabled (i.e.,
+ /nacm/enable-nacm object equals 'true'), or this extension
+ is ignored.
+ The 'default-deny-write' extension MAY appear within a data
+ definition statement. It is ignored otherwise.";
+ }
+
+ extension default-deny-all {
+ description
+ "Used to indicate that the data model node
+ controls a very sensitive security system parameter.
+ If present, the NETCONF server will only allow the designated
+ 'recovery session' to have read, write, or execute access to
+ the node. An explicit access control rule is required for all
+ other users.
+ If the NACM module is used, then it must be enabled (i.e.,
+ /nacm/enable-nacm object equals 'true'), or this extension
+ is ignored.
+ The 'default-deny-all' extension MAY appear within a data
+ definition statement, 'rpc' statement, or 'notification'
+ statement. It is ignored otherwise.";
+ }
+
+ /*
+ * Derived types
+ */
+
+ typedef user-name-type {
+ type string {
+ length "1..max";
+ }
+ description
+ "General-purpose username string.";
+ }
+
+ typedef matchall-string-type {
+ type string {
+ pattern '\*';
+ }
+ description
+ "The string containing a single asterisk '*' is used
+ to conceptually represent all possible values
+ for the particular leaf using this data type.";
+ }
+
+ typedef access-operations-type {
+ type bits {
+ bit create {
+ description
+ "Any protocol operation that creates a
+ new data node.";
+ }
+ bit read {
+ description
+ "Any protocol operation or notification that
+ returns the value of a data node.";
+ }
+ bit update {
+ description
+ "Any protocol operation that alters an existing
+ data node.";
+ }
+ bit delete {
+ description
+ "Any protocol operation that removes a data node.";
+ }
+ bit exec {
+ description
+ "Execution access to the specified protocol operation.";
+ }
+ }
+ description
+ "Access operation.";
+ }
+
+ typedef group-name-type {
+ type string {
+ length "1..max";
+ pattern '[^\*].*';
+ }
+ description
+ "Name of administrative group to which
+ users can be assigned.";
+ }
+
+ typedef action-type {
+ type enumeration {
+ enum permit {
+ description
+ "Requested action is permitted.";
+ }
+ enum deny {
+ description
+ "Requested action is denied.";
+ }
+ }
+ description
+ "Action taken by the server when a particular
+ rule matches.";
+ }
+
+ typedef node-instance-identifier {
+ type yang:xpath1.0;
+ description
+ "Path expression used to represent a special
+ data node, action, or notification instance-identifier
+ string.
+ A node-instance-identifier value is an
+ unrestricted YANG instance-identifier expression.
+ All the same rules as an instance-identifier apply,
+ except that predicates for keys are optional. If a key
+ predicate is missing, then the node-instance-identifier
+ represents all possible server instances for that key.
+ This XML Path Language (XPath) expression is evaluated in the
+ following context:
+ o The set of namespace declarations are those in scope on
+ the leaf element where this type is used.
+ o The set of variable bindings contains one variable,
+ 'USER', which contains the name of the user of the
+ current session.
+ o The function library is the core function library, but
+ note that due to the syntax restrictions of an
+ instance-identifier, no functions are allowed.
+ o The context node is the root node in the data tree.
+ The accessible tree includes actions and notifications tied
+ to data nodes.";
+ }
+
+ /*
+ * Data definition statements
+ */
+
+ container nacm {
+ nacm:default-deny-all;
+
+ description
+ "Parameters for NETCONF access control model.";
+
+ leaf enable-nacm {
+ type boolean;
+ default "true";
+ description
+ "Enables or disables all NETCONF access control
+ enforcement. If 'true', then enforcement
+ is enabled. If 'false', then enforcement
+ is disabled.";
+ }
+
+ leaf read-default {
+ type action-type;
+ default "permit";
+ description
+ "Controls whether read access is granted if
+ no appropriate rule is found for a
+ particular read request.";
+ }
+
+ leaf write-default {
+ type action-type;
+ default "deny";
+ description
+ "Controls whether create, update, or delete access
+ is granted if no appropriate rule is found for a
+ particular write request.";
+ }
+
+ leaf exec-default {
+ type action-type;
+ default "permit";
+ description
+ "Controls whether exec access is granted if no appropriate
+ rule is found for a particular protocol operation request.";
+ }
+
+ leaf enable-external-groups {
+ type boolean;
+ default "true";
+ description
+ "Controls whether the server uses the groups reported by the
+ NETCONF transport layer when it assigns the user to a set of
+ NACM groups. If this leaf has the value 'false', any group
+ names reported by the transport layer are ignored by the
+ server.";
+ }
+
+ leaf denied-operations {
+ type yang:zero-based-counter32;
+ config false;
+ mandatory true;
+ description
+ "Number of times since the server last restarted that a
+ protocol operation request was denied.";
+ }
+
+ leaf denied-data-writes {
+ type yang:zero-based-counter32;
+ config false;
+ mandatory true;
+ description
+ "Number of times since the server last restarted that a
+ protocol operation request to alter
+ a configuration datastore was denied.";
+ }
+
+ leaf denied-notifications {
+ type yang:zero-based-counter32;
+ config false;
+ mandatory true;
+ description
+ "Number of times since the server last restarted that
+ a notification was dropped for a subscription because
+ access to the event type was denied.";
+ }
+
+ container groups {
+ description
+ "NETCONF access control groups.";
+
+ list group {
+ key name;
+
+ description
+ "One NACM group entry. This list will only contain
+ configured entries, not any entries learned from
+ any transport protocols.";
+
+ leaf name {
+ type group-name-type;
+ description
+ "Group name associated with this entry.";
+ }
+
+ leaf-list user-name {
+ type user-name-type;
+ description
+ "Each entry identifies the username of
+ a member of the group associated with
+ this entry.";
+ }
+ }
+ }
+
+ list rule-list {
+ key name;
+ ordered-by user;
+ description
+ "An ordered collection of access control rules.";
+
+ leaf name {
+ type string {
+ length "1..max";
+ }
+ description
+ "Arbitrary name assigned to the rule-list.";
+ }
+ leaf-list group {
+ type union {
+ type matchall-string-type;
+ type group-name-type;
+ }
+ description
+ "List of administrative groups that will be
+ assigned the associated access rights
+ defined by the 'rule' list.
+ The string '*' indicates that all groups apply to the
+ entry.";
+ }
+
+ list rule {
+ key name;
+ ordered-by user;
+ description
+ "One access control rule.
+ Rules are processed in user-defined order until a match is
+ found. A rule matches if 'module-name', 'rule-type', and
+ 'access-operations' match the request. If a rule
+ matches, the 'action' leaf determines whether or not
+ access is granted.";
+
+ leaf name {
+ type string {
+ length "1..max";
+ }
+ description
+ "Arbitrary name assigned to the rule.";
+ }
+
+ leaf module-name {
+ type union {
+ type matchall-string-type;
+ type string;
+ }
+ default "*";
+ description
+ "Name of the module associated with this rule.
+ This leaf matches if it has the value '*' or if the
+ object being accessed is defined in the module with the
+ specified module name.";
+ }
+ choice rule-type {
+ description
+ "This choice matches if all leafs present in the rule
+ match the request. If no leafs are present, the
+ choice matches all requests.";
+ case protocol-operation {
+ leaf rpc-name {
+ type union {
+ type matchall-string-type;
+ type string;
+ }
+ description
+ "This leaf matches if it has the value '*' or if
+ its value equals the requested protocol operation
+ name.";
+ }
+ }
+ case notification {
+ leaf notification-name {
+ type union {
+ type matchall-string-type;
+ type string;
+ }
+ description
+ "This leaf matches if it has the value '*' or if its
+ value equals the requested notification name.";
+ }
+ }
+
+ case data-node {
+ leaf path {
+ type node-instance-identifier;
+ mandatory true;
+ description
+ "Data node instance-identifier associated with the
+ data node, action, or notification controlled by
+ this rule.
+ Configuration data or state data
+ instance-identifiers start with a top-level
+ data node. A complete instance-identifier is
+ required for this type of path value.
+ The special value '/' refers to all possible
+ datastore contents.";
+ }
+ }
+ }
+
+ leaf access-operations {
+ type union {
+ type matchall-string-type;
+ type access-operations-type;
+ }
+ default "*";
+ description
+ "Access operations associated with this rule.
+ This leaf matches if it has the value '*' or if the
+ bit corresponding to the requested operation is set.";
+ }
+
+ leaf action {
+ type action-type;
+ mandatory true;
+ description
+ "The access control action associated with the
+ rule. If a rule has been determined to match a
+ particular request, then this object is used
+ to determine whether to permit or deny the
+ request.";
+ }
+
+ leaf comment {
+ type string;
+ description
+ "A textual description of the access rule.";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module ietf-netconf-monitoring {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";
+ prefix "ncm";
+
+ import ietf-yang-types { prefix yang; }
+ import ietf-inet-types { prefix inet; }
+
+ organization
+ "IETF NETCONF (Network Configuration) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netconf/>
+ WG List: <mailto:netconf@ietf.org>
+ WG Chair: Mehmet Ersue
+ <mailto:mehmet.ersue@nsn.com>
+ WG Chair: Bert Wijnen
+ <mailto:bertietf@bwijnen.net>
+ Editor: Mark Scott
+ <mailto:mark.scott@ericsson.com>
+ Editor: Martin Bjorklund
+ <mailto:mbj@tail-f.com>";
+
+ description
+ "NETCONF Monitoring Module.
+ All elements in this module are read-only.
+ Copyright (c) 2010 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 6022; see
+ the RFC itself for full legal notices.";
+
+ revision 2010-10-04 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6022: YANG Module for NETCONF Monitoring";
+ }
+
+ typedef netconf-datastore-type {
+ type enumeration {
+ enum running;
+ enum candidate;
+ enum startup;
+ }
+ description
+ "Enumeration of possible NETCONF datastore types.";
+ reference
+ "RFC 4741: NETCONF Configuration Protocol";
+ }
+
+ identity transport {
+ description
+ "Base identity for NETCONF transport types.";
+ }
+
+ identity netconf-ssh {
+ base transport;
+ description
+ "NETCONF over Secure Shell (SSH).";
+ reference
+ "RFC 4742: Using the NETCONF Configuration Protocol
+ over Secure SHell (SSH)";
+ }
+
+ identity netconf-soap-over-beep {
+ base transport;
+ description
+ "NETCONF over Simple Object Access Protocol (SOAP) over
+ Blocks Extensible Exchange Protocol (BEEP).";
+
+ reference
+ "RFC 4743: Using NETCONF over the Simple Object
+ Access Protocol (SOAP)";
+ }
+
+ identity netconf-soap-over-https {
+ base transport;
+ description
+ "NETCONF over Simple Object Access Protocol (SOAP)
+ over Hypertext Transfer Protocol Secure (HTTPS).";
+ reference
+ "RFC 4743: Using NETCONF over the Simple Object
+ Access Protocol (SOAP)";
+ }
+
+ identity netconf-beep {
+ base transport;
+ description
+ "NETCONF over Blocks Extensible Exchange Protocol (BEEP).";
+ reference
+ "RFC 4744: Using the NETCONF Protocol over the
+ Blocks Extensible Exchange Protocol (BEEP)";
+ }
+
+ identity netconf-tls {
+ base transport;
+ description
+ "NETCONF over Transport Layer Security (TLS).";
+ reference
+ "RFC 5539: NETCONF over Transport Layer Security (TLS)";
+ }
+
+ identity schema-format {
+ description
+ "Base identity for data model schema languages.";
+ }
+
+ identity xsd {
+ base schema-format;
+ description
+ "W3C XML Schema Definition.";
+ reference
+ "W3C REC REC-xmlschema-1-20041028:
+ XML Schema Part 1: Structures";
+ }
+
+ identity yang {
+ base schema-format;
+ description
+ "The YANG data modeling language for NETCONF.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the
+ Network Configuration Protocol (NETCONF)";
+ }
+
+ identity yin {
+ base schema-format;
+ description
+ "The YIN syntax for YANG.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the
+ Network Configuration Protocol (NETCONF)";
+ }
+
+ identity rng {
+ base schema-format;
+ description
+ "Regular Language for XML Next Generation (RELAX NG).";
+ reference
+ "ISO/IEC 19757-2:2008: RELAX NG";
+ }
+
+ identity rnc {
+ base schema-format;
+ description
+ "Relax NG Compact Syntax";
+ reference
+ "ISO/IEC 19757-2:2008: RELAX NG";
+ }
+
+ grouping common-counters {
+ description
+ "Counters that exist both per session, and also globally,
+ accumulated from all sessions.";
+
+ leaf in-rpcs {
+ type yang:zero-based-counter32;
+ description
+ "Number of correct <rpc> messages received.";
+ }
+ leaf in-bad-rpcs {
+ type yang:zero-based-counter32;
+
+ description
+ "Number of messages received when an <rpc> message was expected,
+ that were not correct <rpc> messages. This includes XML parse
+ errors and errors on the rpc layer.";
+ }
+ leaf out-rpc-errors {
+ type yang:zero-based-counter32;
+ description
+ "Number of <rpc-reply> messages sent that contained an
+ <rpc-error> element.";
+ }
+ leaf out-notifications {
+ type yang:zero-based-counter32;
+ description
+ "Number of <notification> messages sent.";
+ }
+ }
+
+ container netconf-state {
+ config false;
+ description
+ "The netconf-state container is the root of the monitoring
+ data model.";
+
+ container capabilities {
+ description
+ "Contains the list of NETCONF capabilities supported by the
+ server.";
+
+ leaf-list capability {
+ type inet:uri;
+ description
+ "List of NETCONF capabilities supported by the server.";
+ }
+ }
+
+ container datastores {
+ description
+ "Contains the list of NETCONF configuration datastores.";
+
+ list datastore {
+ key name;
+ description
+ "List of NETCONF configuration datastores supported by
+ the NETCONF server and related information.";
+
+ leaf name {
+ type netconf-datastore-type;
+ description
+ "Name of the datastore associated with this list entry.";
+ }
+ container locks {
+ presence
+ "This container is present only if the datastore
+ is locked.";
+ description
+ "The NETCONF <lock> and <partial-lock> operations allow
+ a client to lock specific resources in a datastore. The
+ NETCONF server will prevent changes to the locked
+ resources by all sessions except the one that acquired
+ the lock(s).
+ Monitoring information is provided for each datastore
+ entry including details such as the session that acquired
+ the lock, the type of lock (global or partial) and the
+ list of locked resources. Multiple locks per datastore
+ are supported.";
+
+ grouping lock-info {
+ description
+ "Lock related parameters, common to both global and
+ partial locks.";
+
+ leaf locked-by-session {
+ type uint32;
+ mandatory true;
+ description
+ "The session ID of the session that has locked
+ this resource. Both a global lock and a partial
+ lock MUST contain the NETCONF session-id.
+ If the lock is held by a session that is not managed
+ by the NETCONF server (e.g., a CLI session), a session
+ id of 0 (zero) is reported.";
+ reference
+ "RFC 4741: NETCONF Configuration Protocol";
+ }
+ leaf locked-time {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "The date and time of when the resource was
+ locked.";
+ }
+ }
+
+ choice lock-type {
+ description
+ "Indicates if a global lock or a set of partial locks
+ are set.";
+
+ container global-lock {
+ description
+ "Present if the global lock is set.";
+ uses lock-info;
+ }
+
+ list partial-lock {
+ key lock-id;
+ description
+ "List of partial locks.";
+ reference
+ "RFC 5717: Partial Lock Remote Procedure Call (RPC) for
+ NETCONF";
+
+ leaf lock-id {
+ type uint32;
+ description
+ "This is the lock id returned in the <partial-lock>
+ response.";
+ }
+ uses lock-info;
+ leaf-list select {
+ type yang:xpath1.0;
+ min-elements 1;
+ description
+ "The xpath expression that was used to request
+ the lock. The select expression indicates the
+ original intended scope of the lock.";
+ }
+ leaf-list locked-node {
+ type instance-identifier;
+ description
+ "The list of instance-identifiers (i.e., the
+ locked nodes).
+ The scope of the partial lock is defined by the list
+ of locked nodes.";
+ }
+ }
+ }
+ }
+ }
+ }
+ container schemas {
+ description
+ "Contains the list of data model schemas supported by the
+ server.";
+
+ list schema {
+ key "identifier version format";
+
+ description
+ "List of data model schemas supported by the server.";
+
+ leaf identifier {
+ type string;
+ description
+ "Identifier to uniquely reference the schema. The
+ identifier is used in the <get-schema> operation and may
+ be used for other purposes such as file retrieval.
+ For modeling languages that support or require a data
+ model name (e.g., YANG module name) the identifier MUST
+ match that name. For YANG data models, the identifier is
+ the name of the module or submodule. In other cases, an
+ identifier such as a filename MAY be used instead.";
+ }
+ leaf version {
+ type string;
+ description
+ "Version of the schema supported. Multiple versions MAY be
+ supported simultaneously by a NETCONF server. Each
+ version MUST be reported individually in the schema list,
+ i.e., with same identifier, possibly different location,
+ but different version.
+ For YANG data models, version is the value of the most
+ recent YANG 'revision' statement in the module or
+ submodule, or the empty string if no 'revision' statement
+ is present.";
+ }
+ leaf format {
+ type identityref {
+ base schema-format;
+ }
+ description
+ "The data modeling language the schema is written
+ in (currently xsd, yang, yin, rng, or rnc).
+ For YANG data models, 'yang' format MUST be supported and
+ 'yin' format MAY also be provided.";
+ }
+ leaf namespace {
+ type inet:uri;
+ mandatory true;
+ description
+ "The XML namespace defined by the data model.
+ For YANG data models, this is the module's namespace.
+ If the list entry describes a submodule, this field
+ contains the namespace of the module to which the
+ submodule belongs.";
+ }
+ leaf-list location {
+ type union {
+ type enumeration {
+ enum "NETCONF";
+ }
+ type inet:uri;
+ }
+ description
+ "One or more locations from which the schema can be
+ retrieved. This list SHOULD contain at least one
+ entry per schema.
+ A schema entry may be located on a remote file system
+ (e.g., reference to file system for ftp retrieval) or
+ retrieved directly from a server supporting the
+ <get-schema> operation (denoted by the value 'NETCONF').";
+ }
+ }
+ }
+
+ container sessions {
+ description
+ "The sessions container includes session-specific data for
+ NETCONF management sessions. The session list MUST include
+ all currently active NETCONF sessions.";
+
+ list session {
+ key session-id;
+ description
+ "All NETCONF sessions managed by the NETCONF server
+ MUST be reported in this list.";
+
+ leaf session-id {
+ type uint32 {
+ range "1..max";
+ }
+ description
+ "Unique identifier for the session. This value is the
+ NETCONF session identifier, as defined in RFC 4741.";
+ reference
+ "RFC 4741: NETCONF Configuration Protocol";
+ }
+ leaf transport {
+ type identityref {
+ base transport;
+ }
+ mandatory true;
+ description
+ "Identifies the transport for each session, e.g.,
+ 'netconf-ssh', 'netconf-soap', etc.";
+ }
+ leaf username {
+ type string;
+ mandatory true;
+ description
+ "The username is the client identity that was authenticated
+ by the NETCONF transport protocol. The algorithm used to
+ derive the username is NETCONF transport protocol specific
+ and in addition specific to the authentication mechanism
+ used by the NETCONF transport protocol.";
+ }
+ leaf source-host {
+ type inet:host;
+ description
+ "Host identifier of the NETCONF client. The value
+ returned is implementation specific (e.g., hostname,
+ IPv4 address, IPv6 address)";
+ }
+ leaf login-time {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "Time at the server at which the session was established.";
+ }
+ uses common-counters {
+ description
+ "Per-session counters. Zero based with following reset
+ behaviour:
+ - at start of a session
+ - when max value is reached";
+ }
+ }
+ }
+
+ container statistics {
+ description
+ "Statistical data pertaining to the NETCONF server.";
+
+ leaf netconf-start-time {
+ type yang:date-and-time;
+ description
+ "Date and time at which the management subsystem was
+ started.";
+ }
+ leaf in-bad-hellos {
+ type yang:zero-based-counter32;
+ description
+ "Number of sessions silently dropped because an
+ invalid <hello> message was received. This includes <hello>
+ messages with a 'session-id' attribute, bad namespace, and
+ bad capability declarations.";
+ }
+ leaf in-sessions {
+ type yang:zero-based-counter32;
+ description
+ "Number of sessions started. This counter is incremented
+ when a <hello> message with a <session-id> is sent.
+ 'in-sessions' - 'in-bad-hellos' =
+ 'number of correctly started netconf sessions'";
+ }
+ leaf dropped-sessions {
+ type yang:zero-based-counter32;
+
+ description
+ "Number of sessions that were abnormally terminated, e.g.,
+ due to idle timeout or transport close. This counter is not
+ incremented when a session is properly closed by a
+ <close-session> operation, or killed by a <kill-session>
+ operation.";
+ }
+ uses common-counters {
+ description
+ "Global counters, accumulated from all sessions.
+ Zero based with following reset behaviour:
+ - re-initialization of NETCONF server
+ - when max value is reached";
+ }
+ }
+ }
+
+ rpc get-schema {
+ description
+ "This operation is used to retrieve a schema from the
+ NETCONF server.
+ Positive Response:
+ The NETCONF server returns the requested schema.
+ Negative Response:
+ If requested schema does not exist, the <error-tag> is
+ 'invalid-value'.
+ If more than one schema matches the requested parameters, the
+ <error-tag> is 'operation-failed', and <error-app-tag> is
+ 'data-not-unique'.";
+
+ input {
+ leaf identifier {
+ type string;
+ mandatory true;
+ description
+ "Identifier for the schema list entry.";
+ }
+ leaf version {
+ type string;
+ description
+ "Version of the schema requested. If this parameter is not
+ present, and more than one version of the schema exists on
+ the server, a 'data-not-unique' error is returned, as
+ described above.";
+ }
+ leaf format {
+ type identityref {
+ base schema-format;
+ }
+ description
+ "The data modeling language of the schema. If this
+ parameter is not present, and more than one formats of
+ the schema exists on the server, a 'data-not-unique' error
+ is returned, as described above.";
+ }
+ }
+ output {
+ anyxml data {
+ description
+ "Contains the schema content.";
+ }
+ }
+ }
+}
--- /dev/null
+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.";
+}
+}
--- /dev/null
+module org-openroadm-user-mgmt {
+ namespace "http://org/openroadm/user-mgmt";
+ prefix org-openroadm-user-mgmt;
+
+ organization
+ "Open ROADM MSA";
+ contact
+ "OpenROADM.org";
+ description
+ "YANG definitions of user managements.
+
+ Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
+ AT&T Intellectual Property. All other rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+ * Neither the Members of the Open ROADM MSA Agreement nor the names of its
+ contributors may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA AGREEMENT ''AS IS''
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA AGREEMENT BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE";
+
+ revision 2017-12-15 {
+ description
+ "Version 2.2";
+ }
+ revision 2017-09-29 {
+ description
+ "Version 2.1";
+ }
+ revision 2017-06-26 {
+ description
+ "Version 2.0";
+ }
+ revision 2016-10-14 {
+ description
+ "Version 1.2";
+ }
+
+ typedef username-type {
+ type string {
+ length "3..32";
+ pattern "[a-z][a-z0-9]{2,31}" {
+ error-message
+ "A username must begin with a lowercase letter, The remainder
+ of the string may contain lowercase letters, or numbers 0 through 9.";
+ }
+ }
+ description
+ "The user name string identifying this entry.";
+ }
+
+ typedef password-type {
+ type string {
+ length "8..128";
+ pattern "[a-zA-Z0-9!$%\\^()\\[\\]_\\-~{}.+]*" {
+ error-message "Password content does not meet the requirements";
+ }
+ }
+ description
+ "The password for this entry. This shouldn't be in clear text
+ The Password must contain at least 2 characters from
+ each of the following groups:
+ a) Lower case alphabetic (a-z)
+ b) Upper case alphabetic (A-Z)
+ c) Numeric 0-9
+ d) Special characters Allowed !$%^()[]_-~{}.+
+ Password must not contain Username.";
+ }
+
+ grouping user-profile {
+ list user {
+ key "name";
+ description
+ "The list of local users configured on this device.";
+ leaf name {
+ type username-type;
+ description
+ "The user name string identifying this entry.";
+ }
+ leaf password {
+ type password-type;
+ description
+ "The password for this entry.";
+ }
+ leaf group {
+ type enumeration {
+ enum "sudo";
+ }
+ description
+ "The group to which the user is associated to.";
+ }
+ }
+ }
+
+ rpc chg-password {
+ input {
+ leaf currentPassword {
+ type password-type;
+ mandatory true;
+ description
+ "provide the current password";
+ }
+ leaf newPassword {
+ type password-type;
+ mandatory true;
+ description
+ "provide a new password";
+ }
+ leaf newPasswordConfirm {
+ type password-type;
+ mandatory true;
+ description
+ "re-enter the new password ";
+ }
+ }
+ output {
+ leaf status {
+ type enumeration {
+ enum "Successful" {
+ value 1;
+ }
+ enum "Failed" {
+ value 2;
+ }
+ }
+ mandatory true;
+ description
+ "Successful or Failed";
+ }
+ leaf status-message {
+ type string;
+ description
+ "Gives a more detailed reason for success / failure";
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+module xran-alarm-id {
+ yang-version 1.1;
+ namespace "urn:xran:alarms:1.0";
+ prefix "xran-alarms";
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the alarm identities for the RU.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ typedef alarm-id {
+ type enumeration {
+ enum XRAN_HIGH_TEMP_ALARM {
+ value 1;
+ description "A temperature is higher than expected";
+ }
+ enum XRAN_OVERHEATING_ALARM {
+ value 2;
+ description "A temperature is dangerously high";
+ }
+ enum XRAN_AMBIENT_TEMP_ALARM {
+ value 3;
+ description "A temperature related alarm due to ambient temperature
+ value going outside the allowed ambient temperature range";
+ }
+ enum XRAN_TEMP_TOO_LOW_ALARM {
+ value 4;
+ description "A temperature related alarm due to the temperature inside
+ the unit being too low";
+ }
+ enum XRAN_BROKEN_FAN_ALARM {
+ value 5;
+ description "A broken fan";
+ }
+ enum XRAN_FAN_NOT_DETECTED_ALARM {
+ value 6;
+ description "A fan not detected";
+ }
+ enum XRAN_TUNING_ALARM {
+ value 7;
+ description "A tuning failure.";
+ }
+ enum XRAN_FILTER_ALARM {
+ value 8;
+ description "A faulty filter.";
+ }
+ enum XRAN_TX_QUALITY_ALARM {
+ value 9;
+ description "A transmission quality.";
+ }
+ enum XRAN_OVERVOLTAGE_ALARM {
+ value 10;
+ description "A RF overvoltage protection.";
+ }
+ enum XRAN_CONFIG_ALARM {
+ value 11;
+ description "A configuration failed.";
+ }
+ enum XRAN_CRITICAL_FILE_ALARM {
+ value 12;
+ description "A Critical file not found.";
+ }
+ enum XRAN_FILE_ALARM {
+ value 13;
+ description "A non-critical file not found.";
+ }
+ enum XRAN_CORRUPT_FILE_ALARM {
+ value 14;
+ description "A corrupt configuration file.";
+ }
+ enum XRAN_OPERATION_ALARM {
+ value 15;
+ description "A unit out of order.";
+ }
+ enum XRAN_NO_IDENTITY_ALARM {
+ value 16;
+ description "A unit cannot be identified.";
+ }
+ enum XRAN_NO_EXT_SYNC_SOURCE {
+ value 17;
+ description "An RU has no external sync source.";
+ }
+ enum XRAN_SYNC_ALARM {
+ value 18;
+ description "A unit is out of synchronization.";
+ }
+ enum XRAN_TX_OUT_OF_ORDER_ALARM {
+ value 19;
+ description "A TX path is not usable.";
+ }
+ enum XRAN_RX_OUT_OF_ORDER_ALARM {
+ value 20;
+ description "A RX path is not usable.";
+ }
+ enum XRAN_OPTICAL_BER_ALARM {
+ value 21;
+ description "An increased bit error rate on the optical link";
+ }
+ enum XRAN_SELF_TEST_ALARM {
+ value 22;
+ description "A power-on self test";
+ }
+ enum XRAN_FPGA_UPDATE_ALARM {
+ value 23;
+ description "An FPGA software update";
+ }
+ enum XRAN_UNIT_BLOCKED_ALARM {
+ value 24;
+ description "A unit is blocked";
+ }
+ enum XRAN_RESET_REQUEST_ALARM {
+ value 25;
+ description "A unit requires a reset";
+ }
+ enum XRAN_POWER_SUPPLY_FAULTY {
+ value 26;
+ description "A power supply unit has a fault";
+ }
+ enum XRAN_POWER_AMPLIFIER_FAULTY {
+ value 27;
+ description "A power amplifier unit has a fault";
+ }
+ enum XRAN_C_U_PLANE_LOGICAL_CONNECTION_FAULTY {
+ value 28;
+ description "A C/U-plane logical connection has a fault";
+ }
+ enum XRAN_TRANSCEIVER_FAULT {
+ value 29;
+ description "A transceiver unit has a fault";
+ }
+ enum XRAN_INTERFACE_FAULT {
+ value 30;
+ description "An interface unit has a fault";
+ }
+ }
+ description
+ "A typedef defining an enumerated list of XRAN alarms which corresponds to
+ the fault-id in the xran management plane specification.";
+ }
+}
--- /dev/null
+module xran-ald-port {
+ yang-version 1.1;
+ namespace "urn:xran:ald-port:1.0";
+ prefix "xran-ald-port";
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the input state and output configuration for
+ the xRAN Radio Unit Antenna Line Device capability.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ feature OVERCURRENT-SUPPORTED {
+ description
+ "This feature indicates that the RU supports the over-current notification
+ capability.";
+ }
+
+ container ald-ports-io {
+ description
+ "ALD port information.
+ ALD port of the RU that can be used to connect External Equipment (Antenna Line Devices).
+ Communication uses AISG over HDLC.
+ Physical connection depends on connector type offered by the port (RS-485 or antenna line)
+ Note: Single instance of ALD Port can point to more than one antenna line devices.";
+
+ leaf over-current-supported {
+ type boolean;
+ default false;
+ description
+ "Set to TRUE when the RU supports over curent notifications";
+ }
+
+ list ald-port {
+ key "name";
+ description
+ "Leaf nodes describing ALD Port";
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ description
+ "A name that is unique across the RU that identifies a ald port instance.
+ This name may be used in fault management to refer to a fault source
+ or affected object";
+ }
+
+ leaf port-id {
+ type uint8;
+ config false;
+ mandatory true;
+
+ description
+ "A number which identifies an ALD Port.
+ The number of the Physical ALD port connector in the module.
+ If the module supports 2 ALD Port connectors, use 0 and 1.";
+ }
+
+ leaf dc-control-support{
+ type boolean;
+ config false;
+ mandatory true;
+
+ description
+ "It is shown that on/off in the DC power supply is possible.
+ In case of False, power supply is always on.";
+ }
+
+ leaf dc-enabled{
+ when "./../dc-control-support = 'true'";
+ type boolean;
+
+ description
+ "If dc-control-support is true case, this leaf is effective.
+ In case of true, the power supply is turned on.";
+ }
+
+ leaf supported-connector{
+ type enumeration {
+ enum ANTENNA_CONNECTOR {
+ description
+ "This ald port is related to antenna connector";
+ }
+ enum RS485_PORT {
+ description
+ "This ald port is related to RS485 port";
+ }
+ }
+ config false;
+ mandatory true;
+
+ description
+ "Informs about the connectors of Module which ALDs are connected to.
+ This value is depending on HW design.";
+ }
+ }
+ }
+
+ notification overcurrent-report {
+ if-feature OVERCURRENT-SUPPORTED;
+
+ description
+ "The RU is able to report overcurrent condition about Port.
+ This function is depending on HW design.
+ The notification depend on power consumption which connected ALD devices and module.";
+
+ container overload-condition {
+ description
+ "Container used in notification";
+
+ leaf-list overloaded-ports {
+ type leafref {
+ path "/ald-ports-io/ald-port/name";
+ }
+
+ description
+ "List of overloaded ports";
+ }
+ }
+ }
+}
--- /dev/null
+module xran-ald {
+ yang-version 1.1;
+ namespace "urn:xran:ald:1.0";
+ prefix "xran-ald";
+
+ import xran-ald-port {
+ prefix "ap";
+ }
+
+ organization "xRAN Alliance";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the module for the ald communication.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ // rpc-statements
+ rpc ald-communication {
+ description
+ "Rpc to support communication between lls-CU and Antenna Line Devices";
+
+ input {
+ leaf port-id {
+ type leafref {
+ path "/ap:ald-ports-io/ap:ald-port/ap:port-id";
+ }
+ mandatory true;
+ description
+ "Unique ALD port identifier reported by radio";
+ }
+
+ leaf ald-req-msg {
+ type binary {
+ length "0..1200";
+ }
+
+ description
+ "Response message to be forwarded to ALD in type of binary-string";
+ }
+ }
+
+ output {
+ leaf port-id {
+ type leafref {
+ path "/ap:ald-ports-io/ap:ald-port/ap:port-id";
+ }
+ mandatory true;
+ description
+ "Unique ALD port identifier reported by radio";
+ }
+
+ leaf status {
+ type enumeration {
+ enum ACCEPTED {
+ description
+ "Operation was accepted, message was processed towards ALD and response is provided";
+ }
+ enum REJECTED {
+ description
+ "Operation was rejected by RU";
+ }
+ }
+ mandatory true;
+
+ description
+ "Status of RPC handling seen from RU perspective";
+ }
+
+ leaf error-message {
+ when "../status='REJECTED'";
+ type string;
+
+ description
+ "Detailed error message when the status is rejected. E.g. wrong ALD port identifier was used in RPC received from Netconf Client";
+ }
+
+ leaf ald-resp-msg {
+ type binary {
+ length "0..1200";
+ }
+
+ description
+ "Response message forwarded from ALD in type of binary-string";
+ }
+
+ leaf frames-with-wrong-crc {
+ type uint32;
+
+ description
+ "Number of frames with incorrect CRC (FCS) received from ALD - running counter";
+ }
+
+ leaf frames-without-stop-flag {
+ type uint32;
+
+ description
+ "Number of frames without stop flag received from ALD - running counter";
+ }
+
+ leaf number-of-received-octets {
+ type uint32;
+
+ description
+ "Number of octets received from HDLC bus - running counter";
+ }
+ }
+ }
+}
--- /dev/null
+module xran-beamforming {
+ yang-version 1.1;
+ namespace "urn:xran:beamforming:1.0";
+ prefix "xran-bf";
+
+ import xran-uplane-conf {
+ prefix up;
+ }
+
+ import xran-module-cap {
+ prefix "mcap";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the beamforming capabilitites of an RU.
+ Only RUs that support beamforming shall support this module.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ feature MODIFY-BF-CONFIG {
+ description
+ "This feature indicates that the RU supports an optional feature to
+ modify beamforming configuration information";
+ }
+
+ typedef beam-reference {
+ type leafref {
+ path "/xran-bf:beamforming-config/xran-bf:per-band-config/xran-bf:beam-information/xran-bf:beamforming-properties/xran-bf:beam-id";
+ }
+ description
+ "This type is used by data models that need to reference a beam.";
+ }
+ container beamforming-config {
+ config false;
+ description
+ "A set of configuration data for the RU's beam forming functionality";
+
+ list per-band-config {
+ key band-number;
+ description "beamforming information per band";
+ leaf band-number {
+ type leafref {
+ path "/mcap:module-capability/mcap:band-capabilities/mcap:band-number";
+ }
+ description
+ "band information for the beamforming information
+ related to the band number of module capabilities";
+ }
+
+ leaf-list tx-array {
+ type leafref {
+ path "/up:user-plane-configuration/up:tx-arrays/up:name";
+ }
+ description "tx arrays belonging to this band number";
+ }
+ leaf-list rx-array {
+ type leafref {
+ path "/up:user-plane-configuration/up:rx-arrays/up:name";
+ }
+ description "rx arrays belonging to this band number";
+ }
+ container static-properties {
+ description
+ "the static beamforming related information";
+ leaf beamforming-type {
+ type enumeration {
+ enum COMMON {
+ description "A common beam ID is used for entire band";
+ }
+ enum DIFFERENT {
+ description "Different beam IDs can be assigned for each PRB/RE";
+ }
+ }
+ description
+ "This value indicates supporting beamforming type in RU";
+ }
+
+ leaf number-of-beams {
+ type uint16;
+ description
+ "This value indicates the number of beam patterns RU can generate
+ and apply to the signal of each RU port (both DL and UL).
+ This value is equivalent to the maximum number of used beam IDs.";
+ }
+
+ leaf number-of-polarizations {
+ type uint8;
+ description
+ "This value indicates the number of polarizations supported at RU.";
+ }
+
+ leaf number-of-panels {
+ type uint8;
+ description
+ "This value indicates the number of antenna panels supported at RU.";
+ }
+ }
+
+ container beam-information {
+ description
+ "beam information which relates to the current beamforming configuration";
+ leaf number-of-beamforming-properties {
+ type uint16;
+ description
+ "This parameter indicates the number of beamFormingProperties entries.";
+ }
+
+ list beamforming-properties {
+ key beam-id;
+ description
+ "Array for the beamforming properties at RU.
+ These parameters can be used by the beamforming control by the NETCONF client.
+ 'numberOfBeamformingProperties' indicaets the size of the array.";
+
+
+ leaf beam-id {
+ type uint16;
+ description
+ "This value indicates the beam ID whose beamforming properties are
+ described in the container.";
+ }
+
+ container beamforming-property {
+ description
+ "Structure containing single set of beamforming properties.";
+
+ leaf coarse-fine {
+ type enumeration {
+ enum COARSE-BEAM {
+ description "the beam-id corresponds to a coarse beam";
+ }
+ enum FINE-BEAM {
+ description "the beam-id corresponds to a fine beam";
+ }
+ }
+ description
+ "This value indicates the beam resolution.";
+ }
+
+ leaf beam-groups-id {
+ type uint16;
+ description
+ "Beams with same beamGroupsID can be transmitted simultaneously.";
+ }
+
+ leaf-list coarse-fine-beam-relation {
+ type beam-reference;
+ description
+ "list of related coarse/fine beam.";
+
+ }
+
+ leaf-list neighbor-beam {
+ type beam-reference;
+ description
+ "A list of neighbor beams which might restrict co-scheduling due
+ to interference.";
+ }
+ }
+ }
+ }
+ }
+ container ue-specific-beamforming {
+ presence
+ "Indicates that the RU supports optional Section Type '6' Fields
+ (used for sending channel information for a specific UE";
+ config false;
+ description
+ "Information related to supput by the RU of Section Type 6 for
+ signalling UE-specific channel information to the RU";
+ leaf max-number-of-ues {
+ type uint8;
+ description
+ "Indicates tha maximum number of UE -specific channel information
+ data sets supported by the RU";
+ }
+ }
+ container operational-properties {
+ if-feature MODIFY-BF-CONFIG;
+ description "properties for dynamic beam weight/attribute support";
+
+ leaf number-of-writeable-beamforming-files {
+ type uint8 {
+ range "1 .. max";
+ }
+ mandatory true;
+ description
+ "This leaf indicates the maximum number of writeable beamforming files
+ containing beamweights and/or attributes that the RU can store, taking
+ into account the maximum number of beam-IDs as defined by 3GPP
+ TS38.214 v15.x.x";
+ }
+
+ leaf update-bf-non-delete {
+ type boolean;
+ default false;
+ description
+ "When set to TRUE, indicates that an RU supports the capability
+ to apply the modified beamforming weight information by using rpc
+ activate-beamforming-weight without deletion of tx-array-carriers and
+ rx-array-carriers in advance, i.e., to a deactivated carrier";
+ }
+
+ leaf persistent-bf-files {
+ type boolean;
+ default false;
+ description
+ "When set to TRUE, indicates that the RU supports the capability
+ to store the modified beamforming weight information file in the
+ reset persistent memory";
+ }
+ }
+
+ leaf beamforming-trough-attributes-supported {
+ type boolean;
+ description
+ "Informs if beamforming can be controlled providing attributes to RU
+ (like angles, beamwidth).";
+ }
+
+ leaf beamforming-trough-ue-channel-info-supported {
+ type boolean;
+ description
+ "Informs if beamforming can be controlled by UE information.";
+ }
+ }
+
+ rpc activate-beamforming-config {
+ if-feature MODIFY-BF-CONFIG;
+ description
+ "rpc to activate beamforming config information by indicating the file
+ stored in the folder xRAN/beam-weights in advance";
+ input {
+ leaf beamforming-config-file {
+ type string;
+ mandatory true;
+ description
+ "file name stored in xRAN/beamforming/ folder is indicated";
+ }
+ leaf band-number {
+ type leafref {
+ path "/mcap:module-capability/mcap:band-capabilities/mcap:band-number";
+ }
+ description
+ "The band to which the beam configuration applies";
+ }
+ }
+ output {
+ leaf status {
+ type enumeration {
+ enum ACCEPTED {
+ description "RU has accepted the beamforming weight/attribute file";
+ }
+ enum REJECTED {
+ description
+ "RU has rejected the beamforming weight/attribute file. The RU
+ should then use the default beamforming file.";
+ }
+ }
+ mandatory true;
+ description "Status of activation of beamforming config information";
+ }
+ leaf error-message {
+ when "../status='REJECTED'";
+ type string;
+ description
+ "Detailed error Message when the status is rejected, e.g.,
+ because new beam forming file is attempted to be applied to a
+ carrier which is still active, or the beam-id does not exist.";
+ }
+ }
+ }
+
+ //notification statement
+ notification beamforming-information-update {
+ leaf band-number {
+ type leafref {
+ path "/mcap:module-capability/mcap:band-capabilities/mcap:band-number";
+ }
+ description
+ "The band to which the beamforming information is updated";
+ }
+ description
+ "this notification indicates that the beamforming properties are updated";
+
+ }
+}
--- /dev/null
+module xran-delay-management {
+ yang-version 1.1;
+ namespace "urn:xran:delay:1.0";
+ prefix "xran-delay";
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module covers off aspects of lls-CU to RU delay management,
+ including config data related to RU transmission and reception
+ windows.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ feature ADAPTIVE-RU-PROFILE {
+ description
+ "This feature indicates that the RU supports adaptive RU delay profile
+ based on information provided by the NETCONF client.";
+ }
+
+ container delay-management {
+ description "top level tree covering off lls-CU to RU delay management";
+
+ list bandwidth-scs-delay-state {
+ key "bandwidth subcarrier-spacing";
+ description
+ "Array of structures containing sets of parameters for delay management.";
+
+ leaf bandwidth {
+ type uint32 {
+ range "200 | 1400 | 3000 | 5000 | 10000 | 15000 | 20000 | 25000 |
+ 30000 | 40000 | 50000 | 60000 | 70000 | 80000 | 90000 | 100000
+ | 200000 | 400000" ;
+ }
+ units kilohertz;
+ description
+ "transmission bandwidth configuration in units of kHz -
+ covering NBIoT through to New Radio - see 38.104";
+ }
+ leaf subcarrier-spacing {
+ type uint32 {
+ range "0 .. 240000 ";
+ }
+ units Hertz;
+ description "subcarrier spacing in Hz";
+ }
+
+ container ru-delay-profile {
+ config false;
+ description "container for RU delay parameters";
+ leaf t2a-min-up {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the minimum RU data processing delay between receiving IQ data
+ message over the fronthaul interface and transmitting
+ the corresponding first IQ sample at the antenna";
+ }
+ leaf t2a-max-up {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the earliest allowable time when a data packet is received before
+ the corresponding first IQ sample is transmitted at the antenna";
+ }
+ leaf t2a-min-cp-dl {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the minimum RU data processing delay between receiving downlink
+ real time control plane message over the fronthaul interface and
+ transmitting the corresponding first IQ sample at the antenna";
+ }
+ leaf t2a-max-cp-dl {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the earliest allowable time when a downlink real time control message
+ is received before the corresponding first IQ sample is transmitted at
+ the antenna";
+ }
+ leaf tadv-cp-dl {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the time difference (advance) between the reception window for
+ downlink real time Control messages and reception window for the
+ corresponding IQ data messages.";
+ }
+ leaf ta3-min {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the minimum RU data processing delay between receiving an IQ sample
+ at the antenna and transmitting the last data sample over the
+ fronthaul interface";
+ }
+ leaf ta3-max {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the maximum RU data processing delay between receiving an IQ sample
+ at the antenna and transmitting the first data sample over the
+ fronthaul interface";
+ }
+ leaf t2a-min-cp-ul {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the minimum RU data processing delay between receiving real time
+ up-link control plane message over the fronthaul interface and
+ recieving the first IQ sample at the antenna";
+ }
+ leaf t2a-max-cp-ul {
+ type uint32;
+ units nanoseconds;
+ mandatory true;
+ description
+ "the earliest allowable time when a real time up-link control message
+ is received before the corresponding first IQ sample is received at
+ the antenna";
+ }
+ }
+ }
+
+ container adaptive-delay-configuration {
+ if-feature ADAPTIVE-RU-PROFILE;
+ description "container for adaptive delay parameters";
+ list bandwidth-scs-delay-state {
+ key "bandwidth subcarrier-spacing";
+ description
+ "Array of structures containing sets of parameters for delay management.";
+
+ leaf bandwidth {
+ type uint32 {
+ range "200 | 1400 | 3000 | 5000 | 10000 | 15000 | 20000 | 25000 |
+ 30000 | 40000 | 50000 | 60000 | 70000 | 80000 | 90000 | 100000
+ | 200000 | 400000" ;
+ }
+ units kilohertz;
+ description
+ "transmission bandwidth configuration in units of kHz -
+ covering NBIoT through to New Radio - see 38.104";
+ }
+ leaf subcarrier-spacing {
+ type uint32 {
+ range "0 .. 240000 ";
+ }
+ units Hertz;
+ description "subcarrier spacing in Hz";
+ }
+ container lls-cu-delay-profile {
+ description
+ "lls-CU provided delay profile for adaptive delay configuration";
+ leaf t1a-max-up-lls-cu {
+ type uint32;
+ units nanoseconds;
+ description
+ "the earliest possible time which the lls-CU can support transmiting
+ an IQ data message prior to transmission of the corresponding IQ
+ samples at the antenna";
+ }
+ leaf tx-max-lls-cu {
+ type uint32;
+ units nanoseconds;
+ description
+ "The maximum amount of time which the lls-CU requires to transmit
+ all downlink user plane IQ data message for a symbol";
+ }
+ leaf ta4-max-lls-cu {
+ type uint32;
+ units nanoseconds;
+ description
+ "the latest possible time which the lls-CU can support receiving the
+ last uplink user plane IQ data message for a symbol.";
+ }
+ leaf rx-max-lls-cu {
+ type uint32;
+ units nanoseconds;
+ description
+ "The maximum time difference the lls-CU can support between
+ receiving the first user plane IQ data message for a symbol and
+ receiving the last user plane IQ data message for the same symbol";
+ }
+ }
+ }
+
+ container transport-delay {
+ description
+ "lls-CU provided transport-delay parameters";
+ leaf t12-min {
+ type uint32;
+ units nanoseconds;
+ description
+ "the minimum measured delay between CU port-ID and RU port-ID";
+ }
+ leaf t34-min {
+ type uint32;
+ units nanoseconds;
+ description
+ "the minimum measured delay between RU port-ID and CU port-ID";
+ }
+// additional leaf added by Samsung
+ leaf t12-max {
+ type uint32;
+ units nanoseconds;
+ description
+ "the maximum measured delay between CU port-ID and RU port-ID";
+ }
+// additional leaf added by Samsung
+ leaf t34-max {
+ type uint32;
+ units nanoseconds;
+ description
+ "the maximum measured delay between RU port-ID and CU port-ID";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module xran-dhcp {
+ yang-version 1.1;
+ namespace "urn:xran:dhcp:1.0";
+ prefix "xran-dhcp";
+
+ import ietf-interfaces {
+ prefix "if";
+ }
+
+ import ietf-inet-types {
+ prefix "inet";
+ }
+
+ import ietf-dhcpv6-types {
+ prefix dhcpv6-type;
+ revision-date 2018-01-30;
+ }
+
+ organization "xRAN Alliance";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the YANG definitions for managng the DHCP client on
+ the xRAN Radio Unit.
+
+ Copyright 2018 Members of the xRAN alliance.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ typedef netconf-client-id {
+ type union {
+ type inet:ip-address;
+ type inet:uri;
+ }
+ description "A NETCONF client identifier";
+ }
+
+ grouping netconf-clients {
+ description "the netconf clients discovered using DHCP";
+ list netconf-clients{
+ key client;
+ description "A list of IP addresses or URIs for NETCONF clients";
+ leaf client{
+ type netconf-client-id;
+ description "the client identifier";
+ }
+ leaf optional-port {
+ type inet:port-number;
+ description "an optional (non-default) port";
+ }
+ }
+ }
+
+ grouping dhcpv4-option {
+ description "DHCPv4 Configuration options";
+
+ leaf dhcp-server-identifier {
+ type inet:ip-address;
+ description "DHCP server identifier";
+ }
+ leaf domain-name {
+ type string;
+ description "Name of the domain";
+ }
+ leaf-list domain-name-servers {
+ type inet:ip-address;
+ description "A list of DNS servers";
+ }
+ leaf interface-mtu {
+ type uint32 {
+ range "0..65535";
+ }
+ description "Minimum Transmission Unit (MTU) of the interface";
+ }
+ leaf-list default-gateways{
+ type inet:ip-address;
+ description "the list of default gateways on the RUs subnet";
+ }
+ leaf vendor-specific-option {
+ type string;
+ description "The vendor specific option #43";
+ }
+ uses netconf-clients;
+ }
+
+ grouping dhcpv6-option {
+ description "DHCPv6 Configuration options";
+
+ container dhcp-server-identifier{
+ description "dhcpv6 server identifief";
+ uses dhcpv6-type:duid;
+ }
+ leaf domain-name {
+ type string;
+ description "Name of the domain";
+ }
+ leaf-list domain-name-servers {
+ type inet:ip-address;
+ description "A list of DNS servers";
+ }
+ uses netconf-clients;
+ }
+
+ container dhcp {
+ config false;
+ description
+ "DHCP client configuration";
+
+ list interfaces {
+ key "interface";
+ description "Interface configuration";
+
+ leaf interface {
+ type if:interface-ref;
+ description "Name of the interface";
+ }
+
+ container dhcpv4 {
+ description "DHCPv4 information";
+ leaf client-id {
+ type string;
+ description "DHCP client identifier";
+ }
+ uses dhcpv4-option;
+ }
+ container dhcpv6 {
+ description "DHCPv6 information";
+ container dhcp-client-identifier{
+ description "dhcpv6 client identifief";
+ uses dhcpv6-type:duid;
+ }
+ uses dhcpv6-option;
+ }
+ }
+
+ container m-plane-dhcp {
+ description "leafs covering off DHCP aspects of m-plane operations";
+ leaf private-enterprise-number {
+ type uint16;
+ description "the private eneteprrise number allocated to xRAN";
+ }
+ leaf vendor-class-data {
+ type string;
+ description
+ "The string used in DHCPv4 option 60 or DHCPv4 option 124 and
+ DHCPv6 option 16";
+ }
+ }
+ }
+}
--- /dev/null
+module xran-ecpri-delay {
+ yang-version 1.1;
+ namespace "urn:xran:message5:1.0";
+ prefix "xran-msg5";
+
+ import xran-processing-element {
+ prefix "element";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module is an optional module for supporting eCPRI message 5 handling
+ used for eCPRI based delay measurements.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ container ecpri-delay-message {
+ description "top level tree covering off lls-CU to RU msg5 delay measurement";
+
+ container ru-compensation {
+ config false;
+ description
+ "leafs for ru timing compensation based on message 5 handling";
+ leaf tcv2 {
+ type uint32;
+ units nanoseconds;
+ description
+ "a compensation value to account for expected delay from packet
+ receipt at R2 to timestamping in the RU";
+ }
+ leaf tcv1 {
+ type uint32;
+ units nanoseconds;
+ description
+ "a compensation value to account for expected processing time from
+ timestamping in the RU until actual packet transmission at R3";
+ }
+ }
+
+ leaf enable-message5 {
+ type boolean;
+ default false;
+ description
+ "whether RU's eCPRI message 5 handling is enabled.";
+ }
+
+ container message5-sessions {
+ description "session information for eCPRI message 5";
+
+ list session-parameters {
+ key "session-id";
+ description "list of MSG5 session information";
+ leaf session-id {
+ type uint32;
+ description "Session ID for MSG5 responder";
+ }
+ leaf processing-element-name {
+ type leafref {
+ path "/element:processing-elements/element:ru-elements/element:name";
+ }
+ description "the name of the processing element used for MSG5";
+ }
+ container flow-state {
+ config false;
+ description "MSG5 flow state";
+ leaf responses-transmitted {
+ type uint32;
+ description
+ "The total number of eCPRI mesage 5 response messages transmitted by
+ the RU.";
+ }
+ leaf requests-transmitted {
+ type uint32;
+ description
+ "The total number of eCPRI mesage 5 request messages transmitted by
+ the RU.";
+ }
+ leaf followups-transmitted {
+ type uint32;
+ description
+ "The total number of eCPRI mesage 5 follow up messages transmitted by
+ the RU.";
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module xran-externalio {
+ yang-version 1.1;
+ namespace "urn:xran:external-io:1.0";
+ prefix "xran-io";
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the input state and output configuration for
+ the xRAN Radio Unit external IO.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ container external-io {
+ description
+ "External IO information.";
+ list input {
+ key "name";
+ config false;
+ description
+ "Leaf nodes describing external line inputs";
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ description
+ "A name that is unique across the RU that identifies an input port instance.
+ This name may be used in fault management to refer to a fault source
+ or affected object";
+ }
+ leaf port-in {
+ type uint8;
+ description
+ "A number which identifies an external input port.";
+ }
+
+ leaf line-in {
+ type boolean;
+ default true;
+ description
+ "Value TRUE indicates that circuit is open.
+ Value FALSE indicates that circuit is closed.
+
+ Usually when nothing is connected to the line the value is TRUE.
+ The details of external line-in implementation are HW specific.";
+ }
+ }
+
+ list output {
+ key "name";
+ description
+ "Leaf nodes describing external line outputs";
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ description
+ "A name that is unique across the RU that identifies an output port instance.
+ This name may be used in fault management to refer to a fault source
+ or affected object";
+ }
+ leaf port-out {
+ type uint8;
+ mandatory true;
+ description
+ "A number which identifies an external output port.";
+ }
+
+ leaf line-out {
+ type boolean;
+ default true;
+ description
+ "Value TRUE indicates that circuit is in its natural state.
+ Value FALSE indicates that circuit is not in its natural state.";
+ }
+ }
+ }
+
+ notification external-input-change {
+ description
+ "Notification used to indicate that external line input has changed state";
+ container current-input-notification {
+ description "a container for the state of the input ports";
+ list external-input {
+ key "name";
+ description "a list of the input ports and their state";
+ leaf name{
+ type leafref{
+ path "/external-io/input/name";
+ }
+ description "the name of the ald-port";
+ }
+ leaf io-port {
+ type leafref{
+ path "/external-io/input/port-in";
+ }
+ description "the external input port";
+ }
+ leaf line-in {
+ type leafref{
+ path "/external-io/input/line-in";
+ }
+ description "the state of the external input port";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module xran-fan {
+ yang-version 1.1;
+ namespace "urn:xran:fan:1.0";
+ prefix "xran-fan";
+
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the state of the RU's fans.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ typedef percent {
+ type uint16 {
+ range "0 .. 100";
+ }
+ description "Percentage";
+ }
+
+ container fan-tray {
+ config false;
+ description "top level tree covering off operational state of the fans";
+ list fan-state {
+ key name;
+ description "a list of the fans based on their unique names";
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ description
+ "A name that is unique across the RU that identifies a fan instance.
+ This name may be used in fault management to refer to a fault source
+ or affected object";
+ }
+ leaf fan-location {
+ type uint8;
+ description "A number indicating the location of the FAN in the fan tray";
+ }
+ leaf present-and-operating {
+ type boolean;
+ mandatory true;
+ description
+ "Indicates if a fan is present and operating in the location";
+ }
+ leaf vendor-code {
+ when "../present-and-operating = 'true'";
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "Indicates fan vendor code. Fan vendors are detected with ID pins
+ using 3 bits digital inputs.
+
+ Optional node included when the NETCONF Server has determined
+ the fan vendor code.";
+ }
+ leaf fan-speed {
+ when "../present-and-operating = 'true'";
+ type percent;
+ description
+ "Measured fan speed. Expressed as percentage of max fan speed.
+
+ Optional node included when the fan speed can be measured.";
+ }
+ leaf target-speed {
+ when "../present-and-operating = 'true'";
+ type uint16;
+ units rpm;
+ description "the target speed of the fan";
+ }
+ }
+ }
+}
--- /dev/null
+module xran-file-management {
+ yang-version 1.1;
+ namespace "urn:xran:file-management:1.0";
+ prefix "xran-file-mgmt";
+
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the configuration and operations for handling upload.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ grouping file-path-grouping {
+ description "Complete logical path of the file on the RU to upload/download
+ (no wildcard is allowed) ex : /xRAN/log/syslog.1";
+
+ leaf local-logical-file-path {
+ type string;
+ mandatory true;
+ description "Local logical file path";
+ }
+
+ leaf remote-file-path {
+ type string;
+ mandatory true;
+ description "URI specifying the remote-file-path on lls-CU/NMS.
+ Format:sftp://user[:password]@host[:port]/path";
+ }
+ }
+
+ grouping output-status-grouping {
+ description "Status grouping";
+
+ leaf status {
+ type enumeration {
+ enum SUCCESS {
+ description "";}
+ enum FAILURE {
+ description "";}
+ }
+ description "Operation status";
+ }
+
+ leaf reject-reason {
+ when "../status = 'FAILURE'";
+ type string;
+ description "";
+ }
+ }
+
+ grouping credential-information{
+ description "Type of authentication to use for SFTP upload or download.";
+ choice credentials {
+ case password {
+ container password {
+ presence true;
+ leaf password {
+ type string;
+ mandatory true;
+ description
+ "password needed for authentication.";
+ }
+ description
+ "password authentication method in use";
+ }
+ }
+ case certificate {
+ container certificate {
+ presence true;
+ description
+ "certificate authentication method in use";
+ }
+ }
+ description "";
+ }
+ }
+
+ rpc file-upload {
+ description "File upload over SFTP from RU to NETCONF client";
+ input {
+ uses file-path-grouping;
+ uses credential-information;
+ }
+ output {
+ uses output-status-grouping;
+ }
+ }
+
+ rpc retrieve-file-list {
+ description "List all the files in the logical xRAN unit (* is allowed as wild-card).";
+ input {
+ leaf logical-path {
+ type string;
+ mandatory true;
+ description "xRAN unit of which the files are to be listed.
+ ex : xRAN/log, xRAN/PM, xRAN/transceiver";
+ }
+ leaf file-name-filter {
+ type string;
+ description "Filter which are to be applied on the result list of file names (* is allowed as wild-card).";
+ }
+
+ }
+ output {
+ uses output-status-grouping;
+ leaf-list file-list {
+ when "../status = 'SUCCESS'";
+ type string;
+ description "List of files in the xRAN unit with the filter applied.";
+ }
+ }
+ }
+
+ notification file-upload-notification {
+ uses file-path-grouping;
+ uses output-status-grouping;
+ description "";
+ }
+
+ rpc file-download {
+ description
+ "Management plane triggered to generate the download file of RU.";
+ input {
+ uses file-path-grouping;
+ uses credential-information;
+ }
+ output {
+ uses output-status-grouping;
+ }
+ }
+
+ notification file-download-event {
+ uses file-path-grouping;
+ uses output-status-grouping;
+ description "";
+ }
+}
--- /dev/null
+module xran-fm {
+ yang-version 1.1;
+ namespace "urn:xran:fm:1.0";
+ prefix "xran-fm";
+
+ import ietf-yang-types {
+ prefix yang;
+ revision-date 2013-07-15;
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines alarm reporting mechanism.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ grouping alarm {
+ description
+ "Gropuping which can uniquely identify alarm";
+
+ leaf fault-id {
+ type uint16;
+ mandatory true;
+
+ description
+ "Fault specific Id that identifies the fault.";
+ }
+
+ leaf fault-source {
+ type string {
+ length "1..255";
+ }
+ mandatory true;
+
+ description
+ "Represents the Object or source that is suspected to be faulty.";
+ }
+
+ list affected-objects {
+ key "name";
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ mandatory true;
+
+ description
+ "Represents the Object or source that is suspected to be affected by this fault";
+ }
+ min-elements 1;
+ max-elements 100;
+
+ description
+ "List of affected-objects";
+ }
+
+ leaf fault-severity {
+ type enumeration {
+ enum CRITICAL {
+ description
+ "Critical alarm means that this device is not able to perform any further service";
+ }
+ enum MAJOR {
+ description
+ "Major alarm appeared on the device";
+ }
+ enum MINOR {
+ description
+ "Minor alarm appeared on the device";
+ }
+ enum WARNING {
+ description
+ "Warning is being reported by the device";
+ }
+ }
+ mandatory true;
+
+ description
+ "Fault severity defines the severity level of the fault. A notification, whose fault severity has the value 'warning',
+ is a special type of an alarm notification. For these alarm notifications,
+ the Master Agent does not expect to receive a clear alarm notification.";
+ }
+
+ leaf is-cleared {
+ type boolean;
+ mandatory true;
+
+ description
+ "Fault state determines the type of the event. Not used if faultSeverity is WARNING.";
+ }
+
+ leaf fault-text {
+ type string {
+ length "0..255";
+ }
+
+ description
+ "Textual description of the fault.";
+ }
+
+ leaf event-time {
+ type yang:date-and-time;
+ mandatory true;
+
+ description
+ "Timestamp to indicate the time when the fault is detected/cleared.";
+ }
+ }
+
+ container active-alarm-list {
+ list active-alarms {
+ key "fault-id";
+ uses alarm;
+
+ description
+ "List of currenty active alarms";
+ }
+ config false;
+
+ description
+ "List of currently active alarms. An alarm is removed from this table when the state transitions to clear.";
+ }
+
+ notification alarm-notif {
+ uses alarm;
+
+ description
+ "Notification sent on initial alarm creation, as well as any time the alarm changes state, including clear";
+ }
+}
--- /dev/null
+module xran-hardware {
+ yang-version 1.1;
+ namespace "urn:xran:hardware:1.0";
+ prefix "xran-hw";
+
+ import ietf-hardware {
+ prefix hw;
+ }
+ import iana-hardware {
+ prefix ianahw;
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the YANG definitions for managng the xRAN Radio Unit
+ hardware.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ feature ENERGYSAVING {
+ description
+ "Indicates that the Radio Unit supports energy saving state.";
+ }
+
+ // identity statements
+ identity XRAN-RADIO {
+ base ianahw:module;
+ description
+ "Module used as it represents a self-contained sub-system
+ used in /hw:/hardware/hw:component/hw:class";
+ }
+
+ // typedef statements
+ typedef energysaving-state {
+ type enumeration {
+ enum UNKNOWN {
+ description "The Radio Unit is unable to report energy saving state.";
+ }
+ enum SLEEPING {
+ description
+ "The Radio Unit is in a sleep state. The NETCONF management plane
+ connection is functioning. Other functions and hardware which are
+ not needed for management plane may be in energy saving mode.";
+ }
+ enum AWAKE {
+ description
+ "The Radio Unit is not in an energy saving state.";
+ }
+ }
+ description
+ "new typedef since ietf-hardware only covers pwer-state
+ for redundancy purposes and not power saving operations.";
+ }
+
+ typedef availability-type {
+ type enumeration {
+ enum UNKNOWN {
+ description "The Radio Unit is unable to report its availability state.";
+ }
+ enum NORMAL {
+ description
+ "The RU is functioning correctly.";
+ }
+ enum DEGRADED {
+ description
+ "The RU may be reporting a major alarm or may be reporting a critical
+ alarm that is only impacting one or more subcomponent, but where the
+ RU's implementation permit it to continue operation (server traffic)
+ in a degraded state.
+
+ Used for example, when the RU has M identical sub-components and
+ when a critical alarm is imapcting only N subcomponents, where N<M.";
+ }
+ enum FAULTY {
+ description
+ "The (sub-)components impacted by the critical alarm(s) impact the
+ ability of the RU to continue operation (serve traffic).";
+ }
+ }
+ description
+ "RU’s availability-state is derived by matching active faults
+ and their impact to module’s operation and enables an RU to indicate
+ that even though it may have one or more critical alarms, it can continue
+ to serve traffic.";
+ }
+
+
+
+ augment "/hw:hardware/hw:component" {
+ when "derived-from-or-self(hw:class, 'XRAN-RADIO')";
+ description "New xRAN parameters for xran hardware";
+ container label-content {
+ config false;
+ description
+ "Which set of attributes are printed on the Radio Unit's label";
+ leaf model-name {
+ type boolean;
+ description
+ "indicates whether model-name is included on the RU's label";
+ }
+ leaf serial-number {
+ type boolean;
+ description
+ "indicates whether serial number is included on the RU's label";
+ }
+ // add in other leafs according to manufacturer feedback on labels
+ }
+ leaf product-code {
+ type string;
+ config false;
+ description
+ "xRAN term that is distinct from model-name in ietf-hardware.";
+ }
+ }
+
+ augment "/hw:hardware/hw:component/hw:state" {
+ when "derived-from-or-self(../hw:class, 'XRAN-RADIO')";
+ description
+ "new xRAN defined state";
+ leaf power-state {
+ if-feature "ENERGYSAVING";
+ type energysaving-state;
+ description
+ "The current power saving state for this component.
+ Note - hw:/hardware/compnent/state/standby-state defined in RFC 4268 is
+ used for redundancy purposes and not power saving operations.";
+ }
+ leaf availability-state {
+ type availability-type;
+ config false;
+ description
+ "RU’s availability-state is derived by matching active faults
+ and their impact to module’s operation and enables an RU to indicate
+ that even though it may have one or more critical alarms, it can continue
+ to serve traffic.";
+ }
+ }
+
+ augment "/hw:hardware-state-oper-enabled" {
+ description "new availability state";
+ leaf availability-state {
+ type leafref {
+ path "/hw:hardware/hw:component/hw:state/xran-hw:availability-state";
+ }
+ description
+ "The availability-state of the RU.";
+ }
+ }
+
+ augment "/hw:hardware-state-oper-disabled" {
+ description "new availability state";
+ leaf availability-state {
+ type leafref {
+ path "/hw:hardware/hw:component/hw:state/xran-hw:availability-state";
+ }
+ description
+ "The availability-state of the RU.";
+ }
+ }
+}
--- /dev/null
+module xran-interfaces {
+ yang-version 1.1;
+ namespace "urn:xran:interfaces:1.0";
+ prefix "xran-int";
+
+
+ import ietf-inet-types {
+ prefix "inet";
+ }
+
+ import iana-if-type {
+ prefix "ianaift";
+ }
+
+ import ietf-interfaces {
+ prefix "if";
+ }
+
+ import ietf-ip {
+ prefix "ip";
+ }
+
+ import ietf-hardware {
+ prefix "hw";
+ }
+
+ import ietf-yang-types {
+ prefix "yang";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the YANG definitions for managng the xRAN Radio Unit
+ interfaces.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ identity XRAN-INTERFACE-TYPE {
+ base if:interface-type;
+ description
+ "This identity is used as a base for all interface types
+ defined by xRAN.";
+ }
+
+ identity ALIASMAC-INTERFACE {
+ base XRAN-INTERFACE-TYPE;
+ description
+ "Identity type for alias MAC based CU plane interface,
+ whwere multiple MAC addresses are used on the same Ethernet interface. ";
+ }
+
+ identity ETH-INTERFACE {
+ base XRAN-INTERFACE-TYPE;
+ description
+ "identity type for ethernet plus vlan based CU plane interface. ";
+ }
+
+ identity UDPIP-INTERFACE {
+ base XRAN-INTERFACE-TYPE;
+ description
+ "identity type for UDP/IP based CU plane interface. ";
+ }
+
+ feature UDPIP-BASED-CU-PLANE {
+ description
+ "This feature indicates that the RU supports the UDP/IP based transport
+ for the CU plane.";
+ }
+
+ feature ALIASMAC-BASED-CU-PLANE {
+ description
+ "This feature indicates that the RU supports the alias MAC address
+ based transport for the CU plane.";
+ }
+
+
+ typedef pcp {
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "Priority Code Point. PCP is a 3-bit field that refers to the
+ class of service applied to a VLAN tagged frame. The
+ field specifies a priority value between 0 and 7, these values
+ can be used by quality of service (QoS) to prioritize
+ different classes of traffic.";
+ reference
+ "IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
+ }
+
+ grouping cos-marking {
+ description
+ "Configuration data for CU Plane ethernet CoS marking";
+ leaf u-plane-marking {
+ type pcp;
+ default 7;
+ description "7 represents highest priority for u-plane marking";
+ }
+ leaf c-plane-marking {
+ type pcp;
+ default 7;
+ description "7 represents highest priority for c-plane marking";
+ }
+ leaf m-plane-marking {
+ type pcp;
+ default 2;
+ description "2 represents highest excellent effort for m-plane marking";
+ }
+ leaf s-plane-marking {
+ type pcp;
+ default 7;
+ description "7 represents highest priority for s-plane marking";
+ }
+ leaf other-marking {
+ type pcp;
+ default 1;
+ description "1 represents best effort for other marking";
+ }
+ }
+
+ grouping xran-dscp-marking {
+ description
+ "Configuration data for CU Plane DSCP CoS marking";
+ leaf u-plane-marking {
+ type inet:dscp;
+ default 46;
+ description "46 represents expedited forwarding";
+ }
+ leaf c-plane-marking {
+ type inet:dscp;
+ default 46;
+ description "46 represents expedited forwarding";
+ }
+ leaf m-plane-marking {
+ type inet:dscp;
+ default 18;
+ description "18 represents AF21 or 'immediate traffic'";
+ }
+ leaf s-plane-marking {
+ type inet:dscp;
+ default 46;
+ description "46 represents expedited forwarding";
+ }
+ leaf other-marking {
+ type inet:dscp;
+ default 0;
+ description "0 represents best effort forwarding";
+ }
+ }
+
+
+ augment '/if:interfaces/if:interface' {
+ when "derived-from-or-self(if:type, 'xran-int:XRAN-INTERFACE-TYPE')";
+ description
+ "Applicable for xran interfaces which use references to a port
+ component.";
+
+ container port-reference {
+ description
+ "a port reference used by other xRAN modules";
+ leaf xran-port-name {
+ type leafref {
+ path '/hw:hardware/hw:component/hw:name';
+ }
+ description
+ "xRAN interfaces use a reference to a physical port component";
+ }
+ leaf xran-port-number {
+ type uint8;
+ description
+ "A number allocated by the server which identifies a port.
+ Port number value is 0 to N-1 where N is number of ports
+ in the device.
+
+ This value is fixed for the lifetime of the RU, i.e., cannot be
+ changed suring RU reboots.";
+ }
+ }
+ leaf last-cleared {
+ type yang:date-and-time;
+ config false;
+ description
+ "Timestamp of the last time the interface counters were
+ cleared.";
+ }
+ }
+
+ // Augmentation for lower layer definition
+
+ augment '/if:interfaces/if:interface' {
+ when "derived-from-or-self(if:type, 'xran-int:XRAN-INTERFACE-TYPE') and
+ not(if:lower-layer-if)" {
+ description
+ "Data specific for an xRAN bottom level interface, i.e.,
+ use relative path to check the current interface does not have any
+ lower-layer-if defined";
+ }
+ description
+ "Augments interfaces/interface with xRAN information .";
+ container physical-int {
+ description "container for physical interface";
+ leaf maximum-speed {
+ type enumeration {
+ enum 1000BASE {
+ description "1GbE";
+ }
+ enum 2.5GBASE {
+ description "2.5GbE";
+ }
+ enum 5GBASE{
+ description "5GbE";
+ }
+ enum 10GBASE{
+ description "10GbE";
+ }
+ enum 25GBASE{
+ description "25GbE";
+ }
+ enum 40GBASE{
+ description "40GbE";
+ }
+ enum 50GBASE{
+ description "50GbE";
+ }
+ enum 100GBASE{
+ description "100GbE";
+ }
+ }
+ config false;
+ description "maximum speed of physical interface";
+ }
+ leaf cable-type {
+ type enumeration {
+ enum TWISTED-PAIR{
+ description "twisted pair";
+ }
+ enum FIBER-OPTIC{
+ description "fiber optic";
+ }
+ }
+ config false;
+ description "type of cable";
+ }
+ }
+ }
+
+// Augmentation for basic Ethernet leafs
+
+ augment "/if:interfaces/if:interface" {
+ when "derived-from-or-self(if:type, 'ianaift:ethernetCsmacd') or
+ derived-from-or-self(if:type, 'ianaift:l2vlan')" {
+ description "Applies to Ethernet interfaces";
+ }
+ description
+ "Augment the interface model with parameters for all
+ Ethernet-like interfaces
+
+ Contains parameters for interfaces that use Ethernet framing
+ and expose an Ethernet MAC layer";
+ leaf l2-mtu {
+ type uint16 {
+ range "64 .. 65535";
+ }
+ units bytes;
+ default 1500;
+ description
+ "The maximum size of layer 2 frames that may be transmitted
+ or received on the interface (excluding any FCS overhead).
+ For Ethernet interfaces it also excludes the
+ 4-8 byte overhead of any known (i.e. explicitly matched by
+ a child sub-interface) 801.1Q VLAN tags.";
+ }
+ leaf mac-address {
+ type yang:mac-address;
+ description
+ "The MAC address of the interface.";
+ }
+ leaf bia-mac-address {
+ type yang:mac-address;
+ config false;
+ description
+ "The 'burnt-in' MAC address. I.e the default MAC address
+ assigned to the interface if no MAC address has been
+ explicitly configured on it.";
+ }
+ leaf-list alias-macs {
+ when "derived-from-or-self(../if:type, 'xran-int:ALIASMAC-INTERFACE')";
+ if-feature ALIASMAC-BASED-CU-PLANE;
+ type yang:mac-address;
+ config false;
+ description
+ "Augments interfaces with range of alias MAC addresses.";
+ }
+ leaf vlan-tagging {
+ type boolean;
+ default true;
+ description
+ "Indicates if VLAN tagging is used.
+ Default true is used to enable an RU to auonomously discover that it is
+ connected to a trunk port.";
+ }
+ uses cos-marking;
+ }
+
+// augmentation for VLAN definition
+
+ augment "/if:interfaces/if:interface" {
+ when "derived-from-or-self (if:type, 'ianaift:l2vlan')";
+ description "augments for VLAN definition";
+ leaf base-interface {
+ type if:interface-ref;
+ must "/if:interfaces/if:interface[if:name = current()]"
+ + "/xran-int:vlan-tagging = 'true'" {
+ description
+ "The base interface must have VLAN tagging enabled.";
+ }
+ description
+ "The base interface for the VLAN sub-interafce.";
+ }
+ leaf vlan-id {
+ type uint16 {
+ range "1..4094";
+ }
+ description
+ "The VLAN-ID.";
+ }
+ }
+
+ // Augmention to ietf-ip covering DSCP
+
+ augment "/if:interfaces/if:interface/ip:ipv4" {
+ when "derived-from-or-self(../if:type, 'xran-int:UDPIP-INTERFACE')";
+ if-feature UDPIP-BASED-CU-PLANE;
+ description "augments for IPv4 based transport";
+ uses xran-dscp-marking;
+ }
+ augment "/if:interfaces/if:interface/ip:ipv6" {
+ when "derived-from-or-self(../if:type, 'xran-int:UDPIP-INTERFACE')";
+ if-feature UDPIP-BASED-CU-PLANE;
+ description "augments for IPv6 based transport";
+ uses xran-dscp-marking;
+ }
+
+ rpc reset-interface-counters {
+ description
+ "Management plane triggered restart of the interface counters.";
+ }
+}
--- /dev/null
+module xran-lbm {\r
+ yang-version 1.1;\r
+ namespace "urn:xran:lbm:1.0";\r
+ prefix "xran-lbm";\r
+\r
+ import ietf-yang-types {\r
+ prefix yang;\r
+ revision-date 2013-07-15;\r
+ }\r
+\r
+ organization "xRAN Forum";\r
+\r
+ contact\r
+ "www.xran.org";\r
+\r
+ description\r
+ "This module defines the module capabilities for\r
+ the xRAN Radio loop-back protocol (IEEE 802.1ag).\r
+ It is derived from MEF-38 (Service OAM Fault Management YANG Modules, April 2012)\r
+\r
+ Copyright 2018 the xRAN Forum.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ POSSIBILITY OF SUCH DAMAGE.\r
+\r
+ Redistribution and use in source and binary forms, with or without\r
+ modification, are permitted provided that the following conditions are met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice,\r
+ this list of conditions and the above disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice,\r
+ this list of conditions and the above disclaimer in the documentation\r
+ and/or other materials provided with the distribution.\r
+ * Neither the Members of the xRAN Forum nor the names of its\r
+ contributors may be used to endorse or promote products derived from\r
+ this software without specific prior written permission.";\r
+\r
+ revision "2018-07-20" {\r
+ description\r
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.\r
+\r
+ This version of the model supports v01.00 of the corrsponding xRAN\r
+ M-Plane Specification.";\r
+ reference "XRAN-FH.MP.0-v01.00";\r
+ }\r
+\r
+ typedef priority-type {\r
+ type uint32 {\r
+ range "0..7";\r
+ }\r
+ description\r
+ "A 3 bit priority value to be used in the VLAN tag, if present\r
+ in the transmitted frame.";\r
+ reference "[802.1q] 12.14.7.3.2:e";\r
+ }\r
+\r
+\r
+ typedef mep-id-type {\r
+ type uint16 {\r
+ range "1..8191";\r
+ }\r
+ description\r
+ "Maintenance association End Point Identifier (MEPID): A small integer,\r
+ unique over a given Maintenance Association, identifying a\r
+ specific MEP.";\r
+ reference "[802.1q] 3.19 and 19.2.1";\r
+ }\r
+ typedef vlan-id-type {\r
+ type uint16 {\r
+ range "1..4094";\r
+ }\r
+ description\r
+ "The VLAN-ID that uniquely identifies a VLAN. This is the 12-bit VLAN-ID\r
+ used in the VLAN Tag header.";\r
+ reference "[802.1q] 9.6";\r
+ }\r
+\r
+ typedef md-level-type {\r
+ type int32 {\r
+ range "0..7";\r
+ }\r
+ description\r
+ "Maintenance Domain Level (MD Level) identifier. Higher numbers\r
+ correspond to higher Maintenance Domains, those with the greatest\r
+ physical reach, with the highest values for customers' CFM PDUs.\r
+ Lower numbers correspond to lower Maintenance Domains, those with\r
+ more limited physical reach, with the lowest values for CFM PDUs\r
+ protecting single bridges or physical links.";\r
+ reference "[802.1q] 18.3, 21.4.1, IEEE8021-CFM-MIB.Dot1agCfmMDLevel";\r
+ }\r
+\r
+ typedef lbm-transaction-id-type {\r
+ type uint32;\r
+ description\r
+ "A loopback transaction identifier";\r
+ reference "[802.1q] 21.7.3";\r
+ }\r
+\r
+ list maintenance-domain {\r
+ key "id";\r
+ description\r
+ "A Maintenance Domain managed object is required in order to create an MA\r
+ with a MAID that includes that Maintenance Domain’s Name. From\r
+ this Maintenance Domain managed object, all Maintenance\r
+ Association managed objects associated with that Maintenance\r
+ Domain managed object can be accessed, and thus controlled.";\r
+ reference "[802.1q] 12.14.5";\r
+ leaf id {\r
+ type string;\r
+ description\r
+ "A unique identifier of a Maintenance Domain";\r
+ reference "[802.1q] 12.14.5";\r
+ }\r
+\r
+ leaf name {\r
+ type string;\r
+ description\r
+ "The value for the Maintenance Domain Name. Only the name-type\r
+ 'character-string' is supported";\r
+ reference "[802.1q] 21.6.5.1 (Table 21-19), 12.14.5.3.2:a";\r
+ }\r
+\r
+ leaf md-level {\r
+ type md-level-type;\r
+ default 0;\r
+ description\r
+ "Integer identifying the Maintenance Domain Level (MD Level). Higher\r
+ numbers correspond to higher Maintenance Domains, those with the\r
+ greatest physical reach, with the highest values for customers'\r
+ CFM PDUs. Lower numbers correspond to lower Maintenance\r
+ Domains, those with more limited physical reach, with the lowest\r
+ values for CFM PDUs protecting single bridges or physical links.";\r
+ reference "[802.1q] 12.14.5.1.3:b";\r
+ }\r
+\r
+ list maintenance-association {\r
+ key "id";\r
+ description\r
+ "This list represents Maintenance Entity Groups (Y.1731) or\r
+ Maintenance Associations (802.1ag). MEGs/MAs are sets of\r
+ MEPs, each configured to the same service inside a common\r
+ OAM domain.";\r
+ leaf id {\r
+ type string;\r
+ description\r
+ "A unique identifier of a Maintenance Association";\r
+ reference "[802.1q] 12.14.6";\r
+ }\r
+ leaf name {\r
+ type string;\r
+\r
+ description\r
+ "The value for the Maintenance Association Name. Only the name-type\r
+ 'character-string' is supported";\r
+ reference "[802.1q] 12.14.5.3.2:b, Table 21-20";\r
+ }\r
+\r
+ list component-list {\r
+ key "component-id";\r
+ description\r
+ "A list of components each of which can be managed in a manner\r
+ essentially equivalent to an 802.1Q bridge.";\r
+ reference "[802.1q] IEEE8021-CFM-V2-MIB.ieee8021CfmMaCompTable";\r
+ leaf component-id {\r
+ type uint32;\r
+ description\r
+ "The bridge component within the system to which the information\r
+ in this maintenance-association applies";\r
+ reference "[802.1q] IEEE8021-CFM-V2-MIB.ieee8021CfmMaComponentId";\r
+ }\r
+ leaf name {\r
+ type string;\r
+\r
+ description\r
+ "The value for the Maintenance Association Name. Only the name-type\r
+ 'character-string' is supported";\r
+ reference "[802.1q] 12.14.5.3.2:b, Table 21-20";\r
+ }\r
+\r
+ leaf-list vid {\r
+ type vlan-id-type;\r
+ min-elements 1;\r
+ ordered-by user;\r
+ description\r
+ "The VID(s) monitored by this MA, or 0, if the MA is not attached to any\r
+ VID. The first VID returned is the MA's Primary VID";\r
+ reference "[802.1q] 12.14.5.3.2:b";\r
+ }\r
+\r
+ leaf-list remote-meps {\r
+ type mep-id-type;\r
+ description\r
+ "A list of the MEPIDs of the MEPs in the MA.";\r
+ reference "[802.1q] 12.14.6.1.3:g";\r
+ }\r
+ list maintenance-association-end-point {\r
+ key "mep-identifier";\r
+ description\r
+ "The list of Maintenance association End Points in a specific Maintance\r
+ Association.";\r
+ leaf mep-identifier {\r
+ type mep-id-type;\r
+ description\r
+ "Integer that is unique among all the MEPs in the same MA. Other\r
+ definition is: a small integer, unique over a given\r
+ Maintenance Association, identifying a specific Maintenance\r
+ association End Point.";\r
+ reference "[802.1q] 12.14.6.3.2:b";\r
+ }\r
+ leaf interface {\r
+ type string;\r
+ mandatory true;\r
+ description\r
+ "An interface, either a Bridge Port or an aggregated IEEE 802.3 port\r
+ within a Bridge Port, to which the MEP is attached. Each interface in\r
+ the system is uniquely identified by an interface-name. The structure\r
+ and content of the name is outside the scope of this specification.";\r
+ reference "[802.1q] 12.14.7.1.3:b";\r
+ }\r
+ leaf primary-vid {\r
+ type vlan-id-type;\r
+ mandatory true;\r
+ description\r
+ "The Primary VID of the MEP. The value 0 indicates that either the\r
+ Primary VID is that of the MEP's MA or that the MEP's MA is\r
+ associated with no VID";\r
+ reference "[802.1q] 12.14.7.1.3:d";\r
+ }\r
+ leaf administrative-state {\r
+ type boolean;\r
+ mandatory true;\r
+ description\r
+ "The administrative state of the MEP";\r
+ reference "[802.1q] 12.14.7.1.3:e";\r
+ }\r
+ leaf mac-address {\r
+ type yang:mac-address;\r
+ config false;\r
+ description\r
+ "The MAC address of the MEP";\r
+ reference "[802.1q] 12.14.7.1.3:i";\r
+ }\r
+ container loopback {\r
+ config false;\r
+ description\r
+ "Data definitions related to the Loopback function.";\r
+ leaf replies-transmitted {\r
+ type yang:counter32;\r
+ config false;\r
+ mandatory true;\r
+ description\r
+ "The total number of LBRs transmitted.";\r
+ reference "[802.1q] 12.14.7.1.3:ad";\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r
--- /dev/null
+module xran-module-cap {
+ yang-version 1.1;
+ namespace "urn:xran:module-cap:1.0";
+ prefix "xran-module-cap";
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the module capabilities for
+ the xRAN Radio Unit.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ grouping compression-method-grouping {
+ description
+ "Grouping for compression method.";
+
+ leaf compression-method {
+ type enumeration {
+ enum BLOCK_FLOATING_POINT {
+ description
+ "Block floating point compression and decompression will be used";
+ }
+
+ enum BLOCK_SCALING {
+ description
+ "Block scaling compression and decompresion will be used";
+ }
+
+ enum U_LAW {
+ description
+ "u-Law compression and decompresion method will be used";
+ }
+
+ enum BEAMSPACE {
+ description
+ "Beamspace compression and decompression will be used";
+ }
+
+ enum MODULATION {
+ description
+ "Modulation compression and decompression will be used";
+ }
+ }
+ description
+ "Compresion method which can be supported by the RU";
+ }
+ }
+
+ container module-capability {
+ config false;
+ description
+ "module capability object responsible for providing module capability.";
+
+ container ru-capabilities {
+ description
+ "Structure representing set of capabilities.";
+
+ leaf ru-supported-category {
+ type enumeration {
+ enum CAT_A {
+ description
+ "Informs that precoding is supported in lls-CU";
+ }
+ enum CAT_B {
+ description
+ "Informs that precoding is supported in RU";
+ }
+ }
+
+ description
+ "Informs about which category RU supports";
+ }
+
+ leaf number-of-ru-ports {
+ type uint8;
+ description
+ "This value indicates the maximum number of simultaneous beams per RU.
+ This value is derived by the products of “numberOfPolarizations” and “numberOfPanels”
+ and “the maximum number of simultaneous beams per sub-carrier”.";
+ }
+
+ leaf number-of-antenna-ports {
+ type uint8;
+ description
+ "This value indicates the number of antenna ports supported at RU.
+ This parameter is used by the precoding control between lls-CU and UE.
+ This value conforms to 3GPP TS38.214, Section 5.2. Value 0 means “unused”.";
+ }
+
+ leaf max-power-per-pa-antenna {
+ type decimal64{
+ fraction-digits 4;
+ }
+ description
+ "This value indicates Maximum Power per PA per antenna. Value unit is dBm.";
+ }
+
+ leaf min-power-per-pa-antenna {
+ type decimal64{
+ fraction-digits 4;
+ }
+ description
+ "This value indicates Minimum Power per PA per antenna. Value unit is dBm.";
+ }
+
+ leaf fronthaul-split-option {
+ type uint8 {
+ range "7";
+ }
+ description
+ "This value indicates the Fronthaul Split Option, i.e., 2 or 7 in this release.";
+ }
+
+ container format-of-iq-sample {
+ description
+ "Indicates module capabilities about IQ samples";
+
+ leaf dynamic-compression-supported {
+ type boolean;
+
+ description
+ "Informs if radio supports dynamic compression method";
+ }
+
+ leaf-list supported-bitwidths {
+ type uint8 {
+ range "1..16";
+ }
+
+ description
+ "List of supported bitwidths";
+ }
+
+ leaf realtime-variable-bit-width-supported {
+ type boolean;
+
+ description
+ "Informs if RU supports realtime variable bit with";
+ }
+
+ list compression-method-supported {
+ uses compression-method-grouping;
+ key "compression-method";
+ description
+ "List of supported compression methods by RU";
+ }
+
+ leaf variable-bit-width-per-channel-supported {
+ when "/module-capability/ru-capabilities/format-of-iq-sample/realtime-variable-bit-width-supported = 'true'";
+ type boolean;
+
+ description
+ "Informs if variable bit width per channel is supported or not";
+ }
+
+ leaf syminc-supported {
+ type boolean;
+
+ description
+ "Informs if symbol number increment command in a C-Plane is
+ supported or not";
+ }
+ }
+
+ list ul-mixed-num-required-guard-rbs {
+ key "scs-a scs-b";
+ description
+ "Required number of guard resource blocks for the combination of
+ subcarrier spacing values for uplink";
+ leaf scs-a{
+ type enumeration {
+ enum KHZ_15 {
+ value 0;
+ description
+ "15kHz sub carrier spacing";
+ }
+ enum KHZ_30 {
+ value 1;
+ description
+ "30kHz sub carrier spacing";
+ }
+ enum KHZ_60 {
+ value 2;
+ description
+ "60kHz sub carrier spacing";
+ }
+ enum KHZ_120 {
+ value 3;
+ description
+ "120kHz sub carrier spacing";
+ }
+ enum KHZ_240 {
+ value 4;
+ description
+ "240kHz sub carrier spacing";
+ }
+ enum KHZ_1_25 {
+ value 12;
+ description
+ "1,25kHz sub carrier spacing";
+ }
+ enum KHZ_5 {
+ value 14;
+ description
+ "5kHz sub carrier spacing";
+ }
+ }
+ description
+ "Sub-carrier spacing configuration";
+ }
+ leaf scs-b{
+ type enumeration {
+ enum KHZ_15 {
+ value 0;
+ description
+ "15kHz sub carrier spacing";
+ }
+ enum KHZ_30 {
+ value 1;
+ description
+ "30kHz sub carrier spacing";
+ }
+ enum KHZ_60 {
+ value 2;
+ description
+ "60kHz sub carrier spacing";
+ }
+ enum KHZ_120 {
+ value 3;
+ description
+ "120kHz sub carrier spacing";
+ }
+ enum KHZ_240 {
+ value 4;
+ description
+ "240kHz sub carrier spacing";
+ }
+ enum KHZ_1_25 {
+ value 12;
+ description
+ "1,25kHz sub carrier spacing";
+ }
+ enum KHZ_5 {
+ value 14;
+ description
+ "5kHz sub carrier spacing";
+ }
+ }
+ description
+ "Sub-carrier spacing configuration";
+ }
+ leaf number-of-guard-rbs-ul{
+ type uint8;
+ description
+ "This value indicates the required number of guard resource blocks
+ between the mixed numerologies, the RB using scs-a and the RB
+ using scs-b. It's number is based on scs-a";
+ }
+ }
+ list dl-mixed-num-required-guard-rbs {
+ key "scs-a scs-b";
+ description
+ "Required number of guard resource blocks for the combination of
+ subcarrier spacing values for downlink";
+ leaf scs-a{
+ type enumeration {
+ enum KHZ_15 {
+ value 0;
+ description
+ "15kHz sub carrier spacing";
+ }
+ enum KHZ_30 {
+ value 1;
+ description
+ "30kHz sub carrier spacing";
+ }
+ enum KHZ_60 {
+ value 2;
+ description
+ "60kHz sub carrier spacing";
+ }
+ enum KHZ_120 {
+ value 3;
+ description
+ "120kHz sub carrier spacing";
+ }
+ enum KHZ_240 {
+ value 4;
+ description
+ "240kHz sub carrier spacing";
+ }
+ enum KHZ_1_25 {
+ value 12;
+ description
+ "1,25kHz sub carrier spacing";
+ }
+ enum KHZ_5 {
+ value 14;
+ description
+ "5kHz sub carrier spacing";
+ }
+ }
+ description
+ "Sub-carrier spacing configuration";
+ }
+ leaf scs-b{
+ type enumeration {
+ enum KHZ_15 {
+ value 0;
+ description
+ "15kHz sub carrier spacing";
+ }
+ enum KHZ_30 {
+ value 1;
+ description
+ "30kHz sub carrier spacing";
+ }
+ enum KHZ_60 {
+ value 2;
+ description
+ "60kHz sub carrier spacing";
+ }
+ enum KHZ_120 {
+ value 3;
+ description
+ "120kHz sub carrier spacing";
+ }
+ enum KHZ_240 {
+ value 4;
+ description
+ "240kHz sub carrier spacing";
+ }
+ enum KHZ_1_25 {
+ value 12;
+ description
+ "1,25kHz sub carrier spacing";
+ }
+ enum KHZ_5 {
+ value 14;
+ description
+ "5kHz sub carrier spacing";
+ }
+ }
+ description
+ "Sub-carrier spacing configuration";
+ }
+ leaf number-of-guard-rbs-dl{
+ type uint8;
+ description
+ "This value indicates the required number of guard resource blocks
+ between the mixed numerologies, the RB using scs-a and the RB
+ using scs-b. It's number is based on scs-a";
+ }
+ }
+ }
+ list band-capabilities {
+ key band-number;
+ description
+ "Capabilities that are needed to be defined per each band";
+
+ leaf band-number {
+ type uint16;
+ description
+ "Band number";
+ }
+
+ leaf max-supported-frequency-dl {
+ type uint64;
+ description
+ "This value indicates Maximum supported downlink frequency. Value unit is Hz.";
+ }
+
+ leaf min-supported-frequency-dl {
+ type uint64;
+ description
+ "This value indicates Minimum supported downlink frequency. Value unit is Hz.";
+ }
+
+ leaf max-supported-bandwidth-dl {
+ type uint64;
+ description
+ "This value indicates Maximum total downlink bandwidth in module. Value unit is Hz.";
+ }
+
+ leaf max-num-carriers-dl {
+ type uint32;
+ description
+ "This value indicates Maximum number of downlink carriers in module.";
+ }
+
+ leaf max-carrier-bandwidth-dl {
+ type uint64;
+ description
+ "This value indicates Maximum bandwidth per downlink carrier. Value unit is Hz.";
+ }
+
+ leaf min-carrier-bandwidth-dl {
+ type uint64;
+ description
+ "This value indicates Minimum bandwidth per downlink carrier. Value unit is Hz.";
+ }
+
+ leaf max-supported-frequency-ul {
+ type uint64;
+ description
+ "This value indicates Maximum supported uplink frequency. Value unit is Hz.";
+ }
+
+ leaf min-supported-frequency-ul {
+ type uint64;
+ description
+ "This value indicates Minimum supported uplink frequency. Value unit is Hz.";
+ }
+
+ leaf max-supported-bandwidth-ul {
+ type uint64;
+ description
+ "This value indicates Maximum total uplink bandwidth in module. Value unit is Hz.";
+ }
+
+ leaf max-num-carriers-ul {
+ type uint32;
+ description
+ "This value indicates Maximum number of uplink carriers in module.";
+ }
+
+ leaf max-carrier-bandwidth-ul {
+ type uint64;
+ description
+ "This value indicates Maximum bandwidth per uplink carrier. Value unit is Hz.";
+ }
+
+ leaf min-carrier-bandwidth-ul {
+ type uint64;
+ description
+ "This value indicates Minimum bandwidth per uplink carrier. Value unit is Hz.";
+ }
+// leaf number-of-supported-streams {
+// when "/module-capability/ru-capabilities/ru-supported-category = 'CAT_A'"
+// type uint8;
+// description
+// "Number of supported spatial stream in case CAT-A is supported";
+// }
+// Fixed me if they are necessary.
+
+ leaf max-num-component-carriers {
+ type uint8;
+ description "maximum number of component carriers supported by the RU";
+ }
+
+ leaf max-num-bands {
+ type uint16;
+ description "maximum number of bands supported by the RU";
+ }
+
+ leaf max-num-sectors {
+ type uint8;
+ description "maximum number of sectors supported by the RU";
+ }
+
+ leaf max-power-per-antenna {
+ type decimal64{
+ fraction-digits 4;
+ }
+ description
+ "This value indicates Maximum Power per band per antenna. Value unit is dBm.";
+ }
+
+ leaf min-power-per-antenna {
+ type decimal64{
+ fraction-digits 4;
+ }
+ description
+ "This value indicates Minimum Power per band per antenna. Value unit is dBm.";
+ }
+
+ leaf codebook-configuration_ng {
+ type uint8;
+ description
+ "This parameter informs the precoder codebook_ng that are used for precoding";
+ }
+
+ leaf codebook-configuration_n1 {
+ type uint8;
+ description
+ "This parameter informs the precoder codebook_n1 that are used for precoding";
+ }
+
+ leaf codebook-configuration_n2 {
+ type uint8;
+ description
+ "This parameter informs the precoder codebook_n2 that are used for precoding";
+ }
+ }
+ }
+}
--- /dev/null
+module xran-mplane-int {
+ yang-version 1.1;
+ namespace "urn:xran:mplane-interfaces:1.0";
+ prefix "xran-mplane-int";
+
+ import ietf-inet-types {
+ prefix "inet";
+ }
+
+ import ietf-interfaces {
+ prefix "if";
+ }
+
+ import xran-interfaces {
+ prefix "xran-int";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the YANG definitions for managng the xRAN Radio Unit
+ management plane interface.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ typedef vlan-id {
+ type uint16 {
+ range 1..4094;
+ }
+ description
+ "Type definition representing a single-tagged VLAN";
+ }
+ container mplane-info {
+ description "top level container for management plane information";
+ container searchable-mplane-access-vlans-info {
+ description
+ "These parameters shall be stored by the RU in reset persistant memory
+ to enable it to be re-used to optimize VALN discovery procerdures.";
+ leaf-list searchable-access-vlans {
+ type vlan-id;
+ description
+ "A list of access VLANs that may be operational on the transport
+ network. Can be used by the RU to optimize its VLAN searching - for
+ M-plane operations.";
+ }
+ container vlan-range {
+ description "the range of VLAN IDs that may be configured for M-Plane";
+ leaf lowest-vlan-id {
+ type vlan-id;
+ description
+ "Value of this parameter informs RU about lowest VID to be used
+ in VLAN scan procedure";
+ }
+ leaf highest-vlan-id {
+ type vlan-id;
+ description
+ "Value of this parameter informs RU about highest VID to be used
+ in VLAN scan procedure";
+ }
+ }
+ }
+
+ container m-plane-interfaces {
+ description "information concerning m-plane interfaces";
+ list m-plane-sub-interfaces {
+ key "interface-name sub-interface";
+ description "list of m-plane information";
+ leaf interface-name {
+ type leafref {
+ path "/if:interfaces/if:interface/if:name";
+ }
+ description "the name of the interface";
+ }
+ leaf sub-interface {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../interface-name]/xran-int:vlan-id";
+ }
+ description
+ "vlans used to communicate with management plane servers.";
+ }
+ container client-info {
+ description "the NETCONF client information";
+ list mplane-ipv4-info {
+ key mplane-ipv4;
+ description "list of IPv4 NETCONF clients";
+ leaf mplane-ipv4 {
+ type inet:ipv4-address;
+ description "The IPv4 address of M-Plane client discovered by the RU
+ or manually configured.";
+ }
+ leaf port {
+ type inet:port-number;
+ default "4334";
+ description
+ "The port number the call home server listens on.";
+ }
+ }
+ list mplane-ipv6-info {
+ key mplane-ipv6;
+ description "list of IPv6 NETCONF clients";
+ leaf mplane-ipv6 {
+ type inet:ipv6-address;
+ description "The IPv6 address of M-Plane client discovered by the RU
+ or manually configured.";
+ }
+ leaf port {
+ type inet:port-number;
+ default "4334";
+ description
+ "The port number the call home server listens on.";
+ }
+ }
+ leaf-list mplane-fqdn {
+ type inet:domain-name;
+ description "The discovered FQDN(s) of M-Plane client(s).";
+ }
+ }
+ }
+
+ container m-plane-ssh-ports {
+ description "leafs for managing SSH ports";
+ leaf call-home-ssh-port {
+ type inet:port-number;
+ default 4334;
+ description "call home server port number";
+ }
+ leaf server-ssh-port {
+ type inet:port-number;
+ default 830;
+ description "SSH server port number";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module xran-operations {
+ yang-version 1.1;
+ namespace "urn:xran:operations:1.0";
+ prefix "xran-ops";
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the YANG model used for RU operations.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ typedef xran-version {
+ type string {
+ pattern '[0-9]+(\.[0-9]+)';
+ }
+ description
+ "this type definition is used to represent the version of the xRAN
+ fronthaul interface.";
+ }
+
+ container operational-info{
+ config false;
+ description
+ "a collection of operational infor for the RU";
+
+ container xran-split {
+ description
+ "details about the xran split ";
+ leaf interface-version {
+ type xran-version;
+ default "1.0";
+ description "current version of the xRAN split sdupported by the RU";
+ }
+ leaf optional-header-support {
+ type enumeration {
+ enum NONE {
+ description
+ "Indicates that an RU only supports eCPRI C/U plane headers";
+ }
+ enum 1914POINT3 {
+ description
+ "Indicates that an RU supports the optional 1914.3 header format
+ for the C/U plane";
+ }
+ }
+ default NONE;
+ description
+ "Placeholder to enable future management plane aspects of 1914.3
+ headers to be included.";
+ }
+ leaf ecpri-concatenation-support {
+ type boolean;
+ default false;
+ description
+ "This leaf is used to indicate whether the RU supports the optional
+ eCPRI concatenation capability";
+ }
+ }
+
+ container operational-state {
+ description
+ "Operational state for the Radio Unit";
+ leaf restart-cause {
+ type enumeration {
+ enum POWER-ON {
+ description
+ "RU restarted because it was powered on";
+ }
+ enum SUPERVISION-WATCHDOG {
+ description
+ "RU restarted because it's supervision wathcdog timer wasn't reset
+ by a NETCONF client (inferring loss of NETCONF connectivity)";
+ }
+ enum MPLANE-TRIGGERED-RESTART {
+ description
+ "RU restarted because of an M-plane issued rpc";
+ }
+ enum SOFTWARE-FAILURE {
+ description
+ "RU restarted because of software failure";
+ }
+ enum OTHER-WATCHDOG-TIMER {
+ description
+ "RU restarted because of some other non NETCONF watchdog timer";
+ }
+ enum UNKNOWN {
+ description
+ "The restart reason for the RU is unknown";
+ }
+ }
+ description "the cause for the last restart of the RU";
+ }
+ }
+
+ leaf re-call-home-no-ssh-timer {
+ type uint16;
+ units seconds;
+ default 60;
+ description
+ "The timer used by the xRAN Radio Unit to repeatedley call home to
+ identified call home servers if it has not already an established SSH
+ connection to the identified server.";
+ }
+ }
+
+ rpc reset {
+ // TODO add nacm statement, e.g., nacm:default-deny-all;
+ description
+ "Management plane triggered restart of the radio unit.
+ A server SHOULD send an rpc reply to the client before
+ restarting the system.";
+
+ }
+}
--- /dev/null
+module xran-performance-management {
+ yang-version 1.1;
+ namespace "urn:xran:performance-management:1.0";
+ prefix "xran-pm";
+
+ import ietf-yang-types {
+ prefix "yang-types";
+ revision-date 2013-07-15;
+ }
+
+ // import idetifier for RU
+ import ietf-hardware {
+ prefix "hw";
+ }
+
+ // import ietf-interface
+ import ietf-interfaces {
+ prefix "if";
+ }
+
+ // import ietf-inet-type
+ import ietf-inet-types {
+ prefix "inet";
+ }
+
+ // import xran-port-number
+ import xran-interfaces {
+ prefix "xran-int";
+ }
+
+ // import ru-mac-address, lls-cu-mac-address and vlan-id
+ import xran-processing-element {
+ prefix "xran-elements";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the configuration for performance measurement for
+ transceiver and rx-window measurement objects.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+
+ feature GRANULARITY-TRANSPORT-MEASUREMENT {
+ description
+ "This feature indicates that the RU supports an optional object-unit TRANSPORT in rx-window-measurement.";
+ }
+ feature GRANULARITY-EAXC-ID-MEASUREMENT {
+ description
+ "This feature indicates that the RU supports an optional object-unit EAXC_ID in rx-window-measurement.";
+ }
+
+ grouping start-and-end-time {
+ description
+ "Definition for start and end time for an event";
+
+ leaf start-time {
+ type yang-types:date-and-time;
+ description
+ "Start time for measurement of object stats";
+ }
+ leaf end-time {
+ type yang-types:date-and-time;
+ description
+ "End time for measurement of object stats";
+ }
+ }
+
+ grouping transceiver-measurement-result-grouping {
+ description
+ "transceiver-measurement-result are listed per port-number";
+
+ list transceiver-measurement-result {
+ key "object-unit-id";
+ config false;
+ leaf object-unit-id {
+ type leafref {
+ path "/if:interfaces/if:interface/xran-int:port-reference/xran-int:xran-port-number";
+ }
+
+ description
+ "port-number is used for the object-unit-id for the
+ transceiver-measurement-result, for which object-unit is
+ PORT_NUMBER only";
+ }
+ container min {
+ description
+ "minimum value with recorded time are included for the
+ measurement-object";
+
+ leaf value {
+ type decimal64 {
+ fraction-digits 4;
+ }
+
+ description
+ "minimum value for the measurment-object";
+ }
+ leaf time {
+ type yang-types:date-and-time;
+
+ description
+ "recorded time for the minimum value";
+ }
+ }
+ container max {
+ description
+ "maximum value with recorded time are included for the
+ measurement-object";
+
+ leaf value {
+ type decimal64 {
+ fraction-digits 4;
+ }
+
+ description
+ "maximum value for the measurment-object";
+ }
+ leaf time {
+ type yang-types:date-and-time;
+
+ description
+ "recorded time for the maximum value";
+ }
+ }
+ container first {
+ description
+ "first value with the recorded time are included for the
+ measurement-object";
+
+ leaf value {
+ type decimal64 {
+ fraction-digits 4;
+ }
+
+ description
+ "first value of the measurement-object";
+ }
+ leaf time {
+ type yang-types:date-and-time;
+
+ description
+ "recorded time for the first value";
+ }
+ }
+ container latest {
+ description
+ "latest value with the recorded time are included for the
+ measurement-object";
+
+ leaf value {
+ type decimal64 {
+ fraction-digits 4;
+ }
+
+ description
+ "latest value of the measurement-object";
+ }
+ leaf time {
+ type yang-types:date-and-time;
+
+ description
+ "recorded time for the latest value";
+ }
+ }
+ leaf-list frequeny-table {
+ type uint32;
+
+ description
+ "frequency-table for the measurment-object are included per bin.
+ The configuration parameters for this frequency-table are defined
+ by bin-count, lower-bound and upper-bound";
+ }
+
+ description
+ "List of transceiver measurement results";
+ }
+ }
+
+ grouping rx-window-measurement-result-grouping{
+ description
+ "Group of measurement reasults for rx window measurements";
+
+ choice object-unit-id {
+ config false;
+ case RU {
+ leaf name{
+ type leafref {
+ path "/hw:hardware/hw:component/hw:name";
+ }
+
+ description
+ "the name of RU in ietf-hardware/component is used
+ when RU is selected as object-unit for the reception window
+ stats.";
+ }
+ leaf count {
+ type uint64;
+ mandatory true;
+
+ description
+ "the number of data packet are counted for the reception
+ window stats per RU.";
+ }
+ }
+
+ case TRANSPORT {
+ list tr-measured-result{
+ key "name";
+ leaf name{
+ type leafref{
+ path "/xran-elements:processing-elements/xran-elements:ru-elements/xran-elements:name";
+ }
+
+ description
+ "the name of ru-elements in xran-processing-elements
+ when TRANSPORT is selected as object-unit for the reception
+ window stats.";
+ }
+ leaf count {
+ type uint64;
+ mandatory true;
+
+ description
+ "the number of data packet are counted for the reception
+ window stats.";
+ }
+
+ description
+ "the number of data packet are counted for the reception
+ window stats per TRANSPORT.";
+ }
+ }
+
+ case EAXC_ID {
+ list eaxc-measured-result {
+ key "eaxc-id";
+ leaf eaxc-id{
+ type uint16;
+
+ description
+ "eaxc-id is used
+ when EAXC_ID is selected as object-unit for the reception
+ window stats.
+ EAXC_ID consists of CU-Port-Id, Band-Selector, CC-id and
+ RU-Port-Id to be used in header of C/U-plane data packet.";
+ }
+ leaf count {
+ type uint64;
+ mandatory true;
+
+ description
+ "the number of data packet are counted for the reception
+ window stats.";
+ }
+ leaf transport-name {
+ type leafref{
+ path "/xran-elements:processing-elements/xran-elements:ru-elements/xran-elements:name";
+ }
+
+ description
+ "the name of ru-elements in xran-processing-elements for the
+ transport information corresponding to this eaxc-id";
+ }
+
+ description
+ "the number of data packet are counted for the reception
+ window stats per EAXC-ID.";
+ }
+ }
+
+ description
+ "measurement-result for the reception window stats depends on the
+ configured object-unit, RU, TRANSPORT or EAXC_ID";
+ }
+ }
+
+ container performance-measurement-objects {
+ description
+ "configuration for performance management and measurement-result are
+ included";
+
+ leaf enable-SFTP-upload {
+ type boolean;
+ default false;
+ description
+ "Flag to enable upload of performance measurement result files.";
+ }
+
+ leaf enable-random-file-upload {
+ type boolean;
+ default false;
+ description
+ "Flag to enable upload of performance measurement result files at
+ random within file-upload-interval.";
+ }
+
+ list remote-SFTP-uploads {
+ key remote-SFTP-upload-path;
+ description
+ "SFTP upload can be done to one or more than one SFTP servers";
+
+ leaf remote-SFTP-upload-path {
+ type inet:uri;
+ description
+ "URI specifying the remote location where the files are to uploaded.
+ The following format is possible:
+ sftp://<username>@<host>[:<port>]";
+ }
+
+ choice credentials {
+ description
+ "Type of authentication to use for SFTP upload.";
+
+ case password {
+ container password {
+ presence true;
+ leaf password {
+ type string;
+ mandatory true;
+
+ description
+ "password needed for authentication.";
+ }
+ description
+ "password authentication method in use";
+ }
+ }
+ case certificate {
+ container certificate {
+ presence true;
+ description
+ "certificate authentication method in use";
+ }
+ }
+ }
+ }
+
+ leaf transceiver-measurement-interval {
+ type uint16;
+ description
+ "measurement interval to measure the performance of transceiver
+ measurement objects periodically.";
+ }
+
+ leaf rx-window-measurement-interval {
+ type uint16;
+ description
+ "measurement interval to measure the performance of reception
+ window measurement objects periodically.";
+ }
+
+ leaf notification-interval {
+ type uint16;
+ description
+ "notification interval for the measurement result to be notified
+ periodically.";
+ }
+
+ leaf file-upload-interval {
+ type uint16;
+ description
+ "file upload interval for the measurement result file to be
+ uploaded periodically.";
+ }
+
+ list transceiver-measurement-objects {
+ key "measurement-object";
+ leaf measurement-object {
+ type enumeration {
+ enum RX_POWER {
+ description
+ "Measured Rx input power in mW";
+ }
+ enum TX_POPWER {
+ description
+ "Measured Tx input power in mW.";
+ }
+ enum TX_BIAS_COUNT {
+ description
+ "Internally measured Tx Bias Current in mA";
+ }
+ enum VOLTAGE {
+ description
+ "Internally measured transceiver supply voltage in mV";
+ }
+ enum TEMPERATURE {
+ description
+ "Internally measured optional laser temperature in degrees Celsius.";
+ }
+ }
+ description "Target metric to measure the performance";
+ }
+
+ leaf active {
+ type boolean;
+ default false;
+ description
+ "Enable/disable the performance measurement per Object";
+ }
+
+ leaf-list report-info {
+ type enumeration {
+ enum MAXIMUM {
+ description
+ "to report maximum value and its recorded time within the
+ measurement-interval for the measurement-object.";
+ }
+ enum MINIMUM {
+ description
+ "to report minimum value and its recorded time within the
+ measurement-interval for the measurement-object.";
+ }
+ enum FIRST {
+ description
+ "to report first value and its recorded time within the
+ measurement-interval for the measurement-object.";
+ }
+ enum LATEST {
+ description
+ "to report latest value and its recorded time within the
+ measurement-interval for the measurement-object.";
+ }
+ enum FREQUENCY_TABLE {
+ description
+ "to report frequency bin table within the
+ measurement-interval for the measurement-object.";
+ }
+ }
+ description "The reporting info to the measurement object.";
+ }
+
+ leaf object-unit {
+ type enumeration {
+ enum PORT_NUMBER {
+ description
+ "unit to measure the performance per object-id";
+ }
+ }
+ mandatory true;
+ description "unit to measure the performance per object-id.";
+ }
+
+ leaf function {
+ type enumeration {
+ enum RAW {
+ description
+ "the value is expressed by real value.";
+ }
+ enum LOG_10 {
+ description
+ "the value is expressed by logarithm with base 10.";
+ }
+ }
+
+ description
+ "the value to be recorded for transceiver-measurement
+ by real value or log 10.";
+ }
+
+ leaf bin-count {
+ type uint32;
+
+ description
+ "the number of bin for the frequency table.";
+ }
+
+ leaf lower-bound {
+ type decimal64 {
+ fraction-digits 4;
+ }
+
+ description
+ "the lower value of the first bin of frequency table.";
+ }
+
+ leaf upper-bound {
+ type decimal64 {
+ fraction-digits 4;
+ }
+
+ description
+ "the upper value of the last bin of frequency table.";
+ }
+ uses transceiver-measurement-result-grouping;
+
+ description
+ "configuration and measurement result for the transceiver-measurement.";
+ }
+
+ list rx-window-measurement-objects {
+ key "measurement-object";
+ leaf measurement-object {
+ type enumeration {
+ enum RX_ON_TIME {
+ description
+ "the number of data packets, received on time within
+ the reception window.";
+ }
+ enum RX_EARLY {
+ description
+ "the number of data packets, received before
+ the reception window.";
+ }
+ enum RX_LATE {
+ description
+ "the number of data packets, received after
+ the reception window.";
+ }
+ enum RX_CORRUPT {
+ description
+ "the number of data packets, which are corrupt or whose header
+ is incorrect.";
+ }
+ enum RX_DUPL {
+ description
+ "the number of data packets, which is duplicated with other packets,
+ received within the measurement period.";
+ }
+ enum RX_TOTAL {
+ description
+ "the total number of received data packets.";
+ }
+ }
+ description
+ "target reception window metric to measure the performance.";
+ }
+
+ leaf active {
+ type boolean;
+ default false;
+ description
+ "Enable/disable the performance measurement per reception window
+ measurement object.";
+ }
+
+ leaf object-unit {
+ type enumeration {
+ enum RU {
+ description
+ "the reception window stats are counted per RU.";
+ }
+ enum TRANSPORT {
+ if-feature GRANULARITY-TRANSPORT-MEASUREMENT;
+ description
+ "the reception window stats are counted per transport flow.
+ When there are multiple transport flows between lls-CU and RU,
+ e.g. multiple sets of lls-cu mac address, ru mac address and
+ vlan-id, the reception window stats per transport flow
+ are counted in this case.
+ This configuration is allowed only when RU supports
+ a feature GRANULARITY-TRANSPORT-MEASUREMENT.";
+ }
+ enum EAXC_ID {
+ if-feature GRANULARITY-EAXC-ID-MEASUREMENT;
+
+ description
+ "the reception window stats are counted per eAxC ID, which is
+ used in the header of receivd data packet.
+ This configuration is allowed only when RU supports
+ a feature GRANULARITY-EAXC-ID-MEASUREMENT.";
+ }
+ }
+ description
+ "unit to measure the performance per object-id.";
+ }
+
+ leaf report-info {
+ type enumeration {
+ enum COUNT {
+ description
+ "the number of data packet are counted for the reception
+ window stats.";
+ }
+ }
+ description
+ "The reporting info to the measurement object.";
+ }
+
+ uses rx-window-measurement-result-grouping;
+
+ description
+ "configuration and measurement result for the reception window stats";
+ }
+ }
+
+ notification measurement-result-stats {
+ list transceiver-stats {
+ key "measurement-object";
+ leaf measurement-object {
+ type leafref {
+ path "/performance-measurement-objects/transceiver-measurement-objects/measurement-object";
+ }
+
+ description
+ "measurement-object for the transceiver-measurement";
+ }
+
+ uses start-and-end-time;
+ uses transceiver-measurement-result-grouping;
+
+ description
+ "measurement result of transceiver-measurement per measurement-object";
+ }
+
+ list rx-window-stats {
+ key "measurement-object";
+ leaf measurement-object {
+ type leafref {
+ path "/performance-measurement-objects/rx-window-measurement-objects/measurement-object";
+ }
+
+ description
+ "measurement-object for the reception window measurement";
+ }
+ uses start-and-end-time;
+ uses rx-window-measurement-result-grouping;
+
+ description
+ "measurement result for the reception window measurement per
+ measurement-object";
+
+ }
+
+ description
+ "notification may contain measurement result for transceiver-stats
+ and/or rx-window-stats";
+ }
+}
--- /dev/null
+module xran-processing-element {
+ yang-version 1.1;
+ namespace "urn:xran:processing-element:1.0";
+ prefix "xran-elements";
+
+ import ietf-yang-types {
+ prefix yang;
+ }
+
+ import ietf-inet-types {
+ prefix "inet";
+ }
+
+ import ietf-interfaces {
+ prefix "if";
+ }
+
+ import ietf-ip {
+ prefix "ip";
+ }
+
+ import xran-interfaces {
+ prefix "xran-int";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the YANG definitions for mapping of transport flows to
+ processing elements. Three options are supported:
+ i) virtual MAC based mapping
+ ii) MAC addrress + VLAN-ID based mapping
+ iii) UDP/IP based mapping
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ identity XRAN-INTERFACE-TYPE {
+ base if:interface-type;
+ description
+ "This identity is used as a base for all interface types
+ defined by xRAN.";
+ }
+
+ identity ALIASMAC-INTERFACE {
+ base XRAN-INTERFACE-TYPE;
+ description
+ "Identity type for alias MAC based CU plane interface,
+ whwere multiple MAC addresses are used on the same Ethernet interface. ";
+ }
+
+ identity ETH-INTERFACE {
+ base XRAN-INTERFACE-TYPE;
+ description
+ "identity type for ethernet plus vlan based CU plane interface. ";
+ }
+
+ identity UDPIP-INTERFACE {
+ base XRAN-INTERFACE-TYPE;
+ description
+ "identity type for UDP/IP based CU plane interface. ";
+ }
+
+ container processing-elements {
+ description
+ "a model defining the mapping between transport flows and arbitrary
+ xRAN processing elements. A processing element may be then defined for
+ handling connectivity or delay procedures, or defined with a corresponding
+ eaxcid for CU plane operations";
+ leaf transport-session-type {
+ type identityref {
+ base XRAN-INTERFACE-TYPE;
+ }
+ description
+ "the type of transport session used for identifying different processing
+ elements";
+ }
+ list ru-elements {
+ key "name";
+ description
+ "the list of transport definitions for each processing element";
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ description
+ "A name that is unique across the RU that identifies a processing
+ element instance.
+
+ This name may be used in fault management to refer to a fault source
+ or affected object";
+ }
+ container transport-flow {
+ description
+ "container for the transport-flow used for CU plane";
+ leaf interface-name {
+ type leafref {
+ path "/if:interfaces/if:interface/if:name";
+ }
+ description "the interface name ";
+ }
+ container aliasmac-flow {
+ when "derived-from(../../../transport-session-type, 'ALIASMAC-INTERFACE')";
+ if-feature xran-int:ALIASMAC-BASED-CU-PLANE;
+ description "leafs for virtual mac type data flows";
+ leaf ru-aliasmac-address {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/xran-int:alias-macs";
+ }
+ config false;
+ mandatory true;
+ description
+ "RU's alias MAC address used for alias MAC based flow";
+ }
+ leaf vlan-id {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/xran-int:vlan-id";
+ }
+ description
+ "RU's VLAN-ID used for alias MAC based flow";
+ }
+ leaf llscu-mac-address {
+ type yang:mac-address;
+ mandatory true;
+ description
+ "lls-CU's MAC address used for alias MAC based flow";
+ }
+ }
+ container eth-flow {
+ when "derived-from(../../../transport-session-type, 'ETH-INTERFACE')";
+ description "leafs for mac + vlan-id type data flows";
+ leaf ru-mac-address {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/xran-int:mac-address";
+ }
+ mandatory true;
+ description
+ "RU's MAC address used for Ethernet based flow";
+ }
+ leaf vlan-id {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/xran-int:vlan-id";
+ }
+ mandatory true;
+ description
+ "RU's VLAN-ID used for Ethernet based flow";
+ }
+ leaf llscu-mac-address {
+ type yang:mac-address;
+ mandatory true;
+ description
+ "lls-CU's MAC address used for alias MAC based flow";
+ }
+ }
+ container udpip-flow {
+ when "derived-from(../../../transport-session-type, 'UDPIP-INTERFACE')";
+ if-feature xran-int:UDPIP-BASED-CU-PLANE;
+ description "leafs for UDP/IP type data flows";
+ choice address {
+ leaf ru-ipv4-address {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/ip:ipv4/ip:address/ip:ip";
+ }
+ description "RU's IPv4 address";
+ }
+ leaf ru-ipv6-address {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../../interface-name]/ip:ipv6/ip:address/ip:ip";
+ }
+ description "RU's IPv6 address";
+ }
+ mandatory true;
+ description "choice of RU IPv4 or IPv6 address";
+ }
+ leaf llscu-ip-address {
+ type inet:ip-address;
+ mandatory true;
+ description "lls-CU's IPv address";
+ }
+ leaf ru-ephemeral-udp-port {
+ type inet:port-number;
+ mandatory true;
+ description
+ "ephemeral port used by RU";
+ }
+ leaf llscu-ephemeral-udp-port {
+ type inet:port-number;
+ mandatory true;
+ description
+ "ephemeral port used by lls-CU";
+ }
+ leaf destination-udp {
+ type inet:port-number;
+ mandatory true;
+ description "the well known UDP port number used by eCPRI";
+ // fixme - add in a default when allocated by IANA
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module xran-software-management {
+ yang-version 1.1;
+ namespace "urn:xran:software-management:1.0";
+ prefix xran-swm;
+
+ import ietf-inet-types {
+ prefix "inet";
+ revision-date 2013-07-15;
+ }
+
+ import ietf-hardware {
+ prefix "hw";
+ }
+
+ import xran-hardware {
+ prefix "xran-hw";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines operations and configuration for the management of software packages.
+ This module is derived out of opencpe-firmware-mgmt@2014-02-06.yang
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ // typedef statements
+
+ container software-inventory {
+ config false;
+ description
+ "Contains information about each software slot and its content.";
+
+ list software-slot {
+ key name;
+ min-elements 2;
+
+ description
+ "Information about available software-slots and their software.";
+
+ leaf name {
+ type string;
+
+ description
+ "Name of the software package. This shall be unique to identify the software-slot.";
+ }
+
+ leaf status {
+ type enumeration {
+ enum VALID {
+ description
+ "Slot Contains software build considered as proven valid";
+ }
+ enum INVALID {
+ description
+ "software build is not currently used by RU. The software is considered by RU as damaged (e.g. wrong CRC)";
+ }
+ enum EMPTY {
+ description
+ "W slot does not contain software package.";
+ }
+ }
+ config false;
+ mandatory true;
+
+ description "Indicates the status of the software slot";
+ }
+
+ leaf active {
+ type boolean;
+ must "../status = 'VALID'";
+ config false;
+ description
+ "informs if software stored in particular slot is activated at the moment";
+ }
+
+ leaf running {
+ type boolean;
+ must "../status = 'VALID'";
+ config false;
+ description
+ "informs if software stored in particular slot is used at the moment";
+ }
+
+ leaf access {
+ type enumeration {
+ enum READ_ONLY {
+ description
+ "slot intended only for factory software,
+ activation of such software slot means getting back to factory defaults";
+ }
+ enum READ_WRITE {
+ description
+ "slot used for updating software";
+ }
+ }
+ default READ_WRITE;
+ config false;
+
+ description
+ "Indicates the writability of the slot.
+ A Read-Only software slot is one which has a factory installed software-slot";
+ }
+
+ leaf product-code {
+ type leafref {
+ path "/hw:hardware/hw:component/xran-hw:product-code";
+ }
+ config false;
+
+ description "product code provided by the vendor, specific to the product. This is derived from manifest file.";
+ }
+
+ leaf vendor-code {
+ type string {
+ length 1..2;
+ }
+ config false;
+
+ description
+ "Unique code of the vendor. This is derived from manifest file.";
+ }
+
+ leaf build-id {
+ type string;
+ config false;
+
+ description
+ "Identity associated with the software build. This is derived from manifest file.";
+ }
+
+ leaf build-name {
+ type string;
+ config false;
+
+ description
+ "Name of the build. This is derived from manifest file.";
+ }
+
+ leaf build-version {
+ type leafref{
+ path "/hw:hardware/hw:component/hw:software-rev";
+ }
+ description "Version of the software build. This is derived from manifest file.";
+ }
+
+ list files {
+ key "name";
+ config false;
+
+ description "List of all the files present in the software package.";
+
+ leaf name {
+ type string;
+
+ description
+ "Name of the file installed in the slot.";
+ }
+
+ leaf version {
+ type string;
+
+ description
+ "Version of the file installed in the slot";
+ }
+ leaf local-path {
+ type string;
+ mandatory true;
+
+ description
+ "Complete path of the file stored locally";
+ }
+
+ leaf integrity {
+ type enumeration {
+ enum OK {
+ description "OK - indicates that file integrity is correct";
+ }
+ enum NOK {
+ description "NOK - indicates corrupted file";
+ }
+ }
+ config false;
+
+ description
+ "Result of the file integrity check (checksum calculation) during installation.";
+ }
+ }
+ }
+ }
+ // rpc statements
+
+ rpc software-download {
+ description
+ "Rpc needed to perform software download operation.";
+
+ input {
+ leaf remote-file-path {
+ type inet:uri;
+ mandatory true;
+ description
+ "URI of the software image including username.
+ The following format is possible:
+ sftp://<username>@<host>[:<port>]";
+ }
+
+ choice credentials {
+ description
+ "Type of authentication to use for software downloads.";
+
+ case password {
+ container password {
+ presence true;
+ leaf password {
+ type string;
+ mandatory true;
+
+ description
+ "password needed for authentication.";
+ }
+
+ description
+ "password authentication method in use";
+ }
+ }
+ case certificate {
+ container certificate {
+ presence true;
+ description
+ "certificate authentication method in use";
+ }
+ }
+ }
+ }
+ output {
+ leaf status {
+ type enumeration {
+ enum STARTED {
+ description
+ "Operation has been started without error.";
+ }
+ enum FAILED {
+ description
+ "Operation cannot be started because of error, more detailed information can be found in error-message.";
+ }
+ }
+ mandatory true;
+
+ description
+ "Status of the software files download";
+ }
+ leaf error-message {
+ when "../status = 'FAILED'";
+ type string;
+
+ description
+ "Detailed error Message when the status is failed.";
+ }
+
+ leaf notification-timeout {
+ type int32;
+ units seconds;
+ default 30;
+
+ description
+ "Notification timeout is the time NETCONF client shall
+ wait for a 'download-event' notification from RU. If there is no
+ 'download-event' notification received within notification-timeout,
+ NETCONF client shall assume the download timeout/failure, and follow necessary steps.";
+ }
+ }
+ }
+
+ rpc software-install {
+ description
+ "Install a previously downloaded software package.";
+
+ input {
+ leaf slot-name {
+ type leafref {
+ path "/software-inventory/software-slot/name";
+ }
+ must "/software-inventory/software-slot[name = current()][active = 'false' and running = 'false']" {
+ error-message "software-install may be requested only against active::false and running::false slot!";
+ }
+ mandatory true;
+
+ description
+ "software-slot to which the software shall be installed to.";
+ }
+
+ leaf-list file-names {
+ type string;
+
+ description
+ "Names of the files within software package to be installed";
+ }
+ }
+ output {
+ leaf status {
+ type enumeration {
+ enum STARTED {
+ description
+ "Operation has been started without error.";
+ }
+ enum FAILED {
+ description
+ "Operation cannot be started because of error, more detailed information can be found in error-message.";
+ }
+ }
+ mandatory true;
+
+ description
+ "Status of the software package install.";
+ }
+ leaf error-message {
+ when "../status = 'FAILED'";
+ type string;
+
+ description
+ "Detailed error Message when the status is failed.";
+ }
+ }
+ }
+
+ rpc software-activate {
+ description
+ "Activate a previously installed software.";
+ input {
+ leaf slot-name {
+ type leafref {
+ path "/software-inventory/software-slot/name";
+ }
+ mandatory true;
+
+ description
+ "Slot name on which software has to be activated.";
+ }
+ }
+ output {
+ leaf status {
+ type enumeration {
+ enum STARTED {
+ description
+ "Operation has been started without error.";
+ }
+ enum FAILED {
+ description
+ "Operation cannot be started because of error, more detailed information can be found in error-message.";
+ }
+ }
+ mandatory true;
+
+ description
+ "Status of the software files activation";
+ }
+ leaf error-message {
+ when "../status = 'FAILED'";
+ type string;
+
+ description
+ "Detailed error Message when the status is failed.";
+ }
+
+ leaf notification-timeout {
+ type int32;
+ units seconds;
+ default 30;
+
+ description
+ "Timeout on client waiting for the activate event";
+ }
+ }
+ }
+
+ // notification definitions
+ notification download-event {
+ description "Notification event structure for download completion";
+ leaf file-name {
+ type string;
+ mandatory true;
+
+ description
+ "File name of downloaded software package";
+ }
+
+ leaf status {
+ type enumeration {
+ enum COMPLETED {
+ description
+ "Operation completed succesfully";
+ }
+ enum AUTHENTICATION_ERROR {
+ description "source available, wrong credentials";
+ }
+ enum PROTOCOL_ERROR {
+ description "SFTP errors";
+ }
+ enum FILE_NOT_FOUND {
+ description "source not available.";
+ }
+ enum APPLICATION_ERROR {
+ description "Application related errors";
+ }
+ enum TIMEOUT {
+ description "Timeout waiting for download";
+ }
+ }
+
+ description
+ "Status of finished operation execution";
+ }
+ leaf error-message {
+ when "../status != 'COMPLETED'";
+ type string;
+
+ description
+ "Detailed description of faulty situation";
+ }
+
+ }
+
+ notification install-event {
+ description "Notification event structure for installation completion";
+ leaf slot-name {
+ type leafref {
+ path "/software-inventory/software-slot/name";
+ }
+
+ description
+ "Name of the slot to which software was installed.";
+ }
+ leaf status {
+ type enumeration {
+ enum COMPLETED {
+ description
+ "Operation completed succesfully";
+ }
+ enum FILE_ERROR {
+ description "operation on the file resulted in in error, disk failure, not enough disk space,
+ incompatible file format";
+ }
+ enum INTEGRITY_ERROR {
+ description "file is corrupted";
+ }
+ enum APPLICATION_ERROR {
+ description "operation failed due to internal reason";
+ }
+ }
+
+ description
+ "Status of finished operation execution";
+ }
+ leaf error-message {
+ when "../status != 'COMPLETED'";
+ type string;
+
+ description
+ "Detailed description of faulty situation";
+ }
+ }
+
+ notification activation-event {
+ description "Notification event structure for activation completion";
+ leaf slot-name {
+ type leafref {
+ path "/software-inventory/software-slot/name";
+ }
+
+ description
+ "Name of the slot which was activated";
+ }
+
+ leaf status {
+ type enumeration {
+ enum COMPLETED {
+ description
+ "Operation completed succesfully";
+ }
+ enum APPLICATION_ERROR {
+ description
+ "Operation finished with error, more details can by found in error-message";
+ }
+ }
+
+ description
+ "Status of finished operation execution";
+ }
+ leaf return-code {
+ type uint8;
+
+ description
+ "status code return when the software is tried to activate";
+ }
+ leaf error-message {
+ when "../status != 'COMPLETED'";
+ type string;
+
+ description
+ "Detailed description of faulty situation";
+ }
+ }
+}
--- /dev/null
+module xran-supervision {\r
+ yang-version 1.1;\r
+ namespace "urn:xran:supervision:1.0";\r
+ prefix "xran-supervision";\r
+\r
+ import ietf-yang-types {\r
+ prefix yang;\r
+ }\r
+\r
+ organization "xRAN Forum";\r
+\r
+ contact\r
+ "www.xran.org";\r
+\r
+ description\r
+ "This module defines the configuration data and supervision RPCs that are\r
+ used by the NETCONF client and NETCONF server to detect loss of NETCONF\r
+ connectivity.\r
+\r
+ Copyright 2018 the xRAN Forum.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\r
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ POSSIBILITY OF SUCH DAMAGE.\r
+\r
+ Redistribution and use in source and binary forms, with or without\r
+ modification, are permitted provided that the following conditions are met:\r
+\r
+ * Redistributions of source code must retain the above copyright notice,\r
+ this list of conditions and the above disclaimer.\r
+ * Redistributions in binary form must reproduce the above copyright notice,\r
+ this list of conditions and the above disclaimer in the documentation\r
+ and/or other materials provided with the distribution.\r
+ * Neither the Members of the xRAN Forum nor the names of its\r
+ contributors may be used to endorse or promote products derived from\r
+ this software without specific prior written permission.";\r
+\r
+ revision "2018-07-20" {\r
+ description\r
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.\r
+\r
+ This version of the model supports v01.00 of the corrsponding xRAN\r
+ M-Plane Specification.";\r
+ reference "XRAN-FH.MP.0-v01.00";\r
+ }\r
+\r
+ rpc supervision-watchdog-reset {\r
+ description\r
+ "rpc to reset the watchdog timer";\r
+ input {\r
+\r
+ leaf supervision-notification-interval {\r
+ type uint16;\r
+ units seconds;\r
+ default 60;\r
+ description\r
+ "The interval in seconds at which supervision notifications are sent.\r
+ If not specified the default value of 60 seconds shall apply.";\r
+ }\r
+ leaf guard-timer-overhead {\r
+ type uint16;\r
+ units seconds;\r
+ default 10;\r
+ description\r
+ "This is overhead added to the supervision timer used to calculate the\r
+ supervision wathcdog timer. i.e.,\r
+\r
+ supervision timer = notification timer + guard-timer-overhead\r
+\r
+ If not specified the default value of 10 seconds shall apply.\r
+\r
+ Failure to send this rpc again within the timeout sets the radio into\r
+ 'loss of supervision' state.\r
+\r
+ NOTE - The supervision timer MUST not be less that the confimed\r
+ timeout timer (when the feature is supported).\r
+\r
+ This type of constraint (using an RPCs input) cannot be formally\r
+ expressed in YANG.";\r
+ }\r
+ }\r
+ }\r
+\r
+ notification supervision-notification {\r
+ description\r
+ "Notification to indicate that NETCONF management interface is up\r
+ and also indicate the values of the timers for this NETCONF session";\r
+\r
+ leaf next-update-at {\r
+ type yang:date-and-time;\r
+ description\r
+ "Indicates the time when the next supervision notification is expected.";\r
+ }\r
+ }\r
+}\r
--- /dev/null
+module xran-sync {
+ yang-version 1.1;
+ namespace "urn:xran:sync:1.0";
+ prefix "xran-sync";
+
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines synchronization mechanism for the xRAN Radio Unit.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ typedef geographic-coordinate-degree {
+ type decimal64 {
+ fraction-digits 8;
+ }
+ description
+ "Decimal degree (DD) used to express latitude and longitude
+ geographic coordinates.";
+ }
+
+ feature GNSS {
+ description
+ "This feature indicates that the RU supports integrated GNSS functionality.";
+ }
+
+ container sync {
+ description
+ "Main containter for sync related parameters";
+
+ container sync-status {
+ config false;
+
+ description
+ "Object of this class provides synchronization state of the module.";
+
+ leaf sync-state {
+ type enumeration {
+ enum LOCKED {
+ description
+ "RU is in the locked mode, as defined in ITU-T G.810";
+ }
+ enum HOLDOVER {
+ description
+ "RU clock is in holdover mode";
+ }
+ enum FREERUN {
+ description
+ "RU clock isn’t locked to an input reference, and is not in the holdover mode";
+ }
+ }
+ mandatory true;
+ description
+ "State of DU synchronization";
+ }
+
+ list supported-reference-types {
+ key item;
+ min-elements 1;
+ description
+ "Type of a synchronization supported source.";
+ leaf item {
+ type enumeration {
+ enum GNSS {
+ description
+ "GPS can be taken as a synchronization source";
+ }
+ enum PTP {
+ description
+ "Precision Time Protocol can be taken as a synchronization source";
+ }
+ enum SYNCE {
+ description
+ "Synchronous Ethernet can be taken as a synchronization source";
+ }
+ }
+ mandatory true;
+
+ description
+ "supported reference-type";
+ }
+ }
+ }
+
+ container sync-capability {
+ config false;
+
+ description
+ "Object of this class provides synchronization capabilities of the module.";
+
+ leaf sync-t-tsc {
+ type enumeration {
+ enum STANDARD {
+ description
+ "Standard accuracy for synchronization is supported by the device";
+ }
+ enum ENCHANCED {
+ description
+ "Enchanced accuracy for synchronization is supported by the device";
+ }
+ }
+ mandatory true;
+ description
+ "This will provide information about T-TSC capability";
+
+ reference "T-TSC: ITU-T G.8275.1/Y.1369.1";
+ }
+ }
+
+ container ptp-config {
+ description
+ "This MO defines configuration of Precise Time Protocol.";
+ leaf domain-number {
+ type uint8;
+ default 24;
+ description
+ "This parameter indicates Domain Number for PTP announce messages.";
+ }
+
+ leaf multicast-mac-address {
+ type enumeration {
+ enum FORWARDABLE {
+ description
+ "means, that PTP shall use 01-80-C2-00-00-0E destination MAC address";
+ }
+ enum NONFORWARDABLE {
+ description
+ "means, that PTP shall use 01-1B-19-00-00-00 destination MAC address";
+ }
+ }
+ default FORWARDABLE;
+ description
+ "The parameter defines destination MAC address, used by the DU in the egress PTP messages.";
+ }
+
+ list accepted-clock-classes {
+ key clock-classes;
+ leaf clock-classes {
+ type uint8;
+ description
+ "PTP Clock Class accepted by the RU";
+ }
+ description
+ "Contains list of PTP acceptable Clock Classes, sorted in the descending order.";
+ }
+
+ leaf delay-asymmetry {
+ type int16 {
+ range -10000..10000;
+ }
+ default 0;
+ description
+ "Defines static phase error in the recovered PTP timing signal to be compensated at the RU.
+ The error is defined in units of nanoseconds in the range ±10 000 ns.";
+ }
+ }
+
+ container ptp-status {
+ description
+ "ptp status container";
+ leaf reporting-period {
+ type uint8;
+ default 10;
+ description
+ "This parameter defines minimum period in seconds between reports,
+ sent by the NETCONF Client, for parameters in this container.";
+ }
+ leaf lock-state {
+ type enumeration {
+ enum LOCKED {
+ description
+ "The integrated ordinary clock is synchronizing to the reference, recovered from PTP flow";
+ }
+ enum UNLOCKED {
+ description
+ "The integrated ordinary clock is not synchronizing to the reference, recovered from PTP flow";
+ }
+ }
+ config false;
+ description
+ "This parameter indicates, whether the integrated ordinary clock is
+ synchronizing to the reference, recovered from PTP signal.
+ The exact definition when to indicate locked or unlocked is up to specific
+ implementation.";
+ }
+
+ leaf clock-class {
+ type uint8;
+ config false;
+ description
+ "This parameter contains the clock class of the clock, controlled by the RU";
+ }
+
+ leaf clock-identity {
+ type string {
+ length 18;
+ pattern "0[xX][0-9a-fA-F]{16}";
+ }
+ config false;
+ description
+ "This parameter contains identity of the clock,
+ according to IEEE 1588-2008 defintion, controlled by the RU.
+ The string shall be formatted as an 8-octet hex value with the “0x” prefix.";
+ }
+
+ leaf partial-timing-supported {
+ type boolean;
+
+ description
+ "Provides information wheter G.8275.2 (partial timing support from network) is supported.";
+ }
+
+ list sources {
+ key local-port-number;
+ config false;
+
+ description
+ "Synchronisation sources";
+
+ leaf local-port-number {
+ type uint16;
+ // fixme - change to a leafref once interface design is agreed
+ description
+ "This is reference to portNumber of ExternalEthernetPort to identify the port,
+ where the PTP signal is located.";
+ }
+
+ leaf state {
+ type enumeration {
+ enum PARENT {
+ description
+ "Indicates that this source is the current master clock, i.e. the clock,
+ which the clock, controlled by the Netconf Server, is synchronized to";
+ }
+ enum OK {
+ description
+ "Indicates that this source is an alternate master, which the clock,
+ controlled by the Netconf Server, can potentially synchronize to,
+ i.e. clock class and priority, announced by the master clock is lower,
+ compared to those of the clock, controlled by the Netconf Server,
+ and and the clock class is accepted";
+ }
+ enum NOK {
+ description
+ "Indicates that this source is an alternate master, which the clock,
+ controlled by the Netconf Server, has an operational connection to,
+ but the class or priority of the master clock is higher or equal
+ to those of the clock, controlled by the Netconf Server,
+ or the clock class is not accepted";
+ }
+ enum DISABLED {
+ description
+ "Indicates that this source is an alternate master, which the clock,
+ controlled by the Netconf Server, has no operational connection to";
+ }
+ }
+ description
+ "This parameter indicates status of the PTP source";
+ }
+
+ leaf two-step-flag {
+ type boolean;
+ description
+ "This parameter reflects status of the twoStepFlag attribute in Sync messages,
+ received from the PTP source.";
+ }
+
+ leaf leap61 {
+ type boolean;
+ description
+ "This parameter reflects status of the leap61 flag in Announce messages,
+ received from the PTP source.
+ When true, the last minute of the current UTC day contains 61 seconds.";
+ }
+
+ leaf leap59 {
+ type boolean;
+ description
+ "This parameter reflects status of the leap59 flag in Announce messages,
+ received from the PTP source.
+ When true, the last minute of the current UTC day contains 59 seconds.";
+ }
+
+ leaf current-utc-offset-valid {
+ type boolean;
+ description
+ "This parameter reflects status of the currentUtcOffsetValid flag in
+ Announce messages, received from the PTP source.
+ When true, the current UTC offset is valid.";
+ }
+
+ leaf ptp-timescale {
+ type boolean;
+ description
+ "This parameter reflects status of the ptpTimescale flag in Announce
+ messages, received from the PTP source.
+
+ When set, the clock timescale of the grandmaster clock is PTP;
+ otherwise, the timescale is ARB (arbitrary)";
+ }
+
+ leaf time-traceable {
+ type boolean;
+ description
+ "This parameter reflects status of the timeTraceable flag in Announce
+ messages, received from the PTP source.
+
+ When true, the timescale and the currentUtcOffset are traceable to a
+ primary reference";
+ }
+
+ leaf frequency-traceable {
+ type boolean;
+ description
+ "This parameter reflects status of the frequencyTraceable flag in
+ Announce messages, received from the PTP source.
+
+ When true, the frequency determining the timescale is traceable to a
+ primary reference";
+ }
+
+ leaf source-clock-identity {
+ type string {
+ length 18;
+ pattern "0[xX][0-9a-fA-F]{16}";
+ }
+ description
+ "This parameter reflects value of the sourceClockIdentity attribute in
+ Announce messages, received from the PTP source.
+
+ The string shall be formatted as an 8-octet hex value with the “0x”
+ prefix.";
+ }
+
+ leaf source-port-number {
+ type uint16;
+ description
+ "This parameter reflects value of the sourcePortNumber attribute in
+ Announce messages, received from the PTP source.";
+ }
+
+ leaf current-utc-offset {
+ type int16;
+ description
+ "The offset between TAI and UTC when the epoch of the PTP system is
+ the PTP epoch, i.e., when ptp-timescale is TRUE; otherwise, the value
+ has no meaning";
+ }
+
+ leaf priority1 {
+ type int8;
+ description
+ "This parameter reflects value of the priority1 attribute in Announce
+ messages, received from the PTP source.";
+ }
+
+ leaf clock-class {
+ type int8;
+ description
+ "This parameter reflects value of the clockClass attribute in
+ Announce messages, received from the PTP source.";
+ }
+
+ leaf clock-accuracy {
+ type int8;
+ description
+ "This parameter reflects value of the clockAccuracy attribute in
+ Announce messages, received from the PTP source.";
+ }
+
+ leaf offset-scaled-log-variance {
+ type uint16;
+ description
+ "This parameter reflects value of the offsetScaledLogVariance
+ attribute in Announce messages, received from the PTP source.";
+ }
+
+ leaf priority2 {
+ type uint8;
+ description
+ "This parameter reflects value of the priority2 attribute in Announce
+ messages, received from the PTP source.";
+ }
+
+ leaf grandmaster-clock-identity {
+ type string;
+ description
+ "This parameter reflects value of the grandmasterClockIdentity
+ attribute in Announce messages, received from the PTP source.
+
+ The string shall be formatted as an 8-octet hex value with the “0x”
+ prefix.";
+ }
+
+ leaf steps-removed {
+ type uint16;
+ description
+ "This parameter reflects value of the stepsRemoved attribute in
+ Announce messages, received from the PTP source.
+
+ It indicates the number of communication paths traversed
+ between the local clock and the grandmaster clock.";
+ }
+
+ leaf time-source {
+ type uint8;
+ description
+ "This parameter reflects value of the timeSource attribute in
+ Announce messages, received from the PTP source.";
+ }
+ }
+ }
+
+ container synce-status {
+ description
+ "SyncE status container";
+
+ leaf reporting-period {
+ type uint8;
+ default 10;
+ description
+ "This parameter defines minimum period in seconds between reports,
+ sent by the NETCONF client, for parameters in this container.";
+ }
+
+ leaf lock-state {
+ type enumeration {
+ enum LOCKED {
+ description
+ "The integrated ordinary clock is synchronizing to the reference, recovered from SyncE signal";
+ }
+ enum UNLOCKED {
+ description
+ "The integrated ordinary clock is not synchronizing to the reference, recovered from SyncE signal";
+ }
+ }
+ config false;
+ description
+ "This parameter indicates, whether the integrated ordinary clock is
+ synchronizing to the reference, recovered from SyncE signal.
+
+ The exact definition when to indicate locked or unlocked is up to
+ specific implementation.";
+ }
+
+ list sources {
+ key local-port-number;
+ config false;
+ leaf local-port-number {
+ type uint16;
+ //fixme - change to leafref once interfaces ae agreed
+ description
+ "This is reference to portNumber of ExternalEthernetPort to identify
+ the port, where the SyncE signal is located.";
+ }
+
+ leaf state {
+ type enumeration {
+ enum PARENT {
+ description
+ "Indicates that this source is the current master clock, i.e. the clock,
+ which the clock, controlled by the Netconf Server, is synchronized to";
+ }
+ enum OK {
+ description
+ "Indicates that this source is an alternate master, which the clock,
+ controlled by the Netconf Server, can potentially synchronize to,
+ i.e. clock class and priority, announced by the master clock is lower,
+ compared to those of the clock, controlled by the Netconf Server,
+ and and the clock class is accepted";
+ }
+ enum NOK {
+ description
+ "Indicates that this source is an alternate master, which the clock,
+ controlled by the Netconf Server, has an operational connection to,
+ but the class or priority of the master clock is higher or equal
+ to those of the clock, controlled by the Netconf Server,
+ or the clock class is not accepted";
+ }
+ enum DISABLED {
+ description
+ "Indicates that this source is an alternate master, which the clock,
+ controlled by the Netconf Server, has no operational connection to";
+ }
+ }
+ description
+ "This parameter indicates status of the SyncE source";
+ }
+
+ leaf quality-level {
+ type uint8 {
+ range 0..15;
+ }
+ description
+ "This parameter contains value of the SSM clock quality level,
+ received in SSM messages from the SyncE source.";
+ }
+ min-elements 1;
+ description
+ "This parameter contains characteristics of SyncE sources of the clock, controlled by the RU.";
+ }
+ }
+ container gnss-state {
+ if-feature GNSS;
+ config false;
+ description
+ "Provides information about state of gps receiver";
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ description
+ "A name that is unique across the RU that identifies a GNSS instance.
+ This name may be used in fault management to refer to a
+ fault source or affected object";
+ }
+ leaf gnss-status {
+ type enumeration {
+ enum SYNCHRONIZED {
+ description "GNSS functionality is synchronized";
+ }
+ enum ACQUIRING-SYNC {
+ description "GNSS functionality is acquiring sync";
+ }
+ enum ANTENNA-DISCONNECTED {
+ description "GNSS functionality has its antenna disconnected";
+ }
+ enum BOOTING {
+ description "GNSS functionality is booting";
+ }
+ enum ANTENNA-SHORT-CIRCUIT {
+ description "GNSS functionality has an antenna short circuit";
+ }
+ }
+ description "when available, indicates the status of the gnss receiver.";
+ }
+ container gnss-data {
+ when "../gnss-status='SYNCHRONIZED'";
+ description
+ "GPS data contained";
+ leaf satellites-tracked {
+ type uint8;
+ description "Number of satellites tracked";
+ }
+ container location {
+ description
+ "Containes information about geo location";
+ leaf altitude {
+ type int64;
+ units millimeter;
+ description
+ "Distance above the sea level.";
+ }
+ leaf latitude {
+ type geographic-coordinate-degree {
+ range "-90..90";
+ }
+ description
+ "Relative position north or south on the Earth's surface.";
+ }
+ leaf longitude {
+ type geographic-coordinate-degree {
+ range "-180..180";
+ }
+ description
+ "Angular distance east or west on the Earth's surface.";
+ }
+ }
+ }
+ }
+ }
+
+ //notification statement
+ notification synchronization-state-change {
+ description
+ "Notification used to inform about synchronization state change";
+
+ leaf sync-state {
+ type leafref {
+ path "/sync/sync-status/sync-state";
+ }
+ description
+ "State of RU synchronization is notified at state change";
+ }
+ }
+
+ notification ptp-state-change {
+ description
+ "Notification used to inform about ptp synchronization state change";
+
+ leaf ptp-state{
+ type leafref{
+ path "/sync/ptp-status/lock-state";
+ }
+ description
+ "ptp-state-change notification is signalled from RU at state change";
+ }
+ }
+ notification synce-state-change {
+ description
+ "Notification used to inform about synce synchronization state change";
+
+ leaf synce-state{
+ type leafref{
+ path "/sync/synce-status/lock-state";
+ }
+ description
+ "synce-state change notification is signalled from RU at state change";
+ }
+ }
+ notification gnss-state-change {
+ if-feature GNSS;
+ description
+ "Notification used to inform about gnss synchronization state change";
+
+ leaf gnss-state{
+ type leafref{
+ path "/sync/gnss-state/gnss-status";
+ }
+ description
+ "gnss-state-change notification is signalled from RU at state change";
+ }
+ }
+
+}
--- /dev/null
+module xran-transceiver {
+ yang-version 1.1;
+ namespace "urn:xran:transceiver:1.0";
+ prefix "xran-transceiver";
+
+ import xran-interfaces {
+ prefix "xran-int";
+ }
+
+ import ietf-interfaces {
+ prefix "if";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the operational state data for SFP transceivers used in
+ an xRAN Radio Unit.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ container port-transceivers {
+ description
+ "Container for Port transceiver information.
+ Leaf nodes providing parameters status and diagnostic
+ information for pluggable transceiver module (like SFP,
+ SFP+, SFP28)";
+ list port-transceiver-data {
+ key "interface-name port-number";
+ description "data recovered from port transceivers";
+ leaf interface-name {
+ type leafref {
+ path "/if:interfaces/if:interface/if:name";
+ }
+ description "Name of interface";
+ }
+ leaf port-number {
+ type leafref {
+ path "/if:interfaces/if:interface[if:name = current()/../interface-name]/xran-int:port-reference/xran-int:xran-port-number";
+ }
+ description
+ "A number which identifies a port. In case of SFP/SFP+
+ port, port number value is 0 to N-1 where N is number of ports
+ in the device. Numbers 0 to N-1 are assigned to ports in order
+ following order of labels on the device (labels for ports are
+ not necessarily numbers starting from zero)";
+ }
+
+ leaf name {
+ type string {
+ length "1..255";
+ }
+ description
+ "A name that is unique across the RU that identifies a transceiver instance.
+ This name may be used in fault management to refer to a fault source
+ or affected object";
+ }
+
+ leaf present {
+ type boolean;
+ config false;
+ mandatory true;
+ description
+ "Indicates if pluggable transceiver module is present.";
+ }
+
+ leaf vendor-id {
+ type string {
+ length 1..16;
+ }
+ config false;
+ description
+ "Name of the transciever vendor Full name of transceiver vendor,
+ that contains ASCII characters, left-aligned with
+ any padding on the right with ASCII spaces (20h), or ASCII nul
+ (00h) removed, and ASCII less-than (3Ch) replaced with ASCII
+ open-brace (7Bh) and ASCII more-than (3Eh) replaced with ASCII
+ close-brace (7Dh).
+
+ Optional node included when the NETCONF Server has determined
+ the vendor ID.";
+ }
+
+ leaf vendor-part {
+ type string {
+ length 1..16;
+ }
+ config false;
+ description
+ "Transceiver vendors part number, that contains ASCII characters,
+ left-aligned with any padding on the right with ASCII spaces
+ (20h), or ASCII nul (00h) removed, and ASCII less-than (3Ch)
+ replaced with ASCII open-brace (7Bh) and ASCII more-than (3Eh)
+ replaced with ASCII close-brace (7Dh).
+
+ Optional node included when the NETCONF Server has determined
+ the vendor part number.";
+ }
+
+ leaf vendor-rev {
+ type string {
+ length 1..2;
+ }
+ config false;
+ description
+ "Transceiver vendors revision number. 2-octet field that
+ contains ASCII characters.
+
+ Optional node included when the NETCONF Server has determined
+ the vendor revision number";
+ }
+
+ leaf serial-no {
+ type string {
+ length 1..16;
+ }
+ config false;
+ description
+ "Transceiver serial number encoded using ASCII characters,
+ left-aligned with any padding on the right with ASCII spaces
+ (20h), or ASCII nul (00h) removed, and ASCII less-than (3Ch)
+ replaced with ASCII open-brace (7Bh) and ASCII more-than (3Eh)
+ replaced with ASCII close-brace (7Dh).
+
+ Optional node included when the NETCONF Server has determined
+ the serial number.";
+ }
+
+ leaf SFF8472-compliance-code {
+ type enumeration {
+ enum diagnostics-undefined {
+ description "undefined compliance code";
+ }
+ enum rev9.3-diagnostics {
+ description "diagnostics published 08-01-02";
+ }
+ enum rev9.5-diagnostics{
+ description "diagnostics published 06-01-04";
+ }
+ enum rev10.2-diagnostics{
+ description "diagnostics published 06-01-07";
+ }
+ enum rev11.0-diagnostics{
+ description "diagnostics published 05-21-10";
+ }
+ enum rev11.3-diagnostics{
+ description "diagnostics published 06-11-13";
+ }
+ enum rev11.4-diagnostics{
+ description "diagnostics published 07-24-14";
+ }
+ enum rev12.0-diagnostics{
+ description "diagnostics published 08-28-14";
+ }
+ }
+ config false;
+ description
+ "Indication of which feature set(s) are
+ implemented in the transceiver from Byte 94 of address A0h
+ https://ta.snia.org/higherlogic/ws/public/download/294/SFF-8472.PDF";
+
+ // FIXME is this optional or mandatory?
+ reference "https://ta.snia.org/higherlogic/ws/public/download/294/SFF-8472.PDF";
+ }
+
+ leaf connector-type {
+ type enumeration {
+ enum unknown {
+ description "encoded as 00h in Table 4-3 of SFF-8024";
+ }
+ enum subscrber-connector {
+ description "encoded as 01h in Table 4-3 of SFF-8024";
+ }
+ enum fiber-jack {
+ description "encoded as 06h in Table 4-3 of SFF-8024";
+ }
+ enum lucent-connector {
+ description "encoded as 07h in Table 4-3 of SFF-8024";
+ }
+ enum mt-rj {
+ description "encoded as 08h in Table 4-3 of SFF-8024";
+ }
+ enum multiple-optical {
+ description "encoded as 09h in Table 4-3 of SFF-8024";
+ }
+ enum sg {
+ description "encoded as 0Ah in Table 4-3 of SFF-8024";
+ }
+ enum optical-pigtail {
+ description "encoded as 0Bh in Table 4-3 of SFF-8024";
+ }
+ enum multi-fiber-parralel-optic-1x12 {
+ description "encoded as 0Ch in Table 4-3 of SFF-8024";
+ }
+ enum multi-fiber-parralel-optic-2x16 {
+ description "encoded as 0Dh in Table 4-3 of SFF-8024";
+ }
+ enum hssdc_2{
+ description "encoded as 20h in Table 4-3 of SFF-8024";
+ }
+ enum copper-pigtail{
+ description "encoded as 21h in Table 4-3 of SFF-8024";
+ }
+ enum rj45{
+ description "encoded as 22h in Table 4-3 of SFF-8024";
+ }
+ enum no-separable-connector{
+ description "encoded as 23h in Table 4-3 of SFF-8024";
+ }
+ enum mxc-2x16{
+ description "encoded as 24h in Table 4-3 of SFF-8024";
+ }
+ }
+ config false;
+ // TOCHECK: Remove any enumerations which are not applicable
+ description
+ "Connector-type indicates the external optical or electrical cable
+ connector provided as the media interface as defined in the connector
+ types derived from table 4-3 in SFF-8024.";
+ // FIXME is this optional or mandatory?
+ reference "https://ta.snia.org/higherlogic/ws/public/document?document_id=944";
+ }
+
+ leaf nominal-bitrate {
+ type uint32;
+ config false;
+ description
+ "Nominal bitrate in Mb/s (10^6 bits per second).
+ If needed actual value is rounded to nearest integer.
+
+ Optional node included when the NETCONF Server has determined
+ the nominal bit rate.";
+ }
+
+ leaf low-bitrate-margin {
+ type uint8;
+ config false;
+ description
+ "Minimum supported bitrate as percentage of nominal bitrate
+ below nominal bitrate.
+
+ Optional node included when the NETCONF Server has determined
+ the low bit rate margin";
+ }
+
+ leaf high-bitrate-margin {
+ type uint8;
+ config false;
+ description
+ "Maximum supported bitrate as percentage of nominal bitrate
+ above nominal bitrate.
+
+ Optional node included when the NETCONF Server has determined
+ the high bitrate margin.";
+ }
+
+ leaf rx-power-type {
+ type enumeration {
+ enum oma {
+ description "oma = optical modulation amplitude";
+ }
+ enum avp{
+ description "avp = average power";
+ }
+ }
+ config false;
+ description
+ "Receieved power measurement type
+ oma = optical modulation amplitude
+ avp = average power";
+ // FIXME is this optional or mandatory?
+ }
+
+ leaf rx-power {
+ type decimal64{
+ fraction-digits 4;
+ }
+ config false;
+ description
+ "Measured RX input power in mW.
+
+ Optional node included when the NETCONF Server has determined
+ the measured RX power.";
+ }
+
+ leaf tx-power {
+ type decimal64{
+ fraction-digits 4;
+ }
+ config false;
+ description
+ "Measured coupled TX output power in mW.
+
+ Optional node included when the NETCONF Server has determined
+ the measured coupled TX power.";
+ }
+
+ leaf tx-bias-current {
+ type decimal64{
+ fraction-digits 4;
+ }
+ config false;
+ description
+ "Measured transmitter laser bias current in mA.
+
+ Optional node included when the NETCONF Server has determined
+ the tx bias current.";
+ }
+
+ leaf voltage {
+ type decimal64{
+ fraction-digits 4;
+ }
+ config false;
+ description
+ "Internally measured supply voltage in mV.
+
+ Optional node included when the NETCONF Server has determined
+ the internally measured voltage.";
+ }
+
+ leaf temperature {
+ type decimal64 {
+ fraction-digits 4;
+ }
+ config false;
+ description
+ "Internally measured module temperature in degrees Celcius.";
+ // FIXME is this optional or mandatory?
+ }
+ }
+ }
+}
--- /dev/null
+module xran-troubleshooting {
+ yang-version 1.1;
+ namespace "urn:xran:troubleshooting:1.0";
+ prefix "xran-trblsht";
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the operations for the troubleshooting logs on the RU.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+
+ grouping troubleshooting-status-grouping {
+ description "grouping used for troubleshooting RPCs";
+ leaf status {
+ type enumeration {
+ enum SUCCESS {
+ description "rpc completed correctly";
+ }
+ enum FAILURE {
+ description "rpc failed";
+ }
+ }
+ description "result of rpc operation";
+ }
+ leaf failure-reason {
+ when "../status = 'FAILURE'";
+ type string;
+ description "free form text description why error occurred";
+ }
+ }
+
+ rpc start-troubleshooting-logs {
+ description
+ "Management plane triggered to start collecting the troubleshooting logs files of RU.";
+ output {
+ uses troubleshooting-status-grouping;
+ }
+ }
+
+ rpc stop-troubleshooting-logs {
+ description
+ "Management plane triggered to stop collecting the troubleshooting logs files of RU.";
+ output {
+ uses troubleshooting-status-grouping;
+ }
+ }
+
+ notification troubleshooting-log-generated {
+ description
+ "When new log file generated, send this notification.";
+ leaf-list log-file-name {
+ type string;
+ description
+ "The list of troubleshooting log file names on the RU.";
+ }
+ }
+}
--- /dev/null
+module xran-udp-echo {
+ yang-version 1.1;
+ namespace "urn:xran:udpecho:1.0";
+ prefix "xran-echo";
+
+ import xran-interfaces {
+ prefix "xran-int";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module covers off aspects of llss-CU to RU interface transport
+ verification for UDP/IP based C/U plane connections based on UDP Echo.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ container udp-echo-configuration {
+ if-feature xran-int:UDPIP-BASED-CU-PLANE;
+ description "container for the configuration of udp echo";
+
+ leaf enable-udp-echo {
+ type boolean;
+ default false;
+ description
+ "whether RU's UDP ech server is enabled";
+ }
+
+ leaf dscp-config {
+ type enumeration {
+ enum REFLECTIVE {
+ description
+ "DSCP in echoed datagrams is copied from received datagram";
+ }
+ enum EF {
+ description
+ "DSCP in echoed datagrams is always be set to expeditied
+ forwarding Per Hop Behaviour.";
+ }
+ }
+ default EF;
+ description "configuration of UDP echo DSCP";
+ }
+
+ leaf echo-replies-transmitted {
+ type uint32;
+ config false;
+ description
+ "The total number of UDP echo replies transmitted by the RU.";
+ }
+ }
+}
--- /dev/null
+module xran-uplane-conf {
+ yang-version 1.1;
+ namespace "urn:xran:uplane-conf:1.0";
+ prefix "xran-uplane-conf";
+
+ import xran-processing-element {
+ prefix "xran-pe";
+ }
+
+ import ietf-interfaces {
+ prefix "if";
+ }
+
+ import xran-module-cap {
+ prefix "mcap";
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the module capabilities for
+ the xRAN Radio Unit U-Plane configuration.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ grouping eaxc {
+ description
+ "One eAxC identifier (eAxC ID) comprises a band and sector
+ identifier (BandSector_ID), a component-carrier identifier (CC_ID) and a
+ spatial stream identifier (RU_Port_ID).
+
+ In this version of the specification, one eAxC contains only one spatial
+ stream (i.e. one beam per subcarrier) at a time.
+
+ Bit allocation is subdivided as follows:
+ * CU_Port_ID: Used to differentiate processing units at lls-CU
+ * BandSector_ID: Aggregated cell identifier
+ * CC_ID: distinguishes Carrier Components
+ * RU_Port_ID: Used to differentiate spatial streams or beams on the RU
+
+ The bitwidth of each of the above fields is variable this model is supposed to check
+ if we are occpying bits continuously but we do not have to occupy all 16 bits";
+
+
+ leaf cu-port-bitmask {
+ type uint16;
+ mandatory true;
+ description
+ "mask for eaxc-id bits used to encode CU Port ID";
+ }
+
+ leaf band-sector-bitmask {
+ type uint16;
+ mandatory true;
+ description
+ "mask for eaxc-id bits used to encode the band sector ID";
+ }
+
+ leaf ccid-bitmask {
+ type uint16;
+ mandatory true;
+ description
+ "mask for eaxc-id bits used to encode the component carrier id";
+ }
+
+ leaf ru-port-bitmask {
+ type uint16;
+ mandatory true;
+ description
+ "mask for eaxc-id bits used to encode the RU Port ID";
+ }
+
+ leaf eaxc-id {
+ type uint16;
+ mandatory true;
+ description
+ "encoded value of eaxcid to be read by CU-Plane";
+ }
+ }
+
+ container user-plane-configuration {
+ description "top level container for user plane configuration";
+
+ container compression {
+ description
+ "Container which consists of global configurable parameters for compression";
+
+ leaf compression-type {
+ type enumeration {
+ enum STATIC {
+ description
+ "Indicates that static compression method will be used (both compression and IQ bitwidth)";
+ }
+
+ enum DYNAMIC {
+ description
+ "Indicates that dynamic compresion method will be used";
+ }
+ }
+ description
+ "Compression type that lls-CU wants to be supported";
+ }
+
+ leaf bitwidth {
+ when "./../compression-type = 'STATIC'";
+ type uint8;
+ description
+ "Bitwidth to be used in compression";
+ }
+
+ leaf compression-method {
+ when "./../compression-type = 'STATIC'";
+ type enumeration {
+ enum BLOCK_FLOATING_POINT {
+ description
+ "Block floating point compression and decompression will be used";
+ }
+
+ enum BLOCK_SCALING {
+ description
+ "Block scaling compression and decompresion will be used";
+ }
+
+ enum U_LAW {
+ description
+ "u-Law compression and decompresion method will be used";
+ }
+
+ enum BEAMSPACE {
+ description
+ "Beamspace compression and decompression will be used";
+ }
+
+ enum MODULATION {
+ description
+ "Modulation compression and decompression will be used";
+ }
+ }
+ description
+ "Compresion method which can be supported by the RU";
+ }
+ }
+
+ list low-level-tx-links {
+ key name;
+ description
+ "Object model for low-level-tx-link configuration";
+
+ leaf name {
+ type string;
+ description
+ "Unique name of low-level-tx-link object.";
+ }
+
+ leaf processing-element {
+ type leafref {
+ path "/xran-pe:processing-elements/xran-pe:ru-elements/xran-pe:name";
+ }
+ mandatory true;
+ description
+ "Contains name of processing-element to be used as transport by low-level-tx-link";
+ }
+
+ leaf tx-array-carrier {
+ type leafref {
+ path "/user-plane-configuration/tx-array-carriers/name";
+ }
+ mandatory true;
+ description
+ "Contains name of tx-array-carriers MO to be used as transport by low-level-tx-link";
+ }
+
+ leaf low-level-tx-endpoint {
+ type string;
+ must "boolean(../../low-level-tx-endpoints[name = current()])" {
+ error-message "low-level-tx-endpoint you want to set does not exists in /low-level-tx-endpoints/name";
+ }
+ mandatory true;
+ description
+ "Contains name of low-level-tx-endpoints MO to be used as transport by low-level-tx-link";
+ }
+
+ container remote-address {
+ uses eaxc;
+
+ must "( cu-port-bitmask + band-sector-bitmask + ccid-bitmask + ru-port-bitmask ) =
+ '(0 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 511 | 1023 | 2047 | 4095 | 8191 | 16383 | 32767 | 65535)'" {
+ error-message "Bitmasks for eaxc-id is badly formatted";
+ }
+
+ description
+ "Contains address of remote TX endpoint served by NETCONF client.";
+ }
+ }
+
+ list low-level-rx-links {
+ key name;
+ description
+ "Object model for low-level-rx-links configuration";
+
+ leaf name {
+ type string;
+
+ description
+ "Unique name of low-level-rx-links object.";
+ }
+
+ leaf processing-element {
+ type leafref {
+ path "/xran-pe:processing-elements/xran-pe:ru-elements/xran-pe:name";
+ }
+ mandatory true;
+ description
+ "Contains name of processing-element to be used as transport by LowLevelTxLink";
+ }
+
+ leaf rx-array-carrier {
+ type leafref {
+ path "/user-plane-configuration/rx-array-carriers/name";
+ }
+ mandatory true;
+
+ description
+ "Contains name of rx-array-carriers MO to be used as transport by low-level-rx-links";
+ }
+
+ leaf low-level-rx-endpoint {
+ type string;
+ must "boolean(../../low-level-rx-endpoints[name = current()])" {
+ error-message "low-level-rx-endpoint you want to set does not exists in /low-level-rx-endpoints/name";
+ }
+ mandatory true;
+
+ description
+ "Contains name of low-level-rx-endpoints MO to be used as transport by low-level-rx-links";
+ }
+
+ container remote-address {
+ uses eaxc;
+
+ must "( cu-port-bitmask + band-sector-bitmask +ccid-bitmask + ru-port-bitmask ) =
+ '(0 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 511 | 1023 | 2047 | 4095 | 8191 | 16383 | 32767 | 65535)'" {
+ error-message "Bitmasks for eaxc-id is badly formatted";
+ }
+
+ description
+ "Contains address of remote RX endpoint served by Netconf client.";
+ }
+
+ leaf priority {
+ type enumeration {
+ enum HIGH {
+ description
+ "Means high priority for link";
+ }
+ enum LOW {
+ description
+ "Means low priority for link";
+ }
+ }
+
+ description
+ "Parameter to set priority for this link";
+ }
+ }
+
+ list static-low-level-tx-endpoints {
+ key name;
+ config false;
+ description
+ "Object model for static-low-level-tx-endpoints configuration";
+
+ leaf name {
+ type string;
+
+ description
+ "Unique name of static-low-level-tx-endpoints object.";
+ }
+
+ leaf interface {
+ type string;
+ must "boolean(/if:interfaces/if:interface[if:name = current()])" {
+ error-message "ethernet-interface you want to set does not exists in /interfaces/interface/name";
+ }
+
+ description
+ "Contains name of ietf:interface to be used as transport by low-level-tx-endpoints";
+ }
+
+ leaf array {
+ type leafref {
+ path "/user-plane-configuration/tx-arrays/name";
+ }
+ description
+ "Contains distname of tx-arrays, particular low-level-tx-endpoints is in hardware dependency with.
+ Note: single instance of tx-arrays can be referenced by many instances of low-level-tx-endpoints
+ (e.g. to allow DU to handle multiple fronthauls and multiple component carriers).";
+ }
+ }
+
+ list static-low-level-rx-endpoints {
+ key name;
+ config false;
+ description
+ "Object model for static-low-level-rx-endpoints configuration";
+
+ leaf name {
+ type string;
+
+ description
+ "Unique name of static-low-level-rx-endpoints object.";
+ }
+
+ leaf interface {
+ type string;
+ must "boolean(/if:interfaces/if:interface[if:name = current()])" {
+ error-message "interface you want to set does not exists in /interfaces/interface/name";
+ }
+
+ description
+ "Contains name of ietf:interface to be used as transport by low-level-rx-endpoints";
+ }
+
+ leaf array {
+ type leafref {
+ path "/user-plane-configuration/rx-arrays/name";
+ }
+ description
+ "Contains distname of rx-arrays, particular low-level-rx-endpoints is in hardware dependency with.
+ Note: single instance of rx-arrays can be referenced by many instances of low-level-rx-endpoints
+ (e.g. to allow DU to handle multiple fronthauls and multiple component carriers).";
+ }
+ }
+
+ list low-level-tx-endpoints {
+ key name;
+ description
+ "Object model for low-level-tx-endpoints configuration - augmented static-low-level-tx-endpoints by local-address
+ which cannot be added to static low-level-tx-endpoints as we cannot have modificable element in static object";
+
+ leaf name {
+ type string;
+ must "boolean(../../static-low-level-tx-endpoints[name = current()])" {
+ error-message "name you want to set does not exist in /static-low-level-tx-endpoints/name";
+ }
+
+ description
+ "Unique name of low-level-tx-endpoint object.";
+ }
+
+ container local-address {
+ uses eaxc;
+
+ must "( cu-port-bitmask + band-sector-bitmask + ccid-bitmask + ru-port-bitmask ) =
+ '(0 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 511 | 1023 | 2047 | 4095 | 8191 | 16383 | 32767 | 65535)'" {
+ error-message "Bitmasks for eaxc-id is badly formatted";
+ }
+ description
+ "Contains local address of low level TX endpoint offered by Netconf server.";
+ }
+ }
+
+
+ list low-level-rx-endpoints {
+ key name;
+ description
+ "Object model for low-level-rx-endpoint configuration - augmented static-low-level-rx-endpoints by local-address
+ which cannot be added to static low-level-rx-endpoints as we cannot have modificable element in static object";
+
+ leaf name {
+ type string;
+ must "boolean(../../static-low-level-rx-endpoints[name = current()])" {
+ error-message "name you want to set does not exist in /static-low-level-rx-endpoints/name";
+ }
+
+ description
+ "Unique name of low-level-rx-endpoint object.";
+ }
+
+ container local-address {
+ uses eaxc;
+
+ must "( cu-port-bitmask + band-sector-bitmask + ccid-bitmask + ru-port-bitmask ) =
+ '(0 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 511 | 1023 | 2047 | 4095 | 8191 | 16383 | 32767 | 65535)'" {
+ error-message "Bitmasks for eaxc-id is badly formatted";
+ }
+
+ description
+ "Contains local address of low level RX endpoint offered by Netconf server.";
+ }
+ }
+
+ list tx-array-carriers {
+ key name;
+ description
+ "Object model for tx-array-carriers configuration";
+
+ leaf name {
+ type string;
+
+ description
+ "Unique name of tx-array-carriers object.";
+ }
+
+ leaf absolute-frequency-center {
+ type uint32;
+ mandatory true;
+ description
+ "Absolute Radio Frequency Channel Number - indirectly indicates RF center carrier frequency of downlink signal.";
+ }
+
+ leaf center-of-channel-bandwidth {
+ type uint64;
+ units Hz;
+ mandatory true;
+ description
+ "Center frequency of channel bandwidth in Hz. Common for all numerologies.";
+ }
+
+ leaf channel-bandwidth {
+ type uint64;
+ units Hz;
+ mandatory true;
+
+ description
+ "Width of carrier given in Hertz";
+ }
+
+
+ leaf power {
+ type decimal64 {
+ fraction-digits 4;
+ }
+ mandatory true;
+
+ description
+ "Transmission power in dBm. Value applicable to each array element carrier belonging to array carrier.";
+ }
+
+ leaf active {
+ type enumeration {
+ enum INACTIVE {
+ description
+ "carrier does not provide signal - transmission is disabled";
+ }
+ enum SLEEP{
+ description
+ "carrier is fully configured and was active but is energy saving mode";
+ }
+ enum ACTIVE{
+ description
+ "carrier is fully configured and properly providing the signal";
+ }
+ }
+ default INACTIVE;
+
+ description
+ "Indicates if transmission is enabled for this tx-array-carriers. Note that Netconf server uses state parameter
+ to indicate actual state of tx-array-carriers operation. When tx-array-carriers is in sleep status,
+ Netconf server rejects all other operation request to tx-array-carriers object except either request to change from sleep
+ to active status or delete MO operation (see 4.8) to the object.";
+ }
+
+ leaf state {
+ type enumeration {
+ enum DISABLED {
+ description
+ "tx-array-carrier is not active - transmission of signal is disabled.";
+ }
+ enum BUSY {
+ description
+ "tx-array-carrier is processing an operation requested by change of active parameter.
+ When tx-array-carriers is BUSY the transmission of signal is not guaranteed.";
+ }
+ enum READY {
+ description
+ "tx-array-carrier had completed activation operation - is active and transmission of signal is ongoing.";
+ }
+ }
+ config false;
+
+ description
+ "Indicates state of tx-array-carriers activation operation";
+ }
+
+ leaf type {
+ type enumeration {
+ enum NR {
+ description
+ "5G technology";
+ }
+ }
+ config false;
+
+ description
+ "Type of carrier. Indicates array-carrier technology.";
+ }
+
+ leaf fft-size {
+ type uint32;
+
+ description
+ "The FFT size defines the number of bins used for dividing the window into equal strips, or bins.
+ Hence, a bin is a spectrum sample, and defines the frequency resolution of the window.";
+ }
+
+ leaf downlink-radio-frame-offset {
+ type uint32 {
+ range 0..12288000;
+ }
+ mandatory true;
+
+ description
+ "This parameter is used for offsetting the starting position of 10ms radio frame.
+ Note: The value should have same value within DU to all tx-array-carrierss that have same frequency and bandwidth.
+ Note2: Unit is 1/1.2288e9 Hz and accuracy is 1/4 Tc. Then, its range is calculated 0..12288000.";
+ }
+
+ leaf downlink-sfn-offset {
+ type int16 {
+ range -32768..32767;
+ }
+ mandatory true;
+
+ description
+ "This parameter is used for offsetting SFN value.
+ Unit is in 10ms.
+ Note: The value should have same value within DU to all tx-array-carrierss that have same frequency and bandwidth.";
+ }
+
+ leaf default-scs {
+ type enumeration {
+ enum KHZ_15 {
+ value 0;
+ description
+ "15kHz sub carrier spacing";
+ }
+ enum KHZ_30 {
+ value 1;
+ description
+ "30kHz sub carrier spacing";
+ }
+ enum KHZ_60 {
+ value 2;
+ description
+ "60kHz sub carrier spacing";
+ }
+ enum KHZ_120 {
+ value 3;
+ description
+ "120kHz sub carrier spacing";
+ }
+ enum KHZ_240 {
+ value 4;
+ description
+ "240kHz sub carrier spacing";
+ }
+ enum KHZ_1_25 {
+ value 12;
+ description
+ "1,25kHz sub carrier spacing";
+ }
+ enum KHZ_5 {
+ value 14;
+ description
+ "5kHz sub carrier spacing";
+ }
+ }
+
+ mandatory true;
+
+ description
+ "Sub-carrier spacing configuration";
+ }
+
+ list scs-specific-config {
+ key scs;
+ description
+ "List of scs-specific configurations";
+ uses scs-config;
+ }
+ leaf cp-length {
+ type uint32;
+ description
+ "CP length woud be determined by deployment types that has different
+ delay spread requirements, and/or determined by frequency bands, service type
+ or determined by whether beam forming technology is used or not";
+ }
+ }
+
+ list rx-array-carriers {
+ key name;
+ description
+ "Object model for rx-array-carriers configuration";
+
+ leaf name {
+ type string;
+ description
+ "Unique name of rx-array-carriers object.";
+ }
+
+
+ leaf absolute-frequency-center {
+ type uint32;
+ mandatory true;
+ description
+ "Absolute Radio Frequency Channel Number - indirectly indicates RF center carrier frequency of downlink signal.";
+ }
+ leaf center-of-channel-bandwidth {
+ type uint64;
+ units Hz;
+ mandatory true;
+ description
+ "Center frequency of channel bandwidth. Common for all numerologies.";
+ }
+ leaf channel-bandwidth {
+ type uint64;
+ units Hz;
+ mandatory true;
+ description
+ "Width of carrier given in Hertz";
+ }
+
+
+ leaf active {
+ type enumeration {
+ enum INACTIVE {
+ description
+ "carrier does not provide signal - transmission is disabled";
+ }
+ enum SLEEP{
+ description
+ "carrier is fully configured and was active but is energy saving mode";
+ }
+ enum ACTIVE{
+ description
+ "carrier is fully configured and properly providing the signal";
+ }
+ }
+ default INACTIVE;
+ description
+ "Indicates if transmission is enabled for this rx-array-carriers. Note that Netconf server uses state parameter
+ to indicate actual state of rx-array-carriers operation. When rx-array-carriers is in sleep status,
+ Netconf server rejects all other operation request to rx-array-carriers object except either request to change from sleep
+ to active status or delete MO operation (see 4.8) to the object.";
+ }
+
+ leaf state {
+ type enumeration {
+ enum DISABLED {
+ description
+ "rx-array-carrier is not active - transmission of signal is disabled.";
+ }
+ enum BUSY {
+ description
+ "rx-array-carrier is processing an operation requested by change of active parameter.
+ When tx-array-carriers is BUSY the transmission of signal is not guaranteed.";
+ }
+ enum READY {
+ description
+ "rx-array-carrier had completed activation operation - is active and transmission of signal is ongoing.";
+ }
+ }
+ config false;
+
+ description
+ "Indicates state of rx-array-carriers activation operation";
+ }
+
+ leaf type {
+ type enumeration {
+ enum NR {
+ description
+ "5G technology";
+ }
+ }
+ config false;
+
+ description
+ "Type of carrier. Indicates array-carrier technology.";
+ }
+
+ leaf fft-size {
+ type uint32;
+ description
+ "FFT size";
+ }
+
+ leaf ul-fft-sampling-offset {
+ type uint32;
+ description
+ "uplink FFT sampling offset";
+ }
+
+ leaf n-ta-offset {
+ type uint32;
+ description
+ "Value of configurable N-TA offset";
+ }
+ leaf default-scs {
+ type enumeration {
+ enum KHZ_15 {
+ value 0;
+ description
+ "15kHz sub carrier spacing";
+ }
+ enum KHZ_30 {
+ value 1;
+ description
+ "30kHz sub carrier spacing";
+ }
+ enum KHZ_60 {
+ value 2;
+ description
+ "60kHz sub carrier spacing";
+ }
+ enum KHZ_120 {
+ value 3;
+ description
+ "120kHz sub carrier spacing";
+ }
+ enum KHZ_240 {
+ value 4;
+ description
+ "240kHz sub carrier spacing";
+ }
+ enum KHZ_1_25 {
+ value 12;
+ description
+ "1,25kHz sub carrier spacing";
+ }
+ enum KHZ_5 {
+ value 14;
+ description
+ "5kHz sub carrier spacing";
+ }
+ }
+ mandatory true;
+
+ description
+ "Sub-carrier spacing configuration";
+ }
+
+ list scs-specific-config {
+ key scs;
+ description
+ "List of static scs-specific configurations";
+ uses scs-config;
+ }
+
+
+ leaf cp-length {
+ type uint32;
+ description
+ "CP length woud be determined by deployment types that has different
+ delay spread requirements, and/or determined by frequency bands, service type
+ or determined by whether beam forming technology is used or not";
+ }
+
+ }
+
+ list tx-arrays {
+ key name;
+ config false;
+ description
+ "Object model for tx-arrays configuration";
+
+ leaf name {
+ type string;
+ description
+ "Unique name of tx-arrays object.";
+ }
+
+ leaf polarisation {
+ type int8 {
+ range "-45 | 0 | 45 | 90";
+ }
+ description
+ "This parameter informing which polarization is served by particular antenna array
+ as per HW design. Expected values are +45 deg, -45 deg, 0 deg and 90 deg.
+ Note: In case of multi-band RU orthogonality is assumed to exist per band, meaning:
+ either pair of +45 deg and -45 deg or pair of 0 deg and 90 deg are expected per band.
+ Non-orthogonal pairs like e.g 0 deg and +45 deg are not expected.";
+ }
+
+ leaf panel-id {
+ type uint8;
+ description
+ "This parameter informing panel particular antenna array is built into.
+ Intended use is to indicate if two orthogonal arrays occupy the same physical panel (e.g. as cross-polarized
+ radiators) or if arrays of different polarizations are built into physically separated panels.";
+ }
+
+ leaf band-number {
+ type leafref {
+ path "/mcap:module-capability/mcap:band-capabilities/mcap:band-number";
+ }
+ description
+ "This parameter informing which frequency band particular antenna
+ array is serving for.
+ Intended use is to deal with multiband solutions.";
+ }
+ }
+
+ list rx-arrays {
+ key name;
+ config false;
+ description
+ "Object model for rx-arrays configuration";
+
+ leaf name {
+ type string;
+ description
+ "Unique name of rx-arrays object.";
+ }
+
+ leaf polarisation {
+ type int8 {
+ range "-45 | 0 | 45 | 90";
+ }
+ description
+ "This parameter informing which polarization is served by particular antenna array
+ as per HW design. Expected values are +45 deg, -45 deg, 0 deg and 90 deg.
+ Note: In case of multi-band RU orthogonality is assumed to exist per band, meaning:
+ either pair of +45 deg and -45 deg or pair of 0 deg and 90 deg are expected per band.
+ Non-orthogonal pairs like e.g 0 deg and +45 deg are not expected.";
+ }
+
+ leaf panel-id {
+ type uint8;
+ description
+ "This parameter informing panel particular antenna array is built
+ into.
+ Intended use is to indicate if two orthogonal arrays occupy the same
+ physical panel (e.g. as cross-polarized radiators) or if arrays of
+ different polarizations are built into physically separated panels.";
+ }
+
+ leaf band-number {
+ type leafref {
+ path "/mcap:module-capability/mcap:band-capabilities/mcap:band-number";
+ }
+ description
+ "This parameter informing which frequency band particular antenna
+ array is serving for.
+ Intended use is to deal with multiband solutions.";
+ }
+ }
+ }
+
+ grouping scs-config {
+ description
+ "It groups all parameters related to SCS configuration";
+
+ leaf scs {
+ type enumeration {
+ enum KHZ_15 {
+ value 0;
+ description
+ "15kHz sub carrier spacing";
+ }
+ enum KHZ_30 {
+ value 1;
+ description
+ "30kHz sub carrier spacing";
+ }
+ enum KHZ_60 {
+ value 2;
+ description
+ "60kHz sub carrier spacing";
+ }
+ enum KHZ_120 {
+ value 3;
+ description
+ "120kHz sub carrier spacing";
+ }
+ enum KHZ_240 {
+ value 4;
+ description
+ "240kHz sub carrier spacing";
+ }
+ enum KHZ_1_25 {
+ value 12;
+ description
+ "1,25kHz sub carrier spacing";
+ }
+ enum KHZ_5 {
+ value 14;
+ description
+ "5kHz sub carrier spacing";
+ }
+ }
+ description
+ "Sub-carrier spacing configuration";
+ }
+ leaf offset-to-absolute-frequency-center {
+ type int32;
+ mandatory true;
+ description
+ "Offset to center-of-carrier-bandwidth. Mostly negative value. Granularity of this parameter is 0.5 SCS";
+ }
+
+ leaf number-of-prbs {
+ type uint32;
+ mandatory true;
+ description
+ "Number of physical resource blocks.";
+ }
+ }
+
+
+}
--- /dev/null
+module xran-usermgmt {
+ yang-version 1.1;
+ namespace "urn:xran:user-mgmt:1.0";
+ prefix "xran-usermgmt";
+
+ // import openroadm user management
+ import org-openroadm-user-mgmt {
+ prefix openroadm;
+ revision-date 2017-12-15;
+ }
+
+ organization "xRAN Forum";
+
+ contact
+ "www.xran.org";
+
+ description
+ "This module defines the user management model for the xRAN Radio Unit.
+ The model is an augmentation of the user management model defined by
+ the openroadm MSA.
+
+ Copyright 2018 the xRAN Forum.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the above disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the above disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the Members of the xRAN Forum nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.";
+
+ revision "2018-07-20" {
+ description
+ "version 1.0.0 - First release of the xRAN YANG M-Plane models.
+
+ This version of the model supports v01.00 of the corrsponding xRAN
+ M-Plane Specification.";
+ reference "XRAN-FH.MP.0-v01.00";
+ }
+
+ grouping extended-xran-groups {
+ description
+ "New user permissions defined by xran.
+ Imported openroadm model only supports 'sudo' superuser permissions.";
+ leaf-list xran-group {
+ type enumeration {
+ enum nms {
+ description "Network Management System permissions";
+ }
+ enum fm-pm {
+ description
+ "permissions for fault and performance management.";
+ }
+ enum swm {
+ description
+ "permissions for software managemet.";
+ }
+ }
+ description
+ "new group privileges defined by xRAN - a non sudo account may have
+ multiple group privileges.
+
+ See the xRAN management Plane specification for a list of YANG module
+ privileges";
+ }
+ }
+
+ container xran-user-profile {
+ description "baseline open-roadm user profile";
+ uses openroadm:user-profile;
+ }
+
+ augment "/xran-usermgmt:xran-user-profile/xran-usermgmt:user" {
+ description "add in new xran user group permissions";
+ uses extended-xran-groups;
+ leaf enabled {
+ type boolean;
+ must "count(../enabled='true') > 0" {
+ error-message "At least one account needs to be enabled.";
+ }
+ description
+ "Indicates whether an account is enabled or disabled.";
+ }
+ }
+}