Refactor folder structure. 15/3115/2
authorAlex Stancu <alexandru.stancu@highstreet-technologies.com>
Thu, 2 Apr 2020 10:11:42 +0000 (13:11 +0300)
committerAlex Stancu <alexandru.stancu@highstreet-technologies.com>
Thu, 2 Apr 2020 10:36:28 +0000 (10:36 +0000)
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>
160 files changed:
docker-build-manager.sh [deleted file]
docker-build-model.sh [deleted file]
ntsimulator/CMakeLists.txt
ntsimulator/deploy/manager/Dockerfile [deleted file]
ntsimulator/deploy/manager/container-tag.yaml [deleted file]
ntsimulator/deploy/nts-manager/CMakeLists.txt [new file with mode: 0644]
ntsimulator/deploy/nts-manager/Dockerfile [new file with mode: 0644]
ntsimulator/deploy/nts-manager/container-tag.yaml [new file with mode: 0644]
ntsimulator/deploy/nts-manager/model-install.sh.in [new file with mode: 0755]
ntsimulator/deploy/nts-manager/supervisord.conf [moved from ntsimulator/deploy/manager/supervisord.conf.manager with 100% similarity]
ntsimulator/deploy/o-ran-sc/o-ran-ru/CMakeLists.txt [new file with mode: 0644]
ntsimulator/deploy/o-ran-sc/o-ran-ru/Dockerfile [new file with mode: 0644]
ntsimulator/deploy/o-ran-sc/o-ran-ru/container-tag.yaml [new file with mode: 0644]
ntsimulator/deploy/o-ran-sc/o-ran-ru/stock_config.xml [new file with mode: 0644]
ntsimulator/deploy/o-ran-sc/o-ran-ru/supervisord.conf [new file with mode: 0644]
ntsimulator/deploy/o-ran-sc/o-ran-ru/sysrepo-configuration-load.sh [new file with mode: 0755]
ntsimulator/deploy/o-ran/ru-fh/CMakeLists.txt [new file with mode: 0644]
ntsimulator/deploy/o-ran/ru-fh/Dockerfile [new file with mode: 0644]
ntsimulator/deploy/o-ran/ru-fh/container-tag.yaml [new file with mode: 0644]
ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.sh [new file with mode: 0755]
ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.xml [new file with mode: 0644]
ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.sh [new file with mode: 0755]
ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.xml [new file with mode: 0644]
ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.sh [new file with mode: 0755]
ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.xml [new file with mode: 0644]
ntsimulator/deploy/o-ran/ru-fh/stock_config.xml [new file with mode: 0644]
ntsimulator/deploy/o-ran/ru-fh/supervisord.conf [new file with mode: 0644]
ntsimulator/deploy/tls/ca.key [new file with mode: 0644]
ntsimulator/deploy/tls/ca.pem [new file with mode: 0644]
ntsimulator/deploy/tls/ca.srl [new file with mode: 0644]
ntsimulator/deploy/tls/client.crt [new file with mode: 0644]
ntsimulator/deploy/tls/client.key [new file with mode: 0644]
ntsimulator/deploy/tls/enable_ssh_key.sh [new file with mode: 0755]
ntsimulator/deploy/tls/enable_tls.sh [new file with mode: 0755]
ntsimulator/deploy/tls/netconf_browser.crt [new file with mode: 0644]
ntsimulator/deploy/tls/netconf_browser.csr [new file with mode: 0644]
ntsimulator/deploy/x-ran/CMakeLists.txt [new file with mode: 0644]
ntsimulator/deploy/x-ran/Dockerfile [new file with mode: 0644]
ntsimulator/deploy/x-ran/container-tag.yaml [new file with mode: 0644]
ntsimulator/deploy/x-ran/edit-config-after-activate.sh [new file with mode: 0755]
ntsimulator/deploy/x-ran/edit-config-after-activate.xml [new file with mode: 0644]
ntsimulator/deploy/x-ran/edit-config-after-download.sh [new file with mode: 0755]
ntsimulator/deploy/x-ran/edit-config-after-download.xml [new file with mode: 0644]
ntsimulator/deploy/x-ran/edit-config-demo-start.sh [new file with mode: 0755]
ntsimulator/deploy/x-ran/edit-config-demo-start.xml [new file with mode: 0644]
ntsimulator/deploy/x-ran/stock_config.xml [new file with mode: 0644]
ntsimulator/deploy/x-ran/supervisord.conf [new file with mode: 0644]
ntsimulator/docker-build-nts-manager.sh [new file with mode: 0755]
ntsimulator/docker-build-nts-o-ran-ru-fh.sh [new file with mode: 0755]
ntsimulator/docker-build-nts-o-ran-sc-o-ran-ru.sh [new file with mode: 0755]
ntsimulator/docker-build-nts-xran.sh [new file with mode: 0755]
ntsimulator/scripts/clean.sh
ntsimulator/src/ntsimulator-manager/ntsimulator-manager.c
ntsimulator/src/ntsimulator-manager/simulator-operations.c
ntsimulator/src/o-ran-notifications/o-ran-notifications.c
ntsimulator/src/software-management-oran/CMakeLists.txt [new file with mode: 0644]
ntsimulator/src/software-management-oran/sw-management-rpc.c [new file with mode: 0644]
ntsimulator/src/software-management-xran/CMakeLists.txt [new file with mode: 0644]
ntsimulator/src/software-management-xran/sw-management-rpc.c [new file with mode: 0644]
ntsimulator/src/utils/utils.c
ntsimulator/src/ves-messages/heartbeat.c
ntsimulator/yang/auto-load-yangs.sh
ntsimulator/yang/nts-manager/network-topology-simulator.xml [moved from ntsimulator/yang/manager/network-topology-simulator.xml with 100% similarity]
ntsimulator/yang/nts-manager/network-topology-simulator.yang [moved from ntsimulator/yang/manager/network-topology-simulator.yang with 100% similarity]
ntsimulator/yang/o-ran-sc/o-ran-ru/iana-hardware.yang [moved from ntsimulator/yang/iana-hardware.yang with 100% similarity, mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-alarms.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-hardware.yang [moved from ntsimulator/yang/ietf-hardware.yang with 100% similarity, mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-inet-types.yang [moved from ntsimulator/yang/ietf-inet-types.yang with 100% similarity, mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-interfaces.yang [moved from ntsimulator/yang/ietf-interfaces.yang with 100% similarity]
ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-yang-types.yang [moved from ntsimulator/yang/ietf-yang-types.yang with 100% similarity, mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-alarms-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-common-alarms-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-hardware-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-interfaces-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-root-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-alarms-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-types-v1.yang [new file with mode: 0644]
ntsimulator/yang/o-ran/ru-fh/iana-hardware.yang [new file with mode: 0644]
ntsimulator/yang/o-ran/ru-fh/iana-if-type.yang [moved from ntsimulator/yang/iana-if-type.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/ietf-crypto-types.yang [moved from ntsimulator/yang/ietf-crypto-types.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/ietf-dhcpv6-types.yang [moved from ntsimulator/yang/ietf-dhcpv6-types.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/ietf-hardware.yang [new file with mode: 0644]
ntsimulator/yang/o-ran/ru-fh/ietf-inet-types.yang [new file with mode: 0644]
ntsimulator/yang/o-ran/ru-fh/ietf-interfaces.yang [new file with mode: 0644]
ntsimulator/yang/o-ran/ru-fh/ietf-ip.yang [moved from ntsimulator/yang/ietf-ip.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/ietf-netconf-acm.yang [moved from ntsimulator/yang/ietf-netconf-acm.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/ietf-netconf-monitoring.yang [moved from ntsimulator/yang/ietf-netconf-monitoring.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/ietf-yang-types.yang [new file with mode: 0644]
ntsimulator/yang/o-ran/ru-fh/o-ran-alarm-id.yang [moved from ntsimulator/yang/o-ran-alarm-id.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-ald-port.yang [moved from ntsimulator/yang/o-ran-ald-port.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-ald.yang [moved from ntsimulator/yang/o-ran-ald.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-beamforming.yang [moved from ntsimulator/yang/o-ran-beamforming.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-compression-factors.yang [moved from ntsimulator/yang/o-ran-compression-factors.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-delay-management.yang [moved from ntsimulator/yang/o-ran-delay-management.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-dhcp.yang [moved from ntsimulator/yang/o-ran-dhcp.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-ecpri-delay.yang [moved from ntsimulator/yang/o-ran-ecpri-delay.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-externalio.yang [moved from ntsimulator/yang/o-ran-externalio.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-fan.yang [moved from ntsimulator/yang/o-ran-fan.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-file-management.yang [moved from ntsimulator/yang/o-ran-file-management.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-fm.yang [moved from ntsimulator/yang/o-ran-fm.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-hardware.yang [moved from ntsimulator/yang/o-ran-hardware.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-interfaces.yang [moved from ntsimulator/yang/o-ran-interfaces.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-laa-operations.yang [moved from ntsimulator/yang/o-ran-laa-operations.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-laa.yang [moved from ntsimulator/yang/o-ran-laa.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-lbm.yang [moved from ntsimulator/yang/o-ran-lbm.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-module-cap.yang [moved from ntsimulator/yang/o-ran-module-cap.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-mplane-int.yang [moved from ntsimulator/yang/o-ran-mplane-int.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-operations.yang [moved from ntsimulator/yang/o-ran-operations.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-performance-management.yang [moved from ntsimulator/yang/o-ran-performance-management.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-processing-element.yang [moved from ntsimulator/yang/o-ran-processing-element.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-software-management.yang [moved from ntsimulator/yang/o-ran-software-management.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-supervision.yang [moved from ntsimulator/yang/o-ran-supervision.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-sync.yang [moved from ntsimulator/yang/o-ran-sync.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-trace.yang [moved from ntsimulator/yang/o-ran-trace.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-transceiver.yang [moved from ntsimulator/yang/o-ran-transceiver.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-troubleshooting.yang [moved from ntsimulator/yang/o-ran-troubleshooting.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-udp-echo.yang [moved from ntsimulator/yang/o-ran-udp-echo.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-uplane-conf.yang [moved from ntsimulator/yang/o-ran-uplane-conf.yang with 100% similarity]
ntsimulator/yang/o-ran/ru-fh/o-ran-usermgmt.yang [moved from ntsimulator/yang/o-ran-usermgmt.yang with 100% similarity]
ntsimulator/yang/sysrepo-configuration-load.sh
ntsimulator/yang/x-ran/iana-hardware.yang [new file with mode: 0755]
ntsimulator/yang/x-ran/iana-if-type.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/ietf-crypto-types.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/ietf-dhcpv6-types.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/ietf-hardware.yang [new file with mode: 0755]
ntsimulator/yang/x-ran/ietf-inet-types.yang [new file with mode: 0755]
ntsimulator/yang/x-ran/ietf-interfaces.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/ietf-ip.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/ietf-netconf-acm.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/ietf-netconf-monitoring.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/ietf-yang-types.yang [new file with mode: 0755]
ntsimulator/yang/x-ran/org-openroadm-user-mgmt.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-alarm-id.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-ald-port.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-ald.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-beamforming.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-delay-management.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-dhcp.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-ecpri-delay.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-externalio.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-fan.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-file-management.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-fm.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-hardware.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-interfaces.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-lbm.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-module-cap.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-mplane-int.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-operations.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-performance-management.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-processing-element.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-software-management.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-supervision.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-sync.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-transceiver.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-troubleshooting.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-udp-echo.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-uplane-conf.yang [new file with mode: 0644]
ntsimulator/yang/x-ran/xran-usermgmt.yang [new file with mode: 0644]

diff --git a/docker-build-manager.sh b/docker-build-manager.sh
deleted file mode 100755 (executable)
index c6a8487..0000000
+++ /dev/null
@@ -1 +0,0 @@
-docker build -t o-ran-sc_ntsim_manager -f ntsimulator/deploy/manager/Dockerfile .
diff --git a/docker-build-model.sh b/docker-build-model.sh
deleted file mode 100755 (executable)
index 168f314..0000000
+++ /dev/null
@@ -1 +0,0 @@
-docker build -t o-ran-sc_ntsim_oran -f ntsimulator/deploy/Dockerfile .
index 3d3c52c..804f80b 100644 (file)
@@ -60,9 +60,6 @@ include_directories(${SYSREPO_INCLUDE_DIR})
 # 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)
diff --git a/ntsimulator/deploy/manager/Dockerfile b/ntsimulator/deploy/manager/Dockerfile
deleted file mode 100644 (file)
index 72395be..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-################################################################################
-#
-# 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"]
diff --git a/ntsimulator/deploy/manager/container-tag.yaml b/ntsimulator/deploy/manager/container-tag.yaml
deleted file mode 100644 (file)
index 12585e7..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
----
-tag: 0.0.2
diff --git a/ntsimulator/deploy/nts-manager/CMakeLists.txt b/ntsimulator/deploy/nts-manager/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7e9a720
--- /dev/null
@@ -0,0 +1,97 @@
+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)")
+
+
+
diff --git a/ntsimulator/deploy/nts-manager/Dockerfile b/ntsimulator/deploy/nts-manager/Dockerfile
new file mode 100644 (file)
index 0000000..bff4bd8
--- /dev/null
@@ -0,0 +1,212 @@
+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"]
diff --git a/ntsimulator/deploy/nts-manager/container-tag.yaml b/ntsimulator/deploy/nts-manager/container-tag.yaml
new file mode 100644 (file)
index 0000000..5df0816
--- /dev/null
@@ -0,0 +1,2 @@
+---
+tag: 0.1.1
diff --git a/ntsimulator/deploy/nts-manager/model-install.sh.in b/ntsimulator/deploy/nts-manager/model-install.sh.in
new file mode 100755 (executable)
index 0000000..11e5c6a
--- /dev/null
@@ -0,0 +1,56 @@
+#!/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
diff --git a/ntsimulator/deploy/o-ran-sc/o-ran-ru/CMakeLists.txt b/ntsimulator/deploy/o-ran-sc/o-ran-ru/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3eec7d7
--- /dev/null
@@ -0,0 +1,16 @@
+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
diff --git a/ntsimulator/deploy/o-ran-sc/o-ran-ru/Dockerfile b/ntsimulator/deploy/o-ran-sc/o-ran-ru/Dockerfile
new file mode 100644 (file)
index 0000000..e70a0a6
--- /dev/null
@@ -0,0 +1,242 @@
+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"]
diff --git a/ntsimulator/deploy/o-ran-sc/o-ran-ru/container-tag.yaml b/ntsimulator/deploy/o-ran-sc/o-ran-ru/container-tag.yaml
new file mode 100644 (file)
index 0000000..5df0816
--- /dev/null
@@ -0,0 +1,2 @@
+---
+tag: 0.1.1
diff --git a/ntsimulator/deploy/o-ran-sc/o-ran-ru/stock_config.xml b/ntsimulator/deploy/o-ran-sc/o-ran-ru/stock_config.xml
new file mode 100644 (file)
index 0000000..014c840
--- /dev/null
@@ -0,0 +1,95 @@
+<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>
diff --git a/ntsimulator/deploy/o-ran-sc/o-ran-ru/supervisord.conf b/ntsimulator/deploy/o-ran-sc/o-ran-ru/supervisord.conf
new file mode 100644 (file)
index 0000000..e4b99fa
--- /dev/null
@@ -0,0 +1,46 @@
+[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
diff --git a/ntsimulator/deploy/o-ran-sc/o-ran-ru/sysrepo-configuration-load.sh b/ntsimulator/deploy/o-ran-sc/o-ran-ru/sysrepo-configuration-load.sh
new file mode 100755 (executable)
index 0000000..34a1e79
--- /dev/null
@@ -0,0 +1,29 @@
+#!/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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/CMakeLists.txt b/ntsimulator/deploy/o-ran/ru-fh/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3294ef2
--- /dev/null
@@ -0,0 +1,20 @@
+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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/Dockerfile b/ntsimulator/deploy/o-ran/ru-fh/Dockerfile
new file mode 100644 (file)
index 0000000..a969262
--- /dev/null
@@ -0,0 +1,251 @@
+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"]
diff --git a/ntsimulator/deploy/o-ran/ru-fh/container-tag.yaml b/ntsimulator/deploy/o-ran/ru-fh/container-tag.yaml
new file mode 100644 (file)
index 0000000..5df0816
--- /dev/null
@@ -0,0 +1,2 @@
+---
+tag: 0.1.1
diff --git a/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.sh b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.sh
new file mode 100755 (executable)
index 0000000..9881695
--- /dev/null
@@ -0,0 +1,15 @@
+#!/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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.xml b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.xml
new file mode 100644 (file)
index 0000000..c96e741
--- /dev/null
@@ -0,0 +1,21 @@
+<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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.sh b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.sh
new file mode 100755 (executable)
index 0000000..7989808
--- /dev/null
@@ -0,0 +1,15 @@
+#!/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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.xml b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.xml
new file mode 100644 (file)
index 0000000..1664ed5
--- /dev/null
@@ -0,0 +1,55 @@
+<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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.sh b/ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.sh
new file mode 100755 (executable)
index 0000000..4967da1
--- /dev/null
@@ -0,0 +1,15 @@
+#!/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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.xml b/ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.xml
new file mode 100644 (file)
index 0000000..c80e463
--- /dev/null
@@ -0,0 +1,117 @@
+<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
diff --git a/ntsimulator/deploy/o-ran/ru-fh/stock_config.xml b/ntsimulator/deploy/o-ran/ru-fh/stock_config.xml
new file mode 100644 (file)
index 0000000..014c840
--- /dev/null
@@ -0,0 +1,95 @@
+<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>
diff --git a/ntsimulator/deploy/o-ran/ru-fh/supervisord.conf b/ntsimulator/deploy/o-ran/ru-fh/supervisord.conf
new file mode 100644 (file)
index 0000000..886a5f9
--- /dev/null
@@ -0,0 +1,64 @@
+[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
diff --git a/ntsimulator/deploy/tls/ca.key b/ntsimulator/deploy/tls/ca.key
new file mode 100644 (file)
index 0000000..fb005ce
--- /dev/null
@@ -0,0 +1,27 @@
+-----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-----
diff --git a/ntsimulator/deploy/tls/ca.pem b/ntsimulator/deploy/tls/ca.pem
new file mode 100644 (file)
index 0000000..62593ab
--- /dev/null
@@ -0,0 +1,24 @@
+-----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-----
diff --git a/ntsimulator/deploy/tls/ca.srl b/ntsimulator/deploy/tls/ca.srl
new file mode 100644 (file)
index 0000000..c10d829
--- /dev/null
@@ -0,0 +1 @@
+91390D611074ACC8
diff --git a/ntsimulator/deploy/tls/client.crt b/ntsimulator/deploy/tls/client.crt
new file mode 100644 (file)
index 0000000..8e52dac
--- /dev/null
@@ -0,0 +1,24 @@
+-----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-----
diff --git a/ntsimulator/deploy/tls/client.key b/ntsimulator/deploy/tls/client.key
new file mode 100644 (file)
index 0000000..7ccdab1
--- /dev/null
@@ -0,0 +1,27 @@
+-----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-----
diff --git a/ntsimulator/deploy/tls/enable_ssh_key.sh b/ntsimulator/deploy/tls/enable_ssh_key.sh
new file mode 100755 (executable)
index 0000000..45b02e6
--- /dev/null
@@ -0,0 +1,34 @@
+#! /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
diff --git a/ntsimulator/deploy/tls/enable_tls.sh b/ntsimulator/deploy/tls/enable_tls.sh
new file mode 100755 (executable)
index 0000000..97b539d
--- /dev/null
@@ -0,0 +1,63 @@
+#! /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
diff --git a/ntsimulator/deploy/tls/netconf_browser.crt b/ntsimulator/deploy/tls/netconf_browser.crt
new file mode 100644 (file)
index 0000000..687579d
--- /dev/null
@@ -0,0 +1,19 @@
+-----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-----
diff --git a/ntsimulator/deploy/tls/netconf_browser.csr b/ntsimulator/deploy/tls/netconf_browser.csr
new file mode 100644 (file)
index 0000000..61d8a4c
--- /dev/null
@@ -0,0 +1,15 @@
+-----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-----
diff --git a/ntsimulator/deploy/x-ran/CMakeLists.txt b/ntsimulator/deploy/x-ran/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e21a060
--- /dev/null
@@ -0,0 +1,19 @@
+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
diff --git a/ntsimulator/deploy/x-ran/Dockerfile b/ntsimulator/deploy/x-ran/Dockerfile
new file mode 100644 (file)
index 0000000..0ecd983
--- /dev/null
@@ -0,0 +1,251 @@
+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"]
diff --git a/ntsimulator/deploy/x-ran/container-tag.yaml b/ntsimulator/deploy/x-ran/container-tag.yaml
new file mode 100644 (file)
index 0000000..5df0816
--- /dev/null
@@ -0,0 +1,2 @@
+---
+tag: 0.1.1
diff --git a/ntsimulator/deploy/x-ran/edit-config-after-activate.sh b/ntsimulator/deploy/x-ran/edit-config-after-activate.sh
new file mode 100755 (executable)
index 0000000..9881695
--- /dev/null
@@ -0,0 +1,15 @@
+#!/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
diff --git a/ntsimulator/deploy/x-ran/edit-config-after-activate.xml b/ntsimulator/deploy/x-ran/edit-config-after-activate.xml
new file mode 100644 (file)
index 0000000..df249c3
--- /dev/null
@@ -0,0 +1,21 @@
+<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
diff --git a/ntsimulator/deploy/x-ran/edit-config-after-download.sh b/ntsimulator/deploy/x-ran/edit-config-after-download.sh
new file mode 100755 (executable)
index 0000000..7989808
--- /dev/null
@@ -0,0 +1,15 @@
+#!/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
diff --git a/ntsimulator/deploy/x-ran/edit-config-after-download.xml b/ntsimulator/deploy/x-ran/edit-config-after-download.xml
new file mode 100644 (file)
index 0000000..7613d58
--- /dev/null
@@ -0,0 +1,55 @@
+<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
diff --git a/ntsimulator/deploy/x-ran/edit-config-demo-start.sh b/ntsimulator/deploy/x-ran/edit-config-demo-start.sh
new file mode 100755 (executable)
index 0000000..4967da1
--- /dev/null
@@ -0,0 +1,15 @@
+#!/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
diff --git a/ntsimulator/deploy/x-ran/edit-config-demo-start.xml b/ntsimulator/deploy/x-ran/edit-config-demo-start.xml
new file mode 100644 (file)
index 0000000..8b77f15
--- /dev/null
@@ -0,0 +1,117 @@
+<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
diff --git a/ntsimulator/deploy/x-ran/stock_config.xml b/ntsimulator/deploy/x-ran/stock_config.xml
new file mode 100644 (file)
index 0000000..014c840
--- /dev/null
@@ -0,0 +1,95 @@
+<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>
diff --git a/ntsimulator/deploy/x-ran/supervisord.conf b/ntsimulator/deploy/x-ran/supervisord.conf
new file mode 100644 (file)
index 0000000..3b37a89
--- /dev/null
@@ -0,0 +1,58 @@
+[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
diff --git a/ntsimulator/docker-build-nts-manager.sh b/ntsimulator/docker-build-nts-manager.sh
new file mode 100755 (executable)
index 0000000..ad6152b
--- /dev/null
@@ -0,0 +1 @@
+docker build -t o-ran-sc/ntsim-manager -f deploy/nts-manager/Dockerfile .
diff --git a/ntsimulator/docker-build-nts-o-ran-ru-fh.sh b/ntsimulator/docker-build-nts-o-ran-ru-fh.sh
new file mode 100755 (executable)
index 0000000..47f328d
--- /dev/null
@@ -0,0 +1 @@
+docker build -t o-ran-sc/ntsim-o-ran-ru-fh -f deploy/o-ran/ru-fh/Dockerfile .
diff --git a/ntsimulator/docker-build-nts-o-ran-sc-o-ran-ru.sh b/ntsimulator/docker-build-nts-o-ran-sc-o-ran-ru.sh
new file mode 100755 (executable)
index 0000000..4449cb9
--- /dev/null
@@ -0,0 +1 @@
+docker build -t o-ran-sc/ntsim-o-ran-sc-o-ran-ru -f deploy/o-ran-sc/o-ran-ru/Dockerfile .
diff --git a/ntsimulator/docker-build-nts-xran.sh b/ntsimulator/docker-build-nts-xran.sh
new file mode 100755 (executable)
index 0000000..f983cd7
--- /dev/null
@@ -0,0 +1 @@
+docker build -t o-ran-sc/ntsim-x-ran -f deploy/x-ran/Dockerfile .
index 2d9bd56..5d21e4c 100755 (executable)
 # 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!"
index b5555c4..e5312b1 100644 (file)
@@ -117,7 +117,7 @@ print_current_config(sr_session_ctx_t *session, const char *module_name)
    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);
@@ -184,7 +184,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
     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);
@@ -198,6 +198,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
     }
 
     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);
@@ -211,6 +212,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        {
                printf("Cannot set mount value greater than number of simulated devices.\n");
                sr_free_val(val);
+                       val = NULL;
                return SR_ERR_OK;
        }
 
@@ -221,6 +223,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
     }
 
     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);
@@ -234,6 +237,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
     }
 
     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);
@@ -247,6 +251,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        }
 
        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);
@@ -260,6 +265,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        }
 
        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);
@@ -273,6 +279,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        }
 
        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);
@@ -286,6 +293,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        }
 
        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);
@@ -299,6 +307,7 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        }
 
        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);
@@ -312,11 +321,17 @@ simulator_config_change_cb(sr_session_ctx_t *session, const char *module_name, s
        }
 
        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;
 }
 
@@ -344,6 +359,7 @@ simulator_status_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
                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;
@@ -445,7 +461,6 @@ int odl_add_key_pair_cb(const char *xpath, const sr_val_t *input, const size_t i
                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;
 
@@ -461,6 +476,7 @@ int odl_add_key_pair_cb(const char *xpath, const sr_val_t *input, const size_t i
        if (rc != SR_ERR_OK)
        {
                printf("Failed to add key pair to ODL.\n");
+               return SR_ERR_OPERATION_FAILED;
        }
 
        return rc;
index a4adcc3..2ff4207 100644 (file)
@@ -1027,6 +1027,7 @@ int get_docker_containers_operational_state_curl(device_stack_t *theStack)
                                        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;
                                        }
                                }
                        }
@@ -1098,7 +1099,7 @@ int notification_delay_period_changed(int period)
        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;
        }
 
@@ -1106,7 +1107,7 @@ int notification_delay_period_changed(int period)
        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;
        }
 
@@ -1117,7 +1118,7 @@ int notification_delay_period_changed(int period)
        stringConfiguration = cJSON_Print(jsonConfig);
        writeConfigFile(stringConfiguration);
 
-       free(jsonConfig);
+       cJSON_Delete(jsonConfig);
 
        return SR_ERR_OK;
 }
@@ -1151,7 +1152,7 @@ int ves_heartbeat_period_changed(int period)
        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;
        }
 
@@ -1159,7 +1160,7 @@ int ves_heartbeat_period_changed(int period)
        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;
        }
 
@@ -1170,7 +1171,7 @@ int ves_heartbeat_period_changed(int period)
        stringConfiguration = cJSON_Print(jsonConfig);
        writeConfigFile(stringConfiguration);
 
-       free(jsonConfig);
+       cJSON_Delete(jsonConfig);
 
        return SR_ERR_OK;
 }
@@ -1402,7 +1403,7 @@ int ves_ip_changed(char *new_ip)
        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;
        }
 
@@ -1410,7 +1411,7 @@ int ves_ip_changed(char *new_ip)
        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;
        }
 
@@ -1421,7 +1422,7 @@ int ves_ip_changed(char *new_ip)
        stringConfiguration = cJSON_Print(jsonConfig);
        writeConfigFile(stringConfiguration);
 
-       free(jsonConfig);
+       cJSON_Delete(jsonConfig);
 
        return SR_ERR_OK;
 }
@@ -1455,7 +1456,7 @@ int ves_port_changed(int new_port)
        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;
        }
 
@@ -1463,7 +1464,7 @@ int ves_port_changed(int new_port)
        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;
        }
 
@@ -1474,7 +1475,7 @@ int ves_port_changed(int new_port)
        stringConfiguration = cJSON_Print(jsonConfig);
        writeConfigFile(stringConfiguration);
 
-       free(jsonConfig);
+       cJSON_Delete(jsonConfig);
 
        return SR_ERR_OK;
 }
@@ -1508,7 +1509,7 @@ int ves_registration_changed(cJSON_bool new_bool)
        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;
        }
 
@@ -1516,7 +1517,7 @@ int ves_registration_changed(cJSON_bool new_bool)
        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;
        }
 
@@ -1527,7 +1528,7 @@ int ves_registration_changed(cJSON_bool new_bool)
        stringConfiguration = cJSON_Print(jsonConfig);
        writeConfigFile(stringConfiguration);
 
-       free(jsonConfig);
+       cJSON_Delete(jsonConfig);
 
        return SR_ERR_OK;
 }
@@ -1561,7 +1562,7 @@ int is_netconf_available_changed(cJSON_bool new_bool)
        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;
        }
 
@@ -1569,7 +1570,7 @@ int is_netconf_available_changed(cJSON_bool new_bool)
        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;
        }
 
@@ -1580,7 +1581,7 @@ int is_netconf_available_changed(cJSON_bool new_bool)
        stringConfiguration = cJSON_Print(jsonConfig);
        writeConfigFile(stringConfiguration);
 
-       free(jsonConfig);
+       cJSON_Delete(jsonConfig);
 
        return SR_ERR_OK;
 }
@@ -1614,7 +1615,7 @@ int is_ves_available_changed(cJSON_bool new_bool)
        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;
        }
 
@@ -1622,7 +1623,7 @@ int is_ves_available_changed(cJSON_bool new_bool)
        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;
        }
 
@@ -1633,7 +1634,7 @@ int is_ves_available_changed(cJSON_bool new_bool)
        stringConfiguration = cJSON_Print(jsonConfig);
        writeConfigFile(stringConfiguration);
 
-       free(jsonConfig);
+       cJSON_Delete(jsonConfig);
 
        return SR_ERR_OK;
 }
