From 1f1479ff8ce3a268acb7b70a32bb789d859a915b Mon Sep 17 00:00:00 2001 From: Alex Stancu Date: Thu, 2 Apr 2020 13:11:42 +0300 Subject: [PATCH] Refactor folder structure. Refactor folder structure of NTS, tot align with scp-oam/modeling repo. Issue-ID: SIM-19 Change-Id: I21b0a5bb137e6fe9738f8d90d20a3109c1935a96 Signed-off-by: Alex Stancu --- docker-build-manager.sh | 1 - docker-build-model.sh | 1 - ntsimulator/CMakeLists.txt | 3 - ntsimulator/deploy/manager/Dockerfile | 155 -- ntsimulator/deploy/manager/container-tag.yaml | 2 - ntsimulator/deploy/nts-manager/CMakeLists.txt | 97 + ntsimulator/deploy/nts-manager/Dockerfile | 212 ++ ntsimulator/deploy/nts-manager/container-tag.yaml | 2 + ntsimulator/deploy/nts-manager/model-install.sh.in | 56 + .../supervisord.conf} | 0 .../deploy/o-ran-sc/o-ran-ru/CMakeLists.txt | 16 + ntsimulator/deploy/o-ran-sc/o-ran-ru/Dockerfile | 242 +++ .../deploy/o-ran-sc/o-ran-ru/container-tag.yaml | 2 + .../deploy/o-ran-sc/o-ran-ru/stock_config.xml | 95 + .../deploy/o-ran-sc/o-ran-ru/supervisord.conf | 46 + .../o-ran-ru/sysrepo-configuration-load.sh | 29 + ntsimulator/deploy/o-ran/ru-fh/CMakeLists.txt | 20 + ntsimulator/deploy/o-ran/ru-fh/Dockerfile | 251 +++ ntsimulator/deploy/o-ran/ru-fh/container-tag.yaml | 2 + .../o-ran/ru-fh/edit-config-after-activate.sh | 15 + .../o-ran/ru-fh/edit-config-after-activate.xml | 21 + .../o-ran/ru-fh/edit-config-after-download.sh | 15 + .../o-ran/ru-fh/edit-config-after-download.xml | 55 + .../deploy/o-ran/ru-fh/edit-config-demo-start.sh | 15 + .../deploy/o-ran/ru-fh/edit-config-demo-start.xml | 117 ++ ntsimulator/deploy/o-ran/ru-fh/stock_config.xml | 95 + ntsimulator/deploy/o-ran/ru-fh/supervisord.conf | 64 + ntsimulator/deploy/tls/ca.key | 27 + ntsimulator/deploy/tls/ca.pem | 24 + ntsimulator/deploy/tls/ca.srl | 1 + ntsimulator/deploy/tls/client.crt | 24 + ntsimulator/deploy/tls/client.key | 27 + ntsimulator/deploy/tls/enable_ssh_key.sh | 34 + ntsimulator/deploy/tls/enable_tls.sh | 63 + ntsimulator/deploy/tls/netconf_browser.crt | 19 + ntsimulator/deploy/tls/netconf_browser.csr | 15 + ntsimulator/deploy/x-ran/CMakeLists.txt | 19 + ntsimulator/deploy/x-ran/Dockerfile | 251 +++ ntsimulator/deploy/x-ran/container-tag.yaml | 2 + .../deploy/x-ran/edit-config-after-activate.sh | 15 + .../deploy/x-ran/edit-config-after-activate.xml | 21 + .../deploy/x-ran/edit-config-after-download.sh | 15 + .../deploy/x-ran/edit-config-after-download.xml | 55 + ntsimulator/deploy/x-ran/edit-config-demo-start.sh | 15 + .../deploy/x-ran/edit-config-demo-start.xml | 117 ++ ntsimulator/deploy/x-ran/stock_config.xml | 95 + ntsimulator/deploy/x-ran/supervisord.conf | 58 + ntsimulator/docker-build-nts-manager.sh | 1 + ntsimulator/docker-build-nts-o-ran-ru-fh.sh | 1 + ntsimulator/docker-build-nts-o-ran-sc-o-ran-ru.sh | 1 + ntsimulator/docker-build-nts-xran.sh | 1 + ntsimulator/scripts/clean.sh | 76 +- .../src/ntsimulator-manager/ntsimulator-manager.c | 22 +- .../src/ntsimulator-manager/simulator-operations.c | 43 +- .../src/o-ran-notifications/o-ran-notifications.c | 42 +- .../src/software-management-oran/CMakeLists.txt | 16 + .../software-management-oran/sw-management-rpc.c | 519 +++++ .../src/software-management-xran/CMakeLists.txt | 16 + .../software-management-xran/sw-management-rpc.c | 519 +++++ ntsimulator/src/utils/utils.c | 161 +- ntsimulator/src/ves-messages/heartbeat.c | 34 +- ntsimulator/yang/auto-load-yangs.sh | 7 - .../network-topology-simulator.xml | 0 .../network-topology-simulator.yang | 0 .../{ => o-ran-sc/o-ran-ru}/iana-hardware.yang | 0 .../yang/o-ran-sc/o-ran-ru/ietf-alarms.yang | 1526 ++++++++++++++ .../{ => o-ran-sc/o-ran-ru}/ietf-hardware.yang | 0 .../{ => o-ran-sc/o-ran-ru}/ietf-inet-types.yang | 0 .../{ => o-ran-sc/o-ran-ru}/ietf-interfaces.yang | 0 .../{ => o-ran-sc/o-ran-ru}/ietf-yang-types.yang | 0 .../yang/o-ran-sc/o-ran-ru/o-ran-sc-alarms-v1.yang | 98 + .../o-ran-ru/o-ran-sc-common-alarms-v1.yang | 56 + .../o-ran-sc/o-ran-ru/o-ran-sc-hardware-v1.yang | 89 + .../o-ran-sc/o-ran-ru/o-ran-sc-interfaces-v1.yang | 108 + .../yang/o-ran-sc/o-ran-ru/o-ran-sc-root-v1.yang | 179 ++ .../o-ran-sc/o-ran-ru/o-ran-sc-ru-alarms-v1.yang | 56 + .../yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-v1.yang | 64 + .../yang/o-ran-sc/o-ran-ru/o-ran-sc-types-v1.yang | 286 +++ ntsimulator/yang/o-ran/ru-fh/iana-hardware.yang | 180 ++ .../yang/{ => o-ran/ru-fh}/iana-if-type.yang | 0 .../yang/{ => o-ran/ru-fh}/ietf-crypto-types.yang | 0 .../yang/{ => o-ran/ru-fh}/ietf-dhcpv6-types.yang | 0 ntsimulator/yang/o-ran/ru-fh/ietf-hardware.yang | 1141 ++++++++++ ntsimulator/yang/o-ran/ru-fh/ietf-inet-types.yang | 429 ++++ ntsimulator/yang/o-ran/ru-fh/ietf-interfaces.yang | 1073 ++++++++++ ntsimulator/yang/{ => o-ran/ru-fh}/ietf-ip.yang | 0 .../yang/{ => o-ran/ru-fh}/ietf-netconf-acm.yang | 0 .../{ => o-ran/ru-fh}/ietf-netconf-monitoring.yang | 0 ntsimulator/yang/o-ran/ru-fh/ietf-yang-types.yang | 435 ++++ .../yang/{ => o-ran/ru-fh}/o-ran-alarm-id.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-ald-port.yang | 0 ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-ald.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-beamforming.yang | 0 .../ru-fh}/o-ran-compression-factors.yang | 0 .../{ => o-ran/ru-fh}/o-ran-delay-management.yang | 0 ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-dhcp.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-ecpri-delay.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-externalio.yang | 0 ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-fan.yang | 0 .../{ => o-ran/ru-fh}/o-ran-file-management.yang | 0 ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-fm.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-hardware.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-interfaces.yang | 0 .../{ => o-ran/ru-fh}/o-ran-laa-operations.yang | 0 ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-laa.yang | 0 ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-lbm.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-module-cap.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-mplane-int.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-operations.yang | 0 .../ru-fh}/o-ran-performance-management.yang | 0 .../ru-fh}/o-ran-processing-element.yang | 0 .../ru-fh}/o-ran-software-management.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-supervision.yang | 0 ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-sync.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-trace.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-transceiver.yang | 0 .../{ => o-ran/ru-fh}/o-ran-troubleshooting.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-udp-echo.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-uplane-conf.yang | 0 .../yang/{ => o-ran/ru-fh}/o-ran-usermgmt.yang | 0 ntsimulator/yang/sysrepo-configuration-load.sh | 14 +- ntsimulator/yang/x-ran/iana-hardware.yang | 180 ++ ntsimulator/yang/x-ran/iana-if-type.yang | 1611 +++++++++++++++ ntsimulator/yang/x-ran/ietf-crypto-types.yang | 2173 ++++++++++++++++++++ ntsimulator/yang/x-ran/ietf-dhcpv6-types.yang | 207 ++ ntsimulator/yang/x-ran/ietf-hardware.yang | 1141 ++++++++++ ntsimulator/yang/x-ran/ietf-inet-types.yang | 429 ++++ ntsimulator/yang/x-ran/ietf-interfaces.yang | 1073 ++++++++++ ntsimulator/yang/x-ran/ietf-ip.yang | 860 ++++++++ ntsimulator/yang/x-ran/ietf-netconf-acm.yang | 440 ++++ .../yang/x-ran/ietf-netconf-monitoring.yang | 542 +++++ ntsimulator/yang/x-ran/ietf-yang-types.yang | 435 ++++ .../yang/x-ran/org-openroadm-user-mgmt.yang | 153 ++ ntsimulator/yang/x-ran/xran-alarm-id.yang | 178 ++ ntsimulator/yang/x-ran/xran-ald-port.yang | 158 ++ ntsimulator/yang/x-ran/xran-ald.yang | 144 ++ ntsimulator/yang/x-ran/xran-beamforming.yang | 325 +++ ntsimulator/yang/x-ran/xran-delay-management.yang | 264 +++ ntsimulator/yang/x-ran/xran-dhcp.yang | 183 ++ ntsimulator/yang/x-ran/xran-ecpri-delay.yang | 125 ++ ntsimulator/yang/x-ran/xran-externalio.yang | 144 ++ ntsimulator/yang/x-ran/xran-fan.yang | 110 + ntsimulator/yang/x-ran/xran-file-management.yang | 174 ++ ntsimulator/yang/x-ran/xran-fm.yang | 167 ++ ntsimulator/yang/x-ran/xran-hardware.yang | 197 ++ ntsimulator/yang/x-ran/xran-interfaces.yang | 385 ++++ ntsimulator/yang/x-ran/xran-lbm.yang | 269 +++ ntsimulator/yang/x-ran/xran-module-cap.yang | 533 +++++ ntsimulator/yang/x-ran/xran-mplane-int.yang | 171 ++ ntsimulator/yang/x-ran/xran-operations.yang | 151 ++ .../yang/x-ran/xran-performance-management.yang | 666 ++++++ .../yang/x-ran/xran-processing-element.yang | 237 +++ .../yang/x-ran/xran-software-management.yang | 539 +++++ ntsimulator/yang/x-ran/xran-supervision.yang | 103 + ntsimulator/yang/x-ran/xran-sync.yang | 662 ++++++ ntsimulator/yang/x-ran/xran-transceiver.yang | 369 ++++ ntsimulator/yang/x-ran/xran-troubleshooting.yang | 95 + ntsimulator/yang/x-ran/xran-udp-echo.yang | 88 + ntsimulator/yang/x-ran/xran-uplane-conf.yang | 948 +++++++++ ntsimulator/yang/x-ran/xran-usermgmt.yang | 101 + 160 files changed, 26143 insertions(+), 306 deletions(-) delete mode 100755 docker-build-manager.sh delete mode 100755 docker-build-model.sh delete mode 100644 ntsimulator/deploy/manager/Dockerfile delete mode 100644 ntsimulator/deploy/manager/container-tag.yaml create mode 100644 ntsimulator/deploy/nts-manager/CMakeLists.txt create mode 100644 ntsimulator/deploy/nts-manager/Dockerfile create mode 100644 ntsimulator/deploy/nts-manager/container-tag.yaml create mode 100755 ntsimulator/deploy/nts-manager/model-install.sh.in rename ntsimulator/deploy/{manager/supervisord.conf.manager => nts-manager/supervisord.conf} (100%) create mode 100644 ntsimulator/deploy/o-ran-sc/o-ran-ru/CMakeLists.txt create mode 100644 ntsimulator/deploy/o-ran-sc/o-ran-ru/Dockerfile create mode 100644 ntsimulator/deploy/o-ran-sc/o-ran-ru/container-tag.yaml create mode 100644 ntsimulator/deploy/o-ran-sc/o-ran-ru/stock_config.xml create mode 100644 ntsimulator/deploy/o-ran-sc/o-ran-ru/supervisord.conf create mode 100755 ntsimulator/deploy/o-ran-sc/o-ran-ru/sysrepo-configuration-load.sh create mode 100644 ntsimulator/deploy/o-ran/ru-fh/CMakeLists.txt create mode 100644 ntsimulator/deploy/o-ran/ru-fh/Dockerfile create mode 100644 ntsimulator/deploy/o-ran/ru-fh/container-tag.yaml create mode 100755 ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.sh create mode 100644 ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.xml create mode 100755 ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.sh create mode 100644 ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.xml create mode 100755 ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.sh create mode 100644 ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.xml create mode 100644 ntsimulator/deploy/o-ran/ru-fh/stock_config.xml create mode 100644 ntsimulator/deploy/o-ran/ru-fh/supervisord.conf create mode 100644 ntsimulator/deploy/tls/ca.key create mode 100644 ntsimulator/deploy/tls/ca.pem create mode 100644 ntsimulator/deploy/tls/ca.srl create mode 100644 ntsimulator/deploy/tls/client.crt create mode 100644 ntsimulator/deploy/tls/client.key create mode 100755 ntsimulator/deploy/tls/enable_ssh_key.sh create mode 100755 ntsimulator/deploy/tls/enable_tls.sh create mode 100644 ntsimulator/deploy/tls/netconf_browser.crt create mode 100644 ntsimulator/deploy/tls/netconf_browser.csr create mode 100644 ntsimulator/deploy/x-ran/CMakeLists.txt create mode 100644 ntsimulator/deploy/x-ran/Dockerfile create mode 100644 ntsimulator/deploy/x-ran/container-tag.yaml create mode 100755 ntsimulator/deploy/x-ran/edit-config-after-activate.sh create mode 100644 ntsimulator/deploy/x-ran/edit-config-after-activate.xml create mode 100755 ntsimulator/deploy/x-ran/edit-config-after-download.sh create mode 100644 ntsimulator/deploy/x-ran/edit-config-after-download.xml create mode 100755 ntsimulator/deploy/x-ran/edit-config-demo-start.sh create mode 100644 ntsimulator/deploy/x-ran/edit-config-demo-start.xml create mode 100644 ntsimulator/deploy/x-ran/stock_config.xml create mode 100644 ntsimulator/deploy/x-ran/supervisord.conf create mode 100755 ntsimulator/docker-build-nts-manager.sh create mode 100755 ntsimulator/docker-build-nts-o-ran-ru-fh.sh create mode 100755 ntsimulator/docker-build-nts-o-ran-sc-o-ran-ru.sh create mode 100755 ntsimulator/docker-build-nts-xran.sh create mode 100644 ntsimulator/src/software-management-oran/CMakeLists.txt create mode 100644 ntsimulator/src/software-management-oran/sw-management-rpc.c create mode 100644 ntsimulator/src/software-management-xran/CMakeLists.txt create mode 100644 ntsimulator/src/software-management-xran/sw-management-rpc.c rename ntsimulator/yang/{manager => nts-manager}/network-topology-simulator.xml (100%) rename ntsimulator/yang/{manager => nts-manager}/network-topology-simulator.yang (100%) rename ntsimulator/yang/{ => o-ran-sc/o-ran-ru}/iana-hardware.yang (100%) mode change 100755 => 100644 create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-alarms.yang rename ntsimulator/yang/{ => o-ran-sc/o-ran-ru}/ietf-hardware.yang (100%) mode change 100755 => 100644 rename ntsimulator/yang/{ => o-ran-sc/o-ran-ru}/ietf-inet-types.yang (100%) mode change 100755 => 100644 rename ntsimulator/yang/{ => o-ran-sc/o-ran-ru}/ietf-interfaces.yang (100%) rename ntsimulator/yang/{ => o-ran-sc/o-ran-ru}/ietf-yang-types.yang (100%) mode change 100755 => 100644 create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-alarms-v1.yang create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-common-alarms-v1.yang create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-hardware-v1.yang create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-interfaces-v1.yang create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-root-v1.yang create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-alarms-v1.yang create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-v1.yang create mode 100644 ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-types-v1.yang create mode 100644 ntsimulator/yang/o-ran/ru-fh/iana-hardware.yang rename ntsimulator/yang/{ => o-ran/ru-fh}/iana-if-type.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/ietf-crypto-types.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/ietf-dhcpv6-types.yang (100%) create mode 100644 ntsimulator/yang/o-ran/ru-fh/ietf-hardware.yang create mode 100644 ntsimulator/yang/o-ran/ru-fh/ietf-inet-types.yang create mode 100644 ntsimulator/yang/o-ran/ru-fh/ietf-interfaces.yang rename ntsimulator/yang/{ => o-ran/ru-fh}/ietf-ip.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/ietf-netconf-acm.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/ietf-netconf-monitoring.yang (100%) create mode 100644 ntsimulator/yang/o-ran/ru-fh/ietf-yang-types.yang rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-alarm-id.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-ald-port.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-ald.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-beamforming.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-compression-factors.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-delay-management.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-dhcp.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-ecpri-delay.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-externalio.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-fan.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-file-management.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-fm.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-hardware.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-interfaces.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-laa-operations.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-laa.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-lbm.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-module-cap.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-mplane-int.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-operations.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-performance-management.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-processing-element.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-software-management.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-supervision.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-sync.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-trace.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-transceiver.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-troubleshooting.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-udp-echo.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-uplane-conf.yang (100%) rename ntsimulator/yang/{ => o-ran/ru-fh}/o-ran-usermgmt.yang (100%) create mode 100755 ntsimulator/yang/x-ran/iana-hardware.yang create mode 100644 ntsimulator/yang/x-ran/iana-if-type.yang create mode 100644 ntsimulator/yang/x-ran/ietf-crypto-types.yang create mode 100644 ntsimulator/yang/x-ran/ietf-dhcpv6-types.yang create mode 100755 ntsimulator/yang/x-ran/ietf-hardware.yang create mode 100755 ntsimulator/yang/x-ran/ietf-inet-types.yang create mode 100644 ntsimulator/yang/x-ran/ietf-interfaces.yang create mode 100644 ntsimulator/yang/x-ran/ietf-ip.yang create mode 100644 ntsimulator/yang/x-ran/ietf-netconf-acm.yang create mode 100644 ntsimulator/yang/x-ran/ietf-netconf-monitoring.yang create mode 100755 ntsimulator/yang/x-ran/ietf-yang-types.yang create mode 100644 ntsimulator/yang/x-ran/org-openroadm-user-mgmt.yang create mode 100644 ntsimulator/yang/x-ran/xran-alarm-id.yang create mode 100644 ntsimulator/yang/x-ran/xran-ald-port.yang create mode 100644 ntsimulator/yang/x-ran/xran-ald.yang create mode 100644 ntsimulator/yang/x-ran/xran-beamforming.yang create mode 100644 ntsimulator/yang/x-ran/xran-delay-management.yang create mode 100644 ntsimulator/yang/x-ran/xran-dhcp.yang create mode 100644 ntsimulator/yang/x-ran/xran-ecpri-delay.yang create mode 100644 ntsimulator/yang/x-ran/xran-externalio.yang create mode 100644 ntsimulator/yang/x-ran/xran-fan.yang create mode 100644 ntsimulator/yang/x-ran/xran-file-management.yang create mode 100644 ntsimulator/yang/x-ran/xran-fm.yang create mode 100644 ntsimulator/yang/x-ran/xran-hardware.yang create mode 100644 ntsimulator/yang/x-ran/xran-interfaces.yang create mode 100644 ntsimulator/yang/x-ran/xran-lbm.yang create mode 100644 ntsimulator/yang/x-ran/xran-module-cap.yang create mode 100644 ntsimulator/yang/x-ran/xran-mplane-int.yang create mode 100644 ntsimulator/yang/x-ran/xran-operations.yang create mode 100644 ntsimulator/yang/x-ran/xran-performance-management.yang create mode 100644 ntsimulator/yang/x-ran/xran-processing-element.yang create mode 100644 ntsimulator/yang/x-ran/xran-software-management.yang create mode 100644 ntsimulator/yang/x-ran/xran-supervision.yang create mode 100644 ntsimulator/yang/x-ran/xran-sync.yang create mode 100644 ntsimulator/yang/x-ran/xran-transceiver.yang create mode 100644 ntsimulator/yang/x-ran/xran-troubleshooting.yang create mode 100644 ntsimulator/yang/x-ran/xran-udp-echo.yang create mode 100644 ntsimulator/yang/x-ran/xran-uplane-conf.yang create mode 100644 ntsimulator/yang/x-ran/xran-usermgmt.yang diff --git a/docker-build-manager.sh b/docker-build-manager.sh deleted file mode 100755 index c6a8487..0000000 --- a/docker-build-manager.sh +++ /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 index 168f314..0000000 --- a/docker-build-model.sh +++ /dev/null @@ -1 +0,0 @@ -docker build -t o-ran-sc_ntsim_oran -f ntsimulator/deploy/Dockerfile . diff --git a/ntsimulator/CMakeLists.txt b/ntsimulator/CMakeLists.txt index 3d3c52c..804f80b 100644 --- a/ntsimulator/CMakeLists.txt +++ b/ntsimulator/CMakeLists.txt @@ -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 index 72395be..0000000 --- a/ntsimulator/deploy/manager/Dockerfile +++ /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 index 12585e7..0000000 --- a/ntsimulator/deploy/manager/container-tag.yaml +++ /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 index 0000000..7e9a720 --- /dev/null +++ b/ntsimulator/deploy/nts-manager/CMakeLists.txt @@ -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 index 0000000..bff4bd8 --- /dev/null +++ b/ntsimulator/deploy/nts-manager/Dockerfile @@ -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 index 0000000..5df0816 --- /dev/null +++ b/ntsimulator/deploy/nts-manager/container-tag.yaml @@ -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 index 0000000..11e5c6a --- /dev/null +++ b/ntsimulator/deploy/nts-manager/model-install.sh.in @@ -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/manager/supervisord.conf.manager b/ntsimulator/deploy/nts-manager/supervisord.conf similarity index 100% rename from ntsimulator/deploy/manager/supervisord.conf.manager rename to ntsimulator/deploy/nts-manager/supervisord.conf 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 index 0000000..3eec7d7 --- /dev/null +++ b/ntsimulator/deploy/o-ran-sc/o-ran-ru/CMakeLists.txt @@ -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 index 0000000..e70a0a6 --- /dev/null +++ b/ntsimulator/deploy/o-ran-sc/o-ran-ru/Dockerfile @@ -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 index 0000000..5df0816 --- /dev/null +++ b/ntsimulator/deploy/o-ran-sc/o-ran-ru/container-tag.yaml @@ -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 index 0000000..014c840 --- /dev/null +++ b/ntsimulator/deploy/o-ran-sc/o-ran-ru/stock_config.xml @@ -0,0 +1,95 @@ + + + + MNG0 + +
0.0.0.0
+ 830 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG1 + +
0.0.0.0
+ 831 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG2 + +
0.0.0.0
+ 832 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG3 + +
0.0.0.0
+ 833 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG4 + +
0.0.0.0
+ 834 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG5 + +
0.0.0.0
+ 835 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG6 + +
0.0.0.0
+ 836 + + + imported SSH key + ssh_host_rsa_key + + +
+
+
+
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 index 0000000..e4b99fa --- /dev/null +++ b/ntsimulator/deploy/o-ran-sc/o-ran-ru/supervisord.conf @@ -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 index 0000000..34a1e79 --- /dev/null +++ b/ntsimulator/deploy/o-ran-sc/o-ran-ru/sysrepo-configuration-load.sh @@ -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 index 0000000..3294ef2 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/CMakeLists.txt @@ -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 index 0000000..a969262 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/Dockerfile @@ -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 index 0000000..5df0816 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/container-tag.yaml @@ -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 index 0000000..9881695 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.sh @@ -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 index 0000000..c96e741 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-activate.xml @@ -0,0 +1,21 @@ + + + + + + + + Slot1 + false + false + READ_WRITE + + + Slot2 + true + true + READ_ONLY + + + + \ 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 index 0000000..7989808 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.sh @@ -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 index 0000000..1664ed5 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/edit-config-after-download.xml @@ -0,0 +1,55 @@ + + + + + + + + Slot1 + VALID + true + true + READ_ONLY + SA + 2020-01-23T14:04:23 + SAMSUNG-XRAN-FH-2349-5645-32 + 19.7.123 + + manifest-v1.0.1.cfg + 2349-5645-32 + /home/system/slot1 + OK + + + image-v1.0.1.swm + 2349-5645-32 + /home/system/slot1 + OK + + + + Slot2 + VALID + false + false + READ_WRITE + SA + 2020-02-05T09:02:33 + SAMSUNG-XRAN-FH-2349-5790-44 + 19.7.123 + + manifest-v1.0.2.cfg + 2349-5790-44 + /home/system/slot2 + OK + + + image-v1.0.2.swm + 2349-5790-44 + /home/system/slot2 + OK + + + + + \ 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 index 0000000..4967da1 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.sh @@ -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 index 0000000..c80e463 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/edit-config-demo-start.xml @@ -0,0 +1,117 @@ + + + + + + + + + + softwareSlot1 + ianahw:storage-drive + 4207123 + ddesdvlkmvdfkvf + xAxAxxAxA + 33250247 + 12.2.3 + 7.1.2 + 19.7.123 + 35VU5 + xqxSSJSqJ + trttrttttrtrtttt + btsWtsWstBFFWs + Q446g + true + 2020-02-06T06:06:32.3Z + JJuaJa + 6cc66c66cZc6 + d8de752d-a6ee-74ed-fdac-2c8a9c88afba + + 2020-02-11T11:02:45.3Z + locked + disabled + active + critical major minor warning + hot-standby + + + + softwareSlot2 + ianahw:storage-drive + 4207123 + ddesdvlkmvdfkvf + xAxAxxAxA + 12350247 + 12.2.3 + 7.1.2 + 19.2.33 + 35VU5 + xqxSSJSqJ + trttrttttrtrtttt + btsWtsWstBFFWs + Q446g + true + 2020-02-06T06:06:32.3Z + JJuaJa + 6cc66c66cZc6 + d8de752d-a6ee-74ed-fdac-2c8a9c88afba + + 2020-02-11T11:02:45.3Z + locked + disabled + active + critical major minor warning + hot-standby + + + + + + Slot1 + VALID + true + true + READ_ONLY + SA + 2020-01-23T14:04:23 + SAMSUNG-XRAN-FH-2349-5645-32 + 19.7.123 + + manifest-v1.0.1.cfg + 2349-5645-32 + /home/system/slot1 + OK + + + image-v1.0.1.swm + 2349-5645-32 + /home/system/slot1 + OK + + + + Slot2 + VALID + false + false + READ_WRITE + SA + 2019-07-02T14:04:23 + SAMSUNG-XRAN-FH-2349-2345-44 + 19.2.33 + + manifest-v1.0.0.cfg + 2349-2345-44 + /home/system/slot2 + OK + + + image-v1.0.0.swm + 2349-2345-44 + /home/system/slot2 + OK + + + + + \ 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 index 0000000..014c840 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/stock_config.xml @@ -0,0 +1,95 @@ + + + + MNG0 + +
0.0.0.0
+ 830 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG1 + +
0.0.0.0
+ 831 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG2 + +
0.0.0.0
+ 832 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG3 + +
0.0.0.0
+ 833 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG4 + +
0.0.0.0
+ 834 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG5 + +
0.0.0.0
+ 835 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG6 + +
0.0.0.0
+ 836 + + + imported SSH key + ssh_host_rsa_key + + +
+
+
+
diff --git a/ntsimulator/deploy/o-ran/ru-fh/supervisord.conf b/ntsimulator/deploy/o-ran/ru-fh/supervisord.conf new file mode 100644 index 0000000..886a5f9 --- /dev/null +++ b/ntsimulator/deploy/o-ran/ru-fh/supervisord.conf @@ -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 index 0000000..fb005ce --- /dev/null +++ b/ntsimulator/deploy/tls/ca.key @@ -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 index 0000000..62593ab --- /dev/null +++ b/ntsimulator/deploy/tls/ca.pem @@ -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 index 0000000..c10d829 --- /dev/null +++ b/ntsimulator/deploy/tls/ca.srl @@ -0,0 +1 @@ +91390D611074ACC8 diff --git a/ntsimulator/deploy/tls/client.crt b/ntsimulator/deploy/tls/client.crt new file mode 100644 index 0000000..8e52dac --- /dev/null +++ b/ntsimulator/deploy/tls/client.crt @@ -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 index 0000000..7ccdab1 --- /dev/null +++ b/ntsimulator/deploy/tls/client.key @@ -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 index 0000000..45b02e6 --- /dev/null +++ b/ntsimulator/deploy/tls/enable_ssh_key.sh @@ -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 'netconfssh_keyssh-dss' >> load_auth_pubkey.xml +echo ''"$SSH_PUB_KEY"'' >> 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 index 0000000..97b539d --- /dev/null +++ b/ntsimulator/deploy/tls/enable_tls.sh @@ -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 'melacon_server_key' >> load_private_key.xml +echo ''"$MELACON_SERVER_KEY"'' >> load_private_key.xml + +netopeer2-cli <melacon_server_keymelacon_server_cert' >> load_server_certs.xml +echo ''"$MELACON_CERT"'trusted_ca_listca' >> load_server_certs.xml +echo ''"$CA_CERT"'' >> load_server_certs.xml + +sysrepocfg --merge=load_server_certs.xml --format=xml ietf-keystore +rm load_server_certs.xml + +echo '' >> tls_endpoints.xml +echo 'MNG_TLS_1
0.0.0.0
837melacon_server_certtrusted_ca_list102:E9:38:1F:F6:8B:62:DE:0A:0B:C5:03:81:A8:03:49:A0:00:7F:8B:F3x509c2n:specifiednetconf
' >> tls_endpoints.xml +echo 'MNG_TLS_2
0.0.0.0
838melacon_server_certtrusted_ca_list102:E9:38:1F:F6:8B:62:DE:0A:0B:C5:03:81:A8:03:49:A0:00:7F:8B:F3x509c2n:specifiednetconf
' >> tls_endpoints.xml +echo 'MNG_TLS_3
0.0.0.0
839melacon_server_certtrusted_ca_list102:E9:38:1F:F6:8B:62:DE:0A:0B:C5:03:81:A8:03:49:A0:00:7F:8B:F3x509c2n:specifiednetconf
' >> tls_endpoints.xml +echo '
' >> 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 index 0000000..687579d --- /dev/null +++ b/ntsimulator/deploy/tls/netconf_browser.crt @@ -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 index 0000000..61d8a4c --- /dev/null +++ b/ntsimulator/deploy/tls/netconf_browser.csr @@ -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 index 0000000..e21a060 --- /dev/null +++ b/ntsimulator/deploy/x-ran/CMakeLists.txt @@ -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 index 0000000..0ecd983 --- /dev/null +++ b/ntsimulator/deploy/x-ran/Dockerfile @@ -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 index 0000000..5df0816 --- /dev/null +++ b/ntsimulator/deploy/x-ran/container-tag.yaml @@ -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 index 0000000..9881695 --- /dev/null +++ b/ntsimulator/deploy/x-ran/edit-config-after-activate.sh @@ -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 index 0000000..df249c3 --- /dev/null +++ b/ntsimulator/deploy/x-ran/edit-config-after-activate.xml @@ -0,0 +1,21 @@ + + + + + + + + Slot1 + false + false + READ_WRITE + + + Slot2 + true + true + READ_ONLY + + + + \ 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 index 0000000..7989808 --- /dev/null +++ b/ntsimulator/deploy/x-ran/edit-config-after-download.sh @@ -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 index 0000000..7613d58 --- /dev/null +++ b/ntsimulator/deploy/x-ran/edit-config-after-download.xml @@ -0,0 +1,55 @@ + + + + + + + + Slot1 + VALID + true + true + READ_ONLY + SA + 2020-01-23T14:04:23 + SAMSUNG-XRAN-FH-2349-5645-32 + 19.7.123 + + manifest-v1.0.1.cfg + 2349-5645-32 + /home/system/slot1 + OK + + + image-v1.0.1.swm + 2349-5645-32 + /home/system/slot1 + OK + + + + Slot2 + VALID + false + false + READ_WRITE + SA + 2020-02-05T09:02:33 + SAMSUNG-XRAN-FH-2349-5790-44 + 19.7.123 + + manifest-v1.0.2.cfg + 2349-5790-44 + /home/system/slot2 + OK + + + image-v1.0.2.swm + 2349-5790-44 + /home/system/slot2 + OK + + + + + \ 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 index 0000000..4967da1 --- /dev/null +++ b/ntsimulator/deploy/x-ran/edit-config-demo-start.sh @@ -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 index 0000000..8b77f15 --- /dev/null +++ b/ntsimulator/deploy/x-ran/edit-config-demo-start.xml @@ -0,0 +1,117 @@ + + + + + + + + + + softwareSlot1 + ianahw:storage-drive + 4207123 + ddesdvlkmvdfkvf + xAxAxxAxA + 33250247 + 12.2.3 + 7.1.2 + 19.7.123 + 35VU5 + xqxSSJSqJ + trttrttttrtrtttt + btsWtsWstBFFWs + Q446g + true + 2020-02-06T06:06:32.3Z + JJuaJa + 6cc66c66cZc6 + d8de752d-a6ee-74ed-fdac-2c8a9c88afba + + 2020-02-11T11:02:45.3Z + locked + disabled + active + critical major minor warning + hot-standby + + + + softwareSlot2 + ianahw:storage-drive + 4207123 + ddesdvlkmvdfkvf + xAxAxxAxA + 12350247 + 12.2.3 + 7.1.2 + 19.2.33 + 35VU5 + xqxSSJSqJ + trttrttttrtrtttt + btsWtsWstBFFWs + Q446g + true + 2020-02-06T06:06:32.3Z + JJuaJa + 6cc66c66cZc6 + d8de752d-a6ee-74ed-fdac-2c8a9c88afba + + 2020-02-11T11:02:45.3Z + locked + disabled + active + critical major minor warning + hot-standby + + + + + + Slot1 + VALID + true + true + READ_ONLY + SA + 2020-01-23T14:04:23 + SAMSUNG-XRAN-FH-2349-5645-32 + 19.7.123 + + manifest-v1.0.1.cfg + 2349-5645-32 + /home/system/slot1 + OK + + + image-v1.0.1.swm + 2349-5645-32 + /home/system/slot1 + OK + + + + Slot2 + VALID + false + false + READ_WRITE + SA + 2019-07-02T14:04:23 + SAMSUNG-XRAN-FH-2349-2345-44 + 19.2.33 + + manifest-v1.0.0.cfg + 2349-2345-44 + /home/system/slot2 + OK + + + image-v1.0.0.swm + 2349-2345-44 + /home/system/slot2 + OK + + + + + \ 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 index 0000000..014c840 --- /dev/null +++ b/ntsimulator/deploy/x-ran/stock_config.xml @@ -0,0 +1,95 @@ + + + + MNG0 + +
0.0.0.0
+ 830 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG1 + +
0.0.0.0
+ 831 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG2 + +
0.0.0.0
+ 832 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG3 + +
0.0.0.0
+ 833 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG4 + +
0.0.0.0
+ 834 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG5 + +
0.0.0.0
+ 835 + + + imported SSH key + ssh_host_rsa_key + + +
+
+ + MNG6 + +
0.0.0.0
+ 836 + + + imported SSH key + ssh_host_rsa_key + + +
+
+
+
diff --git a/ntsimulator/deploy/x-ran/supervisord.conf b/ntsimulator/deploy/x-ran/supervisord.conf new file mode 100644 index 0000000..3b37a89 --- /dev/null +++ b/ntsimulator/deploy/x-ran/supervisord.conf @@ -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 index 0000000..ad6152b --- /dev/null +++ b/ntsimulator/docker-build-nts-manager.sh @@ -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 index 0000000..47f328d --- /dev/null +++ b/ntsimulator/docker-build-nts-o-ran-ru-fh.sh @@ -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 index 0000000..4449cb9 --- /dev/null +++ b/ntsimulator/docker-build-nts-o-ran-sc-o-ran-ru.sh @@ -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 index 0000000..f983cd7 --- /dev/null +++ b/ntsimulator/docker-build-nts-xran.sh @@ -0,0 +1 @@ +docker build -t o-ran-sc/ntsim-x-ran -f deploy/x-ran/Dockerfile . diff --git a/ntsimulator/scripts/clean.sh b/ntsimulator/scripts/clean.sh index 2d9bd56..5d21e4c 100755 --- a/ntsimulator/scripts/clean.sh +++ b/ntsimulator/scripts/clean.sh @@ -15,34 +15,74 @@ # 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!" diff --git a/ntsimulator/src/ntsimulator-manager/ntsimulator-manager.c b/ntsimulator/src/ntsimulator-manager/ntsimulator-manager.c index b5555c4..e5312b1 100644 --- a/ntsimulator/src/ntsimulator-manager/ntsimulator-manager.c +++ b/ntsimulator/src/ntsimulator-manager/ntsimulator-manager.c @@ -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; diff --git a/ntsimulator/src/ntsimulator-manager/simulator-operations.c b/ntsimulator/src/ntsimulator-manager/simulator-operations.c index a4adcc3..2ff4207 100644 --- a/ntsimulator/src/ntsimulator-manager/simulator-operations.c +++ b/ntsimulator/src/ntsimulator-manager/simulator-operations.c @@ -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; } diff --git a/ntsimulator/src/o-ran-notifications/o-ran-notifications.c b/ntsimulator/src/o-ran-notifications/o-ran-notifications.c index ae6e0c6..ad282d1 100644 --- a/ntsimulator/src/o-ran-notifications/o-ran-notifications.c +++ b/ntsimulator/src/o-ran-notifications/o-ran-notifications.c @@ -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 index 0000000..f49ce32 --- /dev/null +++ b/ntsimulator/src/software-management-oran/CMakeLists.txt @@ -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 index 0000000..1540596 --- /dev/null +++ b/ntsimulator/src/software-management-oran/sw-management-rpc.c @@ -0,0 +1,519 @@ +/** + * @file sw-management-rpc.c + * @author Rastislav Szabo , Lukas Macko , + * Milan Lenco + * @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 +#include +#include +#include +#include + +#include + +#include "sysrepo.h" +#include "sysrepo/values.h" + +#include "utils.h" + +#define LINE_BUFSIZE 128 + +volatile int exit_application = 0; + +pthread_mutex_t lock; + +static int sw_download_error_count, sw_install_error_count, sw_activate_error_count; + +void call_software_management_script(char *script_name) +{ + char line[LINE_BUFSIZE]; + int linenr; + FILE *pipe; + + /* Get a pipe where the output from the scripts comes in */ + char script[200]; + sprintf(script, "/opt/dev/%s", script_name); + + pipe = popen(script, "r"); + if (pipe == NULL) { /* check for errors */ + printf("Could not open script.\n"); + return; /* return with exit code indicating error */ + } + + /* Read script output from the pipe line by line */ + linenr = 1; + while (fgets(line, LINE_BUFSIZE, pipe) != NULL) { + printf("Script output line %d: %s", linenr, line); + ++linenr; + } + + /* Once here, out of the loop, the script has ended. */ + pclose(pipe); /* Close the pipe */ + return; /* return with exit code indicating success. */ +} + +struct sw_download_struct +{ + sr_session_ctx_t *sess; + char *filename; +}; + +void* sw_download_notification_send(void *arguments) +{ + // create the values to be sent in the notification + struct sw_download_struct *args = (struct sw_download_struct *)arguments; + int rc = SR_ERR_OK; + + sw_download_error_count++; + + sr_val_t *notif = NULL; + size_t current_num_of_values_notif = 0; + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + char *trunc_filename; + trunc_filename = strrchr(args->filename, '/'); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:download-event/file-name"); + if (trunc_filename != NULL) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, trunc_filename + 1); + + if (strcmp(trunc_filename+1, "reset") == 0) + { + call_software_management_script("edit-config-demo-start.sh"); + } + else + { + call_software_management_script("edit-config-after-download.sh"); + } + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->filename); + if (strcmp(args->filename, "reset") == 0) + { + call_software_management_script("edit-config-demo-start.sh"); + } + else + { + call_software_management_script("edit-config-after-download.sh"); + } + } + + if (args->filename != NULL) + { + free(args->filename); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:download-event/status"); + //every 5 RPCs we send an error + if (sw_download_error_count % 5 == 0) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "AUTHENTICATION_ERROR"); + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED"); + } + + + // wait 5 seconds before sending the notification + sleep(5); + + /* send notification for event_notif_sub(_tree)_example */ + printf(">>> Sending event notification for '/o-ran-software-management:download-event'...\n"); + rc = sr_event_notif_send(args->sess, "/o-ran-software-management:download-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT); + if (SR_ERR_NOT_FOUND == rc) { + printf("No application subscribed for '/o-ran-software-management:download-event', skipping.\n"); + rc = SR_ERR_OK; + } + sr_free_values(notif, current_num_of_values_notif); + + return NULL; +} + +struct sw_install_struct +{ + sr_session_ctx_t *sess; + char *slot_name; +}; + +void* sw_install_notification_send(void *arguments) +{ + // create the values to be sent in the notification + struct sw_install_struct *args = (struct sw_install_struct *)arguments; + int rc = SR_ERR_OK; + sw_install_error_count++; + + sr_val_t *notif = NULL; + size_t current_num_of_values_notif = 0; + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:install-event/slot-name"); + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name); + + if (args->slot_name != NULL) + { + free(args->slot_name); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:install-event/status"); + + //every 5 RPCs we send an error + if (sw_install_error_count % 5 == 0) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "INTEGRITY_ERROR"); + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED"); + } + + // wait 5 seconds before sending the notification + sleep(5); + + /* send notification for event_notif_sub(_tree)_example */ + printf(">>> Sending event notification for '/o-ran-software-management:install-event'...\n"); + rc = sr_event_notif_send(args->sess, "/o-ran-software-management:install-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT); + if (SR_ERR_NOT_FOUND == rc) { + printf("No application subscribed for '/o-ran-software-management:install-event', skipping.\n"); + rc = SR_ERR_OK; + } + sr_free_values(notif, current_num_of_values_notif); + + return NULL; +} + +struct sw_activate_struct +{ + sr_session_ctx_t *sess; + char *slot_name; +}; + +void* sw_activate_notification_send(void *arguments) +{ + // create the values to be sent in the notification + struct sw_activate_struct *args = (struct sw_activate_struct *)arguments; + int rc = SR_ERR_OK; + sw_activate_error_count++; + + sr_val_t *notif = NULL; + size_t current_num_of_values_notif = 0; + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:activation-event/slot-name"); + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name); + + if (args->slot_name != NULL) + { + free(args->slot_name); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:activation-event/status"); + //every 5 RPCs we send an error + if (sw_activate_error_count % 5 == 0) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "APPLICATION_ERROR"); + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED"); + + call_software_management_script("edit-config-after-activate.sh"); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/o-ran-software-management:activation-event/return-code"); + notif[current_num_of_values_notif - 1].type = SR_UINT8_T; + notif[current_num_of_values_notif - 1].data.uint8_val = 200; + + // wait 5 seconds before sending the notification + sleep(5); + + /* send notification for event_notif_sub(_tree)_example */ + printf(">>> Sending event notification for '/o-ran-software-management:activation-event'...\n"); + rc = sr_event_notif_send(args->sess, "/o-ran-software-management:activation-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT); + if (SR_ERR_NOT_FOUND == rc) { + printf("No application subscribed for '/o-ran-software-management:activation-event', skipping.\n"); + rc = SR_ERR_OK; + } + sr_free_values(notif, current_num_of_values_notif); + + return NULL; +} + +static int +sw_download_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt, + sr_val_t **output, size_t *output_cnt, void *private_ctx) +{ + int rc = SR_ERR_OK; + sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx; + + /** + * Here you would actually run the operation against the provided input values + * and obtained the output values. + */ + + /* allocate output values */ + rc = sr_new_values(2, output); + if (SR_ERR_OK != rc) { + return rc; + } + + rc = sr_val_set_xpath(&(*output)[0], "/o-ran-software-management:software-download/status"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[0].type = SR_ENUM_T; + (*output)[0].data.enum_val = "STARTED"; + + rc = sr_val_set_xpath(&(*output)[1], "/o-ran-software-management:software-download/notification-timeout"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[1].type = SR_INT32_T; + (*output)[1].data.int32_val = 10; + + /* inform sysrepo about the number of output values */ + *output_cnt = 2; + + struct sw_download_struct *args = (struct sw_download_struct *)malloc(sizeof(struct sw_download_struct)); + args->sess = session; + args->filename = strdup(input[0].data.string_val); + + pthread_t sw_download_thread; + if(pthread_create(&sw_download_thread, NULL, &sw_download_notification_send, (void *)args)) + { + fprintf(stderr, "Could not create thread for SW Download thread\n"); + return SR_ERR_OPERATION_FAILED; + } + + /** + * Do not deallocate input values! + * They will get freed automatically by sysrepo. + */ + return rc; +} + +static int +sw_install_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt, + sr_val_t **output, size_t *output_cnt, void *private_ctx) +{ + int rc = SR_ERR_OK; + sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx; + + /** + * Here you would actually run the operation against the provided input values + * and obtained the output values. + */ + + /* allocate output values */ + rc = sr_new_values(1, output); + if (SR_ERR_OK != rc) { + return rc; + } + + rc = sr_val_set_xpath(&(*output)[0], "/o-ran-software-management:software-install/status"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[0].type = SR_ENUM_T; + (*output)[0].data.enum_val = "STARTED"; + + /* inform sysrepo about the number of output values */ + *output_cnt = 1; + + struct sw_install_struct *args = (struct sw_install_struct *)malloc(sizeof(struct sw_install_struct)); + args->sess = session; + args->slot_name = strdup(input[0].data.string_val); + + pthread_t sw_install_thread; + if(pthread_create(&sw_install_thread, NULL, &sw_install_notification_send, (void *)args)) + { + fprintf(stderr, "Could not create thread for SW Install thread\n"); + return SR_ERR_OPERATION_FAILED; + } + + /** + * Do not deallocate input values! + * They will get freed automatically by sysrepo. + */ + return rc; +} + +static int +sw_activate_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt, + sr_val_t **output, size_t *output_cnt, void *private_ctx) +{ + int rc = SR_ERR_OK; + sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx; + + /** + * Here you would actually run the operation against the provided input values + * and obtained the output values. + */ + + /* allocate output values */ + rc = sr_new_values(2, output); + if (SR_ERR_OK != rc) { + return rc; + } + + rc = sr_val_set_xpath(&(*output)[0], "/o-ran-software-management:software-activate/status"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[0].type = SR_ENUM_T; + (*output)[0].data.enum_val = "STARTED"; + + rc = sr_val_set_xpath(&(*output)[1], "/o-ran-software-management:software-activate/notification-timeout"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[1].type = SR_INT32_T; + (*output)[1].data.int32_val = 10; + + /* inform sysrepo about the number of output values */ + *output_cnt = 2; + + struct sw_activate_struct *args = (struct sw_activate_struct *)malloc(sizeof(struct sw_activate_struct)); + args->sess = session; + args->slot_name = strdup(input[0].data.string_val); + + pthread_t sw_activate_thread; + if(pthread_create(&sw_activate_thread, NULL, &sw_activate_notification_send, (void *)args)) + { + fprintf(stderr, "Could not create thread for SW Activate thread\n"); + return SR_ERR_OPERATION_FAILED; + } + + /** + * Do not deallocate input values! + * They will get freed automatically by sysrepo. + */ + return rc; +} + +static void +sigint_handler(int signum) +{ + exit_application = 1; +} + +static int +rpc_handler(sr_session_ctx_t *session) +{ + sr_subscription_ctx_t *subscription = NULL; + int rc = SR_ERR_OK; + + /* subscribe for handling software-download RPC */ + rc = sr_rpc_subscribe(session, "/o-ran-software-management:software-download", sw_download_rpc_cb, + (void *)session, SR_SUBSCR_DEFAULT, &subscription); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* subscribe for handling software-install RPC */ + rc = sr_rpc_subscribe(session, "/o-ran-software-management:software-install", sw_install_rpc_cb, + (void *)session, SR_SUBSCR_DEFAULT, &subscription); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* subscribe for handling software-activate RPC */ + rc = sr_rpc_subscribe(session, "/o-ran-software-management:software-activate", sw_activate_rpc_cb, + (void *)session, SR_SUBSCR_DEFAULT, &subscription); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc)); + goto cleanup; + } + + printf("\n\n ========== SUBSCRIBED FOR HANDLING RPC ==========\n\n"); + + /* loop until ctrl-c is pressed / SIGINT is received */ + signal(SIGINT, sigint_handler); + signal(SIGPIPE, SIG_IGN); + while (!exit_application) { + sleep(1000); /* or do some more useful work... */ + } + + printf("Application exit requested, exiting.\n"); + +cleanup: + if (NULL != subscription) { + sr_unsubscribe(session, subscription); + } + return rc; +} + +int +main(int argc, char **argv) +{ + sr_conn_ctx_t *connection = NULL; + sr_session_ctx_t *session = NULL; + int rc = SR_ERR_OK; + + setbuf(stdout, NULL); + + if (pthread_mutex_init(&lock, NULL) != 0) + { + printf("Mutex init failed...\n"); + goto cleanup; + } + + /* connect to sysrepo */ + rc = sr_connect("sw_management_rpc_app", SR_CONN_DEFAULT, &connection); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_connect: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* start session */ + rc = sr_session_start(connection, SR_DS_RUNNING, SR_SESS_DEFAULT, &session); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* run as a RPC handler */ + printf("This application will be an RPC handler for 'software-download' operation of 'o-ran-software-management'.\n"); + rc = rpc_handler(session); + +cleanup: + if (NULL != session) { + sr_session_stop(session); + } + if (NULL != connection) { + sr_disconnect(connection); + } + return rc; +} diff --git a/ntsimulator/src/software-management-xran/CMakeLists.txt b/ntsimulator/src/software-management-xran/CMakeLists.txt new file mode 100644 index 0000000..f49ce32 --- /dev/null +++ b/ntsimulator/src/software-management-xran/CMakeLists.txt @@ -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 index 0000000..b2b5025 --- /dev/null +++ b/ntsimulator/src/software-management-xran/sw-management-rpc.c @@ -0,0 +1,519 @@ +/** + * @file sw-management-rpc.c + * @author Rastislav Szabo , Lukas Macko , + * Milan Lenco + * @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 +#include +#include +#include +#include + +#include + +#include "sysrepo.h" +#include "sysrepo/values.h" + +#include "utils.h" + +#define LINE_BUFSIZE 128 + +volatile int exit_application = 0; + +pthread_mutex_t lock; + +static int sw_download_error_count, sw_install_error_count, sw_activate_error_count; + +void call_software_management_script(char *script_name) +{ + char line[LINE_BUFSIZE]; + int linenr; + FILE *pipe; + + /* Get a pipe where the output from the scripts comes in */ + char script[200]; + sprintf(script, "/opt/dev/%s", script_name); + + pipe = popen(script, "r"); + if (pipe == NULL) { /* check for errors */ + printf("Could not open script.\n"); + return; /* return with exit code indicating error */ + } + + /* Read script output from the pipe line by line */ + linenr = 1; + while (fgets(line, LINE_BUFSIZE, pipe) != NULL) { + printf("Script output line %d: %s", linenr, line); + ++linenr; + } + + /* Once here, out of the loop, the script has ended. */ + pclose(pipe); /* Close the pipe */ + return; /* return with exit code indicating success. */ +} + +struct sw_download_struct +{ + sr_session_ctx_t *sess; + char *filename; +}; + +void* sw_download_notification_send(void *arguments) +{ + // create the values to be sent in the notification + struct sw_download_struct *args = (struct sw_download_struct *)arguments; + int rc = SR_ERR_OK; + + sw_download_error_count++; + + sr_val_t *notif = NULL; + size_t current_num_of_values_notif = 0; + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + char *trunc_filename; + trunc_filename = strrchr(args->filename, '/'); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:download-event/file-name"); + if (trunc_filename != NULL) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, trunc_filename + 1); + + if (strcmp(trunc_filename+1, "reset") == 0) + { + call_software_management_script("edit-config-demo-start.sh"); + } + else + { + call_software_management_script("edit-config-after-download.sh"); + } + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->filename); + if (strcmp(args->filename, "reset") == 0) + { + call_software_management_script("edit-config-demo-start.sh"); + } + else + { + call_software_management_script("edit-config-after-download.sh"); + } + } + + if (args->filename != NULL) + { + free(args->filename); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:download-event/status"); + //every 5 RPCs we send an error + if (sw_download_error_count % 5 == 0) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "AUTHENTICATION_ERROR"); + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED"); + } + + + // wait 5 seconds before sending the notification + sleep(5); + + /* send notification for event_notif_sub(_tree)_example */ + printf(">>> Sending event notification for '/xran-software-management:download-event'...\n"); + rc = sr_event_notif_send(args->sess, "/xran-software-management:download-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT); + if (SR_ERR_NOT_FOUND == rc) { + printf("No application subscribed for '/xran-software-management:download-event', skipping.\n"); + rc = SR_ERR_OK; + } + sr_free_values(notif, current_num_of_values_notif); + + return NULL; +} + +struct sw_install_struct +{ + sr_session_ctx_t *sess; + char *slot_name; +}; + +void* sw_install_notification_send(void *arguments) +{ + // create the values to be sent in the notification + struct sw_install_struct *args = (struct sw_install_struct *)arguments; + int rc = SR_ERR_OK; + sw_install_error_count++; + + sr_val_t *notif = NULL; + size_t current_num_of_values_notif = 0; + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:install-event/slot-name"); + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name); + + if (args->slot_name != NULL) + { + free(args->slot_name); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:install-event/status"); + + //every 5 RPCs we send an error + if (sw_install_error_count % 5 == 0) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "INTEGRITY_ERROR"); + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED"); + } + + // wait 5 seconds before sending the notification + sleep(5); + + /* send notification for event_notif_sub(_tree)_example */ + printf(">>> Sending event notification for '/xran-software-management:install-event'...\n"); + rc = sr_event_notif_send(args->sess, "/xran-software-management:install-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT); + if (SR_ERR_NOT_FOUND == rc) { + printf("No application subscribed for '/xran-software-management:install-event', skipping.\n"); + rc = SR_ERR_OK; + } + sr_free_values(notif, current_num_of_values_notif); + + return NULL; +} + +struct sw_activate_struct +{ + sr_session_ctx_t *sess; + char *slot_name; +}; + +void* sw_activate_notification_send(void *arguments) +{ + // create the values to be sent in the notification + struct sw_activate_struct *args = (struct sw_activate_struct *)arguments; + int rc = SR_ERR_OK; + sw_activate_error_count++; + + sr_val_t *notif = NULL; + size_t current_num_of_values_notif = 0; + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:activation-event/slot-name"); + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_STRING_T, args->slot_name); + + if (args->slot_name != NULL) + { + free(args->slot_name); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:activation-event/status"); + //every 5 RPCs we send an error + if (sw_activate_error_count % 5 == 0) + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "APPLICATION_ERROR"); + } + else + { + sr_val_set_str_data(¬if[current_num_of_values_notif - 1], SR_ENUM_T, "COMPLETED"); + + call_software_management_script("edit-config-after-activate.sh"); + } + + CREATE_NEW_VALUE(rc, notif, current_num_of_values_notif); + + sr_val_build_xpath(¬if[current_num_of_values_notif - 1], "%s", "/xran-software-management:activation-event/return-code"); + notif[current_num_of_values_notif - 1].type = SR_UINT8_T; + notif[current_num_of_values_notif - 1].data.uint8_val = 200; + + // wait 5 seconds before sending the notification + sleep(5); + + /* send notification for event_notif_sub(_tree)_example */ + printf(">>> Sending event notification for '/xran-software-management:activation-event'...\n"); + rc = sr_event_notif_send(args->sess, "/xran-software-management:activation-event", notif, current_num_of_values_notif, SR_EV_NOTIF_DEFAULT); + if (SR_ERR_NOT_FOUND == rc) { + printf("No application subscribed for '/xran-software-management:activation-event', skipping.\n"); + rc = SR_ERR_OK; + } + sr_free_values(notif, current_num_of_values_notif); + + return NULL; +} + +static int +sw_download_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt, + sr_val_t **output, size_t *output_cnt, void *private_ctx) +{ + int rc = SR_ERR_OK; + sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx; + + /** + * Here you would actually run the operation against the provided input values + * and obtained the output values. + */ + + /* allocate output values */ + rc = sr_new_values(2, output); + if (SR_ERR_OK != rc) { + return rc; + } + + rc = sr_val_set_xpath(&(*output)[0], "/xran-software-management:software-download/status"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[0].type = SR_ENUM_T; + (*output)[0].data.enum_val = "STARTED"; + + rc = sr_val_set_xpath(&(*output)[1], "/xran-software-management:software-download/notification-timeout"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[1].type = SR_INT32_T; + (*output)[1].data.int32_val = 10; + + /* inform sysrepo about the number of output values */ + *output_cnt = 2; + + struct sw_download_struct *args = (struct sw_download_struct *)malloc(sizeof(struct sw_download_struct)); + args->sess = session; + args->filename = strdup(input[0].data.string_val); + + pthread_t sw_download_thread; + if(pthread_create(&sw_download_thread, NULL, &sw_download_notification_send, (void *)args)) + { + fprintf(stderr, "Could not create thread for SW Download thread\n"); + return SR_ERR_OPERATION_FAILED; + } + + /** + * Do not deallocate input values! + * They will get freed automatically by sysrepo. + */ + return rc; +} + +static int +sw_install_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt, + sr_val_t **output, size_t *output_cnt, void *private_ctx) +{ + int rc = SR_ERR_OK; + sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx; + + /** + * Here you would actually run the operation against the provided input values + * and obtained the output values. + */ + + /* allocate output values */ + rc = sr_new_values(1, output); + if (SR_ERR_OK != rc) { + return rc; + } + + rc = sr_val_set_xpath(&(*output)[0], "/xran-software-management:software-install/status"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[0].type = SR_ENUM_T; + (*output)[0].data.enum_val = "STARTED"; + + /* inform sysrepo about the number of output values */ + *output_cnt = 1; + + struct sw_install_struct *args = (struct sw_install_struct *)malloc(sizeof(struct sw_install_struct)); + args->sess = session; + args->slot_name = strdup(input[0].data.string_val); + + pthread_t sw_install_thread; + if(pthread_create(&sw_install_thread, NULL, &sw_install_notification_send, (void *)args)) + { + fprintf(stderr, "Could not create thread for SW Install thread\n"); + return SR_ERR_OPERATION_FAILED; + } + + /** + * Do not deallocate input values! + * They will get freed automatically by sysrepo. + */ + return rc; +} + +static int +sw_activate_rpc_cb(const char *xpath, const sr_val_t *input, const size_t input_cnt, + sr_val_t **output, size_t *output_cnt, void *private_ctx) +{ + int rc = SR_ERR_OK; + sr_session_ctx_t *session = (sr_session_ctx_t *)private_ctx; + + /** + * Here you would actually run the operation against the provided input values + * and obtained the output values. + */ + + /* allocate output values */ + rc = sr_new_values(2, output); + if (SR_ERR_OK != rc) { + return rc; + } + + rc = sr_val_set_xpath(&(*output)[0], "/xran-software-management:software-activate/status"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[0].type = SR_ENUM_T; + (*output)[0].data.enum_val = "STARTED"; + + rc = sr_val_set_xpath(&(*output)[1], "/xran-software-management:software-activate/notification-timeout"); + if (SR_ERR_OK != rc) { + return rc; + } + (*output)[1].type = SR_INT32_T; + (*output)[1].data.int32_val = 10; + + /* inform sysrepo about the number of output values */ + *output_cnt = 2; + + struct sw_activate_struct *args = (struct sw_activate_struct *)malloc(sizeof(struct sw_activate_struct)); + args->sess = session; + args->slot_name = strdup(input[0].data.string_val); + + pthread_t sw_activate_thread; + if(pthread_create(&sw_activate_thread, NULL, &sw_activate_notification_send, (void *)args)) + { + fprintf(stderr, "Could not create thread for SW Activate thread\n"); + return SR_ERR_OPERATION_FAILED; + } + + /** + * Do not deallocate input values! + * They will get freed automatically by sysrepo. + */ + return rc; +} + +static void +sigint_handler(int signum) +{ + exit_application = 1; +} + +static int +rpc_handler(sr_session_ctx_t *session) +{ + sr_subscription_ctx_t *subscription = NULL; + int rc = SR_ERR_OK; + + /* subscribe for handling software-download RPC */ + rc = sr_rpc_subscribe(session, "/xran-software-management:software-download", sw_download_rpc_cb, + (void *)session, SR_SUBSCR_DEFAULT, &subscription); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* subscribe for handling software-install RPC */ + rc = sr_rpc_subscribe(session, "/xran-software-management:software-install", sw_install_rpc_cb, + (void *)session, SR_SUBSCR_DEFAULT, &subscription); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* subscribe for handling software-activate RPC */ + rc = sr_rpc_subscribe(session, "/xran-software-management:software-activate", sw_activate_rpc_cb, + (void *)session, SR_SUBSCR_DEFAULT, &subscription); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_rpc_subscribe: %s\n", sr_strerror(rc)); + goto cleanup; + } + + printf("\n\n ========== SUBSCRIBED FOR HANDLING RPC ==========\n\n"); + + /* loop until ctrl-c is pressed / SIGINT is received */ + signal(SIGINT, sigint_handler); + signal(SIGPIPE, SIG_IGN); + while (!exit_application) { + sleep(1000); /* or do some more useful work... */ + } + + printf("Application exit requested, exiting.\n"); + +cleanup: + if (NULL != subscription) { + sr_unsubscribe(session, subscription); + } + return rc; +} + +int +main(int argc, char **argv) +{ + sr_conn_ctx_t *connection = NULL; + sr_session_ctx_t *session = NULL; + int rc = SR_ERR_OK; + + setbuf(stdout, NULL); + + if (pthread_mutex_init(&lock, NULL) != 0) + { + printf("Mutex init failed...\n"); + goto cleanup; + } + + /* connect to sysrepo */ + rc = sr_connect("sw_management_rpc_app", SR_CONN_DEFAULT, &connection); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_connect: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* start session */ + rc = sr_session_start(connection, SR_DS_RUNNING, SR_SESS_DEFAULT, &session); + if (SR_ERR_OK != rc) { + fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc)); + goto cleanup; + } + + /* run as a RPC handler */ + printf("This application will be an RPC handler for 'software-download' operation of 'xran-software-management'.\n"); + rc = rpc_handler(session); + +cleanup: + if (NULL != session) { + sr_session_stop(session); + } + if (NULL != connection) { + sr_disconnect(connection); + } + return rc; +} diff --git a/ntsimulator/src/utils/utils.c b/ntsimulator/src/utils/utils.c index af40454..0300ff9 100644 --- a/ntsimulator/src/utils/utils.c +++ b/ntsimulator/src/utils/utils.c @@ -21,6 +21,7 @@ #include #include #include +#include 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; } diff --git a/ntsimulator/src/ves-messages/heartbeat.c b/ntsimulator/src/ves-messages/heartbeat.c index a5785e5..29d69f8 100644 --- a/ntsimulator/src/ves-messages/heartbeat.c +++ b/ntsimulator/src/ves-messages/heartbeat.c @@ -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); diff --git a/ntsimulator/yang/auto-load-yangs.sh b/ntsimulator/yang/auto-load-yangs.sh index 402d076..3c4f409 100755 --- a/ntsimulator/yang/auto-load-yangs.sh +++ b/ntsimulator/yang/auto-load-yangs.sh @@ -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/manager/network-topology-simulator.xml b/ntsimulator/yang/nts-manager/network-topology-simulator.xml similarity index 100% rename from ntsimulator/yang/manager/network-topology-simulator.xml rename to ntsimulator/yang/nts-manager/network-topology-simulator.xml diff --git a/ntsimulator/yang/manager/network-topology-simulator.yang b/ntsimulator/yang/nts-manager/network-topology-simulator.yang similarity index 100% rename from ntsimulator/yang/manager/network-topology-simulator.yang rename to ntsimulator/yang/nts-manager/network-topology-simulator.yang diff --git a/ntsimulator/yang/iana-hardware.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/iana-hardware.yang old mode 100755 new mode 100644 similarity index 100% rename from ntsimulator/yang/iana-hardware.yang rename to ntsimulator/yang/o-ran-sc/o-ran-ru/iana-hardware.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 index 0000000..856320b --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-alarms.yang @@ -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: + WG List: + + Editor: Stefan Vallin + + + Editor: Martin Bjorklund + "; + 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/ietf-hardware.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-hardware.yang old mode 100755 new mode 100644 similarity index 100% rename from ntsimulator/yang/ietf-hardware.yang rename to ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-hardware.yang diff --git a/ntsimulator/yang/ietf-inet-types.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-inet-types.yang old mode 100755 new mode 100644 similarity index 100% rename from ntsimulator/yang/ietf-inet-types.yang rename to ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-inet-types.yang diff --git a/ntsimulator/yang/ietf-interfaces.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-interfaces.yang similarity index 100% rename from ntsimulator/yang/ietf-interfaces.yang rename to ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-interfaces.yang diff --git a/ntsimulator/yang/ietf-yang-types.yang b/ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-yang-types.yang old mode 100755 new mode 100644 similarity index 100% rename from ntsimulator/yang/ietf-yang-types.yang rename to ntsimulator/yang/o-ran-sc/o-ran-ru/ietf-yang-types.yang 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 index 0000000..a55ed7c --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-alarms-v1.yang @@ -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 index 0000000..930bba3 --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-common-alarms-v1.yang @@ -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 index 0000000..fc08229 --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-hardware-v1.yang @@ -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 index 0000000..4f54d43 --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-interfaces-v1.yang @@ -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 index 0000000..1acd553 --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-root-v1.yang @@ -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 index 0000000..c52414d --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-alarms-v1.yang @@ -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 index 0000000..1566ec9 --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-ru-v1.yang @@ -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 index 0000000..5bf46d9 --- /dev/null +++ b/ntsimulator/yang/o-ran-sc/o-ran-ru/o-ran-sc-types-v1.yang @@ -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 index 0000000..52bcaf3 --- /dev/null +++ b/ntsimulator/yang/o-ran/ru-fh/iana-hardware.yang @@ -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/iana-if-type.yang b/ntsimulator/yang/o-ran/ru-fh/iana-if-type.yang similarity index 100% rename from ntsimulator/yang/iana-if-type.yang rename to ntsimulator/yang/o-ran/ru-fh/iana-if-type.yang diff --git a/ntsimulator/yang/ietf-crypto-types.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-crypto-types.yang similarity index 100% rename from ntsimulator/yang/ietf-crypto-types.yang rename to ntsimulator/yang/o-ran/ru-fh/ietf-crypto-types.yang diff --git a/ntsimulator/yang/ietf-dhcpv6-types.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-dhcpv6-types.yang similarity index 100% rename from ntsimulator/yang/ietf-dhcpv6-types.yang rename to ntsimulator/yang/o-ran/ru-fh/ietf-dhcpv6-types.yang 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 index 0000000..f444e26 --- /dev/null +++ b/ntsimulator/yang/o-ran/ru-fh/ietf-hardware.yang @@ -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: + WG List: + Editor: Andy Bierman + + Editor: Martin Bjorklund + + Editor: Jie Dong + + Editor: Dan Romascanu + "; + +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 index 0000000..4b0db8e --- /dev/null +++ b/ntsimulator/yang/o-ran/ru-fh/ietf-inet-types.yang @@ -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: + WG List: + WG Chair: David Kessens + + WG Chair: Juergen Schoenwaelder + + Editor: Juergen Schoenwaelder + "; + +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 . + 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 index 0000000..8dae9d3 --- /dev/null +++ b/ntsimulator/yang/o-ran/ru-fh/ietf-interfaces.yang @@ -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: + WG List: + Editor: Martin Bjorklund + "; + + 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/ietf-ip.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-ip.yang similarity index 100% rename from ntsimulator/yang/ietf-ip.yang rename to ntsimulator/yang/o-ran/ru-fh/ietf-ip.yang diff --git a/ntsimulator/yang/ietf-netconf-acm.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-netconf-acm.yang similarity index 100% rename from ntsimulator/yang/ietf-netconf-acm.yang rename to ntsimulator/yang/o-ran/ru-fh/ietf-netconf-acm.yang diff --git a/ntsimulator/yang/ietf-netconf-monitoring.yang b/ntsimulator/yang/o-ran/ru-fh/ietf-netconf-monitoring.yang similarity index 100% rename from ntsimulator/yang/ietf-netconf-monitoring.yang rename to ntsimulator/yang/o-ran/ru-fh/ietf-netconf-monitoring.yang 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 index 0000000..45b8c55 --- /dev/null +++ b/ntsimulator/yang/o-ran/ru-fh/ietf-yang-types.yang @@ -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: + WG List: + WG Chair: David Kessens + + WG Chair: Juergen Schoenwaelder + + Editor: Juergen Schoenwaelder + "; + +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/o-ran-alarm-id.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-alarm-id.yang similarity index 100% rename from ntsimulator/yang/o-ran-alarm-id.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-alarm-id.yang diff --git a/ntsimulator/yang/o-ran-ald-port.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-ald-port.yang similarity index 100% rename from ntsimulator/yang/o-ran-ald-port.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-ald-port.yang diff --git a/ntsimulator/yang/o-ran-ald.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-ald.yang similarity index 100% rename from ntsimulator/yang/o-ran-ald.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-ald.yang diff --git a/ntsimulator/yang/o-ran-beamforming.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-beamforming.yang similarity index 100% rename from ntsimulator/yang/o-ran-beamforming.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-beamforming.yang diff --git a/ntsimulator/yang/o-ran-compression-factors.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-compression-factors.yang similarity index 100% rename from ntsimulator/yang/o-ran-compression-factors.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-compression-factors.yang diff --git a/ntsimulator/yang/o-ran-delay-management.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-delay-management.yang similarity index 100% rename from ntsimulator/yang/o-ran-delay-management.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-delay-management.yang diff --git a/ntsimulator/yang/o-ran-dhcp.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-dhcp.yang similarity index 100% rename from ntsimulator/yang/o-ran-dhcp.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-dhcp.yang diff --git a/ntsimulator/yang/o-ran-ecpri-delay.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-ecpri-delay.yang similarity index 100% rename from ntsimulator/yang/o-ran-ecpri-delay.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-ecpri-delay.yang diff --git a/ntsimulator/yang/o-ran-externalio.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-externalio.yang similarity index 100% rename from ntsimulator/yang/o-ran-externalio.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-externalio.yang diff --git a/ntsimulator/yang/o-ran-fan.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-fan.yang similarity index 100% rename from ntsimulator/yang/o-ran-fan.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-fan.yang diff --git a/ntsimulator/yang/o-ran-file-management.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-file-management.yang similarity index 100% rename from ntsimulator/yang/o-ran-file-management.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-file-management.yang diff --git a/ntsimulator/yang/o-ran-fm.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-fm.yang similarity index 100% rename from ntsimulator/yang/o-ran-fm.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-fm.yang diff --git a/ntsimulator/yang/o-ran-hardware.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-hardware.yang similarity index 100% rename from ntsimulator/yang/o-ran-hardware.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-hardware.yang diff --git a/ntsimulator/yang/o-ran-interfaces.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-interfaces.yang similarity index 100% rename from ntsimulator/yang/o-ran-interfaces.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-interfaces.yang diff --git a/ntsimulator/yang/o-ran-laa-operations.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-laa-operations.yang similarity index 100% rename from ntsimulator/yang/o-ran-laa-operations.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-laa-operations.yang diff --git a/ntsimulator/yang/o-ran-laa.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-laa.yang similarity index 100% rename from ntsimulator/yang/o-ran-laa.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-laa.yang diff --git a/ntsimulator/yang/o-ran-lbm.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-lbm.yang similarity index 100% rename from ntsimulator/yang/o-ran-lbm.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-lbm.yang diff --git a/ntsimulator/yang/o-ran-module-cap.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-module-cap.yang similarity index 100% rename from ntsimulator/yang/o-ran-module-cap.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-module-cap.yang diff --git a/ntsimulator/yang/o-ran-mplane-int.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-mplane-int.yang similarity index 100% rename from ntsimulator/yang/o-ran-mplane-int.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-mplane-int.yang diff --git a/ntsimulator/yang/o-ran-operations.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-operations.yang similarity index 100% rename from ntsimulator/yang/o-ran-operations.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-operations.yang diff --git a/ntsimulator/yang/o-ran-performance-management.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-performance-management.yang similarity index 100% rename from ntsimulator/yang/o-ran-performance-management.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-performance-management.yang diff --git a/ntsimulator/yang/o-ran-processing-element.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-processing-element.yang similarity index 100% rename from ntsimulator/yang/o-ran-processing-element.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-processing-element.yang diff --git a/ntsimulator/yang/o-ran-software-management.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-software-management.yang similarity index 100% rename from ntsimulator/yang/o-ran-software-management.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-software-management.yang diff --git a/ntsimulator/yang/o-ran-supervision.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-supervision.yang similarity index 100% rename from ntsimulator/yang/o-ran-supervision.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-supervision.yang diff --git a/ntsimulator/yang/o-ran-sync.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-sync.yang similarity index 100% rename from ntsimulator/yang/o-ran-sync.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-sync.yang diff --git a/ntsimulator/yang/o-ran-trace.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-trace.yang similarity index 100% rename from ntsimulator/yang/o-ran-trace.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-trace.yang diff --git a/ntsimulator/yang/o-ran-transceiver.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-transceiver.yang similarity index 100% rename from ntsimulator/yang/o-ran-transceiver.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-transceiver.yang diff --git a/ntsimulator/yang/o-ran-troubleshooting.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-troubleshooting.yang similarity index 100% rename from ntsimulator/yang/o-ran-troubleshooting.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-troubleshooting.yang diff --git a/ntsimulator/yang/o-ran-udp-echo.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-udp-echo.yang similarity index 100% rename from ntsimulator/yang/o-ran-udp-echo.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-udp-echo.yang diff --git a/ntsimulator/yang/o-ran-uplane-conf.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-uplane-conf.yang similarity index 100% rename from ntsimulator/yang/o-ran-uplane-conf.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-uplane-conf.yang diff --git a/ntsimulator/yang/o-ran-usermgmt.yang b/ntsimulator/yang/o-ran/ru-fh/o-ran-usermgmt.yang similarity index 100% rename from ntsimulator/yang/o-ran-usermgmt.yang rename to ntsimulator/yang/o-ran/ru-fh/o-ran-usermgmt.yang diff --git a/ntsimulator/yang/sysrepo-configuration-load.sh b/ntsimulator/yang/sysrepo-configuration-load.sh index ed210ff..8c41b40 100755 --- a/ntsimulator/yang/sysrepo-configuration-load.sh +++ b/ntsimulator/yang/sysrepo-configuration-load.sh @@ -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 index 0000000..52bcaf3 --- /dev/null +++ b/ntsimulator/yang/x-ran/iana-hardware.yang @@ -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 index 0000000..24d04e6 --- /dev/null +++ b/ntsimulator/yang/x-ran/iana-if-type.yang @@ -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 + "; + 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. + "; + + 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 index 0000000..c620734 --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-crypto-types.yang @@ -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: + WG List: + Author: Kent Watsen + Author: Wang Haiguang "; + + 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 (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 index 0000000..c0d7193 --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-dhcpv6-types.yang @@ -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 index 0000000..f444e26 --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-hardware.yang @@ -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: + WG List: + Editor: Andy Bierman + + Editor: Martin Bjorklund + + Editor: Jie Dong + + Editor: Dan Romascanu + "; + +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 index 0000000..4b0db8e --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-inet-types.yang @@ -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: + WG List: + WG Chair: David Kessens + + WG Chair: Juergen Schoenwaelder + + Editor: Juergen Schoenwaelder + "; + +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 . + 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 index 0000000..8dae9d3 --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-interfaces.yang @@ -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: + WG List: + Editor: Martin Bjorklund + "; + + 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 index 0000000..449081b --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-ip.yang @@ -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: + WG List: + Editor: Martin Bjorklund + "; + 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 index 0000000..ec9687a --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-netconf-acm.yang @@ -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: + WG List: + Author: Andy Bierman + + Author: Martin Bjorklund + "; + + 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 index 0000000..3995988 --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-netconf-monitoring.yang @@ -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: + WG List: + WG Chair: Mehmet Ersue + + WG Chair: Bert Wijnen + + Editor: Mark Scott + + Editor: Martin Bjorklund + "; + + 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 messages received."; + } + leaf in-bad-rpcs { + type yang:zero-based-counter32; + + description + "Number of messages received when an message was expected, + that were not correct messages. This includes XML parse + errors and errors on the rpc layer."; + } + leaf out-rpc-errors { + type yang:zero-based-counter32; + description + "Number of messages sent that contained an + element."; + } + leaf out-notifications { + type yang:zero-based-counter32; + description + "Number of 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 and 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 + 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 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 + 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 message was received. This includes + 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 message with a 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 + operation, or killed by a + 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 is + 'invalid-value'. + If more than one schema matches the requested parameters, the + is 'operation-failed', and 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 index 0000000..45b8c55 --- /dev/null +++ b/ntsimulator/yang/x-ran/ietf-yang-types.yang @@ -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: + WG List: + WG Chair: David Kessens + + WG Chair: Juergen Schoenwaelder + + Editor: Juergen Schoenwaelder + "; + +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 index 0000000..fce5f2a --- /dev/null +++ b/ntsimulator/yang/x-ran/org-openroadm-user-mgmt.yang @@ -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 index 0000000..f87fcea --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-alarm-id.yang @@ -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 index 0000000..ab3a4b9 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-ald-port.yang @@ -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 index 0000000..4580992 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-ald.yang @@ -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 index 0000000..3e6c995 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-beamforming.yang @@ -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 index 0000000..e21cf93 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-delay-management.yang @@ -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 index 0000000..8b2a94e --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-dhcp.yang @@ -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 index 0000000..4929a32 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-ecpri-delay.yang @@ -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 index 0000000..a78a710 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-externalio.yang @@ -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 index 0000000..251f32f --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-fan.yang @@ -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 index 0000000..c63ffd0 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-file-management.yang @@ -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 index 0000000..c15f23a --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-fm.yang @@ -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 index 0000000..9d423c1 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-hardware.yang @@ -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@[:]"; + } + + 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 index 0000000..c3809ab --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-processing-element.yang @@ -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 index 0000000..0759cd6 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-software-management.yang @@ -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://@[:]"; + } + + 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 index 0000000..72bfb1d --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-supervision.yang @@ -0,0 +1,103 @@ +module xran-supervision { + yang-version 1.1; + namespace "urn:xran:supervision:1.0"; + prefix "xran-supervision"; + + import ietf-yang-types { + prefix yang; + } + + organization "xRAN Forum"; + + contact + "www.xran.org"; + + description + "This module defines the configuration data and supervision RPCs that are + used by the NETCONF client and NETCONF server to detect loss of NETCONF + connectivity. + + 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 supervision-watchdog-reset { + description + "rpc to reset the watchdog timer"; + input { + + leaf supervision-notification-interval { + type uint16; + units seconds; + default 60; + description + "The interval in seconds at which supervision notifications are sent. + If not specified the default value of 60 seconds shall apply."; + } + leaf guard-timer-overhead { + type uint16; + units seconds; + default 10; + description + "This is overhead added to the supervision timer used to calculate the + supervision wathcdog timer. i.e., + + supervision timer = notification timer + guard-timer-overhead + + If not specified the default value of 10 seconds shall apply. + + Failure to send this rpc again within the timeout sets the radio into + 'loss of supervision' state. + + NOTE - The supervision timer MUST not be less that the confimed + timeout timer (when the feature is supported). + + This type of constraint (using an RPCs input) cannot be formally + expressed in YANG."; + } + } + } + + notification supervision-notification { + description + "Notification to indicate that NETCONF management interface is up + and also indicate the values of the timers for this NETCONF session"; + + leaf next-update-at { + type yang:date-and-time; + description + "Indicates the time when the next supervision notification is expected."; + } + } +} diff --git a/ntsimulator/yang/x-ran/xran-sync.yang b/ntsimulator/yang/x-ran/xran-sync.yang new file mode 100644 index 0000000..734bca8 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-sync.yang @@ -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 index 0000000..df0cb36 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-transceiver.yang @@ -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 index 0000000..587369f --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-troubleshooting.yang @@ -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 index 0000000..cf1d725 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-udp-echo.yang @@ -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 index 0000000..5ca7e3c --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-uplane-conf.yang @@ -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 index 0000000..9de1d90 --- /dev/null +++ b/ntsimulator/yang/x-ran/xran-usermgmt.yang @@ -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."; + } + } +} -- 2.16.6