index ae6e0c6..ad282d1 100644 (file)
@@ -85,7 +85,7 @@ static int send_fault_ves_message(char *alarm_condition, char *alarm_object, cha
 {
        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);
@@ -129,6 +129,10 @@ static int send_fault_ves_message(char *alarm_condition, char *alarm_object, cha
        if (faultFields == NULL)
        {
                printf("Could not create JSON object: faultFields\n");
+               if (postDataJson != NULL)
+               {
+                       cJSON_Delete(postDataJson);
+               }
                return 1;
        }
        cJSON_AddItemToObject(event, "faultFields", faultFields);
@@ -157,41 +161,6 @@ static int send_fault_ves_message(char *alarm_condition, char *alarm_object, cha
        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;
@@ -358,7 +327,6 @@ main(int argc, char **argv)
         if (notification_delay_period > 0)
         {
                send_dummy_notif(session);
-//             send_dummy_notif_file_mgmt(session);
 
             sleep(notification_delay_period);
         }
diff --git a/ntsimulator/src/software-management-oran/CMakeLists.txt b/ntsimulator/src/software-management-oran/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f49ce32
--- /dev/null
@@ -0,0 +1,16 @@
+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
diff --git a/ntsimulator/src/software-management-oran/sw-management-rpc.c b/ntsimulator/src/software-management-oran/sw-management-rpc.c
new file mode 100644 (file)
index 0000000..1540596
--- /dev/null
@@ -0,0 +1,519 @@
+/**
+ * @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(&notif[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:download-event/file-name");
+    if (trunc_filename != NULL)
+    {
+        sr_val_set_str_data(&notif[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(&notif[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(&notif[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(&notif[current_num_of_values_notif - 1], SR_ENUM_T, "AUTHENTICATION_ERROR");
+    }
+    else
+    {
+        sr_val_set_str_data(&notif[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(&notif[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:install-event/slot-name");
+    sr_val_set_str_data(&notif[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(&notif[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(&notif[current_num_of_values_notif - 1], SR_ENUM_T, "INTEGRITY_ERROR");
+    }
+    else
+    {
+        sr_val_set_str_data(&notif[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(&notif[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:activation-event/slot-name");
+    sr_val_set_str_data(&notif[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(&notif[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(&notif[current_num_of_values_notif - 1], SR_ENUM_T, "APPLICATION_ERROR");
+    }
+    else
+    {
+        sr_val_set_str_data(&notif[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(&notif[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;
+}
diff --git a/ntsimulator/src/software-management-xran/CMakeLists.txt b/ntsimulator/src/software-management-xran/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f49ce32
--- /dev/null
@@ -0,0 +1,16 @@
+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
diff --git a/ntsimulator/src/software-management-xran/sw-management-rpc.c b/ntsimulator/src/software-management-xran/sw-management-rpc.c
new file mode 100644 (file)
index 0000000..b2b5025
--- /dev/null
@@ -0,0 +1,519 @@
+/**
+ * @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(&notif[current_num_of_values_notif - 1], "%s", "/xran-software-management:download-event/file-name");
+    if (trunc_filename != NULL)
+    {
+        sr_val_set_str_data(&notif[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(&notif[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(&notif[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(&notif[current_num_of_values_notif - 1], SR_ENUM_T, "AUTHENTICATION_ERROR");
+    }
+    else
+    {
+        sr_val_set_str_data(&notif[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(&notif[current_num_of_values_notif - 1], "%s", "/xran-software-management:install-event/slot-name");
+    sr_val_set_str_data(&notif[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(&notif[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(&notif[current_num_of_values_notif - 1], SR_ENUM_T, "INTEGRITY_ERROR");
+    }
+    else
+    {
+        sr_val_set_str_data(&notif[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(&notif[current_num_of_values_notif - 1], "%s", "/xran-software-management:activation-event/slot-name");
+    sr_val_set_str_data(&notif[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(&notif[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(&notif[current_num_of_values_notif - 1], SR_ENUM_T, "APPLICATION_ERROR");
+    }
+    else
+    {
+        sr_val_set_str_data(&notif[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(&notif[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;
+}
index af40454..0300ff9 100644 (file)
@@ -21,6 +21,7 @@
 #include <time.h>
 #include <sys/time.h>
 #include <stdio.h>
+#include <string.h>
 
 void set_curl_common_info_ves(CURL *curl)
 {
@@ -167,7 +168,6 @@ void getPreviousDayPmTimestamp(int number_of_intervals, char *date_and_time)
 long int getMicrosecondsSinceEpoch(void)
 {
        time_t t = time(NULL);
-       struct tm tm = *localtime(&t);
        struct timeval tv;
        long int useconds;
 
@@ -192,17 +192,20 @@ void prepare_ves_message_curl(CURL *curl)
 
        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)
@@ -214,6 +217,7 @@ cJSON*      vesCreateCommonEventHeader(char *domain, char *event_type, char *source_n
        if (cJSON_AddStringToObject(commonEventHeader, "domain", domain) == NULL)
        {
                printf("Could not create JSON object: domain\n");
+               cJSON_Delete(commonEventHeader);
                return NULL;
        }
 
@@ -223,6 +227,7 @@ cJSON*      vesCreateCommonEventHeader(char *domain, char *event_type, char *source_n
        if (cJSON_AddStringToObject(commonEventHeader, "eventId", eventId) == NULL)
        {
                printf("Could not create JSON object: eventId\n");
+               cJSON_Delete(commonEventHeader);
                return NULL;
        }
 
@@ -232,96 +237,116 @@ cJSON*   vesCreateCommonEventHeader(char *domain, char *event_type, char *source_n
        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];
@@ -337,12 +362,14 @@ cJSON*    vesCreateHeartbeatFields(int heartbeat_interval)
        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;
        }
 
@@ -350,6 +377,7 @@ cJSON*      vesCreateHeartbeatFields(int heartbeat_interval)
        if (additionalFields == NULL)
        {
                printf("Could not create JSON object: additionalFields\n");
+               cJSON_Delete(heartbeatFields);
                return NULL;
        }
        cJSON_AddItemToObject(heartbeatFields, "additionalFields", additionalFields);
@@ -357,12 +385,18 @@ cJSON*    vesCreateHeartbeatFields(int heartbeat_interval)
        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;
@@ -395,8 +429,6 @@ char*       readConfigFileInString(void)
 
 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");
@@ -436,12 +468,13 @@ int       getFaultNotificationDelayPeriodFromConfigJson(void)
        }
        //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;
        }
 
@@ -449,13 +482,13 @@ int       getFaultNotificationDelayPeriodFromConfigJson(void)
        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;
 }
@@ -484,12 +517,13 @@ int       getVesHeartbeatPeriodFromConfigJson(void)
        }
        //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;
        }
 
@@ -497,13 +531,13 @@ int       getVesHeartbeatPeriodFromConfigJson(void)
        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;
 }
@@ -533,30 +567,31 @@ char*     getVesAuthMethodFromConfigJson(void)
                {
                        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;
 }
@@ -585,30 +620,31 @@ char*     getVesIpFromConfigJson(void)
                {
                        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;
 }
@@ -636,12 +672,13 @@ int       getVesPortFromConfigJson(void)
        }
        //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;
        }
 
@@ -649,13 +686,13 @@ int       getVesPortFromConfigJson(void)
        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;
 }
@@ -683,12 +720,13 @@ int       getVesRegistrationFromConfigJson(void)
        }
        //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;
        }
 
@@ -696,17 +734,22 @@ int       getVesRegistrationFromConfigJson(void)
        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();
@@ -719,12 +762,14 @@ cJSON*    vesCreatePnfRegistrationFields(int port, bool is_tls)
        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;
        }
 
@@ -734,30 +779,35 @@ cJSON*    vesCreatePnfRegistrationFields(int port, bool is_tls)
        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;
        }
 
@@ -767,30 +817,35 @@ cJSON*    vesCreatePnfRegistrationFields(int port, bool is_tls)
        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;
        }
 
@@ -798,6 +853,7 @@ cJSON*      vesCreatePnfRegistrationFields(int port, bool is_tls)
        if (additionalFields == NULL)
        {
                printf("Could not create JSON object: additionalFields\n");
+               cJSON_Delete(pnfRegistrationFields);
                return NULL;
        }
        cJSON_AddItemToObject(pnfRegistrationFields, "additionalFields", additionalFields);
@@ -808,6 +864,7 @@ cJSON*      vesCreatePnfRegistrationFields(int port, bool is_tls)
        if (cJSON_AddStringToObject(additionalFields, "oamPort", portString) == NULL)
        {
                printf("Could not create JSON object: oamPort\n");
+               cJSON_Delete(pnfRegistrationFields);
                return NULL;
        }
 
@@ -817,6 +874,7 @@ cJSON*      vesCreatePnfRegistrationFields(int port, bool is_tls)
                if (cJSON_AddStringToObject(additionalFields, "protocol", "TLS") == NULL)
                {
                        printf("Could not create JSON object: protocol\n");
+                       cJSON_Delete(pnfRegistrationFields);
                        return NULL;
                }
 
@@ -824,12 +882,14 @@ cJSON*    vesCreatePnfRegistrationFields(int port, bool is_tls)
                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;
                }
        }
@@ -839,6 +899,7 @@ cJSON*      vesCreatePnfRegistrationFields(int port, bool is_tls)
                if (cJSON_AddStringToObject(additionalFields, "protocol", "SSH") == NULL)
                {
                        printf("Could not create JSON object: protocol\n");
+                       cJSON_Delete(pnfRegistrationFields);
                        return NULL;
                }
 
@@ -846,6 +907,7 @@ cJSON*      vesCreatePnfRegistrationFields(int port, bool is_tls)
                if (cJSON_AddStringToObject(additionalFields, "username", "netconf") == NULL)
                {
                        printf("Could not create JSON object: username\n");
+                       cJSON_Delete(pnfRegistrationFields);
                        return NULL;
                }
 
@@ -853,6 +915,7 @@ cJSON*      vesCreatePnfRegistrationFields(int port, bool is_tls)
                if (cJSON_AddStringToObject(additionalFields, "password", "netconf") == NULL)
                {
                        printf("Could not create JSON object: password\n");
+                       cJSON_Delete(pnfRegistrationFields);
                        return NULL;
                }
        }
@@ -860,42 +923,49 @@ cJSON*    vesCreatePnfRegistrationFields(int port, bool is_tls)
        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;
        }
 
@@ -925,12 +995,13 @@ int       getNetconfAvailableFromConfigJson(void)
        }
        //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;
        }
 
@@ -938,13 +1009,13 @@ int      getNetconfAvailableFromConfigJson(void)
        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;
 }
@@ -972,12 +1043,13 @@ int      getVesAvailableFromConfigJson(void)
        }
        //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;
        }
 
@@ -985,17 +1057,22 @@ int      getVesAvailableFromConfigJson(void)
        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();
@@ -1008,42 +1085,49 @@ cJSON*  vesCreateFaultFields(char *alarm_condition, char *alarm_object, char *sev
        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;
        }
 
@@ -1051,6 +1135,7 @@ cJSON*    vesCreateFaultFields(char *alarm_condition, char *alarm_object, char *sev
        if (alarmAdditionalInformation == NULL)
        {
                printf("Could not create JSON object: alarmAdditionalInformation\n");
+               cJSON_Delete(faultFields);
                return NULL;
        }
        cJSON_AddItemToObject(faultFields, "alarmAdditionalInformation", alarmAdditionalInformation);
@@ -1058,24 +1143,28 @@ cJSON*  vesCreateFaultFields(char *alarm_condition, char *alarm_object, char *sev
        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;
        }
 
index a5785e5..29d69f8 100644 (file)
@@ -65,24 +65,6 @@ int cleanup_curl()
        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
  *
@@ -127,6 +109,11 @@ static int send_heartbeat(int heartbeat_interval)
        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)
@@ -143,6 +130,7 @@ static int send_heartbeat(int heartbeat_interval)
        if (commonEventHeader == NULL)
        {
                printf("Could not create JSON object: commonEventHeader\n");
+               cJSON_Delete(postDataJson);
                return 1;
        }
        cJSON_AddItemToObject(event, "commonEventHeader", commonEventHeader);
@@ -151,6 +139,7 @@ static int send_heartbeat(int heartbeat_interval)
        if (heartbeatFields == NULL)
        {
                printf("Could not create JSON object: heartbeatFields\n");
+               cJSON_Delete(postDataJson);
                return 1;
        }
        cJSON_AddItemToObject(event, "heartbeatFields", heartbeatFields);
@@ -172,7 +161,6 @@ static int send_heartbeat(int heartbeat_interval)
 
        if (res != CURLE_OK)
        {
-               printf("Failed to send cURL...\n");
                return SR_ERR_OPERATION_FAILED;
        }
 
@@ -193,11 +181,17 @@ static int send_pnf_registration_instance(char *hostname, int port, bool is_tls)
        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);
@@ -209,6 +203,7 @@ static int send_pnf_registration_instance(char *hostname, int port, bool is_tls)
        if (commonEventHeader == NULL)
        {
                printf("Could not create JSON object: commonEventHeader\n");
+               cJSON_Delete(postDataJson);
                return 1;
        }
        cJSON_AddItemToObject(event, "commonEventHeader", commonEventHeader);
@@ -217,6 +212,7 @@ static int send_pnf_registration_instance(char *hostname, int port, bool is_tls)
        if (pnfRegistrationFields == NULL)
        {
                printf("Could not create JSON object: pnfRegistrationFields\n");
+               cJSON_Delete(postDataJson);
                return 1;
        }
        cJSON_AddItemToObject(event, "pnfRegistrationFields", pnfRegistrationFields);
index 402d076..3c4f409 100755 (executable)
@@ -28,13 +28,6 @@ shopt -s failglob
 
 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
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-alarms.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-alarms.yang
new file mode 100644 (file)
index 0000000..856320b
--- /dev/null
@@ -0,0 +1,1526 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-alarms-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-alarms-v1.yang
new file mode 100644 (file)
index 0000000..a55ed7c
--- /dev/null
@@ -0,0 +1,98 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-common-alarms-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-common-alarms-v1.yang
new file mode 100644 (file)
index 0000000..930bba3
--- /dev/null
@@ -0,0 +1,56 @@
+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?";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-hardware-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-hardware-v1.yang
new file mode 100644 (file)
index 0000000..fc08229
--- /dev/null
@@ -0,0 +1,89 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-interfaces-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-interfaces-v1.yang
new file mode 100644 (file)
index 0000000..4f54d43
--- /dev/null
@@ -0,0 +1,108 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-root-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-root-v1.yang
new file mode 100644 (file)
index 0000000..1acd553
--- /dev/null
@@ -0,0 +1,179 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-alarms-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-alarms-v1.yang
new file mode 100644 (file)
index 0000000..c52414d
--- /dev/null
@@ -0,0 +1,56 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-v1.yang
new file mode 100644 (file)
index 0000000..1566ec9
--- /dev/null
@@ -0,0 +1,64 @@
+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";
+  }
+}
diff --git a/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-types-v1.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-types-v1.yang
new file mode 100644 (file)
index 0000000..5bf46d9
--- /dev/null
@@ -0,0 +1,286 @@
+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.";
+    }
+}
diff --git a/ntsimulator/yang/o-ran/ru-fh/iana-hardware.yang b/ntsimulator/yang/o-ran/ru-fh/iana-hardware.yang
new file mode 100644 (file)
index 0000000..52bcaf3
--- /dev/null
@@ -0,0 +1,180 @@
+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.";
+}
+}
diff --git a/ntsimulator/yang/o-ran/ru-fh/ietf-hardware.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-hardware.yang
new file mode 100644 (file)
index 0000000..f444e26
--- /dev/null
@@ -0,0 +1,1141 @@
+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";
+}
+
+}
diff --git a/ntsimulator/yang/o-ran/ru-fh/ietf-inet-types.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-inet-types.yang
new file mode 100644 (file)
index 0000000..4b0db8e
--- /dev/null
@@ -0,0 +1,429 @@
+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)";
+}
+
+}
diff --git a/ntsimulator/yang/o-ran/ru-fh/ietf-interfaces.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-interfaces.yang
new file mode 100644 (file)
index 0000000..8dae9d3
--- /dev/null
@@ -0,0 +1,1073 @@
+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";
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/o-ran/ru-fh/ietf-yang-types.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-yang-types.yang
new file mode 100644 (file)
index 0000000..45b8c55
--- /dev/null
@@ -0,0 +1,435 @@
+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.";
+}
+}
index ed210ff..8c41b40 100755 (executable)
@@ -30,7 +30,7 @@ echo "Loading data into sysrepo..."
 #
 #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
@@ -39,8 +39,11 @@ result=$(netopeer2-cli <<-END
 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
@@ -50,6 +53,11 @@ do
 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
diff --git a/ntsimulator/yang/x-ran/iana-hardware.yang b/ntsimulator/yang/x-ran/iana-hardware.yang
new file mode 100755 (executable)
index 0000000..52bcaf3
--- /dev/null
@@ -0,0 +1,180 @@
+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.";
+}
+}
diff --git a/ntsimulator/yang/x-ran/iana-if-type.yang b/ntsimulator/yang/x-ran/iana-if-type.yang
new file mode 100644 (file)
index 0000000..24d04e6
--- /dev/null
@@ -0,0 +1,1611 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/x-ran/ietf-crypto-types.yang b/ntsimulator/yang/x-ran/ietf-crypto-types.yang
new file mode 100644 (file)
index 0000000..c620734
--- /dev/null
@@ -0,0 +1,2173 @@
+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
diff --git a/ntsimulator/yang/x-ran/ietf-dhcpv6-types.yang b/ntsimulator/yang/x-ran/ietf-dhcpv6-types.yang
new file mode 100644 (file)
index 0000000..c0d7193
--- /dev/null
@@ -0,0 +1,207 @@
+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";
+      }
+    }
+  }
+
+}
diff --git a/ntsimulator/yang/x-ran/ietf-hardware.yang b/ntsimulator/yang/x-ran/ietf-hardware.yang
new file mode 100755 (executable)
index 0000000..f444e26
--- /dev/null
@@ -0,0 +1,1141 @@
+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";
+}
+
+}
diff --git a/ntsimulator/yang/x-ran/ietf-inet-types.yang b/ntsimulator/yang/x-ran/ietf-inet-types.yang
new file mode 100755 (executable)
index 0000000..4b0db8e
--- /dev/null
@@ -0,0 +1,429 @@
+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)";
+}
+
+}
diff --git a/ntsimulator/yang/x-ran/ietf-interfaces.yang b/ntsimulator/yang/x-ran/ietf-interfaces.yang
new file mode 100644 (file)
index 0000000..8dae9d3
--- /dev/null
@@ -0,0 +1,1073 @@
+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";
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/ietf-ip.yang b/ntsimulator/yang/x-ran/ietf-ip.yang
new file mode 100644 (file)
index 0000000..449081b
--- /dev/null
@@ -0,0 +1,860 @@
+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";
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/ietf-netconf-acm.yang b/ntsimulator/yang/x-ran/ietf-netconf-acm.yang
new file mode 100644 (file)
index 0000000..ec9687a
--- /dev/null
@@ -0,0 +1,440 @@
+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.";
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/ietf-netconf-monitoring.yang b/ntsimulator/yang/x-ran/ietf-netconf-monitoring.yang
new file mode 100644 (file)
index 0000000..3995988
--- /dev/null
@@ -0,0 +1,542 @@
+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.";
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/ietf-yang-types.yang b/ntsimulator/yang/x-ran/ietf-yang-types.yang
new file mode 100755 (executable)
index 0000000..45b8c55
--- /dev/null
@@ -0,0 +1,435 @@
+module ietf-yang-types {
+
+namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+prefix "yang";
+
+organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+contact
+ "WG Web:   <http://tools.ietf.org/wg/netmod/>
+  WG List:  <mailto:netmod@ietf.org>
+  WG Chair: David Kessens
+            <mailto:david.kessens@nsn.com>
+  WG Chair: Juergen Schoenwaelder
+            <mailto:j.schoenwaelder@jacobs-university.de>
+  Editor:   Juergen Schoenwaelder
+            <mailto:j.schoenwaelder@jacobs-university.de>";
+
+description
+ "This module contains a collection of generally useful derived
+  YANG data types.
+  Copyright (c) 2013 IETF Trust and the persons identified as
+  authors of the code.  All rights reserved.
+  Redistribution and use in source and binary forms, with or
+  without modification, is permitted pursuant to, and subject
+  to the license terms contained in, the Simplified BSD License
+  set forth in Section 4.c of the IETF Trust's Legal Provisions
+  Relating to IETF Documents
+  (http://trustee.ietf.org/license-info).
+  This version of this YANG module is part of RFC 6991; see
+  the RFC itself for full legal notices.";
+
+revision 2013-07-15 {
+  description
+   "This revision adds the following new data types:
+    - yang-identifier
+    - hex-string
+    - uuid
+    - dotted-quad";
+  reference
+   "RFC 6991: Common YANG Data Types";
+}
+
+revision 2010-09-24 {
+  description
+   "Initial revision.";
+  reference
+   "RFC 6021: Common YANG Data Types";
+}
+
+/*** collection of counter and gauge types ***/
+
+typedef counter32 {
+  type uint32;
+  description
+   "The counter32 type represents a non-negative integer
+    that monotonically increases until it reaches a
+    maximum value of 2^32-1 (4294967295 decimal), when it
+    wraps around and starts increasing again from zero.
+    Counters have no defined 'initial' value, and thus, a
+    single value of a counter has (in general) no information
+    content.  Discontinuities in the monotonically increasing
+    value normally occur at re-initialization of the
+    management system, and at other times as specified in the
+    description of a schema node using this type.  If such
+    other times can occur, for example, the creation of
+    a schema node of type counter32 at times other than
+    re-initialization, then a corresponding schema node
+    should be defined, with an appropriate type, to indicate
+    the last discontinuity.
+    The counter32 type should not be used for configuration
+    schema nodes.  A default statement SHOULD NOT be used in
+    combination with the type counter32.
+    In the value set and its semantics, this type is equivalent
+    to the Counter32 type of the SMIv2.";
+  reference
+   "RFC 2578: Structure of Management Information Version 2
+              (SMIv2)";
+}
+
+typedef zero-based-counter32 {
+  type yang:counter32;
+  default "0";
+  description
+   "The zero-based-counter32 type represents a counter32
+    that has the defined 'initial' value zero.
+    A schema node of this type will be set to zero (0) on creation
+    and will thereafter increase monotonically until it reaches
+    a maximum value of 2^32-1 (4294967295 decimal), when it
+    wraps around and starts increasing again from zero.
+    Provided that an application discovers a new schema node
+    of this type within the minimum time to wrap, it can use the
+    'initial' value as a delta.  It is important for a management
+    station to be aware of this minimum time and the actual time
+    between polls, and to discard data if the actual time is too
+    long or there is no defined minimum time.
+    In the value set and its semantics, this type is equivalent
+    to the ZeroBasedCounter32 textual convention of the SMIv2.";
+  reference
+    "RFC 4502: Remote Network Monitoring Management Information
+               Base Version 2";
+}
+
+typedef counter64 {
+  type uint64;
+  description
+   "The counter64 type represents a non-negative integer
+    that monotonically increases until it reaches a
+    maximum value of 2^64-1 (18446744073709551615 decimal),
+    when it wraps around and starts increasing again from zero.
+    Counters have no defined 'initial' value, and thus, a
+    single value of a counter has (in general) no information
+    content.  Discontinuities in the monotonically increasing
+    value normally occur at re-initialization of the
+    management system, and at other times as specified in the
+    description of a schema node using this type.  If such
+    other times can occur, for example, the creation of
+    a schema node of type counter64 at times other than
+    re-initialization, then a corresponding schema node
+    should be defined, with an appropriate type, to indicate
+    the last discontinuity.
+    The counter64 type should not be used for configuration
+    schema nodes.  A default statement SHOULD NOT be used in
+    combination with the type counter64.
+    In the value set and its semantics, this type is equivalent
+    to the Counter64 type of the SMIv2.";
+  reference
+   "RFC 2578: Structure of Management Information Version 2
+              (SMIv2)";
+}
+
+typedef zero-based-counter64 {
+  type yang:counter64;
+  default "0";
+  description
+   "The zero-based-counter64 type represents a counter64 that
+    has the defined 'initial' value zero.
+    A schema node of this type will be set to zero (0) on creation
+    and will thereafter increase monotonically until it reaches
+    a maximum value of 2^64-1 (18446744073709551615 decimal),
+    when it wraps around and starts increasing again from zero.
+    Provided that an application discovers a new schema node
+    of this type within the minimum time to wrap, it can use the
+    'initial' value as a delta.  It is important for a management
+    station to be aware of this minimum time and the actual time
+    between polls, and to discard data if the actual time is too
+    long or there is no defined minimum time.
+    In the value set and its semantics, this type is equivalent
+    to the ZeroBasedCounter64 textual convention of the SMIv2.";
+  reference
+   "RFC 2856: Textual Conventions for Additional High Capacity
+              Data Types";
+}
+
+typedef gauge32 {
+  type uint32;
+  description
+   "The gauge32 type represents a non-negative integer, which
+    may increase or decrease, but shall never exceed a maximum
+    value, nor fall below a minimum value.  The maximum value
+    cannot be greater than 2^32-1 (4294967295 decimal), and
+    the minimum value cannot be smaller than 0.  The value of
+    a gauge32 has its maximum value whenever the information
+    being modeled is greater than or equal to its maximum
+    value, and has its minimum value whenever the information
+    being modeled is smaller than or equal to its minimum value.
+    If the information being modeled subsequently decreases
+    below (increases above) the maximum (minimum) value, the
+    gauge32 also decreases (increases).
+    In the value set and its semantics, this type is equivalent
+    to the Gauge32 type of the SMIv2.";
+  reference
+   "RFC 2578: Structure of Management Information Version 2
+              (SMIv2)";
+}
+
+typedef gauge64 {
+  type uint64;
+  description
+   "The gauge64 type represents a non-negative integer, which
+    may increase or decrease, but shall never exceed a maximum
+    value, nor fall below a minimum value.  The maximum value
+    cannot be greater than 2^64-1 (18446744073709551615), and
+    the minimum value cannot be smaller than 0.  The value of
+    a gauge64 has its maximum value whenever the information
+    being modeled is greater than or equal to its maximum
+    value, and has its minimum value whenever the information
+    being modeled is smaller than or equal to its minimum value.
+    If the information being modeled subsequently decreases
+    below (increases above) the maximum (minimum) value, the
+    gauge64 also decreases (increases).
+    In the value set and its semantics, this type is equivalent
+    to the CounterBasedGauge64 SMIv2 textual convention defined
+    in RFC 2856";
+  reference
+   "RFC 2856: Textual Conventions for Additional High Capacity
+              Data Types";
+}
+
+/*** collection of identifier-related types ***/
+
+typedef object-identifier {
+  type string {
+    pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+          + '(\.(0|([1-9]\d*)))*';
+  }
+  description
+   "The object-identifier type represents administratively
+    assigned names in a registration-hierarchical-name tree.
+    Values of this type are denoted as a sequence of numerical
+    non-negative sub-identifier values.  Each sub-identifier
+    value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers
+    are separated by single dots and without any intermediate
+    whitespace.
+    The ASN.1 standard restricts the value space of the first
+    sub-identifier to 0, 1, or 2.  Furthermore, the value space
+    of the second sub-identifier is restricted to the range
+    0 to 39 if the first sub-identifier is 0 or 1.  Finally,
+    the ASN.1 standard requires that an object identifier
+    has always at least two sub-identifiers.  The pattern
+    captures these restrictions.
+    Although the number of sub-identifiers is not limited,
+    module designers should realize that there may be
+    implementations that stick with the SMIv2 limit of 128
+    sub-identifiers.
+    This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+    since it is not restricted to 128 sub-identifiers.  Hence,
+    this type SHOULD NOT be used to represent the SMIv2 OBJECT
+    IDENTIFIER type; the object-identifier-128 type SHOULD be
+    used instead.";
+  reference
+   "ISO9834-1: Information technology -- Open Systems
+    Interconnection -- Procedures for the operation of OSI
+    Registration Authorities: General procedures and top
+    arcs of the ASN.1 Object Identifier tree";
+}
+
+typedef object-identifier-128 {
+  type object-identifier {
+    pattern '\d*(\.\d*){1,127}';
+  }
+  description
+   "This type represents object-identifiers restricted to 128
+    sub-identifiers.
+    In the value set and its semantics, this type is equivalent
+    to the OBJECT IDENTIFIER type of the SMIv2.";
+  reference
+   "RFC 2578: Structure of Management Information Version 2
+              (SMIv2)";
+}
+
+typedef yang-identifier {
+  type string {
+    length "1..max";
+    pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+    pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+  }
+  description
+    "A YANG identifier string as defined by the 'identifier'
+     rule in Section 12 of RFC 6020.  An identifier must
+     start with an alphabetic character or an underscore
+     followed by an arbitrary sequence of alphabetic or
+     numeric characters, underscores, hyphens, or dots.
+     A YANG identifier MUST NOT start with any possible
+     combination of the lowercase or uppercase character
+     sequence 'xml'.";
+  reference
+    "RFC 6020: YANG - A Data Modeling Language for the Network
+               Configuration Protocol (NETCONF)";
+}
+
+/*** collection of types related to date and time***/
+
+typedef date-and-time {
+  type string {
+    pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+          + '(Z|[\+\-]\d{2}:\d{2})';
+  }
+  description
+   "The date-and-time type is a profile of the ISO 8601
+    standard for representation of dates and times using the
+    Gregorian calendar.  The profile is defined by the
+    date-time production in Section 5.6 of RFC 3339.
+    The date-and-time type is compatible with the dateTime XML
+    schema type with the following notable exceptions:
+    (a) The date-and-time type does not allow negative years.
+    (b) The date-and-time time-offset -00:00 indicates an unknown
+        time zone (see RFC 3339) while -00:00 and +00:00 and Z
+        all represent the same time zone in dateTime.
+    (c) The canonical format (see below) of data-and-time values
+        differs from the canonical format used by the dateTime XML
+        schema type, which requires all times to be in UTC using
+        the time-offset 'Z'.
+    This type is not equivalent to the DateAndTime textual
+    convention of the SMIv2 since RFC 3339 uses a different
+    separator between full-date and full-time and provides
+    higher resolution of time-secfrac.
+    The canonical format for date-and-time values with a known time
+    zone uses a numeric time zone offset that is calculated using
+    the device's configured known offset to UTC time.  A change of
+    the device's offset to UTC time will cause date-and-time values
+    to change accordingly.  Such changes might happen periodically
+    in case a server follows automatically daylight saving time
+    (DST) time zone offset changes.  The canonical format for
+    date-and-time values with an unknown time zone (usually
+    referring to the notion of local time) uses the time-offset
+    -00:00.";
+  reference
+   "RFC 3339: Date and Time on the Internet: Timestamps
+    RFC 2579: Textual Conventions for SMIv2
+    XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+}
+
+typedef timeticks {
+  type uint32;
+  description
+   "The timeticks type represents a non-negative integer that
+    represents the time, modulo 2^32 (4294967296 decimal), in
+    hundredths of a second between two epochs.  When a schema
+    node is defined that uses this type, the description of
+    the schema node identifies both of the reference epochs.
+    In the value set and its semantics, this type is equivalent
+    to the TimeTicks type of the SMIv2.";
+  reference
+   "RFC 2578: Structure of Management Information Version 2
+              (SMIv2)";
+}
+
+typedef timestamp {
+  type yang:timeticks;
+  description
+   "The timestamp type represents the value of an associated
+    timeticks schema node at which a specific occurrence
+    happened.  The specific occurrence must be defined in the
+    description of any schema node defined using this type.  When
+    the specific occurrence occurred prior to the last time the
+    associated timeticks attribute was zero, then the timestamp
+    value is zero.  Note that this requires all timestamp values
+    to be reset to zero when the value of the associated timeticks
+    attribute reaches 497+ days and wraps around to zero.
+    The associated timeticks schema node must be specified
+    in the description of any schema node using this type.
+    In the value set and its semantics, this type is equivalent
+    to the TimeStamp textual convention of the SMIv2.";
+  reference
+   "RFC 2579: Textual Conventions for SMIv2";
+}
+
+/*** collection of generic address types ***/
+
+typedef phys-address {
+  type string {
+    pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+  }
+
+  description
+   "Represents media- or physical-level addresses represented
+    as a sequence octets, each octet represented by two hexadecimal
+    numbers.  Octets are separated by colons.  The canonical
+    representation uses lowercase characters.
+    In the value set and its semantics, this type is equivalent
+    to the PhysAddress textual convention of the SMIv2.";
+  reference
+   "RFC 2579: Textual Conventions for SMIv2";
+}
+
+typedef mac-address {
+  type string {
+    pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+  }
+  description
+   "The mac-address type represents an IEEE 802 MAC address.
+    The canonical representation uses lowercase characters.
+    In the value set and its semantics, this type is equivalent
+    to the MacAddress textual convention of the SMIv2.";
+  reference
+   "IEEE 802: IEEE Standard for Local and Metropolitan Area
+              Networks: Overview and Architecture
+    RFC 2579: Textual Conventions for SMIv2";
+}
+
+/*** collection of XML-specific types ***/
+
+typedef xpath1.0 {
+  type string;
+  description
+   "This type represents an XPATH 1.0 expression.
+    When a schema node is defined that uses this type, the
+    description of the schema node MUST specify the XPath
+    context in which the XPath expression is evaluated.";
+  reference
+   "XPATH: XML Path Language (XPath) Version 1.0";
+}
+
+/*** collection of string types ***/
+
+typedef hex-string {
+  type string {
+    pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+  }
+  description
+   "A hexadecimal string with octets represented as hex digits
+    separated by colons.  The canonical representation uses
+    lowercase characters.";
+}
+
+typedef uuid {
+  type string {
+    pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+          + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+  }
+  description
+   "A Universally Unique IDentifier in the string representation
+    defined in RFC 4122.  The canonical representation uses
+    lowercase characters.
+    The following is an example of a UUID in string representation:
+    f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+    ";
+  reference
+   "RFC 4122: A Universally Unique IDentifier (UUID) URN
+              Namespace";
+}
+
+typedef dotted-quad {
+  type string {
+    pattern
+      '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+    + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+  }
+  description
+    "An unsigned 32-bit number expressed in the dotted-quad
+     notation, i.e., four octets written as decimal numbers
+     and separated with the '.' (full stop) character.";
+}
+}
diff --git a/ntsimulator/yang/x-ran/org-openroadm-user-mgmt.yang b/ntsimulator/yang/x-ran/org-openroadm-user-mgmt.yang
new file mode 100644 (file)
index 0000000..fce5f2a
--- /dev/null
@@ -0,0 +1,153 @@
+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
diff --git a/ntsimulator/yang/x-ran/xran-alarm-id.yang b/ntsimulator/yang/x-ran/xran-alarm-id.yang
new file mode 100644 (file)
index 0000000..f87fcea
--- /dev/null
@@ -0,0 +1,178 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-ald-port.yang b/ntsimulator/yang/x-ran/xran-ald-port.yang
new file mode 100644 (file)
index 0000000..ab3a4b9
--- /dev/null
@@ -0,0 +1,158 @@
+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";
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-ald.yang b/ntsimulator/yang/x-ran/xran-ald.yang
new file mode 100644 (file)
index 0000000..4580992
--- /dev/null
@@ -0,0 +1,144 @@
+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";
+         }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-beamforming.yang b/ntsimulator/yang/x-ran/xran-beamforming.yang
new file mode 100644 (file)
index 0000000..3e6c995
--- /dev/null
@@ -0,0 +1,325 @@
+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";
+
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-delay-management.yang b/ntsimulator/yang/x-ran/xran-delay-management.yang
new file mode 100644 (file)
index 0000000..e21cf93
--- /dev/null
@@ -0,0 +1,264 @@
+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";
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-dhcp.yang b/ntsimulator/yang/x-ran/xran-dhcp.yang
new file mode 100644 (file)
index 0000000..8b2a94e
--- /dev/null
@@ -0,0 +1,183 @@
+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";
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-ecpri-delay.yang b/ntsimulator/yang/x-ran/xran-ecpri-delay.yang
new file mode 100644 (file)
index 0000000..4929a32
--- /dev/null
@@ -0,0 +1,125 @@
+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.";
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-externalio.yang b/ntsimulator/yang/x-ran/xran-externalio.yang
new file mode 100644 (file)
index 0000000..a78a710
--- /dev/null
@@ -0,0 +1,144 @@
+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";
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-fan.yang b/ntsimulator/yang/x-ran/xran-fan.yang
new file mode 100644 (file)
index 0000000..251f32f
--- /dev/null
@@ -0,0 +1,110 @@
+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";
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-file-management.yang b/ntsimulator/yang/x-ran/xran-file-management.yang
new file mode 100644 (file)
index 0000000..c63ffd0
--- /dev/null
@@ -0,0 +1,174 @@
+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 "";
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-fm.yang b/ntsimulator/yang/x-ran/xran-fm.yang
new file mode 100644 (file)
index 0000000..c15f23a
--- /dev/null
@@ -0,0 +1,167 @@
+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";
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-hardware.yang b/ntsimulator/yang/x-ran/xran-hardware.yang
new file mode 100644 (file)
index 0000000..9d423c1
--- /dev/null
@@ -0,0 +1,197 @@
+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.";
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-interfaces.yang b/ntsimulator/yang/x-ran/xran-interfaces.yang
new file mode 100644 (file)
index 0000000..a4a0aaa
--- /dev/null
@@ -0,0 +1,385 @@
+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.";
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-lbm.yang b/ntsimulator/yang/x-ran/xran-lbm.yang
new file mode 100644 (file)
index 0000000..65ea7fb
--- /dev/null
@@ -0,0 +1,269 @@
+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
diff --git a/ntsimulator/yang/x-ran/xran-module-cap.yang b/ntsimulator/yang/x-ran/xran-module-cap.yang
new file mode 100644 (file)
index 0000000..9fef7d0
--- /dev/null
@@ -0,0 +1,533 @@
+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";
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-mplane-int.yang b/ntsimulator/yang/x-ran/xran-mplane-int.yang
new file mode 100644 (file)
index 0000000..778d37a
--- /dev/null
@@ -0,0 +1,171 @@
+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";
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-operations.yang b/ntsimulator/yang/x-ran/xran-operations.yang
new file mode 100644 (file)
index 0000000..490ceb5
--- /dev/null
@@ -0,0 +1,151 @@
+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.";
+
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-performance-management.yang b/ntsimulator/yang/x-ran/xran-performance-management.yang
new file mode 100644 (file)
index 0000000..92b4557
--- /dev/null
@@ -0,0 +1,666 @@
+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";
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-processing-element.yang b/ntsimulator/yang/x-ran/xran-processing-element.yang
new file mode 100644 (file)
index 0000000..c3809ab
--- /dev/null
@@ -0,0 +1,237 @@
+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
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-software-management.yang b/ntsimulator/yang/x-ran/xran-software-management.yang
new file mode 100644 (file)
index 0000000..0759cd6
--- /dev/null
@@ -0,0 +1,539 @@
+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";
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-supervision.yang b/ntsimulator/yang/x-ran/xran-supervision.yang
new file mode 100644 (file)
index 0000000..72bfb1d
--- /dev/null
@@ -0,0 +1,103 @@
+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
diff --git a/ntsimulator/yang/x-ran/xran-sync.yang b/ntsimulator/yang/x-ran/xran-sync.yang
new file mode 100644 (file)
index 0000000..734bca8
--- /dev/null
@@ -0,0 +1,662 @@
+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";
+    }
+  }
+
+}
diff --git a/ntsimulator/yang/x-ran/xran-transceiver.yang b/ntsimulator/yang/x-ran/xran-transceiver.yang
new file mode 100644 (file)
index 0000000..df0cb36
--- /dev/null
@@ -0,0 +1,369 @@
+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?
+      }
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-troubleshooting.yang b/ntsimulator/yang/x-ran/xran-troubleshooting.yang
new file mode 100644 (file)
index 0000000..587369f
--- /dev/null
@@ -0,0 +1,95 @@
+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.";
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-udp-echo.yang b/ntsimulator/yang/x-ran/xran-udp-echo.yang
new file mode 100644 (file)
index 0000000..cf1d725
--- /dev/null
@@ -0,0 +1,88 @@
+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.";
+    }
+  }
+}
diff --git a/ntsimulator/yang/x-ran/xran-uplane-conf.yang b/ntsimulator/yang/x-ran/xran-uplane-conf.yang
new file mode 100644 (file)
index 0000000..5ca7e3c
--- /dev/null
@@ -0,0 +1,948 @@
+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.";
+    }
+  }
+
+
+}
diff --git a/ntsimulator/yang/x-ran/xran-usermgmt.yang b/ntsimulator/yang/x-ran/xran-usermgmt.yang
new file mode 100644 (file)
index 0000000..9de1d90
--- /dev/null
@@ -0,0 +1,101 @@
+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.";
+    }
+  }
+}