From b92944068f8a7b643b333515e424517db4192b61 Mon Sep 17 00:00:00 2001 From: Vidhu Date: Wed, 7 Apr 2021 09:06:29 +0530 Subject: [PATCH] Restructure O1 module to run as a thread in O-DU High binary [Issue-Id: ODUHIGH-297] Signed-off-by: Vidhu Change-Id: I269b9663313e9b0e8de688028dd1ef094443aeb0 --- Dockerfile | 8 +- build/common/cu_stub.mak | 2 +- build/common/du_app.mak | 2 +- build/common/o1.mak | 4 +- build/common/o1_client.mak | 53 ----- build/common/ric_stub.mak | 2 +- build/config/startup_config.xml | 19 ++ build/o1/makefile | 126 ----------- build/odu/makefile | 18 +- build/{o1 => scripts}/install_lib.sh | 30 +-- build/scripts/netopeer-server.sh | 16 ++ build/{o1 => }/yang/o-ran-sc-odu-alarm-v1.yang | 0 build/{o1 => }/yang/o-ran-sc-odu-interface-v1.yang | 0 docs/ODU-O1-Arch.jpg | Bin 28769 -> 34485 bytes docs/ODU-O1-GetAlarmListFlow.jpg | Bin 114151 -> 71485 bytes docs/ODUArch.jpg | Bin 56637 -> 90425 bytes docs/README | 98 +++++---- docs/developer-guide.rst | 4 +- docs/installation-guide.rst | 121 +++++++--- docs/overview.rst | 20 +- docs/user-guide.rst | 38 +--- src/cu_stub/cu_stub.c | 14 +- src/du_app/du_cell_mgr.c | 2 +- src/du_app/du_cfg.c | 4 +- src/du_app/du_f1ap_msg_hdl.c | 4 +- src/du_app/du_mgr_main.c | 11 + src/du_app/du_msg_hdl.c | 1 - src/o1/Alarm.hpp | 2 +- .../AlarmInterface.c => AlarmInterface.cpp} | 61 +++--- src/o1/{o1_client => }/AlarmInterface.h | 19 +- src/o1/{o1_client/Alarm.h => AlarmMessages.h} | 6 +- src/o1/{o1_client => }/CommonMessages.h | 2 +- src/o1/ConfigInterface.cpp | 151 +++++++++++++ src/o1/{o1_client/Config.h => ConfigInterface.h} | 21 +- src/o1/GlobalDefs.cpp | 4 +- src/o1/GlobalDefs.hpp | 6 +- src/o1/InitConfig.cpp | 107 +++++---- src/o1/InitConfig.hpp | 24 +- src/o1/NetconfManager.cpp | 7 +- src/o1/O1App.cpp | 182 +++++++++++++++ src/o1/{o1_client/GlobalDefs.h => O1App.hpp} | 45 ++-- src/o1/{o1_client/Config.c => O1Interface.cpp} | 95 ++++---- src/o1/{o1_client/TcpClient.h => O1Interface.h} | 26 +-- src/o1/O1_main.cpp | 68 ------ src/o1/SessionHandler.cpp | 47 +++- src/o1/Thread.cpp | 222 +++++++++++++++++++ src/o1/{o1_client/Message.h => Thread.hpp} | 47 ++-- .../TcpClient.c => UnixSocketClient.cpp} | 144 ++++++------ src/o1/UnixSocketClient.hpp | 54 +++++ src/o1/{TcpServer.cpp => UnixSocketServer.cpp} | 243 ++++++++++++--------- src/o1/{TcpServer.hpp => UnixSocketServer.hpp} | 28 +-- src/ric_stub/ric_stub.c | 11 +- 52 files changed, 1410 insertions(+), 809 deletions(-) delete mode 100644 build/common/o1_client.mak create mode 100644 build/config/startup_config.xml delete mode 100644 build/o1/makefile rename build/{o1 => scripts}/install_lib.sh (88%) create mode 100755 build/scripts/netopeer-server.sh rename build/{o1 => }/yang/o-ran-sc-odu-alarm-v1.yang (100%) rename build/{o1 => }/yang/o-ran-sc-odu-interface-v1.yang (100%) rename src/o1/{o1_client/AlarmInterface.c => AlarmInterface.cpp} (79%) rename src/o1/{o1_client => }/AlarmInterface.h (85%) rename src/o1/{o1_client/Alarm.h => AlarmMessages.h} (95%) rename src/o1/{o1_client => }/CommonMessages.h (96%) create mode 100644 src/o1/ConfigInterface.cpp rename src/o1/{o1_client/Config.h => ConfigInterface.h} (85%) create mode 100644 src/o1/O1App.cpp rename src/o1/{o1_client/GlobalDefs.h => O1App.hpp} (67%) rename src/o1/{o1_client/Config.c => O1Interface.cpp} (53%) rename src/o1/{o1_client/TcpClient.h => O1Interface.h} (70%) delete mode 100644 src/o1/O1_main.cpp create mode 100644 src/o1/Thread.cpp rename src/o1/{o1_client/Message.h => Thread.hpp} (70%) rename src/o1/{o1_client/TcpClient.c => UnixSocketClient.cpp} (56%) create mode 100644 src/o1/UnixSocketClient.hpp rename src/o1/{TcpServer.cpp => UnixSocketServer.cpp} (57%) rename src/o1/{TcpServer.hpp => UnixSocketServer.hpp} (75%) diff --git a/Dockerfile b/Dockerfile index dbd558df4..cfeffb2f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,9 +25,9 @@ RUN cd build/odu && make clean_odu odu MACHINE=BIT64 MODE=TDD #CMD /opt/o-du-l2/bin/odu/odu #cleanup netconf folder and install libraries -RUN cd build/o1 && rm -rf netconf && /bin/bash install_lib.sh -c - -RUN cd build/o1 && make o1 MACHINE=BIT64 +RUN cd build/scripts && /bin/bash install_lib.sh -c # Install the data models based on the ODU yang model -RUN /usr/local/bin/sysrepoctl -i build/o1/yang/o-ran-sc-odu-alarm-v1.yang +RUN /usr/local/bin/sysrepoctl -i build/yang/o-ran-sc-odu-alarm-v1.yang + +RUN cd build/odu && make clean_odu odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES diff --git a/build/common/cu_stub.mak b/build/common/cu_stub.mak index 1e9add2ee..cbee68a0b 100755 --- a/build/common/cu_stub.mak +++ b/build/common/cu_stub.mak @@ -40,7 +40,7 @@ I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/F1AP I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/RRC ifeq ($(O1_ENABLE),YES) -I_OPTS+=-I$(ROOT_DIR)/src/o1/o1_client +I_OPTS+=-I$(ROOT_DIR)/src/o1 endif #-------------------------------------------------------------# diff --git a/build/common/du_app.mak b/build/common/du_app.mak index f7175d1b1..b80422309 100644 --- a/build/common/du_app.mak +++ b/build/common/du_app.mak @@ -42,7 +42,7 @@ I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/RRC I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/E2AP ifeq ($(O1_ENABLE),YES) -I_OPTS+=-I$(ROOT_DIR)/src/o1/o1_client +I_OPTS+=-I$(ROOT_DIR)/src/o1 endif #-------------------------------------------------------------# diff --git a/build/common/o1.mak b/build/common/o1.mak index e3acf5462..5815798b2 100755 --- a/build/common/o1.mak +++ b/build/common/o1.mak @@ -20,12 +20,11 @@ include ../common/rsys_fancy.mak include ../common/env.mak COLOR=$(COLOR_RED) -ROOT_DIR=$(patsubst %/build/o1,%,$(BUILD_DIR)) - SRC_DIR=$(ROOT_DIR)/src/o1/ CPP_SRCS=$(wildcard $(SRC_DIR)/*.cpp) CPP_OBJS=$(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(CPP_SRCS)) +PLTFRM_FLAGS= lib: $(LIB_DIR)/libo1.a include $(COM_BUILD_DIR)/compile.mak @@ -33,7 +32,6 @@ L_OPTS=-lsysrepo -lyang L_OPTS+= -lsysrepo-cpp -lyang-cpp L_OPTS+= -lm -lpthread I_OPTS=-I$(ROOT_DIR)/src/o1/ -I_OPTS+=-I$(ROOT_DIR)/src/o1/o1_client #-------------------------------------------------------------# #Linker macros diff --git a/build/common/o1_client.mak b/build/common/o1_client.mak deleted file mode 100644 index f3b553561..000000000 --- a/build/common/o1_client.mak +++ /dev/null @@ -1,53 +0,0 @@ -################################################################################ -# Copyright (c) [2017-2019] [Radisys] # -# # -# 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. # -################################################################################ - -# This is makefile for O1 client - -include ../common/rsys_fancy.mak -include ../common/env.mak -COLOR=$(COLOR_RED) - -SRC_DIR=$(ROOT_DIR)/src/o1/o1_client -C_SRCS=$(wildcard $(SRC_DIR)/*.c) -C_OBJS=$(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(C_SRCS)) - -lib: $(LIB_DIR)/libo1client.a -include $(COM_BUILD_DIR)/compile.mak - -L_OPTS=-lsysrepo -lyang -L_OPTS+= -lsysrepo-cpp -lyang-cpp -L_OPTS+= -lm -lpthread -I_OPTS+=-I$(ROOT_DIR)/src/o1/o1_client -I_OPTS+=-I$(ROOT_DIR)/src/cm -I_OPTS+=-I$(ROOT_DIR)/src/mt - -#-------------------------------------------------------------# -#Linker macros -#-------------------------------------------------------------# -$(LIB_DIR)/libo1client.a:$(C_OBJS) $(C_WO_PED_OBJS) - @echo -e "Creating Archive $(COLOR) $@ $(REVERT_COLOR)" - $(Q)ar -cr $(LIB_DIR)/libo1client.a $(C_OBJS) $(C_WO_PED_OBJS) - -#-------------------------------------------------------------# -#Clean macros -#-------------------------------------------------------------# -clean: - @echo -e "$(COLOR_RED)Cleaning O1 Client$(REVERT_COLOR)" - $(Q)\rm -f $(LIB_DIR)/libo1client.a $(C_OBJS) $(C_WO_PED_OBJS) $(LOG_FILES) $(BAK_FILES) - -#********************************************************************** -# End of file -#********************************************************************** diff --git a/build/common/ric_stub.mak b/build/common/ric_stub.mak index f7c5175c6..43a8a3f60 100644 --- a/build/common/ric_stub.mak +++ b/build/common/ric_stub.mak @@ -39,7 +39,7 @@ I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/common I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/E2AP ifeq ($(O1_ENABLE),YES) -I_OPTS+=-I$(ROOT_DIR)/src/o1/o1_client +I_OPTS+=-I$(ROOT_DIR)/src/o1 endif #-------------------------------------------------------------# #Linker macros diff --git a/build/config/startup_config.xml b/build/config/startup_config.xml new file mode 100644 index 000000000..045c1c2b4 --- /dev/null +++ b/build/config/startup_config.xml @@ -0,0 +1,19 @@ + + + +odu +192.168.130.81 +38472 + + +ocu +192.168.130.82 +38472 + + +ric +192.168.130.80 +36422 + + + diff --git a/build/o1/makefile b/build/o1/makefile deleted file mode 100644 index ff985aff5..000000000 --- a/build/o1/makefile +++ /dev/null @@ -1,126 +0,0 @@ -################################################################################ -# Copyright (c) [2017-2019] [Radisys] # -# # -# 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. # -################################################################################ - -# Master makefile for O1 module - -# Identify the location our software which is used by rest -# of the build scripts - -include ../common/rsys_fancy.mak -include ../common/env.mak - -ROOT_DIR=$(patsubst %/build/o1,%,$(BUILD_DIR)) -RULE=$(COLOR_RED) -OPTS=$(COLOR_GREEN) -NORM=$(REVERT_COLOR) - -# For improved speed -CPUINFO=`cat /proc/cpuinfo | grep processor| wc -l` -ifeq ($(CPUINFO), 1) - NUM_PARALLEL=1 -else - NUM_PARALLEL=$(shell echo $(CPUINFO) - 1 |bc) -endif - -ifeq ($(FAST), 1) - NUM_PARALLEL=$(shell echo $(CPUINFO) + 2 |bc) -endif - -PARALLEL_COMP=-j $(NUM_PARALLEL) - -# Different options to O1 build -# # Other apsects of tool chain set here -# # These should be made available appropriately to the builds -ifeq ($(MACHINE),BIT64) -CC =gcc -m64 -CCPP =g++ -m64 -else -CC =gcc -m32 -CCPP =g++ -m32 -endif - -CC1= $(CC) -CCPP1= $(CCPP) - - -# The include options get merged with the options needed by -# # the called makefiles and hence we export these to make them -# # available to them. -BUILD=i686-linux - -# The called makefiles depend on these macros and these need to be exported -export PLTFRM -export PLTFRM_FLAGS -export BUILD -export I_OPTS - -# Add to the linker options the platform specific components -#L_OPTS+=-lnsl -lrt -lm -lpthread -lsctp -L_OPTS=-lsysrepo -lyang -L_OPTS+= -lsysrepo-cpp -lyang-cpp -L_OPTS+= -lm -lpthread - -# Export some of the flags expected from the command line. -# # These macros are made available for the makefiles called from this makefile -export MACHINE - -help: - @echo -e "******************************************************************" - @echo -e "BUILD COMMAND DESCRIPTION " - @echo -e "------------------------------------------------------------------" - @echo -e "$(RULE)o1 - Builds all components of O1$(NORM)" - @echo -e "$(RULE)clean_o1 - clean up O1$(NORM)" - @echo -e "$(RULE)clean_all - cleanup O1 and all directories$(NORM)" - @echo -e "$(OPTS) options: $(NORM)" - @echo -e "$(OPTS) MACHINE=BIT64/BIT32 - Default is BIT32$(NORM)" - @echo -e "******************************************************************" - -prepare_dirs: - $(Q)echo -e "Preparing directories for build..." - $(Q)mkdir -p $(BUILD_DIR)/obj/o1 - $(Q)mkdir -p $(LIB_ROOT)/o1 - $(Q)mkdir -p $(BIN_DIR)/o1 - $(Q)echo -e "Directories are successfully prepared" - -o1_mod: - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak OBJ_DIR=$(OBJ_ROOT)/o1 LIB_DIR=$(LIB_ROOT)/o1 LOG_DIR=$(LOG_ROOT)/o1 CC='$(CCPP1)' - -link_o1: o1_mod - $(Q)$(CCPP1) -g -o $(OBJ_ROOT)/o1/o1 -Wl,-R../lib/:. $(OBJ_ROOT)/o1/*.o\ - $(L_OPTS) -L$(LIB_ROOT)/o1 - -clean_o1: - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak clean OBJ_DIR=$(OBJ_ROOT)/o1 LIB_DIR=$(LIB_ROOT)/o1 LOG_DIR=$(LOG_ROOT)/o1 CC='$(CC1)' - $(Q)rm -rf $(OBJ_ROOT)/o1/* - $(Q)rm -rf $(LIB_ROOT)/o1/* - $(Q)rm -rf $(BIN_DIR)/o1/* - $(Q)echo -e "***** O1 CLEAN COMPLETE *****" - -clean_all: clean_o1 - $(Q)rm -rf $(OBJ_ROOT) - $(Q)rm -rf $(LIB_ROOT) - $(Q)rm -rf $(LOG_ROOT) - $(Q)rm -rf $(BIN_DIR) - -copy_build: link_o1 - $(Q)cp -f ./obj/o1/o1 ./bin/o1 - $(Q)echo -e "***** O1 BUILD COMPLETE *****" - -o1: prepare_dirs copy_build - -#********************************************************************** -# End of file -#********************************************************************** diff --git a/build/odu/makefile b/build/odu/makefile index c165fbcdd..d1084210c 100644 --- a/build/odu/makefile +++ b/build/odu/makefile @@ -138,6 +138,12 @@ ifeq ($(PHY), INTEL_L1) -lrte_gro -lrte_pmd_ark -lrte_pmd_i40e -lrte_pmd_sw_event endif +ifeq ($(O1_ENABLE),YES) + L_OPTS+=-lsysrepo -lyang + L_OPTS+=-lsysrepo-cpp -lyang-cpp + L_OPTS+=-lstdc++ +endif + # Export some of the flags expected from the command line. # # These macros are made available for the makefiles called from this makefile export BOARD @@ -205,7 +211,7 @@ du: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/rl.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/phy_stub.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' ifeq ($(O1_ENABLE),YES) - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1_client.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CCPP1)' endif link_du: du @@ -226,7 +232,7 @@ clean_odu: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/rl.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/phy_stub.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' ifeq ($(O1_ENABLE),YES) - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1_client.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CCPP1)' endif $(Q)rm -rf $(OBJ_ROOT)/odu/* $(Q)rm -rf $(LIB_ROOT)/odu/* @@ -250,7 +256,7 @@ cu: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' ifeq ($(O1_ENABLE),YES) - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1_client.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CCPP1)' endif clean_cu: @@ -261,7 +267,7 @@ clean_cu: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' ifeq ($(O1_ENABLE),YES) - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1_client.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CCPP1)' endif $(Q)rm -rf $(OBJ_ROOT)/cu_stub/* $(Q)rm -rf $(LIB_ROOT)/cu_stub/* @@ -284,7 +290,7 @@ ric: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' ifeq ($(O1_ENABLE),YES) - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1_client.mak OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CCPP1)' endif clean_ric: @@ -295,7 +301,7 @@ clean_ric: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' ifeq ($(O1_ENABLE),YES) - $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1_client.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/o1.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CCPP1)' endif $(Q)rm -rf $(OBJ_ROOT)/ric_stub/* $(Q)rm -rf $(LIB_ROOT)/ric_stub/* diff --git a/build/o1/install_lib.sh b/build/scripts/install_lib.sh similarity index 88% rename from build/o1/install_lib.sh rename to build/scripts/install_lib.sh index da44611fe..2aec9746f 100755 --- a/build/o1/install_lib.sh +++ b/build/scripts/install_lib.sh @@ -22,10 +22,10 @@ #variable declaration CURRENT_PATH=`pwd` HOME="$CURRENT_PATH/../.." -MAKE_PATH="$HOME/build/o1" -NETCONF_PATH="$HOME/build/o1/netconf" -SYSREPOCTL_PATH="$NETCONF_PATH/sysrepo/build/sysrepoctl" -YANG_PATH="$HOME/build/o1/yang" +NETCONF_PATH="$HOME/build/netconf" +YANG_PATH="$HOME/build/yang" +CONFIG_PATH="$HOME/build/config" +STARTUP_CONFIG="startup_config.xml" INSTALL="netconf" CLEANUP="no" @@ -51,11 +51,6 @@ log() { echo -e "$1 " } - - -#functions definitions -#TBD: install only mandatory packages - #install pre-requisite packages prerequisite_netconf() { @@ -93,17 +88,6 @@ check_ret() { #install netconf libraries install_netconf_lib() { - #with sudo we can not create new user so we need to create it manually using - #root credentials. - - #$SUDO adduser --system netconf && \ - # echo "netconf:netconf" | chpasswd - - #$SUDO 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 - if [[ "$CLEANUP" == "cleanup" ]]; then rm -rf $NETCONF_PATH log_warning "DELETED $NETCONF_PATH" @@ -173,7 +157,9 @@ install_netconf_lib() { #install yang module install_yang_module() { - $SYSREPOCTL_PATH -i "$YANG_PATH/o-ran-sc-du-alarm-v1.yang" + sysrepoctl -i "$YANG_PATH/o-ran-sc-odu-alarm-v1.yang" + sysrepoctl -i "$YANG_PATH/o-ran-sc-odu-interface-v1.yang" + sysrepocfg --import="$CONFIG_PATH/$STARTUP_CONFIG" --datastore startup --module o-ran-sc-odu-interface-v1 } @@ -216,7 +202,7 @@ main() { } #start execution / function calls -if [[ "$#" -ge 2 ]] ; then +if [[ "$#" -ge 3 ]] ; then log_error " NUMBER OF PARAMETER : $# " show_help fi diff --git a/build/scripts/netopeer-server.sh b/build/scripts/netopeer-server.sh new file mode 100755 index 000000000..f4b1f80df --- /dev/null +++ b/build/scripts/netopeer-server.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +if [ "$1" == "" ] +then + echo Usage : netopeer.sh [start] [stop] +fi + +if [ "$1" == "start" ] +then + netopeer2-server -d -v2 > /var/log/netopeer2-server.log 2>&1 & +fi + +if [ "$1" == "stop" ] +then + kill -9 `pidof netopeer2-server` +fi diff --git a/build/o1/yang/o-ran-sc-odu-alarm-v1.yang b/build/yang/o-ran-sc-odu-alarm-v1.yang similarity index 100% rename from build/o1/yang/o-ran-sc-odu-alarm-v1.yang rename to build/yang/o-ran-sc-odu-alarm-v1.yang diff --git a/build/o1/yang/o-ran-sc-odu-interface-v1.yang b/build/yang/o-ran-sc-odu-interface-v1.yang similarity index 100% rename from build/o1/yang/o-ran-sc-odu-interface-v1.yang rename to build/yang/o-ran-sc-odu-interface-v1.yang diff --git a/docs/ODU-O1-Arch.jpg b/docs/ODU-O1-Arch.jpg index 06c19846df7446282556f4336f7c88b6360e3610..7c5c75776f67d92a30896b44dbd125ba5afaf1df 100644 GIT binary patch literal 34485 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 literal 28769 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 t3a&Ree5TK;K>qPJ3+k7P`xXB~88!C4Ac#ib zta7!Uw(yJ5BX;K>Zd5MwtZ=rvIV(0Q+lkY8SE0Ti3^0Gun;RZwAVU5<+Xve~gBuCe$+r^H4XS7bI z*a!6~M$?7=`FaCR=*d)iH1rD?+@50@5JfNaqeqA&5^@PX`3|{6h3|_j;?aQkUK{*m zpnePKRz6Ncclq{+x`FG0qzoE&ZuG7}ymeg)`@<3ZaLRAX4*$kkjqM(e-m^7D>uZW1 zDZ$dT7j#~~;g0my3}0MHk$@G+G)pCg++jVUNV_p?mB4>Rt_*cQQ})Skr|~|7L*m6p z{zqf0RO^2r|8c$l>9!#&E9@iq=nrVcVRTd*1Cl`21OL97H2yNj$_>?NA{i0hq%Ci& zUjx&VPL+&|lW><2iL9XJry1mm%gpB*(*d>r;ZpuDZe^#6SJ;2tn4_5paucmUUFvko z*4#WQ?qTF&Sy`#KF=y{n4SutRk?ZhhuMwFNNejoZe@)+2p#xF7kMS}=DpNT@-waE%BXpaT+`puc8xz$W@d*>z@kBe&@@3|dWbK=T8n@!IZ0{@kYypn;^zNTvC-a&y1NMZ~ZJZyke!+mu&BS z@%k72`P@TA6L*JNj{LoBa2I|o7`#l8CfWg0iQRSGxvMkML-IMY`X?VA(J#e>U~1%Epq-65rd_c-%^qL|3jdRm>h?f08`t76b+0xY zXCj>KeBbxlX#>%RdB53t7r4$df68gzTSz6Kh=t_)8AkDV^Uk>lEEH~aTsf=t9EmS0 z5!D$G*m1NWLA^g?*k^j-`EpTN1}aXIqlIYp60aZl0OuU2hVLzN+tIkEWC825O!*U5 zXXyOuNm_vzTl;aFg!(HVcnYF>TS*%c1%3m@#Kj-gc~d}yS#1`%$1r6>v85&CNUTHp zd4pL}_waS$w?_+1565;~Q1{MJi5&>nt;|Qa>(+_hRW+YnpggUS7wqau%A}jT;hl?Z zdU>)R;xcIS79m3A^!PaWt7pNOy@jw*jfik78#k|)pLThwJ7n}Q1}o!v%4vi6vgMv& zG6c4Yl3n;zlj3jv~4r3hV$%{JJ9Z6jX7q*ak!a+j7ym>@^Vzuo-=5td1^m3OuSuyigPaN=i4Sm>4MyqG` z+-GzY;*`3#$B|f;@1b4X{e4DbyIsqgt zJT#uFgBQv_K5Omg**O^zt{5Q6#(>;&6%PG0uqb!cF-6baGG0yZ63I=chj4~+c?#Rl z#ef_we;xT8k%~hdy_t4k0K2$ng0wR4^vlI8Jhf=_cjs__&uiK;?l9%%GS&k14B2Yd zlz^%`oV)PsnX9eaW9)Y#67Z?-fFH00J_6xK2Y!=o3E}~sF#vpf4f+}l_yyWBAbqNP zAEmY`c4I(z`ym|zoWg#mpx56EQ1|2Mhp=D&^_!e$KrE_}2kc-f^0E)a77{EBh$i?| zFDkY)js7wiopV+2Fn4v-JmQ33VOOi*&s2h)D6u}u`=pZpk4zCO*I3QfJMJtaCL8Dr zmSP4W>rAIg;MWF~rclS7>e6Fh_j=f)57|t8!}?gvXh}gIvMCXs$6aEdxHkSUQ%mXF7(CZ7INj_blKHL|zC%cmO zjGeu{aoDTR4c4vZYUn59mM!!sTCn{r^lI))>!0nWWg=cfcBwRzJ09VQqZvpd2|2-l z&|@%d161jqIl6`(Ro$G72JzK0(G%nXHNccJ-prm4OSU&&MgmZf6fv%iaNJ`+zWl`- zcx*KTLK8r|!T^>lSnBh5z^`JR0RmT@f%#=R|8o=rB2xP8JpFqyb&UaGVn7J5COfJr z49GkT{V#qsFWSMB4(16j7!YzB;lTur0U>fD{>k^`(nX{w2oPm^0#_K2u&fLQq^Cqa z8c}@#tqO{ZrralgTBn1k{0Qcs=xB~6PAy1;w#u)_p>a@Nz_ZKj(t`Jo_+qV~(Pkyck_?v9td$&^aRG+%!p3N6E)}4Hw{N+PV@#{TcFKXHA%kGDD8aWH|L|0 zVsqK-*j>3Yw$GB1{#J7(lDFPx*3nz_MrT!tx(Otec9jEYq~e;9wcZGR%e_qYZs4=> zYw+uAhmU?~XMb2HAN&-l>iXOBblk_LjIf%>&TFEOcoR_>FrY)_Y!PC=!6Q@vXpo;OYRsX|Ab zhs^-Nws7@g;Hf5(a!48p+0lz9g}<1p!_@tPYdjpVPvbZA9XN7j`sg*Kc?ZAqc&E>D zQBnoI_b=VaHXCsKeBf$lP4QS!^=YB-QtwxesjF4^H5s%JZ`HDp!?HK%!($&@*;5P+ zZ9iZ%@146$WS?Do;o3|Th<&0d?kAu_5=j;{%3mWNbuoJ;PmtppEKNvMv$rtkrntF~ zgWrKym|9M{i!yUmYSvDo2-Y*f% zf8*I%qtI;zbXg!`9!fniw}6UM7cW9T26Edq*+zF`&+UDUMpxNhbCganSo~HdMDS*H zEs^Xw9lalb+oSSA@!mb5njC;!XJeyf;N8Jixs~8Uz{?9OV}G*F4{a!BUf&uviRB7- z7R-|Z`!VZzAQMcI{umpZn6-I6(kJpGWQa}zus)_f$R62r+$(xJ8Xr{guX5-TS#_$ zn6X##yQOL1+2B{^H?qrj*zTJ$yFdZSLO-MOau>?4^3rP#o)K`ExKUD8 zTHzvdhTBIjx^^Aqkjm{;H=z2Wn)h)+19W1T&VeoQOPxo>QjsJDocZf!=>vFtEsDi2 z_(!i|UmDfOpTE|#(9&7?XIrt2nv3W+?JNT>v#k4x+8JN(o*e})F(8K>h?`$f@g6|D zJ{TDsV;^0sCz;YEYa2+cZ4GkGZjZ#qjr{J&_{-%mWjFXx)XSWPbYPvKUmwl-qR{j2 z=n|UTB%ha$NQSqD*B=A%9;CZ%Dh4>+00x9>%^a3@@V3}*Y46*J^!L=`J&V%H1B+Kg zoS%w8ghVcY6IKH#;Cw>@gNpn%zhHR-IV-5jjXzIV5NpX9jzz9e=Q3o^g9qp*ijJ%Cx|iT9sR>exEKIbQ^fRt=)%BeNCtWqqH3F|l=pL*3 z7mDX4h~}Ylw_aTv+!^4Tu!B}v7%6{P(x1eWSDgzIO(#p<4T`$WCXf(xcEjS}QO%RU zyI>`%)=(f4kA(Z74T+=q-4Qsxp_*9!@msB`$<@M|tE)RUU-vo0!Ecf z1mEe4Ul2C2Jy}f!12>B`F}^*X1=s?eBb^z@oR{&%jXalGD#is}|IrQxexWV*fb2A8E%=z9*3%o1o;!(%75@e(frwQ_@hJm(5liofORx)~0_ zst3dpEsa>bT?hG30k*}Eg4PsNxjJiA#eO?!$zEa@JOAb>;tTSWpG+<-tNDZ{erkqe zRpTxW(>92cFdg>R_dXK6f~eWx{`uxhBt|{hZ25^n1BB^U@JO%%Y5X<9z6FWT!yKib z3I29q9!gazUQM;KUy8>y(XKhh8tQ0l_tJ9RA8-mvq1;I~y6=cw{iVHLQxSs@Xx0PG z_D3D5KQ**w7uZA-N4@*dTt8xkKan_BLhP%&e9i7rOpd*E7Jz$w)ucTLo9O_xqaS!-{U0@f;hY8i1*MOff7V?yj<&PKUO^Ih0;JoimH2M5#V|UBpPe2Ta@YB z>t=g(*onPVTJT?=js-Kx`?Sg6vr6V?bhqHHdpr>N@xV4og7K zIH@C;3wA3x-+FS@xkN|0&NtO}X+z7Omu1W#)QDH@u#4?Xkp*ZR@DCaD5}i;MMPzk- zhYn`l{6`g?#l-&Y-w-AOh%OQC8VX%#z8WkG zfN8T+0UqFmUEBA9WvgCwp(iTy#?0z3O-)1P$F^|%7M){TRhL*EHC%t%HhNhK2}r4g zH{ZnxOPCWQI^Z$0R}8Ui*B1KCru2t*{uB~_#5}WCHWzrfL1vM+)jPb^<@RKFdjDzS z;JH5?I|!l){1-PG1!whh|2EvU7tB1mBUJMB@o1TJ>!{LLQjx{LgJS1}y@YpE;2euR z*Ue{boCLRgb$ywfi|<_j79v&wuT+g;jeGC5#9kUZALdh5F0X~Wj5Yv9fxLJ4q;S_OHq-U;z?~7qJ`~UB!I@* z-tB>8tqJ8Fy`Fi$sLxW6kS^ua}e%)>I?F8i$Fs zJAx(lyl%dd?N{Gn^+Bg)$h%BaiX!wSuIhZ^$$JUJKcy`*cH;^!HZ<1}$HH9mx_nOyX?=Zjmi7MS!yz8FM~SkLtty)5V4BGw^DSf%dvO)} zIG)h`Q~xnP-A85r`gNp(&xY87BGY~lcQ8+0Ac zt#wKszOHe{Jn@HG%IEaX)Tm&mLiy0?a5M9#Gpy^cCkJRh=ZJsS0$?@{N5U ziBvCSiY$ZTCC$^6`?n2MFoA0c$Omk;ivJw`*)efzn7P$*XnKF`Z zC-x;8Oo8r4767pUcsMKdF_8j1r?gl9A@d)&NAO|8H)^G>tpC;zo?4DyCngES6z3+C zpL-n5wAdrCD*Ws~u1)TUAL=GCKP3|f=d!Q_P9TV}*WB{2@!AQ0hdv4J{`kR~j<jo=9(a^(uDw#2)8O5&8&i7k z2x3)sN5oqVcWkIlrp!Orw#%39dQ&`thZ8^dwJik6_CxawadOaath7D#2s#TgCwaeL z;SqU~R)k&uu!21Z2V7c8U(pE975aW4W-uQwwqDRgJ7XuRG5bX-a|e+?Tx-<~QY`Q` z8t5IEsHT78-lOMeidK{bexstg<@QB-=q){97f8aM9egbXLBjU(%;>J7()7}hZ>K3S z|M^Czy`$c|8%Z=~?OA6cs$ljDCt2wkZfomU`BqsFKKi#J?#sQzl8txZG!^UdjaGKF zfWQir)<7NTjFtSkoBAgJk+!Lqwt0L1t$#9QfB)XVJM}}J6kYmHI9c5iy(;%%+|x#) zqXRQ3MFum{O8fu=ViI(usgZmU{soEX4@1TL#)|PRBWlr|700OO0O2B6&13aLvdso$ zf|~I#e$-62+F5p!KtTI1R@Fh?y?@mP+5UN;1SZ=jG*3+g-Xm76sD{?xo|2)(<-lf= zk>6{Y!Z$9Zmelua@CV<`8H*5^snmnary;PR=sPH zUyQ-1x^qB*%QGWKZ$a3-nb3G?g~{CRulaciv)T!d_0+bYQh>L*^48OY?QojH5&6X64^U z?oHZ;m<6{`0sv24;!JBHG>qy|d|lBsGr-i)S}N#(rL1%lkPSpUPtR1?n+Klhq=zqSOalO?D&-brAyUP>TZV%lqps}e%-s@ z*1h`E_}6yFF+kzYAj{I{->dYK&BU(XOMc(?j?MIn)vIXl`%$zL`^Ca4t3BVJJ_R}n zSJ%Zw>@GUFaT?ixr6P90D7T<_EYN|Z*NL5kF$YtDIfVfon40RaK= zinmhZd<2&c>$;gQK0bGQDhFv*j`}jkxvmLcYZV)jUTRK6@!Dwxc~z?>$KtE&Yi_^0 zeRYfQ=6#|s{}sp!)f?-%Cv`O`O-VaED}UbAP_|B}7{J9JvNN;#DzWjkh05 zsPJ=bZ>+5kQ!;o`i#_&)-ZQvtedVUFdB$k!`rt+Axy1*S))(~nzM$JA(2M-YYGYbr z1z5~j$r)?foSf>|qf67?($B3}nTPIxT+?cLYUr-DA%Y9}<8&?Q)R5)3;s?@UZ^S$+ zk16oqJ{-Cs?7DqoGyZx`^fwarb!o5&pl33+dxgsk_L$q_l1a)Ly&034s4vW)Px}@m zxqnq2O~3mi$c-=IvUQ04yoM z3Ro*^8LJlUDP)~-&dZBfulvYj{%j`^Y5rhb%_mMOElxb_=||q@Owqf}i_zm5Be;}H zb2EA~7~&9?2mJ?4G^ayl&_E*smmhqJ0RgL;^A%JPD+Yw*O)TRpBtKTG()_I1GlTqB z&Ig$@ttM!>apj&lRk5N2a{#CEfz_`*BwaQha7IQTb`XFR1HzhurP>Bc>A)x6Y;>$8 ztp|;Q^*|}&G9By%WI@kwje`vcxpbI0Zh!`*|IGjw!J4Z8l4DR06z9{yZwlNS-Eo5o za&Fn+he$xZmI1+oJ#^v80O-`TKs&$^{aqQ5uJQI76IvS2`u}$|&=f}hAD8UEmf%1L zhk-fKm1>-Kf~<{3KimyZ{I()-HR#)Msasf;ouwq5(VP**{pDeAAItggn1kGxSY^!AgmB<7aALP5HD9k3Av4J zI6QoIqx4G`$AKP)9_+=TA_xbW0hwym@&(PtfCSU`m5FG_atVT@Z;C?@vNOvaF-uVg zt>o!*bGbYH4{JUzBEW7RW(MR>Y@j4~>l+4JLmXxg!gFa%&=fhK)K;6j60L9Q1Dfc`Wz88lT`c}5RLn5slvL%z~){XBy5ZhB|b z`P?i%Z)Ob^qs=p?us)Vxc=0Atuz>w5>nlqnao9?a#(_Qw^2x(~pl-=KF0hkx|B6UX zU}eO}8NMS)b^QAZkD;4`Oc=LP9{Oh?2?M@TiAL`ub+fZG|3Mr0Ki=Ogo~k&Oz<^xG zbfc+?v*1)L2EqST;mi%^;fGuiRfK~zB=hbAA_HPt!_pm|G1Y!Bo~M%T_dxLOYyY2Y z%Qq7%UYFP-2#D-2VN1lht|^Pu)bwQ>D(XY@rPUu~CewgK79UM^(vNtOXa|4ek5|Q3 zE|a#a8{tcnSO3r=7qVGTzxsMQgo)P$rm$m8)}|GBVJA1|c_J1v<-aW(1YI?BD_SwX z30u~|hUkW`{v8wc zK1I$3Ns3Z!q2OfyAEhM(lUIzb0=}@jw~Q)L;^$+l)txdfU==o9rLHOY#?M#hHFD|* zMC?XFkJI(zt!|+`YH2SZJFC>+4VP(PqmB!lavp}FXSc#C1{hUJsh)rt4sqnJ0anX7ZAB4Z9$LaG0Z<7nnPU@{4Y*nFhPfqslOoo@93hr0Qi5 z15%V4S+ZtDebjBM@C!ZO07k4kntL6fYh_1KQCnJj94Z|4eEUiRjh|@kvF&L(0-Vrk zDKPN_B+?j=*UW(Me~Yj|8AyK6wQ3;YpX9!PnYzRQl%7$xwufQfEqT2YL7xtOfWK37 zkzNJvKVy3k7sq_h{a*1$4gMCc5U7SAB_QBnF6;;5#1Z7R@{I<$Z~|r$z5rHk;`z}B zubq@;$4g$)Id;(*!v79mac~%2(Ju+tL$JhgI@KO+WeYf;WK*R~!lZBfnY5mcQr?fL z!j+A@Xj3*2J+}4AZqo+SiFnz{2UMU+y71iMO6PY8Fxx}>cFsqQ?axRL29_$ne;;9U z`SO`?7U#&&Mb5iE=<%KQx48nFGSEXrV?r1{2y={j*Hbq0$b&~%*_6g0nby%Y%Z|byA40F{V1<=mrNS3-DGmMs(VEw3#}E`XgsnVAym{BE8-rB zr23MrBa^<@Y}@H2(X9HoB;af6NpCbzorr4RSL#L&0#KSsGL3Uu58MYHp*m!m9js(w~8_1p1A?FLjtbP_b$h3k;kl!Cr{`SLt(sDaS5dc z-1X$x_w_?I7So3J$BVhv$Y&gd-i_+V6AEmry6JYX2Gk*Ro6$Ma_={T9aVx-Bd&KLP zn_|Q;_R}sU)5Q{{B>7msRQAqfTe{FY6Xt0>wg$h@gfL4L4l)S2CWOAE(iQ7TP_i4< zs_cD~2a}Q2=6b@kIObR4@5z(grAaYQw3d2LT)E1dctk1;fK%8F=F#jfFz9QlZNP#I zEWlMzdL7?5N=PzJ9Q>YOtG%b1JpJibspxrfh5L#7`vx3l;#_Erx5+IVGc8jqK@^*! zW);~ITf}_29UHAw-DrV;{&JvE(Xsq#RNeSUaX?W)g};A(L5AA{??;CdJL~x+Jubho z%heST^sMLpbi8lFyVp-|J~e{MSG=M!R$MZJ{Nv-B9+bIMSZ25Cd#TM=rg=Em&{H}N zmo;{XGtpG{Q1andW8>M^l^$ZBZ-DqnPIm9g$IB`kQY^f;Z%KKc0o}Q=0s|t*N>row z(qDm{duz|h+@lL%QfS_@&I!hr|N1XfzV%@QG51egG*)O=gF&JLDSp=Da=d?)x8{|I5S-9x;kkd<~;TRMRl>|@9M z3{5nc+t*259|ret2}r0PIMtR9kVnTp5SQ0cB-h)GB%fR&eX^r1z3cm|G_i8m-7$TOYP_c0Y=F_aJcK z)Oj?=-VGugIFF(x8H2d&*H_GeR)Fng#DaFuF{*N4lMb)>V3xkg-@eFyVVHji?wu@c zG$zR4JWja55@&w($K&JIhm7MX8;22L{xqMtY60r|o|g>B+SVpGJLBHTXq@37U8iHg zu4G$tH78nX3HtbN#}0LZ_8Ge<*(wM6!h1M4O%3??Iei7|j@rM0iUB=QvY#FUa*KYU z+#!3zO*ka_e4dF4^~9@=u_US#$uY)?Z3;<3#x`s5Wc&4{6~q{iZYoac$7K2Fv3z7f zHs-&7nIcBxw&MobmMI1#=>h0mE0?=52gxp@n@ZVf?ZHFoJu%G+M3nU?mG7gU=Z!H% zYfJA#2ea|Y#ct{*+8cxZ9=6u<)kho97sHl+KOy}VfdVb0!tUj^S%I2y`bj-}#Zf1T zZdlxBiBJ@}+Ka+^w1@kxkErRkeS?2qLTp>3wrPZjfg?+BBq=qFK=r_Jo9i_B=hlv{ zFIA=CPU{z6;C+}E!qjo<@iBs(=K^X%ez@}}a6O2#TT_v!+%(^!RO4#osFm2e;l6Hp zmK){4H&a6%Dt3DK^rqV2oAt-g)Ayl*BvwMl0)~S=QWt!%vLEyyV8BN^ zY*OHx*xlnKz93XRI@P>8R^iWoMtn*~%d>jA%Dy%p?SzfA zI}a{P>OB%Pv>EXMNM}Iw!VUXkWRNzgdSPV?v9s5cbez3zV$O4fU*x%E>oM@wFM#|R z$i?>~+O5nm#E!NTz-HHTS0HJfwa45r*E#*7#dRZ%J+gTQx%k|>vr|1TYju(~-<88q zUO+4k4j9u#)*7Lcn!U98LK_QzIx_9|eq~Jn`L}!b`hw`?RjF_4CKOq}61^s(Y$XUC zdtiugsxb}@1=08=f8}ai&zRzjd(RVXR9)Q0q{X7a1E^4bHzehrcha-B)B#R)goKP~ zMR`R=U1~kX9-Tn;&Nfdcy3fgtEUDk4_yHAQ=J2p`Bv{DVN90sBme?I%*6)F@q}3K8 zT@yPF-|li0E}5E+bjak_wf=IWG#1u+sD4;&t&0v1?#dD(?)5ayMYW37{ZzMK`23`X zVu(13^a~zUGP+Vmu$px~o2mO~d#_2pQ`Dp-^)QU=G9aJ|O}=fbG#4OC*u|oZWLICi ztga%AS9s=-eCRff0qT9kU-)!X5hVYvA)Uv&;6!80{>AtZIQg^_;=nxw`;;hW)i9us zCM++to^v*auF27A$QmQ=MSm*(#K4nm_OS~o2_NYL2w`swTq|$&VEJXUy|a7ZRj(vHMxElP8Y(=H#M8aSBL|HFBD|8TR~T^-(_|Ce5A87u{W z_>@~Hdj`;(-`T_m-L;Kb_w42Kg3%DVPAR&*8ae zvvD$JlTc1$53*mgq3Fc7lEUURA^vCDI#tS13JKBFcQoFee~j>UG&^Q6#RkJ)qB9Oj zIe7xar6|`zR;trG@Nw0FRIqRMK%w`Fu@DtStnWaJ_!)Po&X%SJ*DgdY*A1Tbdn^?o zb}32>c~MeZO~0FL+Z9r7@zN@boiv+F641@KJy_m4;fz8DgD5sq$1e*n_09{)!}lmuMe2EEh)=t(cD7g$t~z4n$BTJaB#cUKE<4O$vEzRgRGC z>Tr$u>v5+U*@xR#A^wRkLq8g+6kv$m(UN5Y&C<1N!iIO6tLvL!%Hf#`0vogH1 zDy$vNW14&>+~du)5^vH#9QLu%^^Q*Xafd-VEY@nR%izQ8^lFuID$96OsoPSOYC*i` z#e~Ny0?voKI?mU=Z56r4<4$5m^9a^^n84wwD+I-p@ah}qYKUYqy294_kiWbv5XO$XB0v*02+2nju2&p?@W5UXch|x@`dn?Kj+&yROb*{!#hW5y$ZwiD(+3gw zJ;E6r^re8Z36MoU_-a@Dw(m%?Zve~NYlB?lciK+mm#V#oD*MDuOr2S3TQl?QTurg0?eRwf z6^MoHMqqgVG8tPn?KetQ@yxRx@G{kXTqWi0i)tyK^PQCSRTJ#^xMa}$M-4LxhLYz! z(KQ-8lxsxa*Gi~kDXr`a?qJ7iPR;T@1!;lm)~$@2?bHXobSiu)8Oi* zT~2=jv<29`4;h{)P57FfFtTVNa*eg2aJ(m2gq9NMDnUqdT|mGlfF|=%(Z=EOC(Syz zQR4j2`a>gCHg`Ai#0{lU+{^MigmfXZOR6^EUwq%*bwfOg=cQhtWdy@*0M-uJtyt3a z?y(>_yJXmeW1`IU@%6nEy~@O@+UCJu(~ko94UZl7zAaFbx)pI@BPiA=Q72s4;mkc< zOOPQR8SiNoroC2zvd|}d()*lduViTd+^G3Ol_~+bPhxC_4BW7O_(Pqt!10;WqdD>4 z;}!yy<9;?yyMOT)F9%yE1=a_>iPdDbk!Gm^zu*onQg=1ZH4;UADUj(~tWnZkCjC`E z;pMOFn2Y!BnQRpudi(o;y~|ev(T=Ur3#EF9N#@zjtwKE<3tcXJT2Xn@K6TqUWynFq z%uMCt4MXKaEYlRzkmu0Dz}!tB2KTkr4Yo{358N_5Zn)SSkS+<65VBzI$mMyzAR6bo zWGjdBsVAA64+Yxd2=Z5`S4u6YnoZTovS+R>S|Dd_Y-7V-$tCj+o;u3@WAtzcE3-XC z$geg~7*7#a!952bsT&XGC52}eyLR0EgaU5PnMhB1*S||TiMfC2_l&eNYSG_=|Mf-@ zIceP-oX8o|MG{M>>W-@Q?4)d=CrW%;*-bubF&1Tx<>lVy`%R+HYt><7%Y$QS!4N29+tgO}5qk@W6&6 znYj30-C#e>S-`(!MU!Pr=9l-ur`N^mJW+`%B*c0t= zwk6YJA5)nq26odqi?#z*MHR0VF%#XFHAR54thBUr4XDmL(3tPyK!3}&6VYiN{#B1Z z$J3u2FmU18=^5X%H*U6H4NHw~j98bzyIHrHC$7%IYDTFh*@0IE*VW}bWV40)R;;>e zH}apB9Ik4Rl4&$@iFwxcjFaVwLUizuEw-ZJin-^SF;Ae?pt|(}A)v!5F#YubCfw@s zF2AbnkY$HxcVell*I=Yr(&L0m{of9^7oPGBjlT?JBg)25Gy{W3`RRaapWzt&0+7CE zUe`PCTMrU2EXk4*HGOe@pb7{)dSkNVNWwtZhqTy`OT^&yakhiUfbDDYi?;mAh=kxQX7Y8$lIdy#lwyG%Gtd@Km8lt^ zYgmaYyauKyW`1OJC_+&E8qSSVYp_{mKGItQaf`&&*qd=L<92oDvroh6{U44-brzl6 zFnAz{lH)`8-FVgXT`cjs|)(WYk+H*E+ zj-w$e`po$ok`STE2*O^49zMo50+%^j5hhbW>{RVvswfdgmB9l3Qpg!Mv-gv>#!lKAcQ8NjdvmNf0wtzpkN93u8{vkJ(^} zU2b>^`{J7eX=h0X%`YeHwC3mduszWDS!Eyt^`OXk77jWJg^qNAsd?9cSg@JVaHVzf z;eFWU#njsweb5L=SmnKG7Kutj&p#D_xI`O*JJ2+h{HkUAiFivxEs()idQ(m!R9dUO zRXC{Wk@wwgwf6~GL6C|v1nv!8Sfo`5lyI)8;Ysi_^B-8Et{gz5flg@sW6xi%H@t+P zx*D!_La?YiFVXJFVwT9;ys2nxj`|e+BrC3R4QD8@=P&-~p!O-29q|amQW#G^FKi8V zvU>HglGG*iKG&FtO^z0lmEXaZR($IwQhwWfVPXp`apIXiO4t$h_x-{R8@LHnklJ05 zT&|5=2l26G<#KWreHrNEH`K4>Xv?{&oIk`8cbRZ&sN+Xf!?MpJA1ynY0l_3vCJ<)1 z)R+yOc;FE>ETZB?Ah@SDe~CWY=G&)yq{4}L$T~T~$pR?PpSg(xiP#;At>*OPnYbVP z#KMSWrv<@%(>}%Wt8_`h-E-JGYun}^&6u=6D?+RX52JT^h%*7rh`7!^!M7g`{v1^I z{&2bzce0kR@sEe36@+b3ga;yzl+~@f`2*E`Q9yak;KJPuF=~-}8HZKg%Vdq?Pkga3iz{ z%InM&pxP4EjBo@fT}qjmoINt?lw|tuIJ2kfR$@lQ7()L-!-uJ!=kQscSD}#7%_V>* z*lqx-h|P(@yc)~*rz2`)a~Je{J~}Pt5_BC0OoX}Iyq-wiNVPMRKXYPE1{ZfsqK^uT zEX$&XCx2XtyRynWla_&S-_M9W2X@k1H@Dz7!3HdOew+>K;7NuxVg(V}jml+XbybIi zEEJOv%D?*O35@im)qJnvbxY1y-B;5Xr)HrSR8u0V%(}K)q0}?p!E~eSlbbK;;#1>C z%`p4%Q=cLtIn6*Xa7UtqTr+C(X;I!CITpZB}=(+hlLL% z)lO!0Cc}9V!_VU+^7rALPuf5Hod-FuYFclXQKjOl z)x8I@m(%MumkE|cBQ;+W1dAbuE*JHr#Zo-IJm>&+Q~)tr3Othc>2N}Yc6P&sQfZo9n5=q*3aO)w}S;@zh0hBrDrwT zKOb&sT(GV9DE+8z(p(qX8qHO%GP*$qB}ovDoA)DmL49%Gbud7lf|T+}7(com3Y~6X zg8z3gC>^~}#la}~=Hfi%e}?G+RU&KLMxf2n%Q;_GGQBQ_Gb4+(1o10{@?@T6EXlG# z`E$H-Vbf~xw*3+eHMZJha{fn}vD0-(+*5QZp`F}1)saGKCi=ZX9?x>jCF=7H509wo zecoErb+dOkV+ASUck`BtNE;K$G~{sO0-~%2Us#~0qvx`iUe9`@`sj@&xV>vUsgdOy z$E&?B0+cyC=X*bS3&qfYWNYnmso`DAs2!HjKsr!aWsH(Sfxt&x1(fOxfb++GDkqTb zR8R6Sg_Hq=EAgq<1Z(i=-()+1>oh2qxksBR!ATNkMtC}PslTbR$oG? zW((tV-$DcJUgsSa<-aIyYSlYefpiCa|G(O(!GFV5u9=p@*1I1pky_3sQUv#*X-MBRfm^a*-Q)Cg7UX*4@D)$54tLrkrFn1^H9` z+;Bwh31w*5Qg3-2QSHh>Me7q!kj0u8CyV}2($dl12bVq5bmqb0NiQjSzFYGW^!a)p z3YwuF1^~FVv>{VsK{`2Y;#5$<;`!n01v@NRPK280(_6A=2Y0!Y{xsuz`or)^?N_sm*LCOQ!{}%t1C9%=_igF(9Os_DtozAXDD7c#N8rym zFwmixXZV(_A-L^7!8(RfLrHBm;tWiktTR8gV{x)kNS(WHMT+cF_9meOVQ%>2v2ytJ zBYb!ICwv+%9e>-*G96B@UM!P?YwxhIV74Id88+hMOc2T1U{s?qMRYCMtr5qpoZr63 zeBN9Gr}RvK)*&15t-$`PN{4ti$(?uOHoOo# zbO9x%PEIg-$xfefytd%oxrg0!d05)rbh5ip4ShK2=nhe5(0n89FzP>^nRoXyG$Ah%8c%>)&ByA1n z4ZM<5)p5vMFeL={ilSl^{cor=^!LbpD*FaId-fx#o)X%aoYDM)QaHpM12s?^k=O>0 zg^Di=bqAt4ulHX>2R`mHl^l^B=OjWAiXEx-c=4 zlV)^>j1JxqSD>kFxRnupebHkZ>`IiF^DTm%G#9^esItZqOFr|o)@j>ds2#e+; zHNv@Y388LPp1s$-J)WLjDJbQYy;JufpcF1yd@%d>Q0(g4@Ao2w8|8 zXTX>|7hVR32@@7{)jATK-v7Gm=9d3@_R88<^Cn2LjCP%6;z5I1f%7>AuHiFb>#otX zn@A{`Crr^_6o*&muIr<#xo#%qN7j|Ooa{*4Yl|#tF0hcYZjFD+GIG)9<9kN7y0{fp z-(nyW?5hH^e%2_uQ}kd4*3WtgPDZYrGgi7-JN?QxF3-5l4tdyc5qSouh|maiB}ArG zub0ckO?_;Ss`f)$FArk=-HBr7gJBLF3z5QuOEIGYTEA~}tUb6j_~`xwsu$R#;lt}h zoP@SFLtIj9OM7Y{Sp@v#qE1d_PfmAMA3>+lz-co}Gosq8E52ibo^{DRFYKPzsW<|+ z*|Nui8ym9=br|^4sfproRqdEpE=Y}sKIoiZRmN?mRW3hE<3)199Kwc>eNH_yEBmHY zAa3rki>MBXqy1&gROwTsidU*owh(}C(C(!fIoZYNSlld+X!CJdPV*m6k^32$KOrrN z(-3ZnTOWn9UoL2g`C_0cXcxR|kn^u>naxd@M{6O|_th1DVHH;Lq%-OsPyo{To~ONV zIQI^kbRR1yG@(Z-YshB1jf2x55aX9U2q@8m<)OC1>>Syk+>5)3aQEU z{oM-|vq6sh%QnZmvb~~TinSb=?KfV_yo0$QLA;O>N25o@)3sCl+?$u%{I!6SKu2M&GmN)RPQ#xlx6iV?hir)FR6?D3XpquQ0RAb#vdgy8i3*tEWC|d2 z718bh-i!*)Yn3!k`?cPGzzsuB2q zKWO7x*iiHAIZ;G@+Y7>wahOMm?y$6E1Ew3(Kqy?V*R`;@vh$~AMy!|E$GJUlB8+-^ zk%#)AGZ02OHV*@kRNc@hj2C2_gJ>KZ5|o~b*lzrpi8A;n_SIUsWkWk0rkMbJ<>C4h zs}cufqRbKL5!r1+{8WW1$NC&)jl9Zur49&0J(yRERRw(Wa}+Xp^RI`h3qJFZ>YnYe zbSL&1dCg;`04@0WkyKNfG4ja(ikoUtUn7@247b?mjU6q^>Z%U1b=o&#eKFWxWys*T z#yfV`M^fimO<=E~@MQE}_?SX%Wkp$U&6&w|wj2E}1#+uTmQo*n)c50ko=TbJd?<4G zhN(yT)?2Q|yr>)^Y^iAi$bpnf`fKdpJK3BQb%_`pa@y_-uHA@CNIX$fqJ6Ze$Q)+p z+@4k~8o+jS#s&JYliNu`JPNNjfHeA`Z|{_4zEJVAHY;{PC%fI_WX_vn%NlLxQ5{}B zt*J*JSlsJswxb)@D!8ir$LF@h?|J$d#)I-Kx}_3mbMam3vZGXGd2UDbll{=i^F;|p z<}S?U{%z}0rM(2F)5*&cmaK08exvR5I$-7Xt@mGMJkeC?v7pb0XX9oP`>3&QStE|+ zb*E`|6cb$m-K5f3h~v zj7t^+Xqv_4jI`p4MqK6y^=_w$gg_rx96tOu7Y92NFCV{211^mR>Jy$yw(>;(Q_!n( zIV>F-4z+U&_qDU(fgGOhMIQfTkrS-fW5L5OT%4$tHg|?gn4mD@#wxgWQQ34_d*O8E z01#HxYoMo-5T?xLn_ymw5jKC3ff4lj%kIWQx0fFqb#yCg`7!Dcn|F0&Q7 z?y_s;HRc4NV_??|u0fz66Usr`r)^(O1MXOEmoQB2Os2RB?JU?pmHufm=97i~t>(Yy zKk0I<{v^*g`Ms#ls-sm70X2e?@~loJUwq^)aY>Bp1!{@2-!izLs(+=R{4aJrvYmB@ z=98l0fTc_CW}QHHjhag?wSY54o!Ncgr^bNg=la{ojc+E8Vm^22ISK|sWSS)_4t*XA z+U0>PSUgVI<$;uoa$_?`VTdt;|Ls-41KDVO0eB#aRV5SX%+D92rKzHj=sKkL;)9_(P1rX$cXJ7^JDL;CLEY4qXU~Kp*G5u1L{_voAQ)$dbc~0~K zuF-33fTcZc7>ggL9N(p+-Ib6mU{=(lIp^dVXHrTQK(rQ|gq7lq(S}yAtc={!PLUA zBff2E*x<4LxqC(`W*5mJY=pAL8%CjL#Z!~$_}d1r3r~6?nd4<9<-jV^A@@Vh2S_O4 zbjXHQkDROZ!_u1So&vdy)P)t>5cA$6vtP?)B94J#!hTzaCt|2WjEWjfGTY4_mvw9? z3Eg0dCc-g?YJ-`%J|8SBb+}WjUL;Oeeu?_4Fwge(qZ$Ei7wRx1;2Ar%e2qoJ6?F(M_FltbWCJjgGbZr~4PLE`?iNx0U<&`u5SY3Bs3&MglMP z$cCp2(*+QEQ#?Y$_{mz)wOyiTV?r|y7PDqv9MiDz#5Uwtv&s#*>8iwt8>t=&H=}6J zvSoWV+y*-*`^(P#@wm$^`jXl5qd*bGPm74hx|Z=(<(99e5)G#{RBEEba7zx4zJ4!I z`3Cti(;PhI#s__+YOVCDMvN%XI~9uyrD@8|=(Yx3J{e`Xl`ruAF$=+BSR60u_~Yoz zq54a2;_6^|^l(F*<^7g*$gq4<-Knlp6+gF-7)wN&4f#-#U~R!CuUyA%zdSQtq^pTv z`(@eq*HZFFnsUZjxp0S2AqA%!#!KcxYNWP}ngDm1JNI4MdjQCRSuL~Zho|u0A~kl` zAoMT2Jkz2T#VP2QOrQ-3>xC{M$f3+ELbjjK_HV##RDacZc!$ML-ozh7JyuZSd1H=h zhf;3W$OB4egvBD%HMko>k)k%LUaLFn!b*i$h{jMY9Vm;I{(B~4KA_>>U!xhIgq{MwXkf;(~4PZL8w0(L%HW$GpACd_Y1ljJZs_d(?O?xof#af21iitrc{j1=@=cU7&t~aGE_2H z%~DzV;Y@qGq*l0ep~(85=4`tLZU5P)20wAG2%d|)PaWdIMgU%iZVt7ZFt(^)9ey*k zp&PF#Y*a~1EB@RD5){E56T)Y7Cx2vj3 zSp*)O|Le4TuREE0w;a9N(q=`aC#hXg24Dnw3uUK{=Q2-h8!#wyK`0FRTO<1gqby&1ih zBt7cG>K?m=jK26xp5>5)CNw?2umRn7XOkI_ z2LfXyIOX(0+OWABgH>aPWgliM?V1lzKksIws@0R;bQ;nEq>#EqEYqY5Y&6eN!7`~n zE`$Z{sQ{#nD@Eret}^x*gURRtQdSKbTn?DRy+Tj81JUkS8P{F$Qw@Hf5{1P490}%j zw!x7CcCkw=ie%`LB>Y@5jRz@Ok$O4Y4^Z@?TO#YVgbwfJ`Ff%X8U-s&dj)kKXCFbx zenW|ql|odn7UT>eHHc_lr{7Kr=h9A@IG&Zu+B-4QlAO>Mf2IHMaL8suRI*n0a*bLh zVbHvxobvp9b`7umttm~8JoSJ*upagOPYZ10?=?;-aJZ(G%@`P(pjI!JkGl2Jy&G#* z*&}kbd4gjSP7cG3^GmTU)w2e(_fhr|_5c~PLz%ZB5|#xgQ#`)Ggx1kvNe7}oQlq*q z_5VcbW}9i9tbt!Ro;0>{km_W^E_$!)%-Mx!P1o%>2A`rvVFzB{cC9;2mDElQu!Vni z{<+}oK1U;2U3!*Iv1cpH_UGSiNb@ciO(}DwaML;JEzwlQ$h0DjegFwZfvbn4%Zw0i zz|v*ULaECT(kPS_J70tZ(Ym1+2T;|4pJSktrfR6g6*N5>W|l)Q+(ljf7p^_JK`Y#y z2iG^k(Lb0#g~Zkg{fB12;Qw7${JB8K4LV^}G%)R?Apcbj_o>-ZaDbm2@p-z3Db(sl z)@>5L)oSbV{>Qme>Ue-uRqdU6R+(EP=9|%fgf9mdX4U*q{c+crP;rrloe1rJP>z`b z2nF~!qy?XzaH~&Y!|~aa=X&Sd==Aq(;a{$J*3x68S9(YqkoyCc#ExzhV49dxmxG+Z%IR#^V>iVj@yGs~GRS(A-F|9@d8b-v0yq{wElETAd!qt>3g*kNp(q=(^Xp8$0p{cm!7Q|c%TX$seW zajsy#wAB-uH(*S&5Z7iNu_QWBR8jm1CP3Y2bf3nD$Z??XcT%n*i_ln3%8kJ_Z}*wi zPQft(p~)70^sv?+IF6T5m+s|-A7Ej5$|C-$1N$WZh^jX27~QyMnq;@b!kbw~LKV7> z@rV4@y{dXo;)lKRvrb4Szm>xezSC_V?nG&V{N|mn-hYJw`0jV^`b_NI)ZX=(ATBnT z*c=TqCO;82@qNi325B%cfg3<-8lXH#AF6FW zRi!D(P81)C)NrPF_s2}L^HvEyT$9Y*6W1G}Wo&=^4R1HtBget`Yk0v`gAfC29%A-% zQbizrT=E(C>2&gDRk~bpq0~r2hAry;!w?grdRD%JY926oL=W@eDhX~<7qi%K z5AkWzxN*tiCds7iT*@Plg$GRg7?06oMypY>i@#T7;;zUb-mY2Zjn9p2y>sJk&U!bm z4m%gx(Q8@^p-R4#aTi_|Br~M}2C9nXQ14={&A-NzPsK8i60z&<;}B3JfHXkq8HJV% zmwNQsx|to8?-Fj?W#LRm#ws0iG@};t_ort5!-2nE%J%=S1UK{ltUL6nN}JA`Szp`% zojgU&Bx9RRvY6ZbtBpd0JKp;!FJILwOv%`74~?-yVXeW8TvB z$R@J-BEtv`T$TUoYv!?Ex5V^G&3~{a6bD}8Ya4&oKf=Feb@#hyfX``;U0>Zm6biRF zUg8p8IK?AAwve>hgb_J`&$S+s6_exm&OKjR%{Kx4-(hjN?tJ#Nf?E7) z!t!+`kqYi5FIkF;xNcD5ip=z5{Ml=}?i@hQBWWW2Yc;MAu zyTgZ1O79t+nL0Y~$`}8aHx2v?in@PAb@w07F-@c&>`(7gKZA4%lox>^64%F%SPtvu z=sQVWpz2^kOP$aqlaHltM-|I0cs7LgO5JhQI^82v8y^eLu^Mf6b8%y>_#L*AdZnSP z?FHZY745Ubl9A7R2;s_mt_l4u((|u5Ys-c(a%!OYRPZ((YG^jXL6bBPrmB-mbucXL v_QddBJKeRRTPbH}=29pr#a143Blkqi9<7IC)k*&ky@~99&s*2_?F{`l5)((u diff --git a/docs/ODU-O1-GetAlarmListFlow.jpg b/docs/ODU-O1-GetAlarmListFlow.jpg index cd205078f4fe8cb9bef4bf4ab1f273d9435ff4a2..2998993d5cb9e91ce1484022791b621abac675bd 100644 GIT binary patch literal 71485 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

LNEt9l5}&qC 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∋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 literal 114151 zcmeFYcQjmo+b=wV=n=ge38Do-^fHkILGLLy=k-~sq;&F9RU0vghzo- zc}Gb8CY9DJg1au%!a*?^gzS&YnrXBL_c=sfy9N^x)6&s1Fmm4G;^yIfC@Ll{Au09b zse+=?Gi4Q>7rJ`-28Ko!mR8m_Z*1+{+&w(KynTG%e+c;)`ss66Y~0uQgv4)2$(dQ% zIX`pr@(aoYCb?*0%PJ&aUpBq2ZCyvGIvX)WYJ@^2+Mk`o`wL;nDHQ>Dl?k z<)3-s0Q3Ck=ieswmw8bD^SXhDhl@w>XI?lrynqXr0uTR=&`nBtErM4rRCk4g2&o^( zWRx`%v5RQ$)4X;aB&OwfxWIYvXKMeL*?(cV2n}v__Vl{w>cUz2pztWpeNMsFK$Uc^+$e#+JFnCge|Z zXNCm_hjIV7@qf})>TkQ)<?9^znCb(qMB=BA+Cw-5aSvRuAq}Js$E<(Dp@zm||18VJ)wa8{8 z+sIw(4g2irhOZRlyZI5JPG?DTOV{Yw z)7-V}RH*6I>*DR<6MeK{JQhTV1zjuFD+4mbnt=s%uKx$G3+|BGpfQOUJS^xJRI3FG z8ps3opAQ`YJ6FPjHboaT(A+2F7>E*@9Sb^PJmA7m`-Wmc;9?_g%OK=)}diu!*UUKWM|3%ZQ-j>Ce8 zWuIU{(PPEb&^H#4wPWNy7v|Lovmp918gm2L)$`XiIYv(4xr!nwaVLO9RtSWCAI(?z zpADCcuU+aaxI)U@^!)vE^JG7!wIds1sY>DN#R&|-eJ0S227A=Q>&H`iWr&7~BmsT_ zcEi`nBJu98z9^O5tT(HJ1Qi)C^wm&b{GFkxTz-*vwAQ!1GzYWYIhXA(&rjF0e&f)(Y_^@;D{IrcY@jn5 zpA^)`f^b9%NtCuk zI9_6I%vd{Mh_Ik03oNKB^#8v7w^d80Ya?fws#QIr%?syjY)v#cVEUr z1<1}@eZBPSI`AODsTp1NKbBrrq&ZLmeh^u|`9;+t54A(5Co*4eTmcVa78YY7m70Ga zOvu9N?fBXG650kM>?N8Qub8$yS~_18t5C-|X>I!8Yk8S`#(T-AOJk>15MNSt0lx%` ze9GD8?MdBpI(Nm-CFCst^ z_+>R^vA#F~FYbnD(mZOy{gIQ|NDKG<_StR3>snSC?57whMX~&|2yiV$WG(;hTZofC z##t3U9yCMAdohvHBtKXJe=12|K!yoa7JEX-=4RAt~cKL(`~E7k1X1WzB7kkusRMU>3vCi`a(Z^Eq@Bv#zq@ps5ANmQD(!e&GgazFr;NI7W4xP0!(NI5^xbC z0kK<{_n1E}1Aqg7CDbk8Ig(qj)V<;yza~KcaSnhUVnM7~+ll7K;6DZ)fEsAuVl5?+ zU0Mb6a#QGUC}4m!0Z4GLDc9`*Xf75+30-&s=x}GjD772V7%d%YHC$>S*E_{9N>`G| z&yRCkZM#=QO#YPZlEQ3sf39n4M;j?DI3)&}CzH3m68 zV=Rbh`3*+EI5U>k;nsfjcDn$-*xJS_FMo-GokY5{ZdS9)&S%9TEH=2cD zLFsd3(O2)Mp@*j6eYig`bx0!<7St>Y*g(!P8k$W%UT9b2vWwfmMf$8Gu-2moz#?M) zz%9HpFgj5Q&2J6{Z0Oz}NT%TeNSQ~70&7qDpzpE7&pPrCv?YX5^8&6MZoK=AfIo3<_Va6FZpRacC{ITUyWIrM4`ZZ`=xe zqRXo=qnxf{FlW4(Aa<4z$Jt)oW`AEt(X}K(xQN_Y{${;j=NuKBUq`ooNCx6{otle! z_Of~;1LtS5u7rCyTS3A1{I`?_512fcw=e@|vE2(hfz2smm!2j2#;`Mr`C!+q37LUt zy8{?r*YG(+A+>*lt0K&Y{zPDtA$n1{gjtOCL7`5HnX&Pj7qo^&v`|Geva$gS!c{BY zvve5p4sDB?=^BSo9UDHn=J~5&kJ^Qu_@uji>?%A}gNhd;TPj7 zs~xLMN(g|op{BKAY^HXUvx)&p_iXUMO@Lku?vF3x9OR_-HEe4cZRv3;{CW_#Qd{Mz z%IbrfU?L1 z<|B;FSxWDLMQ4wzqrW&eW__rH>f}lbqdRj>ve@FCa4E~BS79n>;9(uw8}|!Q1G2n$ z`{>R)ysxjm-;jSv#HwZ}$6KGMynnr$?>K8Zo5Ey1)g@IFL$(Fj$N9@(CEw4lZ1v70 zwVkXhc}3SWW*Y{Nqoe#^In76tcju{sQ8w1MQK&)(`_C!Tn#|0%h`0!di~RIMHc@Av z>Xn^`H|5xnh?${rgtvJtsPEx#{$ofJDvesVQH00q%tg zpyegPrOjFqJc>E+#EYrphixxhQ$nBqXChauFTFIQRXKO-dD+8oH_u*Mx_G8%^EJ&@ zx_GgLHKjNZeqZO+?_YJMm*O*1tW$scakJV-Q=SJC>g*{Cein>Za#T*v`Kz&q38o#Q z=9*c#2l+G8nC$749kf@8?l|33#>J^pAbWS!;WDAGu(-!O^G2L5(t)#n&=5~}D(CA_ zg$-V4(t|JGS#ce=HB9t%TKmyuzF1JJ@sZGJ8GP;pdBNiKuj&W>i$5Ce*)-!GW3N7V zo`40tiW*i3_bn=|>lPAQd_;8X#ybrY=Jye#mQ6AWi#~#l9bjccj^U4)vGkmG<(>&q z)H^N12IAKPbu{xv;1|f^p3|6ZPsm?-7%6n{%;i}mr{uf!Ve72;lHnP;U4CIl=gLif z7)}NL>bSG?z4QCd^p7P-<}7*jM}F%|HFJ3zBL4PC@S6&} zB_C&kB>K&%#+Slg%nmRgQu-UW?F7 z4}QwqXgQeq#`rM@W*=91nfTemIwtD5Z@_ZG1K1UBY58~Z({Ql1UGBebiBV=_lANwp z#W<44j^99B+sitY3rHm=7PV!nZmCWv1)X?(K&J zIUPgqU7p!E2}ACRLNpPSfgYnF*@b$Ve)i{l-^NmM2{>MD&QZ!(m6$v%-HbVRoxbih zX7bLBQMz(fDPm~+^uv8E9|*#Ulp?U8b>C6sKDh=Kv}{+X5FnhZ&f7z>YhEDZ#nWJt zKHF=)|J8c{6Iu*FBG575(G;^Vl+i%g`}?F2I?tL81W2QLVg99_( z7Of@7B`e$sjXR75T`)$UtH{^@B+ytf5Lx>IfQ4Pxhyk=lT?qmX=~(#uEp)oh8G3qIJHZw;M!)b;G>m@auHt**f}0@R(i_>u z0SJLFVXA#x7ctv=2jUmZUZ>{Kz(!dE;Vl&cj80Yh%Wu<2>W2C&!9T$+Yrh=S50I}Y zOfLZXu1RMB6w>1PC$7!=+nvI)%xEXMUSJQRF9<54(`NzNWeHi12KMKP_#bSTS`A3W zrpzAmo4LkXHTE{oUQ9W^6w&<>!V`s9LyBm?kmt_s0KNNJV>r^g1$%zUCa=%UVXRo_ z4B-biQ^>BrepK~wy}82M)1y*eo~9cgq)pBiOlDRh-3rVHLRoK^+kS}Zwt1ERtyBJC zu^ZJF+4f4ytL2k>b&O$Un(+xJNP|h9a<^#+wU!|*&2l;|ayipm71L~#i-{_O8N)cv z;Q;2PYB4`09)%oxL@H=3XrP7BNsZw1-zVlt@c=o|lI~5jW~4TPf<(-MZ>tqd&CZ(r zx-Ss;dmwkZP5y9!km%Vo_qwjZ*DmXBfyg=+_*4OdHJK7V$<|9)9H(1q7Y?S+)w+`K9z5LKi1@KsAW#uoyE?Xo`0|%w!4L~ zjNzIbQ^vC@r{j14o|%d1DjD$?8jO%4b#&xpizkDZ3iSvs*)28s zdW@#!;&!`|ovclvm*d`k(SSd$e@=ksfM+9n^u@*O`gtcVPrnL;s&3HM=FOz9U!R9# zXACK=z=H^rMjD5!!aDS^M&?LQV?|suhIfCxw4pI!SUYt`z(LT-s+NF4Cj4%aVb~X) z@3#qMj%i{R`R&$CyrbLno)>avwPqNoRd{_J;3Zl?c}sX{ZG0;%)F9|~az}kljvs>; z%9G^8ZK^SL;yz&eQl^;2_0AywE$OZK?i_EqvAO25H*`ISn1>3EDe*^^7BzG1c$CXk zN^IlQF77apiN^bMPUD~`Q4OYGe>2(* zKWhVOuPe^SCg=98;^^%WJKNHGrmJxa`}r4iw8C~$9l6Ch;RJ|}0D%^Ji}uM%N63Vy zfN@+}{b-#zp@Fft=aHht{nPP}ZZdJVEx+{q>Q@Glu0%;}^X4x-7}?&!92)&R9c=Kh z&s2Nc$j|y=fXvM6)NFBfYBMoz^W?(5roFGkj?uh*t0ucK^;pl|o`~P<@vF~2BPw0- z`*8$<+~xuxEm9pBMgFSEr>ebiKg|s_ICD~-`R7DQW<^>OeYYyzNvnQkir?94Dt7dI z^nQr|%!ctR?Y^2wtz6ZU*!kpKJ|eb+jls>Xig$HY7X(Vc@S6@}a@R7ttnt{cZzmOCPnCptrKAMzIVphKFM$6j_&4w2dqQxb z%W1jSAs*(}64T=>rqNAv7hFIT_{tO@?9|0Yk9{)Bj{bpw+Rs#2W_t>BY)dH5h!-N`ED~}X+XrjU4l{N6mO7EWu z4v%SdlO>8*Ji@tIRI5!32xTZA$pm%X%^s6cef6UoPhUesLvD$gwrXfvrP-yXO0j5y zfkC2^eJpG9q~@z63#wMnw|KWc>~y4PsbZ9pjRSx48-p(#tVW35=8Ia=h!ckD z1tCi1j_;}HBtZ&Aadmr*hwjvRy2!AHb?_l0rVQ@U7Y%767OQz`%f}awSf-f2NPXec zD@~Og_Dr@P-$jo`T1X5S)L}vTY-IrR7cvjIA|Akkes1-g`R<241-+(*pS1t=&Yl&rHGd0y zU40~!P8|r%AdeK>byylIDz^618-Zz$?y}?h+rpEo*0OF_6I8j4=<@aI?;}1{Ldr~M zRUM!rQyLClUYt!5ku#>xBif(w_1^*ve@UqEpu@=)mA$j2e6=$3?;7R1EH&4PQVb`<6ibEI1vqVnj>`oSH7JsN{SeGZpcqE3bm`?-*3d4?AobBL4Sj8zr> zuAZ`k_MP#M7GtZ!Z?_$+318b6D_H1uH`~(xq;VT|Ty&Mw>SwPy|1^#=(Lous`ng{Q z4Obb@-uzHC)I4U26kcMukl$+VxE1Hk+UIV{ryjPsNxt1_$X}wF5pQrq*o#M}m7-^8 z;{4vwfUUT`7iBmWv_l(fqdg$d7b>ACw)7n&G=&>BoI+lRFc;?6S9>0*YC7UUc6S#; zpFE)T+eriEaHm>W!G$r;#$>?@mucC`m7Z7?LTS2zdb}m>wrMjJId-I|;E z!67u=BYvAM|7}c=DMuhv)koP^xW5$h*_FkfU8pLSrPjN&MAfVon0Sj3(W%(`ZS^um zis3qtwcQk66)qrrx!&Ve=@v8;q8(pjG>o}9=Y3%VkWa943%T*mxXr3s_Kn)NULtm? zLaj4+QS4NpN#|VGH3>G$gHA4{G{$kr!rj5eh6hZxBr>i~>O4D@xSPaoD!!PXw=UR_ zBP$<-R@5gsg17IwfRh)(eTr)k%$7&PCw=CF?r+?gsO%kwWULME{rW(a=;`+RmT)KQ zXuOh2pFGqElfcXCb(VgTi>ADGMDqgr(_jV29U$x1+~q~QGv~U1O#Aj?ngIKMsbys% z3JrxQU9dbjU)qe?S~^3=@ugo8Za^=c5io9;{`oZ)#L=^cX^}F=eCOZl;Y-26>|jAo zke+)Jutjv@YD?IP2a?ik>b!uA73D`l#aWtmZ-gQmHRrh z*YDX7+Q+(@L({j>_#nt#nxt59k;l<7S>fq$@oL;J-e0%6P7~R1x;qFKd3|J@GCLhC zB?=LZLg*P%+7FNWjM-sG64PPee238^_ONP*vv zeESR_%jJMnRVk299U_rB*uw!LvdD$GD+0jJuICi-0Q5NGy5>Se8T}BD|GhqH47Xy1 zH@UtdgPwx6Y;RDCpR*xe?Pn`wjS3@m^9XeD@O4g%IiA*n4gboaEth^pQBRwN+VVk zxmXmXJnWh%e2DIU(u$EBg?B%^(4M;nYm(CFtJd5Y=2ek?-o{bbMBq4U{J!0K17TEr z_TiXNlwWB8KH>qc=;N^4;7VZBDf?bW$q=s};p};oyjvv0muu^#Dw{do3{OhHtN-?> zuHw4_@+EVc*kTI!edVXht2&A|W<4w64fU~g9rUr23f6ZdIndQ>X`{JS+3D5A2!%C_ z{Vw}tA6nz`_rPfJTN!c-&e`anMyMH+Zn8`z;tS10pBsfzFarFF?>5ZVd3I_1WA67x zw%3fAde`qFs)OGwdB66EHNRh&Zw+i1TUu7s1254wIOk z?wNnxha+54)mt9iAu*2QonFNcO6 zw%L`}-d@#$2&92_o0S7XL<0o)Uk&wW{-)_AyvWw{EOgW-f0q*_AzL8ljsh$|C;$Tm z(~5PCHO?{PSkSg~0T#63e_~gau-*68!n@8SuC`SJyOU>O7%l^LI1?novru#&l zuM8P0HZe4+Oc$b`;m?d#`TPoP7ee$YCDaDD6<*4-f8_7*J2It3WHrNV-6p2#o~_`n zMJ&Vw;TtON65<8$v12GwRkdT=?4>HjtHxsQFY+0S;3O!p6+Tm~dc-cFS-*s!8CKWS zG8vmQ6*n`Fw&2MZ&!F~Ar~tQdme(fFxYrb|CXjgR^B>AQlCEKx_CoYX;Ie3lj_QlM zEzIaS(a0D6%(aebrJ5?PGpLa>E*H5m>wM8D|31R)_qej*h>L%HLs-a3wH{qGWLfcm z?)rTRwq??D-m?q& z6!#{sm2g<)u7dFURi9rWEoJ==bj|5m6z-)g+3v|$_D)Ogh z$Xl~OJ{*}vm*v4tVTU$?mEptv9lQApsp5vo%1-?C2`FT+uFxIw(?TD905}cw%e0&Jc51~8k7W+mJ7n7>Qa&La&Qc;knU?V13(^zl zH~dY?%*=fBenT~(s#aE3$=ipqHsAxJX=FocQJ^lo-kw@H)-#VDmn*Kb*r2GGtDVua zM(E>^q5lAY@I~vtBtGdlp3U+-UU8LV&4koa(J`dBq5J8ZjH4-maBE8Am%`f=Ik*7CG0TUjMI@{a_hanI3VbE>-S6EOE z9lSFUN@DXC?vXSf*zY`5)8s6u(Q z5oT#df%k+XN>GPbQ1Hw1f-SB6{zN;g1Jci=mmh>gj}IQjDo|O<8QUaA3Eygt_C?O8 z8ZEt0doH?nS{y+qXZkZ!OMi!?l6K{h9;!Xj_1!HwIOo8}y_2VKsgL>0fb0k~i61p3KCXUQebCtmybJns(JZF3K$m^?L$BY% zA=gY6X5(f&2jdu}bVBHavd$dOFnJ^c-B$GD?nU)_5f`hHhgyAQKe=2fO9hIU?;2DJ`Ht#*T7 zV-AAP-5s(cEb|$fWPM8J9DWu1NjqJ9M<;A#bb1FbuE6&wjGwp^Pun>+zkPUMd30gV z^Q8Af8yju2bQ67_uPGv#f0638^@Mo*Mji9gL4i?Vh|^Cyy2KcnKF*=GD9(U+!jXdc zH09>yST`flc%v{|1$O|pncQ9S1nBA#H=VzrlEU$?fdkNkr6s|uThZ5S6)=5RN++~l zb>)J69H9A#{IQ@1CDMxsbU3Z~Da#=8c+K84(q)bYxoq&q=j=veLAlaKtz>9#U)Zl9 z*#62oPyq<^qnTL)fE({x2(Gu@k%6CQy?2-rSwZ!aheJ}GjE)d@IxD=Rpt$#8D<@DY z@7AWB>`g{=tw2up%uK75$E_5bhm@0*{drL=IWD}RFLRe4%g=O(jjKsf=9Sd0*U!a# zEl?B~z|bFu@%0v=wU!!u>b1PGm49^Kj4n{Kx|Qf+CEV*CgZEnQHy0|R`4d488?)u> z%6guIhv%*BQVI>u+SJ z?~D(SU%lW?qXb&h16Z1@B0F9vF?1nuxet)Hj?e=1uYy%48QuGgV+cGgCC-w#+~Qx8 zU0(4B;UBUf;!qiIqpajcVGw2@sa|>MibMO1G2|Bbo5YceA zyOG5pCM)KJPxvEC9Ff)iJY%!Oqc2AUiePj`$vvhfn?z!1r(l~^t-I0;pzk#EVj?Z` zmdyGU`UHt1XZbI*jOxrC92}hd+>N^prw=z4UA~;z$s;lw>g(%H{J1!D@DwIQMw^h(G@bEQBS8LlU?vbP39eV#>#2k%AN3HJ8N%|*v zVI4m_>a~!@LQymg5qj|nwr*<@B1rc zZzhPCP1<>Sc{;E4RR=GyO6&`JJ&>R$kU53P91wi)fYFlq9?FVVS|_9W>5EnpD388b z30HY0s>>7BRqTSYN9t(`wovLdY^JuN(jjpA(X=L_F&_V>!sQ!vWid%O;0FZk5+R8T zjCDl``Hrcu-T(xAw$RbEPN(CwPI>lhbe2B+YNveg?CP3$xSdff`Pp6j zPmWqy`W&E~peBy;gI!s>{*(g4E!sklS6=uh6_m90wzN+ zbHIGxW8sUY2x-+ZTX{M&XIxBeu24K>D@&X1rN($t0P$rshSxUksdA*keXmd8wnst_we`E_@4Ni_l2Bh!Qb|XqAm&p!M|aZ z0rtub^&g(t+b)b$BtNtG%o9i0TljXBrLaZM+2SV8R5##(Feuj$ti zU5~~p#wabf)YcvfIY-`CP;s7A&e?DqY*o?aZgHK-x%kf+-t83#z6Ma4w$mA&vZt|j z$#PAtWj1)UU@q$o#aI9aeiV7U;9~xGe83D06x5CbL4wn@go*x5E6gfT{0;6=$_MOP z19S>@^tsTaqj>(H*gJV~b6Y_m$ps+7?{lOsR|b9V5Q^~XcQcixIXt#k|L{G(PGqw{ zJ5sk-G-JgG+LHQuyw$~MdXvIzleV_bj-m@8JawHZ0!|D~c)%*o7Z*P>kaw?gdH-I< zb!@b~jlFGwQh|J)utuTDEN5o|s8#K*qYfg9I{IrMYlwnxY~O*1|4@L_sG#b-_(ro( zJXaKjUf6~c#260k9GMqH-+^_5KNamDD-;qxJvgK6eVAsI^-z^MgZdsP(+e7oT(0Ea zlqX}NWKTMh?~#HN*eg37RsNW)oX3MW`zyG9HM|+AO$zO1&Akfw0N~Px>Y)UBq|HhG-z!WfP1~9d;3^S&plspqFqaa<-m)L!&Xla; zF`k_?_HoFmvYR7Djc>Wg)V^;_bt*sFh0p9k`ItN67VcGy$S4jsPRXh~d;S>ZL;2!G z2s>MKD{j2Z`|n-_X?OSiD~u+aa}B~f5J!yCy?w5`B;O1_5*q4Sy5`m<;087COlp~w zb?QYbXkQttR#uucFs{4H@N*H6c&*pgooM8*i6hBRK8`qu($+FIEDSGI)b;1O{d9Ea zxCr_|;4D40@~Q)eAePUjHIO{+$+$&b6gU6dMCIUS2aD8Iq1tELkE}Hfo#$`(NUZY} zXIADX>F28r#|;*GObwmt9X@@6ulW695k7b6cfGw>e`nq}oqTItpHAe7Xk@L7)QdOD zZ(hef;Rp%>;iiTOrQO!IR{(PIZ744eRiKv_t5t#dz2bo3sjMheMXW@`^IS(=%k5*R??#33Nlk{s z0ekCNGIVObF47UgXjgVyZEE}B^QX6Pd^k0Go2Hs1K&-xcgUu@^982ojzKvy* z4ui6K2<4ozxV9y>xbJ$sSu+?$+54yf^*(=(%&KnyJ!kJisd1`9W!%Gc6eR?X)&Di? zdTXYpQ&zI@QUGbO$Y;n^`mLv|>vvbI;$SyZRKfbZa9SwdEkao`m(ZrmVe?dP_&Weg zRkrU}9GOggYhzVPu$o|!CUTgPItZ35iEgQ7Sxt2-+?4tp`CBO*kJU|(jh^xs2-L{;! zOp_WHU)1=d=d1ofl%KC_yc0z`-D%^Vix(WYKOnKQr-@b+Cle2i?Q&`a=uRnmbjBUm zGC9RDce7AQf$B~M89m38-0p%6+N!bNJ!hW2n*(`D!kyrR_WI5yeXFTZdYo@Z)2oe9 z@x1^!T|UDX=UAUC^brqh!K*OCSDNJ1_FM_1eqMB31n-2V@^4h_!gs`4 zHc5<&ACI9n{e3jmq_P^-Z;o$usr z2Hw2h0%S~7SVrq*vi@oCma%`~oY;de?-@HkV>HxVKs;w3`8b3gj+dW zpC%(iMDLA?wtJtbhLdS3#rzaapP~4`jq#o)Wc%`BX?6R}3tNetzVl0H^VNHl`kuy? z4s6)tGfYOQ*mk$<)7uX>#WcNGHkAkDM$1evq1n>_DmAHzXWBj^dRyAFo!!`Wry}Zt z9qvxktrM?0vyJ3%BAGIOP&^l6eyCrB+{Op$PI72KCE|0o!Wj2BhFv1c4MB?a2yFA0Wb>SP&w8 zh3c*TL7?i9jnEQ5o%R7usPCJNLRt6gG`8PMulZ1^;muP&ylk$&=fK3<}G(@lStVZ?H5v1WJy zF?^%mc<=7WJ;D37@18W5vd7k#R8Zc$<$WX7eqlxhOj*1wWW1plDbnj)b#~Z;U<;NE ziqWD^EizPhB{zvPb)aEI=^^4nw?}uKFU{YdIN(3@OVP3M@Ufw3uP;^O>tyP@pZ3zq z8DNX`gR_~_;++)sLuOO*Y!Pm1Bwf*7vR%)ER@HkZo=3fS8S$O<0yo^@@U~{0#FqM{q?PdMG9)35xF4C7(nn$3_-@!<>+|t zmt{<7{Imz|_Xh(FZwD3JRMfRy1Jq(y^prCHl^9zzo>91e+cswM+Ze{rD(vNhq1U4S7>0iC+vGKPq37?tkjVZlC+k;( z4#ff%$rt?WwVGh($Aiy?ycje;*f2;gJ$tpGHYpv)TM<>v8t=8lBG4hhXedCUMvkK8 z-nkd65Ph{B7V^cflzKzPG)F1G$r`~g+t;Qn<1*FCF_rcDaii9=shD1O28Ip=H!nGc z+EF0Tu9LQ9H%=kU@FRjVg%gC@-miHRG;{Wew>84qcdROC!E5m3L(Q{=s!CHaCQ(F` z&DSixy4!&BLp}hdsY?-eyjbrLuS51;0!O+=3dGz;>-GyVDkq88?_fYNUS>~eq1S>w zI(|#=3dbBsUns=;jQ(2=)A>&h^Yt(W0>^@`Zfznj&1H=Ws?raxf%hi7bOA4Tu^Aol zBVnsWYWhLPuo~yru9%LTq;DA@kW`#0?P_ZMFW8&uiOl*@e}dPjmX1rgE#-$MJ;hYi zvCCq(a^AL&tS_RB;|x(b#n+hd>?!m09T$ngr5pBrV)m=HJqusBtqho%t)@zpAp9Oh zGM1w`=g?*$52G2@jOz?6h{~z-I(g|@BlR?0@C@R|Bo6g!l;xfADYU&z?JJG7H_qpR z5fcad#zkJ`i`hXXrIFw z^Y+T7#{SoN4GY!tm=ndgbHfefzmTTD`7iKaZn(Tc&g5T0u6a^vkl~Q6Oo=|X=0sFT zf1QWD%N^s^M_gekn-G9X)SgKkCVeY{qO z^jc)f9;uzS8Oj7@+G_uh@%fml010(cgq6XK2ahIvuUt%Zsb}xHdQs+37x_5mFUYE@ z4W9%6xc#Q!wr$a@#9l7)O9c&QXG$f`J8$|9kpYX=($2+uqwb#tEk;hhl$3e6 z`%G06u9z0wn%-A`Kp<;hk{Py=s-!iOqR7kJ#fNGHQV895_QkK?6+w?v`P%LOdZ+sr zB)CC;xqn*lK+b&GQ*<6e16_uh0kTO9u&yeC_H%_zfxJK?W8&UiMhFv8x8(Gw|2K zOD1JZOTT|6%%U>3NI)A=E%{aCMoKrKd}O&>*H&~+4!$T~+SBDFi^j})SaUMVXk%7R z!}uj@F^Tdi!jy8svYJC|C3epza^(91Sz$W*4ebp%Dop3T+55t&4Gq?smxBYspEOWb z>Uz%xn4-HniG5$v5`wx)Qo$9H8!PZ5+q(id|P%yZokfqjt{6QKyE9 z@nM~?_}u|kwL*imf%Zggc$4274x%C!iNNzGRWhWIUxA)$yHOf;CXbG8)u}hborn}n-Atpj7$ZJ`LmNV z8kOHB_jav5+Wcig6vT`hv0rcLVyd3X6ObM8;%6;O^#Scyr`Rq#PwSIzUBuO6pAW(E zIBsc#keGs6f{2GO%4swCS6Y|_IE{Y3mv^9x*(FcS+h~k<8z%P+-VuSsutkX zP5SQJhXq7jS{=?(iNtAfH1Xu@Msh+8e&5&6q-W)(t?n$Ojzx4NkyGzUSqr12#$0oi z6)JbHRkYKEYo(;PGi%5Oo?fQ`Cl5P20BQ<+DQ{y2Gt;_~1uFKUBaqutkmKO~2D3&d z7R-TQ;&QY(Ihykb-BP_5Hg|X*K%icVKmeaw3{dd?dO%3?x);-0D~|cTV^1o6u&{{~ zQ9-sQW=S&w{q(8(bv9CHFaxQIXZF$M%6Fm+9Q_+GFUo4WnRdFSae0?5EiJ8U3irs) zTRXv%v}PRP3PY8>(%%G2QdH}bS5>=TdAL6+SD^n)QnK_b6eQ?6x;~<>CUuz0B#;c_ zTDIbKi33X5LS-5|TQHKpvkw%~z9v)aU3TP)ZcAm4S3DfcXH($XZUL3_P=As6P1O1D zJdklSkZ43kI$!}(Hb*9|jA>8q)vfk(xo`ZwsE}9b4tawQKH;5ccIHb5n%uFqNqb~k z!Z-$pwFOw6d1gfG0P)PZu}Y&<#Qs43rq{5YKGce!J4%`G8b#Hu3ldnwk?6naES1b% zVif1WvBp1H`8u;k>p#dD&9veA{18@ukz*Vs!sisa1SGq>}C}vXHhcj;0Sl~@(ZL@L$JJyjTgct_$46$ z%SdofD?9HmVUc8JpDb>1`=5;`uQvuJ`$e{guaZ`2sEnG%Rb5|2O!Lx@z0UI1mgglm zp(J2!`GE{De)Mh1?($|{1?+}{K!@KsCl+LDME#neq9EPz#27_xBZkREx6dNOWJ$xrkm^4{$d6J?2N_pCheqnt-5DLtEsrAWd`N zP^x4e^dKyK8*PKWNW=h%$u1b|6?APIy3dKRE>`fc$KSrk^vNRauDnoBMj~7AE%FQy z=1*xL5y7>*zcSG9D&Xcjxc}C}eI#S*C<7E=CWDroBMnERXCsaH`2I3z9e%VH%}l*p zbM|@I8%xa%jzCtVl?OXp@SSCf+34+Ur+*GguHgf4q7(?ln-VWlsP**G9N-gt;N&e; zGElNh51jV+m$lHkP6x87>B7L{<`)FxrO2aG$T=mDmDbCuMuZ*C8gPB)3fAS}aODO% z!@KPpEUoADziv^p9Bt?I0zm)okcZ?Y3#?H^fycI;jO~n>+)uSabm>92T2c+o_rE|# z=zx>I>ULoC>*(`mkWCWcxG|R~IYvn7G*BGl-wSZ4&}Fb$3v^%tkY81FpV4;X&3yAv zO(A+iQ5KaKa(QQGq(!n}U!aVO?hOPc2W4WXp5nFl0PAocm6m}!r4r_QAtZ6j{C9al z6jDqq-EQc(*OX2TURoaFu)Skp@anVFUG64uyk9k`>~m2`KV6%9m0LMyJB?Eqf}n4U zwu@XeYBPLWTMmtjqW~u!v>f7pmDMqZNMoz|;*h}Nre&=&LL`u#1brBv&G`Zji~pv|eToc$9rb9u8T5GKSn2R0mYA;9_8V zTK^D+CWfpAh@VE$T_6cCPmf=KUme(76Z(#0@Hghr@k$f^hFH*JRsie<`Fa6GeOlKk zVHg1A1}ULiuarp8bMJw}zP`NVrRNox53=@H(2e6gj7rwF+omIJ^c>y z#uc^V_t(G62LQUvB4Kh=CD3^8bz(UD0!k0$5umoOJlD|R3tH|xxmKV!=Jp8;O)`wU z;En#*@#Or!I%`aLD$re_v!UO2T{< z80*dCNbxo&yt`z5G}rB|K`5dB#@%~|HMwo;;!#vYn$n991O$|((v%h(AR;0ny+lQN zQ;}YRNUs6{3PPlb2n3N{LkB5RrPolUCX^5$#5-}Fwf7R&IeVXb?(g^9=l;Qy@IA?w z`OPxs81Hz;JB^?ER>r3S^Kg)HxuBjvUUk9Q)?!2Tt}|+*ETB%|-CgdY;7hA1?fm?Q zUytW%jzb_zg5L$Y@#0C!W%+2Z18Gd-Bs5*SJ`^IR?*qXDjn_cT1|sM~7$IxJ4yi{l ze9AA*tBm4E@t$XWOQK|l)|8c6N2GSbB_M-&Q+X2Ht^G!t5{Y3UP%696{MT6Gt7gWyHvyB^a zqUOaq%=pRpl1!XSWCTd(fiY2f^FRxQ027Yq_V0K5uy1<92a0p1;RFUmD=hypx{Ux^ z68<9bWY0moDQq)tk%Vx(=#3qhq~CaX{xKO2Im`Vf2*=i3v^ z;CT#P=s2$8;b!_Nr;KGLB6t0oQSdnI0I>an`1pl|Xmqdbx4XKXl8p?;yb3J5FW*Hf z^9#9LgdARfe332x?2cZcmfAJ59Z za9#qpq<{4wFOB4v!*B0MCniN){X{$}u~Fch6Ha2C*Hg@N$(&;{Q}0F%w?9e0d^wI) zO$0~gHQy+ted+}hkK-b(v1m4ny+%~Q5&=&9N~L+}W|yJJ|c!+~a4obYwpu4>xc>AcNva zt5Q(4Ob$dH647AClUQ-X7hP-Z+7wpT^z3u^0l7>IHa|Il<~5k_820T#WcT*6jXf}r zHLZDvX0AZNtUXI2s}QG}Lhxo4d364Aq`6eH$>Xf)dn}&D1stDb&d43esN8p}>Dc=- z3Lnqr3@)SR4(!=}5QY=lpue_7{Ap$NGrjB;pZP9#gF=%-S$Z7f_PbquO!4*`{bQS7 zP_AD&^zRkxyU|iFd>)1!6Ui@G;^AE4Z3-gCsJ)X|f>9A6B;%LZ#mKroE%!tcAv=)X6iyejjK$%F|^Z zU>xQ=S@ztG#|4$iMaJS$HTi)*>Wf#-Vb!jvyo!yrqAhle#g~=@!9?wkI&B^}PTm)H zO1j@Xi{Vo-35eOnj&B9jLa*qYn1}YeiexivYSX!t5?@yI#9r-GYfit=8n{z%ao&sW z@x?=ZC`64YsLwp%U`M3t21Pi0;RFSu8L<8$*}&e%fsy0w>ri4;<&6)`-%*z>QdAw` z-xO;SPq?|J)wKi=P!S%lg_&8N8~1nfqjD+7`3W47}z(=!5o1%AlA9( z#|W$-A-bxn-TQsad5EaKv#YSkZ-X3eXYC$5LNAfEI-)NXlpUgRt95ZqD1YV9>UATHnrs^J3yyQ9aZAsbLYOIKHn8YiuB(b9KyA&K^A;%Uhe}5oL zQaE<9p2Ssp+`vM0BG_)r!pTFNUO9Z*?Bs=u!pp6Yg%=&TZ`rq1+uHQM!J6iLFP&~q zCe1jY^A@eek&LbP0@C|fQ*2wAx&|eA=9+4;5>uXxc~L4ILhE1pOuoh;@4undbVfTW zkz|lbM=IZ8m!F$Wcrdl!?4Dd*64rQlDQa4yt#5;_=?d`cYe^rek4O@f9>LSaYzfT(QKYQM$nW8 zql6TtM(%_dAXZO9u^-F9JdrnI2f`!ujlea~PT7-hliun4@&z`Hc;c&I3wrt^Fc`!w zXS*K|a%LzoP>Fap2MVCaSU-RxKY0Rni&t)Xh_99FC!|Ji>te@#(j(CT-@w`I0KQ^_1aBVU;BSz+Zhj>5xib1uD z#Lx$PNHq)pd`*RYHHr2U_I9MT^{vSKFw?}Dr&M`Omk$qn9eE6?+7lx@VDS2_>c#FS z!DSwybDghJ3~c&h>QBH#?|~vV*?5V zRq_wpLxPkBVv1c_AB|CgIr&TU%_tJ?vS zp(#BDzxVe?S5%pNv}Kg?JA%KJ8Wps>W5t*?QZwXfC*-!l1J~RtR^DUL6jG1;TVviA zFlzrgI^n;Lib2k&e{-yIg@UQ++QxA#6^qhjv4Eor567dN{2uwe)C45N7Ghmw@Y@j}+(Xu}@wyC)AF8yKc#NSySB$ zQgyK0peD;jlXrQ=(UnEdcG+4FD;hMfjah0r@tn{95%ZW${S0FLG;v|f%8QUaE*Q?B zKWG_uS8zek+2n?yH|1*`ZycR7bu?8fF2eirL#rsVyW;aZgM3+b0WaQ)&$)0gMtfjF z#gvMzZ1k3enQ#}~3{~sPGYOYiIVZXBe3@XDxlACpS@MxYn&2Ohpq%u3GaKq=q3xVm zBgvo86SCO$T`D~_61f6k6{&-udDagx_pl3rl@=wPMSjj8<}A}VZ%UbGi4xRg!B%sP z3B>cyI}x~hh+l7+3DF0)Z@-UK^_XwyNm=46 zaTRyX1}Szfw6Iq5sOh(Rv%I^Crdq?vC_nkhRMZLFAYCR{+&3=ypEd5;OF zNKW`@Q9A3t9M`9TC4Df3Z&|(9Y4tZ!eH>0hW(lDf`m;7;e zpEddBp`zy@s8(80(kZJzU68LT{#p6mX!6Goype6k??A{SFLSg>uu47hZ4Ev9Z+U^g z|3q(C@H;Eg*;1xK+fc+KirUe6{N2H8N0%L&J}!GOD)DEiN1opKxY|i=xmX~xGJsRV z+XbgKg5C3Gk#Vq~0*tU4LD0_Bg88_MT8u9p?7Nva{Qc8BpvDIi2+3z``e zY;m!f4dnB_cmB)CAXdX0)rUCW1$}+Bn{cB&?^a1;oQT{PbJW=}5}oLwt1)-JM>*%* z2(c-&vcQDl8K91rWM{9xJm3WdWEU>vn^dsR&w_Y7*#&sXN4tR>VotvlHoxy9{Kcak zg>SGDAeY*RsIkvRbjpJ5;gAKA_(qAyFWt9G-%f`ZS9}9<2Cv*GHh+dxa;fg5S(1{m z!sAkSUE4LiZlMi!=mF;-O!G2BvA0Qa_hVeCpB8KR+?69B`1|#ysuME_31}<;uwJ|A zRA~NjA0P<(b^*SwwigsUX9G?r-`?Vt3f!<;cY_`^oa-urTK9o>z0I3uAOM&fP zk?oT)u*jxf64*&qTCnZg(fxfKSUZw3?Q=j>Fa~Mr?}jHxR2ACOJp4ojKu)-p3*zy& zJ$v!^fAu#lFNF9a1Pc0|=fKvl^{Ig8=X{LllOSofx$6KgSQn7!$&3(l{-~IClI-{o z2+E3>2~fa;@;R%DDunP(&(t1u1^YPA=6}`|?|=Urw|>zoi~u})?s`y2_{?ti(qNw= zI{~|=j{%=(=}ZXyiNO9f^i*J+MCQlVQ6s8g*i6JHJ5u#-!DNM?B6_#=sY`E^OQkhj zI-z6`ePP1yB6nVfx<+u6%sFS>Nvj55$tb5W8^(6yJw3*d{arCxZVzI5SZ(_b4Z!Q( zx6Ff<;o6A+QKW?}%7~KUMKg0zLFmIUwcV08*D$d;bKZYc0{le~ISWSX>}_bQg_BE- z;I&AdKV!l!@^s!tc=pR?>!Q4u*7TE6Fme${40PB3A%O2qLhWv!X|P#`e-w+dXcz(I zSB~Q93ir+Tsy_bu_Y}rp;_NQ=sI!cR!(PcCqq@2$`#JO~1vJ#*+kW^z7Zr#&0)`|o zlEkwP|DdkG_|@{ydog|`tm&14dP=K!$$K%X8ma{kn^|1!jjE|$%->aHUFt18J6S1+ zXvzhU=YtX8KHqjMs5q3SN3rCv^`^(>s;c8&LgAD6F@a>SfBgOS4KN*X`Xq&5P;)Ui zwryX43i%@=0qXSr%t&1Q8-ZgQ_?;dRV?x3^oz$;|_U7BKRDtEnJw}UiFf9}6>4j}BFsx*ElK&VEvPPKcnEy6FZV?j} z2s<5*7duvsuBf~RJ9ATO*?gzV_63z%wNy_JyK%UzRIdcXv4yY+DZuB@#sisL zBY{fn7}4Ej%wk8reaxeNpbRlQ%d*n|WEhi^Gt$VPxxRUuOJDz0=fj6~m9)a<5xCkp z&;t9GzjVw6#FtaJc96|SuO}?zqGTrdiILEgduh;}9}wly(sN^tKMNgxKxm9Y7R{4` zW+ndd?Z0&K#g$(RxAxWyXeY0K)foO@E=cx2Lp7A1hc+NHiLDt38uiiP%9>-R9+a`iPg`fSbM;+=%aQuwYu6Er>2ru3y-(Sv zkJ+jkY+PujuX{Lg^X)KuWu`;Qno&IRDp+DA)BCO7NvANxlo`PVETjR%`hW*0D;mAD zxArGycm2Wg>NeSMl<3qRPyY_MU}6I9cQ997T5}b@~)Uz0=c4!y)N7rM`8uza6Usznh3(OP&n0>+J?Js}WR2m@gtU zXw>za?9_74b^0A6;icu+%fq!h1#_LXz4aQQ(&wK#xw&4S&d_2oIdjiZ3!bsqqfL=U zw8aYJW6kVgA>}eQ;vK2sWR@MKl4mJ2V&-X~zF@!Kr_Ek6%2w()g|HXL_l%aetjMta zJNoV4J&cN0VI|>z%BllDVG2vWODn$@=2xJ9K$w+?B5Dvs#~M&oWFG<%dGdd|fk9)PT96S{uec1QJ}tAkRFQD@cbZd0JxLMGs1)ngtA1Y(daJ!V)Taog z)zy0O*bNn460Mg%a>=d5tY;%gAh~?)!(X=*!TnpCv4K;)-4>G&dQm0?@%?M>zij}P zG)Ol${Xo^_M?eEoOaPNrTTJdYH!WzQYEp}ZB`+ucqhU!zMqlElk>L=PZC zsj>qC>OF_PQs&z;E85{kXp{wQ^t8gNz({D@nxxKbq*edIF%glt$687mZyHZf8B7L6 zzFIHSx6bZ-whHV`k?g1cu*s0$3}6`;lV5CP${&?>&3~=5`^*0Nr*Z$?{1yLZB2!Kf zEw<6E&9T_YzuBq(Y|`HAe)G52D(YVtF3GU!*pI~2M?W9|70|i8J^Ej`Il%2XSyX?c z6-^}zXe8#FUY_UVo=HFRHkAL?s2F&IcsYwUi0)`58zFbd@ko^8?QcSe9`pmF!|9{} ztW`z<`o7m}!=|%ji%Ht{#76rTG!f(U2E|N|dp`he&W`!M=vFJk5)Dz7* zjU2x7R>w*>^x&T9anwN|d>CKs;|^guc9)}GKj zg@+n2gupTN&EAtsj|E_TY!85XIm0u1NlKgN{(3;ezkHUzIiBIyhX4L(`;KP-cI4NV z|MqCVnvtKjYJbard%EokJ7C~wt<<(+M}OmJ06=;FvzNdF;dJ@I?KA_89LNC1SlzBi zd~h1e^C5gGwsj`&AaBpqY#4hT;3ezyukF=*H_W+^vTUN24KovUvEEKB`nSg2e)p#Z zjobOZeo*X3&+Xv}T7wtQ#5l^x~*eTYrlHf4G`Gv@A`#C zn1!&O8Wd5JO{(r7DkFA-L42SKHi#fc5{$14D%BP{>tow6y`?Q=Uj>SYFTSoW*09+Y z>uBj^J`orytDwLlGcqC)p4n~x{pP^l9sp$DjBeTGy!Uoyu62 zD}&7_YGkU#$*+!~qvUM&PM`T#=56*5(Jz2f!$cX=o? z1|AAVueTV}kf(SH!Wzepi&xkycMD}NITX*t8g}9fW?p#M9B)XozWpeMQDNMPhad9v za*ie{TAHA9Ro(VN+3I(C5j}@A-o(?gFQ#hnI-R51(u59h*{dnwi z)m*s1eGQ(tg$>a`_Nq9g0Ip8k0-3oDauw|aZN&;_;8f6-_*eYIr zM|)$RZh}q`G~cOqNR5@2ss(j379``ZDM}#*ip*~7ua^0yz_;M0^lyDvL&`Rf7Y|=X zNn!YxPGdK<%k#0>F?sg(nd!mn6`We(%H@)uMjJD(>J6&o@Hd4SDAw^53rR*Fx)9ar z@0fjLC#UtNbJ*^YT{N`_!P7;Brg18P zi@nz#n?&AHnx!3ywiC*r2K1(1!&&Wpa7Dv@j^(ol=x|!itv8yalNGG}K%C>Bh{~VH z%HHeW_~erXYCti86<7qO%ss^fhyOa}+k?>&d)pp>(QAM1dfRP4*dujs+p~)o{n}{j znA2RW9tJ`ARl4nlBW8*a18RLRe5eP7j(TK*1aFq>n*@ppoPF9|TN{1tvQ8JYYE6(p zcDvA@VF?IHzU(0fjWGPdN)R|Wp}^CIAb~6lK)>z_uI%!=&eb9~IWyNTWD+mAiv8!% z;eH?aHxvOxBy|Wj&z!XjX~c^^(V71og9Odm4`}T7=;y+*CiCbstT2qI(l*E6;DUcS zVB|mWLUIY57)iM?2zU_mP5^W^%JZ)Q`^G|?-*b#iHunKkzmUeY57%W&o*t*V#4>t* zATO*x8ybjQy)CN^dLtgaOSh4if@tDwBo!+GT1n7CsB(AmTaE%m!LNY6 z3;RD}e-|LCGrSOPiN-`acSMN zc>78CIa>(x{R10}jI9JjBUv4%FpkEjl%^yd6&8b%P`z4LYvM860B7o=e?#Rw#KmRv z@UVL~j=lyTXSXB@+;7hC2`E8FZ)r5+eQKf6Y3$+kw)cmQg-a&nls_CC6zHaZ{T2I2 z_u%L9*AS>0LBC;8G?ZP}kZp6xU#Z8W%MSevwdLA)V9ul#?LhsOle`xc5>;-wI5B-dTKS6ch8i=JO;K<&vWGrpLQ}h| zAjaV#+kDXzf-Nv=OV?N*lz0oAngD2eH8FXg=Z}h-7Uo7O#qr+@bpLWdvCfh}SUdlHs}IE;_-_+Q`99RV=Oa8R?`%fWJDOjYR8D6p_xli zdEY-L#d*@rjpN!iY(U�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 diff --git a/docs/ODUArch.jpg b/docs/ODUArch.jpg index 1b9b7723ed886cfb51f9f278ed73fcc69c07866f..39a06a11fa17d14820c88513376d7967058d72b7 100644 GIT binary patch literal 90425 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 literal 56637 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 diff --git a/docs/README b/docs/README index d527a5e37..cc9d63803 100644 --- a/docs/README +++ b/docs/README @@ -3,8 +3,9 @@ A. Directory Structure : 1. l2/build/ : contains files required to compile the code a. common : contains individual module's makefile b. odu : contains main makefile to generate an executable binary - c. scripts: contains scripts for logging - d. o1 : contains main makefile to generate an executable binary + c. scripts: contains scripts for logging, installing netconf libraries and starting netopeer server + d. config : contains the configuration files + e. yang : contains the YANG modules 2. l2/docs/ : contains README and other configuration files for building docs @@ -32,12 +33,11 @@ B. Pre-requisite for Compilation : b. On CentOS : sudo yum install -y libpcap-devel -C. Pre-requisite for running O1 module: ---------------------------------------- -Install netconf server ----------------------- +C. Pre-requisite for O1 Interface (Required only if run with O1 interface enabled) +----------------------------------------------------------------------------------- +1. Setup netconf server -1. Create new netconf user (login with root user and run following command) + Create new netconf user (login with root user and run following commands) $adduser --system netconf && \ echo "netconf:netconf" | chpasswd @@ -45,16 +45,28 @@ Install netconf server 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 -2. Install netconf packages. - $cd l2/build/o1/ + Install netconf packages. + $cd l2/build/scripts $chmod +x install_lib.sh - $ ./install_lib.sh + $ ./install_lib.sh -c -Install the yang module ------------------------ -1. cd l2/build/o1/yang - sysrepoctl -i o-ran-sc-odu-alarm-v1.yang - sysrepoctl -i o-ran-sc-odu-interface-v1.yang +2. Start Netopeer2-server: + $cd l2/build/scripts + $./netopeer-server.sh start + +3. Install the yang modules + $cd l2/build/yang + $sysrepoctl -i o-ran-sc-odu-alarm-v1.yang + $sysrepoctl -i o-ran-sc-odu-interface-v1.yang + +4. Configure the startup IP and Port configurations for DU, CU and RIC + + $cd l2/build/config + + Open the startup_config.xml and edit the desired IP and Port for CU, DU and RIC. + Then load the configuration in the sysrepo running datastore using the command below + + $sysrepocfg --import=startup_config.xml --datastore running --module o-ran-sc-odu-interface-v1 D. How to Clean and Build: @@ -86,57 +98,69 @@ D. How to Clean and Build: 4. Cleaning ODU, CU Stub and RIC Stub: make clean_all -5. Building ODU binary with O1 interface enabled: + +E. How to Clean and Build with O1 interface enabled (Requires pre-requisite steps in section C) +------------------------------------------------------------------------------------------------ + +1. Building ODU binary: a. Build folder cd l2/build/odu - b. Building ODU with O1 module enabled: + b. Building ODU binary make odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES c. Cleaning ODU binary - make clean_odu MACHINE=BIT64 MODE=FDD + make clean_odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES - d. Build folder - cd l2/build/o1 - e. Building O1 binary - make o1 MACHINE=BIT64 - f. Cleaning O1 binary - make clean_o1 +2. Building CU Stub binary: + a. Build folder + cd l2/build/odu + b. Building CU Stub binary + make cu_stub NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES + c. Cleaning CU Stub binary + make clean_cu NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES + +3. Building RIC Stub binary: + a. Build folder + cd l2/build/odu + b. Building RIC Stub binary + make ric_stub NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES + c. Cleaning RIC Stub binary + make clean_ric NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES + +4. Cleaning ODU, CU Stub and RIC Stub: + make clean_all -E. How to execute: +F. How to execute: ------------------ 1. Assign virtual IP addresses as follows: a. ifconfig :ODU "192.168.130.81" b. ifconfig :CU_STUB "192.168.130.82" c. ifconfig :RIC_STUB "192.168.130.80" -2. Execute O1 (only if O-DU is built with O1 interface enabled): - a. O1 execution folder: - cd l2/build/o1/bin/o1 - b. Run O1 binary: - ./o1 +PS: If O1 interface is enabled, IP should match those configured in step C.4. -3. Execute CU Stub: +2. Execute CU Stub: a. CU execution folder: cd l2/bin/cu_stub b. Run CU Stub binary: ./cu_stub -4. Execute RIC Stub: +3. Execute RIC Stub: a. RIC execution folder: cd l2/bin/ric_stub b. Run RIC Stub binary: ./ric_stub -5. Execute DU: +4. Execute DU: a. DU execution folder: cd l2/bin/odu b. Run ODU binary: ./odu PS: CU stub and RIC stub must be run (in no particular sequence) before ODU - If O1 module is enabled it must be run before ODU -F. How to test with Intel L1: + +G. How to test with Intel L1: ----------------------------- I. Compilation @@ -201,7 +225,7 @@ II. Execution ./odu -G. How to execute the Health Check : get alarm-list +H. How to execute the Health Check : get alarm-list ---------------------------------------------------- Steps: @@ -217,7 +241,7 @@ G. How to execute the Health Check : get alarm-list Here are the steps as executed in the terminal - netopeer2-cli + $netopeer2-cli > connect --login netconf Interactive SSH Authentication Type your password: diff --git a/docs/developer-guide.rst b/docs/developer-guide.rst index 6ef573812..18e68a08b 100644 --- a/docs/developer-guide.rst +++ b/docs/developer-guide.rst @@ -763,7 +763,9 @@ O1 uses GNU C++ language. ODU - O1 Communication ^^^^^^^^^^^^^^^^^^^^^^ -O-DU High and O1 module communicate on a TCP socket. +O1 module runs as a thread in O-DU High. + +Alarm communication between the threads happen on a Unix socket. O-DU High sends alarm messages in the following structure using Alarm Interface APIs. diff --git a/docs/installation-guide.rst b/docs/installation-guide.rst index ab169b029..7de60d3c2 100644 --- a/docs/installation-guide.rst +++ b/docs/installation-guide.rst @@ -97,27 +97,72 @@ Following libraries are required to compile and execute O-DU High: - Ubuntu : sudo apt-get install -y libpcap-dev - CentOS : sudo yum install -y libpcap-devel -Following libraries are required to compile and execute O1 module: + + +Cloning code +-------------- + +- Create a folder to clone the O-DU High code into. The folder is hereafter referred to as . + +- Clone code into + + git clone "https://gerrit.o-ran-sc.org/r/o-du/l2" + + +Setting up Netconf server +------------------------- -- Netconf: + Following steps are required to compile ODU with O1 interface enabled: + +- Install Netconf libraries: + libssh, libyang, libnetconf2, sysrepo, netopeer2 Script is provided in the following folder to install these libraries - Ubuntu : - | cd /l2/build/o1 - | sudo ./install_lib.sh + | cd /l2/build/scripts + | sudo ./install_lib.sh -c +- Start Netopeer2-server: + + - Ubuntu : + | cd /l2/build/scripts + | sudo ./netopeer-server.sh start -Cloning code --------------- +- Create a new netconf user + + Switch to root user and run following commands + + - Ubuntu : + + | adduser --system netconf && \\ + | echo "netconf:netconf" | chpasswd -- Create a folder to clone the O-DU High code into. The folder is hereafter referred to as . + | 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 -- Clone code into +- Install the YANG modules - git clone "https://gerrit.o-ran-sc.org/r/o-du/l2" + - Ubuntu : + + | cd /l2/build/yang + | sysrepoctl -i ./yang/o-ran-sc-odu-alarm-v1.yang + | sysrepoctl -i ./yang/o-ran-sc-odu-interface-v1.yang + +- Configure the startup IP and Port configurations for DU, CU and RIC + + - Ubuntu : + + | cd /l2/build/config + | + | Open the startup_config.xml and edit the desired IP and Port for CU, DU and RIC. + | Then load the configuration in the sysrepo running datastore using the command below + | + | sysrepocfg --import=startup_config.xml --datastore running --module o-ran-sc-odu-interface-v1 Compilation ------------ @@ -133,13 +178,10 @@ Compilation make clean_odu MACHINE=BIT64 MODE=FDD - - Build O-DU High binary + - Compile O-DU High binary make odu MACHINE=BIT64 MODE=FDD - To build with O1 interface enabled: - - make odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES - Build CU Stub : @@ -151,7 +193,7 @@ Compilation make clean_cu NODE=TEST_STUB MACHINE=BIT64 MODE=FDD - - Build CU Stub binary + - Compile CU Stub binary make cu_stub NODE=TEST_STUB MACHINE=BIT64 MODE=FDD @@ -165,35 +207,57 @@ Compilation make clean_ric NODE=TEST_STUB MACHINE=BIT64 MODE=FDD - - Build RIC Stub binary + - Compile RIC Stub binary make ric_stub NODE=TEST_STUB MACHINE=BIT64 MODE=FDD -- Build O-DU High with O1 interface enabled: - - Navigate to o1 Build folder +Compilation with O1 interface enabled +-------------------------------------- + +- Build O-DU High: + + - Navigate to Build folder + + cd /l2/build/odu + + - Clean O-DU High binary + + make clean_odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES + + + - Compile O-DU High binary + + make odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES + + +- Build CU Stub : + + - Navigate to Build folder - cd /l2/build/o1 + cd /l2/build/odu - - Clean O1 binary + - Clean CU Stub binary - make clean_o1 MACHINE=BIT64 + make clean_cu NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES - - Build O1 binary + - Compile CU Stub binary - make o1 MACHINE=BIT64 + make cu_stub NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES - - Navigate to odu Build folder +- Build RIC Stub : + - Navigate to Build folder + cd /l2/build/odu - - Clean O-DU High binary + - Clean RIC Stub binary + + make clean_ric NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES - make clean_odu MACHINE=BIT64 MODE=FDD - - - Build O-DU High binary + - Compile RIC Stub binary - make odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES + make ric_stub NODE=TEST_STUB MACHINE=BIT64 MODE=FDD O1_ENABLE=YES @@ -205,4 +269,3 @@ The above generated images can be found at: - RIC Stub - /l2/bin/ric_stub -- O1 - /l2/build/o1/bin/o1 diff --git a/docs/overview.rst b/docs/overview.rst index 61f8ff8c3..371aab8a1 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -102,22 +102,22 @@ O1 Module ^^^^^^^^^^ .. figure:: ODU-O1-Arch.jpg - :width: 600 + :width: 554 :alt: Figure 2 O1 Architecture Figure 2 - O1 Architecture -As shown in figure 2 the O1 module in O-DU High runs a separate process and communicates with ODU-High process over a TCP interface. O1 module uses API calls for interacting with the Netconf server(Netopeer) and datastore(sysrepo) for providing the Netconf interface. +As shown in figure 2 the O1 module runs as a thread in O-DU High. Alarm communication happens over a Unix socket between the O1 and O-DU threads. O1 module uses API calls for interacting with the Netconf server(Netopeer) and datastore(sysrepo) for providing the Netconf interface. O1 architecture has following components: -- Netconf Manager: Subscribe to Netconf YANG modules and events. Register callback handler methods. +- Session Handler: Subscribe to Netconf YANG modules and events. Register callback handler methods. - Alarm Manager: Stores and manages(add/updated/delete) alarms. -- TCP server: Receives the alarm messages sent from O-DU High over TCP socket. +- Unix socket server: Receives the alarm messages sent from O-DU High thread over Unix socket. -- TCP Client Alarm Interface : Integrates with O-DU High module and provides an interface for sending the alarm messages to O1 module over TCP socket. +- Alarm Interface : Provides an interface to O-DU High threads for sending the alarm messages to O1 module over Unix socket. - Netopeer server: Serves the northbound SMO/OAM Netconf requests. @@ -319,11 +319,11 @@ Figure 5 below depicts the above call flow, inclusive of all interfaces: O1 Netconf get-alarm list procedure ----------------------------------- -This section describes the *Health Status Retrieval* scenario of O-DU High health-check. It enables a northbound client(SMO) to retrieve the health of the ODU-High based on the last self-check performed. The alarm-list is provided as the response to the request via O1 Netconf interface. +This section describes the *Health Status Retrieval* scenario of O-DU High health-check. It enables a northbound client(SMO) to retrieve the health of the O-DU High based on the last self-check performed. The alarm-list is provided as the response to the request via O1 Netconf interface. .. figure:: ODU-O1-GetAlarmListFlow.jpg - :width: 720 + :width: 869 :alt: Figure 6 O1 get alarm-list flow Figure 6 - O1 get alarm-list flow @@ -331,13 +331,13 @@ This section describes the *Health Status Retrieval* scenario of O-DU High healt As seen in the Figure 6, -- On the cell state change from de-active to activate, ODU High process raises a cell up alarm message and sends it over the TCP socket using the TCP client Alarm Interface API. +- On the cell state change from de-active to activate, DU APP module raises a cell up alarm message and sends it over the Unix socket using the Alarm Interface API. -- On other side a TCP server, running as a thread, in O1 module receives the cell up alarm message and it passes the alarm information to the Alarm Manager. +- On other side a Unix socket server, running as a thread, in O1 module receives the cell up alarm message and it passes on the alarm information to the Alarm Manager. - Alarm Manager stores the alarm data in a list. -- Whenever SMO/OAM requires the current alarm list, it sends a Netconf get request. The request is received by the Netopeer Server and a callback method, registered with the Netconf Manager, is invoked. +- Whenever SMO/OAM requires the current alarm list, it sends a Netconf get request. The request is received by the Netopeer Server and a callback method, registered with the Session Handler, is invoked. - The callback function fetches the alarm list from Alarm Manager and sends it back to the client (SMO/OAM) via Netconf interface. diff --git a/docs/user-guide.rst b/docs/user-guide.rst index 04f463d57..d8ca936d1 100644 --- a/docs/user-guide.rst +++ b/docs/user-guide.rst @@ -24,36 +24,10 @@ I. Execution - On locally compiling O-DU High Source Code b. ifconfig :CU_STUB "192.168.130.82" c. ifconfig :RIC_STUB "192.168.130.80" -2. Execute O1 (only if O-DU is built with O1 interface enabled): +PS: If O1 interface is enabled, IPs should match those configured in "startup_config.xml" + ( Refer Installation Guide - "Setting up Netconf server" ) - a. Navigate to O1 build folder - - - cd /l2/build/o1 - - b. Create a new netconf user and install the YANG module - - Switch to root user and run following commands - - | adduser --system netconf && \\ - | echo "netconf:netconf" | chpasswd - - | 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 - - sysrepoctl -i ./yang/o-ran-sc-odu-alarm-v1.yang - sysrepoctl -i ./yang/o-ran-sc-odu-interface-v1.yang - - c. Navigate to O1 execution folder - - - cd /l2/build/o1/bin/o1 - - d. Run O1 binary - - - ./o1 - -3. Execute CU Stub: +2. Execute CU Stub: a. Navigate to CU execution folder @@ -63,7 +37,7 @@ I. Execution - On locally compiling O-DU High Source Code - ./cu_stub -4. Execute RIC Stub: +3. Execute RIC Stub: a. Navigate to RIC execution folder @@ -73,7 +47,7 @@ I. Execution - On locally compiling O-DU High Source Code - ./ric_stub -5. Execute O-DU High: +4. Execute O-DU High: a. Navigate to ODU execution folder @@ -83,7 +57,7 @@ I. Execution - On locally compiling O-DU High Source Code - ./odu -PS: CU stub and RIC stub must be run (in no particular sequence) before ODU. If O-DU High is built with O1 interface enabled, the O1 binary must be run before all other binaries. +PS: CU stub and RIC stub must be run (in no particular sequence) before ODU. II. Execution - Using Docker Images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/cu_stub/cu_stub.c b/src/cu_stub/cu_stub.c index ebaade2fa..6c5980047 100644 --- a/src/cu_stub/cu_stub.c +++ b/src/cu_stub/cu_stub.c @@ -24,9 +24,7 @@ #include "du_log.h" #ifdef O1_ENABLE - -#include "Config.h" - +#include "ConfigInterface.h" #endif #define CU_ID 1 @@ -167,13 +165,13 @@ void readCuCfg() DU_LOG("\nDEBUG --> CU_STUB : Reading CU configurations"); #ifdef O1_ENABLE - if( getStartupConfig(&g_cfg) != ROK ) + if( getStartupConfigForStub(&g_cfg) != ROK ) { - RETVALUE(RFAILED); + DU_LOG("\nError --> CU_STUB : Could not fetch startup "\ + "configurations from Netconf interface\n"); + exit(1); } - DU_LOG("\nReading CU configurations---"); - DU_LOG("\nReading CU configurations g_cfg.DU_IPV4_Addr=%s", g_cfg.DU_IPV4_Addr); - DU_LOG("\nReading CU configurations g_cfg.CU_IPV4_Addr=%s", g_cfg.CU_IPV4_Addr); + cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du); cmInetAddr((S8*)g_cfg.CU_IPV4_Addr, &ipv4_cu); diff --git a/src/du_app/du_cell_mgr.c b/src/du_app/du_cell_mgr.c index 02a47f042..a06b642a5 100644 --- a/src/du_app/du_cell_mgr.c +++ b/src/du_app/du_cell_mgr.c @@ -30,9 +30,9 @@ #include "du_mgr.h" #include "du_utils.h" #include "du_cell_mgr.h" + #ifdef O1_ENABLE -#include "GlobalDefs.h" #include "AlarmInterface.h" #endif diff --git a/src/du_app/du_cfg.c b/src/du_app/du_cfg.c index e94e1f0e0..f59d77919 100644 --- a/src/du_app/du_cfg.c +++ b/src/du_app/du_cfg.c @@ -53,10 +53,8 @@ #include "BWP-UplinkCommon.h" #ifdef O1_ENABLE - -#include "Config.h" +#include "ConfigInterface.h" extern StartupConfig g_cfg; - #endif DuCfgParams duCfgParam; diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index a6205a53b..00b1dae59 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -103,10 +103,8 @@ #include "GTPTunnel.h" #ifdef O1_ENABLE - -#include "Config.h" +#include "ConfigInterface.h" extern StartupConfig g_cfg; - #endif DuCfgParams duCfgParam; diff --git a/src/du_app/du_mgr_main.c b/src/du_app/du_mgr_main.c index 13ef27237..712465d7b 100644 --- a/src/du_app/du_mgr_main.c +++ b/src/du_app/du_mgr_main.c @@ -30,6 +30,12 @@ #include "du_sctp.h" #include "du_egtp.h" +#ifdef O1_ENABLE + +#include "O1Interface.h" + +#endif + uint8_t rlcUlActvTsk (Pst *, Buffer *); uint8_t rlcUlActvInit (Ent, Inst, Region, Reason); uint8_t rlcDlActvTsk (Pst *, Buffer *); @@ -433,6 +439,11 @@ uint8_t tst(void) { init_log(); +#ifdef O1_ENABLE + if(start_O1_module() != ROK) + return RFAILED; +#endif + //Initialize TAPA layers if(duInit() != ROK) { diff --git a/src/du_app/du_msg_hdl.c b/src/du_app/du_msg_hdl.c index af63f7cf0..5a09fe3fa 100644 --- a/src/du_app/du_msg_hdl.c +++ b/src/du_app/du_msg_hdl.c @@ -42,7 +42,6 @@ #ifdef O1_ENABLE -#include "GlobalDefs.h" #include "AlarmInterface.h" #endif diff --git a/src/o1/Alarm.hpp b/src/o1/Alarm.hpp index ced49d0b1..c4d84132c 100644 --- a/src/o1/Alarm.hpp +++ b/src/o1/Alarm.hpp @@ -23,7 +23,7 @@ #include #include -#include "Alarm.h" +#include "AlarmMessages.h" using std::string; diff --git a/src/o1/o1_client/AlarmInterface.c b/src/o1/AlarmInterface.cpp similarity index 79% rename from src/o1/o1_client/AlarmInterface.c rename to src/o1/AlarmInterface.cpp index dcb9447d2..4f265d56e 100644 --- a/src/o1/o1_client/AlarmInterface.c +++ b/src/o1/AlarmInterface.cpp @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,11 +16,13 @@ ################################################################################ *******************************************************************************/ -/* This file contains interfaces to raise and clear alarms */ +/* This file contains C interfaces for ODU to raise and clear alarms */ +#include +#include +#include "GlobalDefs.hpp" #include "AlarmInterface.h" -#include "TcpClient.h" - +#include "UnixSocketClient.hpp" /******************************************************************* * @@ -32,27 +34,29 @@ * * Functionality: * - Raise an alarm by sending alarm info to O1 module over - * TCP socket with action set to RAISE + * Unix socket with action set to RAISE * * @params[in] alarm information - * @return ROK - success - * RFAILED - failure + * @return O1::SUCCESS - success + * O1::FAILURE - failure ******************************************************************/ uint8_t raiseAlarm(AlarmRecord* alrm) { - if (openSocket(TCP_SERVER_IP,TCP_PORT) == RFAILED) + + UnixSocketClient uxClient(O1::ALARM_SOCK_PATH); + if (uxClient.openSocket() == O1::FAILURE) { - return RFAILED; + return O1::FAILURE; } alrm->msgHeader.msgType = ALARM; alrm->msgHeader.action = RAISE_ALARM; - if (sendData(alrm,sizeof(AlarmRecord)) < 0 ) + if (uxClient.sendData(alrm,sizeof(AlarmRecord)) < 0 ) { - closeSocket(); - return RFAILED; + uxClient.closeSocket(); + return O1::FAILURE; } - closeSocket(); - return ROK; + uxClient.closeSocket(); + return O1::SUCCESS; } /******************************************************************* @@ -65,28 +69,29 @@ uint8_t raiseAlarm(AlarmRecord* alrm) * * Functionality: * - Clears an alarm raised earlier by sending the alrm - * information to O1 module over TCP socket with action + * information to O1 module over Unix socket with action * set to CLEAR * * @params[in] alarm information - * @return ROK - success - * RFAILED - failure + * @return O1::SUCCESS - success + * O1::FAILURE - failure ******************************************************************/ uint8_t clearAlarm(AlarmRecord* alrm) { - if (openSocket(TCP_SERVER_IP,TCP_PORT) == RFAILED) + UnixSocketClient uxClient(O1::ALARM_SOCK_PATH); + if (uxClient.openSocket() == O1::FAILURE) { - return RFAILED; + return O1::FAILURE; } alrm->msgHeader.msgType = ALARM; alrm->msgHeader.action = CLEAR_ALARM; - if (sendData(alrm,sizeof(AlarmRecord)) < 0) + if (uxClient.sendData(alrm,sizeof(AlarmRecord)) < 0) { - closeSocket(); - return RFAILED; + uxClient.closeSocket(); + return O1::FAILURE; } - closeSocket(); - return ROK; + uxClient.closeSocket(); + return O1::SUCCESS; } @@ -103,8 +108,8 @@ uint8_t clearAlarm(AlarmRecord* alrm) * the alarm * * @params[in] alarm Id, cell Id - * @return ROK - success - * RFAILED - failure + * @return O1::SUCCESS - success + * O1::FAILURE - failure ******************************************************************/ uint8_t raiseCellAlrm(uint16_t alrmId, uint16_t cellId) { @@ -153,8 +158,8 @@ uint8_t raiseCellAlrm(uint16_t alrmId, uint16_t cellId) * - Clears the cell specific alarm using alarm id * * @params[in] alarm Id - * @return ROK - success - * RFAILED - failure + * @return O1::SUCCESS - success + * O1::FAILURE - failure ******************************************************************/ uint8_t clearCellAlrm(uint16_t alrmId) { diff --git a/src/o1/o1_client/AlarmInterface.h b/src/o1/AlarmInterface.h similarity index 85% rename from src/o1/o1_client/AlarmInterface.h rename to src/o1/AlarmInterface.h index 4dabd43ee..53839ddfb 100644 --- a/src/o1/o1_client/AlarmInterface.h +++ b/src/o1/AlarmInterface.h @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,23 +16,32 @@ ################################################################################ *******************************************************************************/ -/* This file contains interfaces to raise and clear alarms */ +/* This file contains C interfaces for ODU to raise and clear alarms */ #ifndef __ALARM_INTERFACE_H__ #define __ALARM_INTERFACE_H__ #include -#include "Alarm.h" -#include "ssi.h" -#include "GlobalDefs.h" +#include "AlarmMessages.h" +#define CELL_UP_ALARM_ID 1009 +#define CELL_DOWN_ALARM_ID 1010 #define BUFF_SIZE 20 +#ifdef __cplusplus +extern "C" +{ +#endif + uint8_t raiseAlarm(AlarmRecord* alrm); uint8_t clearAlarm(AlarmRecord* alrm); uint8_t raiseCellAlrm(uint16_t alrmId, uint16_t cellId); uint8_t clearCellAlrm(uint16_t alrmId); +#ifdef __cplusplus +} +#endif + #endif /********************************************************************** diff --git a/src/o1/o1_client/Alarm.h b/src/o1/AlarmMessages.h similarity index 95% rename from src/o1/o1_client/Alarm.h rename to src/o1/AlarmMessages.h index f88ed2eb2..5a7ab732b 100644 --- a/src/o1/o1_client/Alarm.h +++ b/src/o1/AlarmMessages.h @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -18,8 +18,8 @@ /* This file contains definitions of Alarm structure */ -#ifndef __ALARM_H__ -#define __ALARM_H__ +#ifndef __ALARM_MESSAGES_H__ +#define __ALARM_MESSAGES_H__ #include #include "CommonMessages.h" diff --git a/src/o1/o1_client/CommonMessages.h b/src/o1/CommonMessages.h similarity index 96% rename from src/o1/o1_client/CommonMessages.h rename to src/o1/CommonMessages.h index 35ab96539..c51b44759 100644 --- a/src/o1/o1_client/CommonMessages.h +++ b/src/o1/CommonMessages.h @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # diff --git a/src/o1/ConfigInterface.cpp b/src/o1/ConfigInterface.cpp new file mode 100644 index 000000000..0a283ae51 --- /dev/null +++ b/src/o1/ConfigInterface.cpp @@ -0,0 +1,151 @@ +/******************************************************************************* +################################################################################ +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # +# # +# 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. # +################################################################################ +*******************************************************************************/ + +/* This file contains C interface for ODU and stubs to get startup + configuration +*/ + +#include "ConfigInterface.h" +#include "GlobalDefs.hpp" +#include "UnixSocketClient.hpp" +#include "SessionHandler.hpp" +#include "InitConfig.hpp" + +StartupConfig g_cfg; + +/******************************************************************* + * + * @brief Get the startup config from Netconf + * + * @details + * + * Function : getStartupConfig + * + * Functionality: + * - Get the start up IP and port for DU + * + * @params[in] pointer to StartupConfig + * @return O1::SUCCESS - success + * O1::FAILURE - failure + ******************************************************************/ +uint8_t getStartupConfig(StartupConfig *cfg) +{ + if ( InitConfig::instance().getCurrInterfaceConfig(*cfg) ) + { + O1_LOG("\nO1 StartupConfig : " + "cfg.DU_IPV4_Addr [%s]", + cfg->DU_IPV4_Addr); + O1_LOG("\nO1 StartupConfig : " + "cfg.DU_Port [%d]", + cfg->DU_Port); + O1_LOG("\nO1 StartupConfig : " + "cfg.CU_IPV4_Addr [%s]", + cfg->CU_IPV4_Addr); + O1_LOG("\nO1 StartupConfig : " + "cfg.CU_Port [%d]", + cfg->CU_Port); + O1_LOG("\nO1 StartupConfig : " + "cfg.RIC_IPV4_Addr [%s]", + cfg->RIC_IPV4_Addr); + O1_LOG("\nO1 StartupConfig : " + "cfg.RIC_Port [%d]", + cfg->RIC_Port); + return O1::SUCCESS; + } + return O1::FAILURE; +} + +/******************************************************************* + * + * @brief Get the startup config from Netconf + * + * @details + * + * Function : getStartupConfig + * + * Functionality: + * - Get the start up IP and port for CU and RIC + * + * @params[in] pointer to StartupConfig + * @return O1::SUCCESS - success + * O1::FAILURE - failure + ******************************************************************/ +uint8_t getStartupConfigForStub(StartupConfig *cfg) +{ +#if 0 + UnixSocketClient uxClient(O1::ALARM_SOCK_PATH); + O1_LOG("\nO1 CONFIG : getStartupConfig ------ \n"); + MsgHeader msg; + msg.msgType = CONFIGURATION; + msg.action = GET_STARTUP_CONFIG; + if (uxClient.openSocket() == O1::FAILURE) + { + return O1::FAILURE; + } + if (uxClient.sendData(&msg,sizeof(msg)) < 0 ) + { + uxClient.closeSocket(); + return O1::FAILURE; + } + if (uxClient.receiveData(cfg, sizeof(StartupConfig)) < 0) + { + uxClient.closeSocket(); + return O1::FAILURE; + } + O1_LOG("\nO1 CONFIG : ip du %s\n",cfg->DU_IPV4_Addr ); + O1_LOG("\nO1 CONFIG : ip cu %s\n",cfg->CU_IPV4_Addr ); + O1_LOG("\nO1 CONFIG : ip ric %s\n",cfg->RIC_IPV4_Addr ); + O1_LOG("\nO1 CONFIG : port cu %hu\n",cfg->CU_Port); + O1_LOG("\nO1 CONFIG : port du %hu\n",cfg->DU_Port); + O1_LOG("\nO1 CONFIG : port ric %hu\n",cfg->RIC_Port); + + uxClient.closeSocket(); +#endif + SessionHandler sessHdlr; + if ( sessHdlr.init() ) + { + if ( InitConfig::instance().getCurrInterfaceConfig(*cfg) ) + { + O1_LOG("\nO1 StartupConfig : " + "cfg.DU_IPV4_Addr [%s]", + cfg->DU_IPV4_Addr); + O1_LOG("\nO1 StartupConfig : " + "cfg.DU_Port [%d]", + cfg->DU_Port); + O1_LOG("\nO1 StartupConfig : " + "cfg.CU_IPV4_Addr [%s]", + cfg->CU_IPV4_Addr); + O1_LOG("\nO1 StartupConfig : " + "cfg.CU_Port [%d]", + cfg->CU_Port); + O1_LOG("\nO1 StartupConfig : " + "cfg.RIC_IPV4_Addr [%s]", + cfg->RIC_IPV4_Addr); + O1_LOG("\nO1 StartupConfig : " + "cfg.RIC_Port [%d]", + cfg->RIC_Port); + return O1::SUCCESS; + } + } + return O1::FAILURE; +} + + +/********************************************************************** + End of file +**********************************************************************/ diff --git a/src/o1/o1_client/Config.h b/src/o1/ConfigInterface.h similarity index 85% rename from src/o1/o1_client/Config.h rename to src/o1/ConfigInterface.h index fb7250ca4..0f4929e5c 100644 --- a/src/o1/o1_client/Config.h +++ b/src/o1/ConfigInterface.h @@ -16,10 +16,12 @@ ################################################################################ *******************************************************************************/ -/* This file contains definitions of startup configuration structure */ +/* This file contains C interface for ODU and stubs to get startup + configuration +*/ -#ifndef __CONFIG_H__ -#define __CONFIG_H__ +#ifndef __CONFIG_INTERFACE_H__ +#define __CONFIG_INTERFACE_H__ #include #include @@ -27,6 +29,11 @@ #define IPV4_LEN 16 #define PORT_LEN 10 +#ifdef __cplusplus +extern "C" +{ +#endif + typedef struct { char DU_IPV4_Addr[IPV4_LEN]; @@ -37,7 +44,13 @@ typedef struct uint16_t RIC_Port; }StartupConfig; -uint8_t getStartupConfig(); + +uint8_t getStartupConfig(StartupConfig *cfg); +uint8_t getStartupConfigForStub(StartupConfig *cfg); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/o1/GlobalDefs.cpp b/src/o1/GlobalDefs.cpp index 77ea38062..e3dc38dbe 100644 --- a/src/o1/GlobalDefs.cpp +++ b/src/o1/GlobalDefs.cpp @@ -20,9 +20,11 @@ #include "GlobalDefs.hpp" -const short O1::TCP_PORT = 8282; const int O1::SUCCESS = 0; const int O1::FAILURE = 1; +const std::string O1::ALARM_SOCK_PATH("/tmp/alarmsock"); +const int O1::CPU_CORE = 22; + /********************************************************************** End of file diff --git a/src/o1/GlobalDefs.hpp b/src/o1/GlobalDefs.hpp index 0f8d42a41..759e72554 100644 --- a/src/o1/GlobalDefs.hpp +++ b/src/o1/GlobalDefs.hpp @@ -22,6 +22,9 @@ #define __GLOBAL_DEFS_HPP__ #include +#include + +using std::string; #define O1_LOG(...) ( {\ printf(__VA_ARGS__);\ @@ -38,9 +41,10 @@ class O1 { public: - static const short TCP_PORT; static const int SUCCESS; static const int FAILURE; + static const string ALARM_SOCK_PATH; + static const int CPU_CORE; }; #endif diff --git a/src/o1/InitConfig.cpp b/src/o1/InitConfig.cpp index 4edc8c2a6..b21e1b734 100644 --- a/src/o1/InitConfig.cpp +++ b/src/o1/InitConfig.cpp @@ -20,9 +20,6 @@ YANG modules */ #include "InitConfig.hpp" -#include -#include -using namespace std; /* Default constructor */ @@ -54,9 +51,13 @@ InitConfig::~InitConfig() bool InitConfig::init(sysrepo::S_Session sess) { - O1_LOG("\nInitConfig::init started "); mSess = sess; - getInterfaceConfig(sess); + InitConfig::InterfaceMap map; + if(!getInterfaceConfig(sess, map)) + { + O1_LOG("\nInitConfig::getInterfaceConfig InitConfig data error "); + return false; + } return true; } @@ -86,57 +87,45 @@ bool InitConfig::getCurrInterfaceConfig(StartupConfig & cfg) switch (it->first) { case Interface::ODU : - if(it->second.first != "0") + if(it->second.first != "") strcpy(cfg.DU_IPV4_Addr, it->second.first.c_str()); else - strcpy(cfg.DU_IPV4_Addr, DEFAULT_DU_IPV4_ADDR); - //O1_LOG("\n InitConfig::getCurrInterfaceConfig cfg.DU_IPV4_Addr = \ - %s", cfg.DU_IPV4_Addr); + return false; if(it->second.second != 0) cfg.DU_Port = (uint16_t)it->second.second; else - cfg.DU_Port = (uint16_t) DEFAULT_DU_PORT; - //O1_LOG("\n InitConfig::getCurrInterfaceConfig cfg.DU_Port = %d", \ - cfg.DU_Port); + return false; break; case Interface::OCU : - if(it->second.first != "0") + if(it->second.first != "") strcpy(cfg.CU_IPV4_Addr, it->second.first.c_str()); else - strcpy(cfg.CU_IPV4_Addr, DEFAULT_CU_IPV4_ADDR); + return false; - //O1_LOG("\n InitConfig::getCurrInterfaceConfig cfg.CU_IPV4_Addr = \ - %s", cfg.CU_IPV4_Addr); if(it->second.second != 0) cfg.CU_Port = (uint16_t) it->second.second; else - cfg.CU_Port = (uint16_t) DEFAULT_CU_PORT; + return false; - //O1_LOG("\n InitConfig::getCurrInterfaceConfig cfg.CU_Port = %d", \ - cfg.CU_Port); break; case Interface::RIC : - if(it->second.first != "0") + if(it->second.first != "") strcpy(cfg.RIC_IPV4_Addr, it->second.first.c_str()); else - strcpy(cfg.RIC_IPV4_Addr, DEFAULT_RIC_IPV4_ADDR); + return false; - //O1_LOG("\n InitConfig::getCurrInterfaceConfig cfg.RIC_IPV4_Addr = \ - %s", cfg.RIC_IPV4_Addr); if(it->second.second != 0) cfg.RIC_Port = (uint16_t) it->second.second; else - cfg.RIC_Port = (uint16_t) DEFAULT_RIC_PORT; + return false; - //O1_LOG("\n InitConfig::getCurrInterfaceConfig cfg.RIC_Port = %d", \ - cfg.RIC_Port); break; default : @@ -162,16 +151,25 @@ bool InitConfig::getCurrInterfaceConfig(StartupConfig & cfg) * @return reference of InterfaceMap * ******************************************************************/ -InitConfig::InterfaceMap InitConfig::getInterfaceConfig(sysrepo::S_Session sess) +bool InitConfig::getInterfaceConfig(sysrepo::S_Session sess , InitConfig::InterfaceMap &map) { - O1_LOG("\nInitConfig::getInterfaceConfig started"); - mInterfaceList.insert(std::make_pair(Interface::ODU, \ - getInterfaceData(sess,Interface::ODU))); - mInterfaceList.insert(std::make_pair(Interface::OCU, \ - getInterfaceData(sess,Interface::OCU))); - mInterfaceList.insert(std::make_pair(Interface::RIC, \ - getInterfaceData(sess,Interface::RIC))); - return mInterfaceList; + InitConfig::Address oduAddr; + InitConfig::Address ocuAddr; + InitConfig::Address ricAddr; + if(getInterfaceData(sess,Interface::ODU, oduAddr) && \ + getInterfaceData(sess,Interface::OCU, ocuAddr) && \ + getInterfaceData(sess,Interface::RIC, ricAddr)) + { + mInterfaceList.insert(std::make_pair(Interface::ODU, oduAddr)); + mInterfaceList.insert(std::make_pair(Interface::OCU, ocuAddr)); + mInterfaceList.insert(std::make_pair(Interface::RIC, ricAddr)); + map = mInterfaceList; + return true; + } + else + { + return false; + } } /******************************************************************* @@ -189,13 +187,26 @@ InitConfig::InterfaceMap InitConfig::getInterfaceConfig(sysrepo::S_Session sess) * @return reference of Address * ******************************************************************/ -InitConfig::Address InitConfig::getInterfaceData(sysrepo::S_Session sess, \ - Interface inf) +bool InitConfig::getInterfaceData(sysrepo::S_Session sess, \ + Interface inf, InitConfig::Address & addr) { - O1_LOG("\nInitConfig::getInterfaceData started"); + //O1_LOG("\nInitConfig::getInterfaceData started"); string sInf = interfaceToString(inf); - return std::make_pair(getData(sess, getInterfaceXpath(sInf, IP_ADDRESS)), \ - atoi(getData(sess, getInterfaceXpath(sInf, PORT)).c_str())); + string ip; + string port; + + if(getData(sess, getInterfaceXpath(sInf, IP_ADDRESS), ip)) + { + if(getData(sess, getInterfaceXpath(sInf, PORT), port)) + { + addr = std::make_pair(ip, atoi(port.c_str())); + return true; + } + else + return false; + } + else + return false; } /******************************************************************* @@ -236,7 +247,7 @@ char * InitConfig::getInterfaceXpath( string sInf, string param) * ******************************************************************/ -string InitConfig::getData(sysrepo::S_Session sess,char* xpath) +bool InitConfig::getData(sysrepo::S_Session sess,char* xpath, string &val) { //O1_LOG("\nInitConfig::getData of xpath = %s", \ xpath); //enable for debugging only @@ -245,19 +256,21 @@ string InitConfig::getData(sysrepo::S_Session sess,char* xpath) auto value = sess->get_item(xpath); if (value == nullptr) { + O1_LOG("\nInitConfig::getData no data available at xpath= %s", \ + xpath); //O1_LOG("\nget_item value are null for xpath = %s", \ xpath); //enable for debugging only - return "0"; + return false; } - string mVal = value->val_to_string(); - return mVal; + val = value->val_to_string(); + return true; } catch (...) { - //O1_LOG("\nInitConfig::getData exception occured for block xpath= %s", \ - xpath); //enable for debugging only - return "0"; + O1_LOG("\nInitConfig::getData exception occured for xpath= %s", \ + xpath); + return false; } } diff --git a/src/o1/InitConfig.hpp b/src/o1/InitConfig.hpp index 99d61f348..1b58f0861 100644 --- a/src/o1/InitConfig.hpp +++ b/src/o1/InitConfig.hpp @@ -24,27 +24,20 @@ #include #include #include -#include "sysrepo-cpp/Session.hpp" +#include #include +#include "sysrepo-cpp/Session.hpp" #include "Singleton.hpp" -#include "Config.h" - +#include "ConfigInterface.h" #include "GlobalDefs.hpp" + #define IP_ADDRESS "interface-address" #define PORT "port" #define INTERFACE_MODULE_NAME_ORAN "/o-ran-sc-odu-interface-v1:odu" #define MAX_XPATH 100 #define NETCONF_STARTUP_CFG "/etc/netconf_startup.cfg" -#define DEFAULT_DU_IPV4_ADDR "192.168.130.81" -#define DEFAULT_DU_PORT 38472 - -#define DEFAULT_CU_IPV4_ADDR "192.168.130.82" -#define DEFAULT_CU_PORT 38472 - -#define DEFAULT_RIC_IPV4_ADDR "192.168.130.80" -#define DEFAULT_RIC_PORT 36421 - +using namespace std; enum class Interface { ODU, OCU, @@ -75,10 +68,11 @@ class InitConfig : public Singleton sysrepo::S_Session mSess; //string mVal; /* function to get the data of Interfaces param*/ - InterfaceMap getInterfaceConfig(sysrepo::S_Session sess); - Address getInterfaceData(sysrepo::S_Session sess, Interface inf); + bool getInterfaceData(sysrepo::S_Session sess, \ + Interface inf, InitConfig::Address & addr); + bool getInterfaceConfig(sysrepo::S_Session sess , InitConfig::InterfaceMap &map); char * getInterfaceXpath( std::string sInf, std::string param); - std::string getData(sysrepo::S_Session sess,char* xpath); + bool getData(sysrepo::S_Session sess,char* xpath, string &val); std::string interfaceToString(Interface inf); bool printInterfaceConfig(); bool writeInterfaceConfig(); diff --git a/src/o1/NetconfManager.cpp b/src/o1/NetconfManager.cpp index 077cdfefb..4fa027629 100644 --- a/src/o1/NetconfManager.cpp +++ b/src/o1/NetconfManager.cpp @@ -119,11 +119,11 @@ void NetconfManager::sigintHandler(int signum) **********************************************************************/ bool NetconfManager::init(void) { - if(startNetopeerServer()) + /* if(startNetopeerServer()) { O1_LOG("\nO1 NetconfManager : netopeer server started"); } - + */ try { mSessHndl = new SessionHandler; @@ -132,9 +132,10 @@ bool NetconfManager::init(void) if( !mSessHndl->init()) { - O1_LOG("\nO1 NetconfManager : SessionHandler init failed "); + O1_LOG("\nO1 NetconfManager : SessionHandler init failed \n"); return false; } + return true; } catch( const std::exception& e ) { diff --git a/src/o1/O1App.cpp b/src/o1/O1App.cpp new file mode 100644 index 000000000..b4cfbde2c --- /dev/null +++ b/src/o1/O1App.cpp @@ -0,0 +1,182 @@ +/******************************************************************************* +################################################################################ +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # +# # +# 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. # +################################################################################ +*******************************************************************************/ + +/* This file contains the O1App class which is responsible for running/starting + all the O1 modules in a thread. It inherits the Thread class and Singleton + class. +*/ + +#include "O1App.hpp" +#include "GlobalDefs.hpp" +#include "SessionHandler.hpp" +#include "ConfigInterface.h" +#include + +/******************************************************************* + * + * @brief Constructor + * + * @details + * + * Function : O1App + * + * Functionality: + * - Constructor intialization + * + * @params[in] None + * @return None + ******************************************************************/ + +O1App::O1App() : mUxSocketServer(O1::ALARM_SOCK_PATH) +{ + +} + +/******************************************************************* + * + * @brief Destructor + * + * @details + * + * Function : ~O1App + * + * Functionality: + * - Destructor + * + * @params[in] None + * @return None + ******************************************************************/ + +O1App::~O1App() +{ + +} + +/******************************************************************* + * + * @brief Runs the O1 modules as a thread + * + * @details + * + * Function : run + * + * Functionality: + * - Implements the "run" function of Thread class. + * Starts all the O1 modules. + * + * + * @params[in] void + * @return true : success + * false : failure + ******************************************************************/ + +bool O1App::run() +{ + + SessionHandler sessHdlr; + /* Start Netconf session and subscribe to yang modules */ + try + { + if( !sessHdlr.init() ) + { + O1_LOG("\nO1 O1App : SessionHandler initialization failed "); + return false; + } + } + catch( const std::exception& e ) + { + O1_LOG("\nO1 O1App : Exception : %s", e.what()); + return false; + } + + /* Start the Unix Socket Server to listen for alarm messages */ + if( mUxSocketServer.start() ) + { + + if(mUxSocketServer.setAffinity(O1::CPU_CORE)) + { + O1_LOG("\nO1 O1App : CPU affinity set " ); + mUxSocketServer.printAffinity(); + } + + sleep(2); + if( mUxSocketServer.isRunning() ) + { + mStartupStatus = true; + O1_LOG("\nO1 O1App : Unix Socket server started\n"); + } + else + { + O1_LOG("\nO1 O1App : Unix Socket server failed to start\n"); + return false; + } + /* Wait for the Unix Socket Server thread to end*/ + mUxSocketServer.join(); + } + else + { + O1_LOG("\nO1 O1App : Unix Socket server failed to start\n"); + return false; + } + return true; +} + +/******************************************************************* + * + * @brief Check if the O1 Module is fully up and running + * + * @details + * + * Function : getStartupStatus + * + * Functionality: + * - Returns the status of O1App whether it is fully up + * + * + * @params[in] void + * @return true : started + * false : not started + ******************************************************************/ + +bool O1App::getStartupStatus() const +{ + return mStartupStatus; +} + +/******************************************************************* + * + * @brief Cleanup O1App + * + * @details + * + * Function : cleanUp + * + * Functionality: + * - Implements the "cleanUp" function of Thread class to + * take care of any clean up required for O1 components + * before stopping the thread. + * + * @params[in] void + * @return void + ******************************************************************/ + +void O1App::cleanUp(void) +{ + /* Stop the socket server thread */ + mUxSocketServer.stop(); +} diff --git a/src/o1/o1_client/GlobalDefs.h b/src/o1/O1App.hpp similarity index 67% rename from src/o1/o1_client/GlobalDefs.h rename to src/o1/O1App.hpp index 6323819e2..b1653d3f3 100644 --- a/src/o1/o1_client/GlobalDefs.h +++ b/src/o1/O1App.hpp @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,25 +16,36 @@ ################################################################################ *******************************************************************************/ -/* Class for global defines and constants for O1 interface */ +/* This file contains the O1App class which is responsible for running/starting + all the O1 modules in a thread. It inherits the Thread class and Singleton + class. +*/ -#ifndef __GLOBAL_DEFS_H__ -#define __GLOBAL_DEFS_H__ +#ifndef __O1_APP_HPP__ +#define __O1_APP_HPP__ -#include +#include "Singleton.hpp" +#include "Thread.hpp" +#include "UnixSocketServer.hpp" -#define O1_LOG(...) ({\ - printf(__VA_ARGS__);\ - syslog(LOG_DEBUG,__VA_ARGS__);\ - }) -#define TCP_PORT 8282 -#define TCP_SERVER_IP "127.0.0.1" -#define CELL_UP_ALARM_ID 1009 -#define CELL_DOWN_ALARM_ID 1010 +class O1App : public Singleton, public Thread +{ + friend Singleton; + + private: + bool mStartupStatus; + UnixSocketServer mUxSocketServer; -#endif + protected: + bool run(); + + public: + O1App(); + ~O1App(); + bool getStartupStatus()const; + void cleanUp(void); +}; -/********************************************************************** - End of file -**********************************************************************/ + +#endif diff --git a/src/o1/o1_client/Config.c b/src/o1/O1Interface.cpp similarity index 53% rename from src/o1/o1_client/Config.c rename to src/o1/O1Interface.cpp index 0f766cab4..c3135b53a 100644 --- a/src/o1/o1_client/Config.c +++ b/src/o1/O1Interface.cpp @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,59 +16,80 @@ ################################################################################ *******************************************************************************/ -/* This file contains definitions of startup configuration structure */ +/* This file contains the C interface for ODU to start the O1 module */ -#include "Config.h" -#include "ssi.h" -#include "GlobalDefs.h" -#include "TcpClient.h" +#include "O1Interface.h" +#include "O1App.hpp" +#include "GlobalDefs.hpp" +#include +#include -StartupConfig g_cfg; /******************************************************************* * - * @brief Get the startup config from Netconf + * @brief Wait for the O1 Module to start * * @details * - * Function : getStartupConfig + * Function : check_O1_module_status * * Functionality: - * - Get the start up IP and port for DU,CU and RIC + * - Checks if the O1App has started * - * @params[in] pointer to StartupConfig - * @return ROK - success - * RFAILED - failure + * + * @params[in] void + * @return O1::SUCCESS - success + * O1::FAILURE - failure ******************************************************************/ -uint8_t getStartupConfig(StartupConfig *cfg) -{ - O1_LOG("\nCONFIG : getStartupConfig ------ \n"); - MsgHeader msg; - msg.msgType = CONFIGURATION; - msg.action = GET_STARTUP_CONFIG; - if (openSocket(TCP_SERVER_IP,TCP_PORT) == RFAILED) + +int static check_O1_module_status(void){ + for( int i = 0; i < 5 ; i++) { - return RFAILED; + if( O1App::instance().getStartupStatus() == true) + { + return O1::SUCCESS; + } + else + { + sleep(1); + } } - if (sendData(&msg,sizeof(msg)) < 0 ) - { - closeSocket(); - return RFAILED; + + return O1::FAILURE; +} + +/******************************************************************* + * + * @brief Starts the O1 Module + * + * @details + * + * Function : start_O1_module + * + * Functionality: + * - Starts the O1 module by instantiating the O1App instance + * Invoked from the ODU-High main function + * + * + * @params[in] void + * @return O1::SUCCESS - success + * O1::FAILURE - failure + ******************************************************************/ + +int start_O1_module(void) +{ + + if(O1App::instance().start() == false){ + O1_LOG("\nO1 O1Interface : Failed to start"); + return O1::FAILURE; } - if (receiveData(cfg, sizeof(StartupConfig)) < 0) + + if(O1App::instance().setAffinity(O1::CPU_CORE)) { - closeSocket(); - return RFAILED; + O1_LOG("\nO1 O1Interface : CPU affinity set " ); + O1App::instance().printAffinity(); } - O1_LOG("\nCONFIG : ip du %s\n",cfg->DU_IPV4_Addr ); - O1_LOG("\nCONFIG : ip cu %s\n",cfg->CU_IPV4_Addr ); - O1_LOG("\nCONFIG : ip ric %s\n",cfg->RIC_IPV4_Addr ); - O1_LOG("\nCONFIG : port cu %hu\n",cfg->CU_Port); - O1_LOG("\nCONFIG : port du %hu\n",cfg->DU_Port); - O1_LOG("\nCONFIG : port ric %hu\n",cfg->RIC_Port); - - closeSocket(); - return ROK; + return check_O1_module_status(); } diff --git a/src/o1/o1_client/TcpClient.h b/src/o1/O1Interface.h similarity index 70% rename from src/o1/o1_client/TcpClient.h rename to src/o1/O1Interface.h index 8349e580f..cff161da6 100644 --- a/src/o1/o1_client/TcpClient.h +++ b/src/o1/O1Interface.h @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,20 +16,20 @@ ################################################################################ *******************************************************************************/ -/* This file contains functions to connect to a TCP server and send massages */ +/* This file contains the C interface for ODU to start the O1 module */ -#ifndef __TCP_CLIENT_H__ -#define __TCP_CLIENT_H__ -#include -#include "ssi.h" +#ifndef __O1_INTERFACE_H__ +#define __O1_INTERFACE_H__ -uint8_t openSocket(const char*, const uint16_t); -int sendData(void*, const int); -int receiveData(void* data, const int size); -uint8_t closeSocket(); +#ifdef __cplusplus +extern "C" +{ +#endif +int start_O1_module(void); +#ifdef __cplusplus +} #endif -/********************************************************************** - End of file -**********************************************************************/ + +#endif diff --git a/src/o1/O1_main.cpp b/src/o1/O1_main.cpp deleted file mode 100644 index c0ecce74f..000000000 --- a/src/o1/O1_main.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* -################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # -# # -# 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. # -################################################################################ -*******************************************************************************/ - -/* This file contains O1 main. - Starts the Netopeer and TCP server -*/ - -#include "NetconfManager.hpp" -#include "TcpServer.hpp" -#include - -/********************************************************************** - Description : Main function. Start of O1 module. - Params[In] : None - Return : EXIT_SUCCESS - : EXIT_FAILURE -**********************************************************************/ - -int main(int argc, char **argv) -{ - TcpServer tcpServer(O1::TCP_PORT); - /*SIGINT handling*/ - //signal(SIGINT, NetconfManager::sigintHandler); - /* Start Netconf server and subscribe to yang modules */ - try - { - NetconfManager::instancePtr()->init(); - O1_LOG("\nO1 O1_main : NetconfManager init successful"); - - } - catch( const std::exception& e ) - { - O1_LOG("\nO1 O1_main : Exception : %s", e.what()); - return EXIT_FAILURE; - } - /* Start the TCP Server to listen for alarm messages */ - if( tcpServer.start() ) - { - O1_LOG("\nO1 O1_main : TCP server started\n"); - /* Wait for the TcpServer thread to end*/ - tcpServer.wait(); - } - else - { - O1_LOG("\nO1 O1_main : Failed to start TCP server"); - return EXIT_FAILURE; - } - return EXIT_SUCCESS; -} - -/********************************************************************** - End of file -**********************************************************************/ diff --git a/src/o1/SessionHandler.cpp b/src/o1/SessionHandler.cpp index bc6ec9f98..1f9c0cf06 100644 --- a/src/o1/SessionHandler.cpp +++ b/src/o1/SessionHandler.cpp @@ -50,15 +50,46 @@ bool SessionHandler::init() { try { - O1_LOG("\nO1 SessionHandler : Initialization done"); mConn = createConnection(); - O1_LOG("\nO1 SessionHandler : Initialization done"); - mSess = createSession(mConn); - mSub = createSubscribe(mSess); - O1_LOG("\nO1 SessionHandler : Initialization done"); - //InitConfig initConf; - InitConfig::instance().init(mSess); - return true; + if(mConn != NULL) + { + O1_LOG("\nO1 SessionHandler : Connection created"); + //removing nacm module temperary for auth issue resolve + //mConn.remove_module("ietf-netconf-acm"); + mSess = createSession(mConn); + if(mSess != NULL) + { + O1_LOG("\nO1 SessionHandler : Session created"); + mSub = createSubscribe(mSess); + if(mSub != NULL) + { + O1_LOG("\nO1 SessionHandler : Subscription created"); + if(InitConfig::instance().init(mSess)) + { + return true; + } + else + { + return false; + } + } + else + { + O1_LOG("\nO1 SessionHandler : Subscription failed"); + return false; + } + } + else + { + O1_LOG("\nO1 SessionHandler : Session failed"); + return false; + } + } + else + { + O1_LOG("\nO1 SessionHandler : connection failed"); + return false; + } } catch( const std::exception& e ) { diff --git a/src/o1/Thread.cpp b/src/o1/Thread.cpp new file mode 100644 index 000000000..266c21b5f --- /dev/null +++ b/src/o1/Thread.cpp @@ -0,0 +1,222 @@ +/******************************************************************************* +################################################################################ +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # +# # +# 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. # +################################################################################ +*******************************************************************************/ + +/* This file contains class for launching and managing POSIX threads */ + +#include "Thread.hpp" +#include "GlobalDefs.hpp" +#include +#include + +/******************************************************************* + * + * @brief Constructor + * + * @details + * + * Function : Thread + * + * Functionality: + * - Constructor intialization + * + * @params[in] None + * @return None + ******************************************************************/ + +Thread::Thread(): mThreadId(0) +{ + +} + +/******************************************************************* + * + * @brief Destructor + * + * @details + * + * Function : ~Thread + * + * Functionality: + * - Destructor + * + * @params[in] None + * @return None + ******************************************************************/ + +Thread::~Thread() +{ + +} + +/******************************************************************* + * + * @brief Static function registered to run as pthread + + * + * @details + * + * Function : task + * + * Functionality: + * - Static function registered to run as pthread. It calls + * the run function that is implemented by the derived + * class instance. + * + * @params[in] void pointer to the base class instance that + implements this Thread class + * @return void + ******************************************************************/ + +void* Thread::task(void* args) +{ + Thread* thisPtr = static_cast(args); + thisPtr->run(); +} + + +/******************************************************************* + * + * @brief Creates a thread + * + * @details + * + * Function : start + * + * Functionality: + * - Starts a pthread registering the "task" function for + * performing the thread task. + * + * @params[in] void + * @return true : success + * false : failure + ******************************************************************/ + +bool Thread::start() +{ + return (pthread_create(&mThreadId, NULL, task, this) == 0); +} + + +/******************************************************************* + * + * @brief Stops the thread + * + * @details + * + * Function : stop + * + * Functionality: + * - Stops the thread. Performs an clean ups prior to + * stopping the thread + * + * + * @params[in] void + * @return true : success + * false : failure + ******************************************************************/ +bool Thread::stop() +{ + cleanUp(); + return (pthread_cancel(mThreadId) == 0); +} + +/******************************************************************* + * + * @brief Wait for the thread to complete + * + * @details + * + * Function : join + * + * Functionality: + * - Waits for the thread to complete in the calling process/ + * thread + * + * @params[in] void + * @return true : success + * false : failure + ******************************************************************/ +bool Thread::join() +{ + return (pthread_join(mThreadId,NULL) == 0); +} + + +/******************************************************************* + * + * @brief Set the affinity of the thread + * + * @details + * + * Function : setAffinity + * + * Functionality: + * - Pins the thread to cpu core(s) + * + * @params[in] CPU cores + * @return true : success + * false : failure + ******************************************************************/ +bool Thread::setAffinity(int coreNum) +{ + int ret; + cpu_set_t cpuset; + long nCores = sysconf(_SC_NPROCESSORS_ONLN); + + CPU_ZERO(&cpuset); + CPU_SET(coreNum%nCores, &cpuset); + ret = pthread_setaffinity_np(mThreadId, sizeof(cpu_set_t), &cpuset); + if (ret != 0) + { + return false; + } + return true; +} + +/******************************************************************* + * + * @brief Print the affinity of the thread + * + * @details + * + * Function : printAffinity + * + * Functionality: + * - Prints the cpu core(s) the thread is pinned to + * + * @params[in] void + * @return true : success + * false : failure + ******************************************************************/ +bool Thread::printAffinity() +{ + int ret; + long nCores = sysconf(_SC_NPROCESSORS_ONLN); + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + + ret = pthread_getaffinity_np(mThreadId, sizeof(cpu_set_t), &cpuset); + if (ret != 0) + return false; + + for (int i = 0; i < nCores; i++) + if (CPU_ISSET(i, &cpuset)) + O1_LOG("CPU %d ", i); + return true; +} diff --git a/src/o1/o1_client/Message.h b/src/o1/Thread.hpp similarity index 70% rename from src/o1/o1_client/Message.h rename to src/o1/Thread.hpp index 80fdc5804..9f9ee514e 100644 --- a/src/o1/o1_client/Message.h +++ b/src/o1/Thread.hpp @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,34 +16,33 @@ ################################################################################ *******************************************************************************/ -/* This file contains definitions of common message structures */ +/* This file contains class for launching and managing POSIX threads */ -#ifndef __MESSAGE_H__ -#define __MESSAGE_H__ +#ifndef __THREAD_HPP__ +#define __THREAD_HPP__ -#include +#include -typedef enum +class Thread { - RAISE_ALARM, - CLEAR_ALARM, - GET_STARTUP_CONFIG -}MsgAction; + private: + pthread_t mThreadId; + static void* task(void*); -typedef enum -{ - ALARM, - CONFIGURATION -}MsgType; + protected: + virtual bool run() = 0; -typedef struct -{ - MsgType msgType; - MsgAction action; -}MsgHeader; + public: + Thread(); + virtual ~Thread(); + bool start(); + bool stop(); + virtual void cleanUp()=0; + bool setAffinity(int); + bool printAffinity(); + bool join(); +}; -#endif -/********************************************************************** - End of file -**********************************************************************/ + +#endif diff --git a/src/o1/o1_client/TcpClient.c b/src/o1/UnixSocketClient.cpp similarity index 56% rename from src/o1/o1_client/TcpClient.c rename to src/o1/UnixSocketClient.cpp index 0049962b5..bd27dde07 100644 --- a/src/o1/o1_client/TcpClient.c +++ b/src/o1/UnixSocketClient.cpp @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,7 +16,9 @@ ################################################################################ *******************************************************************************/ -/* This file contains functions to connect to TCP server and send massages */ +/* This file contains functions to connect to unix socket server and send/recv + messages +*/ #include @@ -27,166 +29,162 @@ #include #include #include +#include -#include "TcpClient.h" -#include "GlobalDefs.h" -#include "ssi.h" - -static int s_sock; -static struct sockaddr_in s_serverName; -static uint16_t s_port; -static const char* s_hostName = NULL; +#include "UnixSocketClient.hpp" +#include "GlobalDefs.hpp" /******************************************************************* * - * @brief Initilize the sockadd_in structure + * @brief Constructor * * @details * - * Function : initSockaddr + * Function : UnixSocketClient * * Functionality: - * - Initilizes the sockadd_in structure + * - Constructor intialization * - * @params[in] void - * @return ROK - success - * RFAILED - failure + * @params[in] socket path + * @return None ******************************************************************/ -static uint8_t initSockaddr() +UnixSocketClient::UnixSocketClient(const string& path) + : mSockPath(path) { - struct hostent *hostInfo; - struct sockaddr_in *name = &s_serverName; - bzero(&s_serverName, sizeof(s_serverName)); - name->sin_family = AF_INET; - name->sin_port = htons (s_port); - hostInfo = gethostbyname (s_hostName); - if (hostInfo == NULL) - { - O1_LOG("\nO1 TcpClient : Unknown host %s", s_hostName); - return RFAILED; - } - name->sin_addr = *(struct in_addr *) hostInfo->h_addr; - return ROK; } +/******************************************************************* + * + * @brief Destructor + * + * @details + * + * Function : ~UnixSocketClient + * + * Functionality: + * - Destructor + * + * @params[in] None + * @return None + ******************************************************************/ + UnixSocketClient::~UnixSocketClient() + { + + } /******************************************************************* * - * @brief Open a TCP socket + * @brief Open a Unix socket * * @details * * Function : openSocket * * Functionality: - * - Opens a TCP socket + * - Opens a Unix socket * - * @params[in] hostname, port - * @return ROK - success - * RFAILED - failure + * @params[in] void + * @return O1::SUCCESS - success + * O1::FAILURE - failure ******************************************************************/ -uint8_t openSocket(const char* hostName, const uint16_t port) +uint8_t UnixSocketClient::openSocket() { /* Create the socket. */ - s_port = port; - s_hostName = hostName; - s_sock = socket (PF_INET, SOCK_STREAM, 0); - if (s_sock < 0) + mSock = socket (AF_UNIX, SOCK_STREAM, 0); + if (mSock < 0) { - O1_LOG("\nO1 TcpClient : Error opening socket"); - return RFAILED; + O1_LOG("\nO1 UnixSocketClient : Error opening socket"); + return O1::FAILURE; } - /* Init the sockaddr_in structure */ - if (initSockaddr() == RFAILED) - { - return RFAILED; - } + /* Init the sockaddr_un structure */ + mSockName.sun_family = AF_UNIX; + strcpy(mSockName.sun_path, mSockPath.c_str()); + /* Connect to the server */ - if (0 > connect (s_sock, - (struct sockaddr_in *)&s_serverName , - sizeof (s_serverName))) + if (0 > connect (mSock, + (struct sockaddr *)&mSockName, + sizeof (mSockName))) { - O1_LOG("\nO1 TcpClient : Error connecting"); - return RFAILED; + O1_LOG("\nO1 UnixSocketClient : Error connecting"); + return O1::FAILURE; } - return ROK; + return O1::SUCCESS; } - /******************************************************************* * - * @brief Send message over TCP socket + * @brief Send message over Unix socket * * @details * * Function : sendData * * Functionality: - * - Sends message over TCP socket + * - Sends message over Unix socket * * @params[in] message, size of the message * @return Number of bytes sent * ******************************************************************/ -int sendData(void* data, const int size) +int UnixSocketClient::sendData(void* data, const int size) { - int nbytes = write (s_sock, data, size); + int nbytes = write (mSock, data, size); if (nbytes < 0) { - O1_LOG("\nO1 TcpClient : Error writing. %d bytes sent", nbytes); + O1_LOG("\nO1 UnixSocketClient : Error writing. %d bytes sent", nbytes); } return nbytes; } /******************************************************************* * - * @brief Recieve message over TCP socket + * @brief Recieve message over Unix socket * * @details * * Function : receiveData * * Functionality: - * - Recieves message over TCP socket + * - Recieves message over Unix socket * * @params[in] message, size of the message * @return Number of bytes received * ******************************************************************/ -int receiveData(void* data, const int size) +int UnixSocketClient::receiveData(void* data, const int size) { - int nbytes = read (s_sock, data, size); + int nbytes = read (mSock, data, size); if (nbytes < 0) { - O1_LOG("\nO1 TcpClient : Error reading. %d bytes sent", nbytes); + O1_LOG("\nO1 UnixSocketClient : Error reading. %d bytes sent", nbytes); } return nbytes; } /******************************************************************* * - * @brief Close the TCP socket + * @brief Close the Unix socket * * @details * * Function : closeSocket * * Functionality: - * - Closes the TCP socket + * - Closes the Unix socket * - * @params[in] message, size of the message - * @return ROK - success - * RFAILED - failure + * @params[in] void + * @return O1::SUCCESS - success + * O1::FAILURE - failure ******************************************************************/ -uint8_t closeSocket() +uint8_t UnixSocketClient::closeSocket() { - if( close(s_sock) != 0 ) - return RFAILED; - return ROK; + if( close(mSock) != 0 ) + return O1::FAILURE; + return O1::SUCCESS; } /********************************************************************** diff --git a/src/o1/UnixSocketClient.hpp b/src/o1/UnixSocketClient.hpp new file mode 100644 index 000000000..6256d3830 --- /dev/null +++ b/src/o1/UnixSocketClient.hpp @@ -0,0 +1,54 @@ +/******************************************************************************* +################################################################################ +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # +# # +# Licensed under th`e 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. # +################################################################################ +*******************************************************************************/ + +/* This file contains functions to connect to a unix socket server and send/recv + messages +*/ + +#ifndef __UNIX_SOCKET_CLIENT_HPP__ +#define __UNIX_SOCKET_CLIENT_HPP__ + +#include +#include +#include + +using std::string; + +class UnixSocketClient +{ + private: + + int mSock; + string mSockPath; + struct sockaddr_un mSockName; + + public: + UnixSocketClient(const string& path); + ~UnixSocketClient(); + uint8_t openSocket(); + int sendData(void*, const int); + int receiveData(void* data, const int size); + uint8_t closeSocket(); + +}; + +#endif + +/********************************************************************** + End of file +**********************************************************************/ diff --git a/src/o1/TcpServer.cpp b/src/o1/UnixSocketServer.cpp similarity index 57% rename from src/o1/TcpServer.cpp rename to src/o1/UnixSocketServer.cpp index 337387d09..528e0398a 100644 --- a/src/o1/TcpServer.cpp +++ b/src/o1/UnixSocketServer.cpp @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,15 +16,15 @@ ################################################################################ *******************************************************************************/ -/* This file contains TcpServer class that listens for Netconf Alarm messages - on a TCP socket from ODU. It calls the AlarmManager functions for raising - or clearing the alarms based on the actions received +/* This file contains UnixSocketServer class that listens for Netconf Alarm + messages on a Unix socket from ODU. It calls the AlarmManager functions + for raising or clearing the alarms based on the actions received */ -#include "TcpServer.hpp" +#include "UnixSocketServer.hpp" #include "Alarm.hpp" #include "AlarmManager.hpp" -#include "Config.h" +#include "ConfigInterface.h" #include "GlobalDefs.hpp" #include #include @@ -36,13 +36,49 @@ #include #include #include +#include #include "InitConfig.hpp" + using std::map; using std::pair; -/* Destructor */ -TcpServer::~TcpServer() +/******************************************************************* + * + * @brief Constructor + * + * @details + * + * Function : UnixSocketServer + * + * Functionality: + * - Constructor intialization + * + * @params[in] socket path + * @return None + ******************************************************************/ +UnixSocketServer::UnixSocketServer(const string& sockPath) + : mSockPath(sockPath), + mIsRunning(false) +{ + +} + +/******************************************************************* + * + * @brief Destructor + * + * @details + * + * Function : ~UnixSocketServer + * + * Functionality: + * - Destructor + * + * @params[in] None + * @return None + ******************************************************************/ +UnixSocketServer::~UnixSocketServer() { } @@ -63,7 +99,7 @@ TcpServer::~TcpServer() * @return No. of bytes read * ******************************************************************/ -int TcpServer::readMessage(int fd) +int UnixSocketServer::readMessage(int fd) { AlarmRecord *alrmRec = NULL; char recvBuf[BUFLEN]; @@ -76,23 +112,27 @@ int TcpServer::readMessage(int fd) { MsgHeader *msgHdr = (MsgHeader*)recvBuf; - O1_LOG("\nO1 TcpServer :\nBuf size %ld", sizeof(recvBuf)); - O1_LOG("\nO1 TcpServer :\nMsgType %d",msgHdr->msgType); - O1_LOG("\nO1 TcpServer :\nAction %d",msgHdr->action); + O1_LOG("\nO1 UnixSocketServer :\nMsgType %d",msgHdr->msgType); if ( msgHdr->msgType == ALARM ){ uint16_t alrmId; alrmRec = (AlarmRecord*) recvBuf; - O1_LOG("\nO1 TcpServer :\nAction %d\nalarm ID %s\n%d\n%s\n%d\n%s\n%s\nbytes %d", - alrmRec->msgHeader.action, - alrmRec->alarmId, - alrmRec->perceivedSeverity, - alrmRec->additionalText, - alrmRec->eventType, - alrmRec->specificProblem, - alrmRec->additionalInfo, - nbytes - ); + O1_LOG("\nO1 UnixSocketServer :\n" + "Action %d\n" + "Alarm ID %s\n" + "Severity %d\n" + "Additional Text %s\n" + "Specific Problem %s\n" + "Additional Info %s\n" + "Alarm Raise Time %s\n", + alrmRec->msgHeader.action, + alrmRec->alarmId, + alrmRec->perceivedSeverity, + alrmRec->additionalText, + alrmRec->specificProblem, + alrmRec->additionalInfo, + alrmRec->alarmRaiseTime + ); /*Fill the alarm structure */ sscanf(alrmRec->alarmId,"%hu",&alrmId); @@ -109,41 +149,64 @@ int TcpServer::readMessage(int fd) case RAISE_ALARM: if(AlarmManager::instance().raiseAlarm(alrm)) { - O1_LOG("\nO1 TcpServer : Alarm raised for alarm Id %s", alrmRec->alarmId); + O1_LOG("\nO1 UnixSocketServer : " + "Alarm raised for alarm Id %s", + alrmRec->alarmId); } else { - O1_LOG("\nO1 TcpServer : Error in raising alarm for alrm Id %s", alrmRec->alarmId); + O1_LOG("\nO1 UnixSocketServer : " + "Error in raising alarm for alrm Id %s", + alrmRec->alarmId); } break; case CLEAR_ALARM: if(AlarmManager::instance().clearAlarm(alrm)) { - O1_LOG("\nO1 TcpServer : Alarm cleared for alarm Id %s", alrmRec->alarmId); + O1_LOG("\nO1 UnixSocketServer : " + "Alarm cleared for alarm Id %s", + alrmRec->alarmId); } else { - O1_LOG("\nO1 TcpServer : Error in clearing alarm for alarm Id %s", alrmRec->alarmId); + O1_LOG("\nO1 UnixSocketServer : " + "Error in clearing alarm for alarm Id %s", + alrmRec->alarmId); } break; +#if 0 case GET_STARTUP_CONFIG: { StartupConfig cfg; InitConfig::instance().getCurrInterfaceConfig(cfg); - O1_LOG("\nO1 TcpServer : cfg.DU_IPV4_Addr [%s]", cfg.DU_IPV4_Addr); - O1_LOG("\nO1 TcpServer : cfg.DU_Port [%d]", cfg.DU_Port); - O1_LOG("\nO1 TcpServer : cfg.CU_IPV4_Addr [%s]", cfg.CU_IPV4_Addr); - O1_LOG("\nO1 TcpServer : cfg.CU_Port [%d]", cfg.CU_Port); - O1_LOG("\nO1 TcpServer : cfg.RIC_IPV4_Addr [%s]", cfg.RIC_IPV4_Addr); - O1_LOG("\nO1 TcpServer : cfg.RIC_Port [%d]", cfg.RIC_Port); + O1_LOG("\nO1 UnixSocketServer : " + "cfg.DU_IPV4_Addr [%s]", + cfg.DU_IPV4_Addr); + O1_LOG("\nO1 UnixSocketServer : " + "cfg.DU_Port [%d]", + cfg.DU_Port); + O1_LOG("\nO1 UnixSocketServer : " + "cfg.CU_IPV4_Addr [%s]", + cfg.CU_IPV4_Addr); + O1_LOG("\nO1 UnixSocketServer : " + "cfg.CU_Port [%d]", + cfg.CU_Port); + O1_LOG("\nO1 UnixSocketServer : " + "cfg.RIC_IPV4_Addr [%s]", + cfg.RIC_IPV4_Addr); + O1_LOG("\nO1 UnixSocketServer : " + "cfg.RIC_Port [%d]", + cfg.RIC_Port); if (write (fd, &cfg, sizeof(cfg)) < 0) { - O1_LOG("\nO1 TcpServer : Error sending startup configuration \n"); + O1_LOG("\nO1 UnixSocketServer : " + "Error sending startup configuration \n"); } break; } +#endif default: - O1_LOG("\nO1 TcpServer : No action performed"); + O1_LOG("\nO1 UnixSocketServer : No action performed"); break; } @@ -154,38 +217,46 @@ int TcpServer::readMessage(int fd) /******************************************************************* * - * @brief Open a TCP socket and bind on the port + * @brief Open a Unix socket and bind on the port * * @details * * Function : makeSocket * * Functionality: - * - Opens a TCP socket and bind on the port + * - Opens a Unix socket and bind on the port * * @params[in] void * @return O1:SUCCESS - success * O1:FAILURE - failure ******************************************************************/ -int TcpServer::makeSocket() + +int UnixSocketServer::makeSocket() { - struct sockaddr_in name; + struct sockaddr_un name; /* Create the socket. */ - mSock = socket (PF_INET, SOCK_STREAM, 0); + mSock = socket (AF_UNIX, SOCK_STREAM, 0); if (mSock < 0) { - O1_LOG("\nO1 TcpServer : Socket error"); + O1_LOG("\nO1 UnixSocketServer : Socket error"); return O1::FAILURE; } /* Give the socket a name. */ bzero(&name, sizeof(name)); - name.sin_family = AF_INET; - name.sin_port = htons (mPort); - name.sin_addr.s_addr = htonl (INADDR_ANY); + name.sun_family = AF_UNIX; + + /* Remove the socket file if it already exists */ + if ( unlink(mSockPath.c_str()) == 0) + { + O1_LOG("\nO1 UnixSocketServer : " + "Removing the existing socket path %s", + mSockPath.c_str()); + } + strcpy(name.sun_path, mSockPath.c_str()); if (bind (mSock, (struct sockaddr *) &name, sizeof (name)) < 0) { close(mSock); - O1_LOG("\nO1 TcpServer : Bind error"); + O1_LOG("\nO1 UnixSocketServer : Bind error"); return O1::FAILURE; } return O1::SUCCESS; @@ -194,57 +265,37 @@ int TcpServer::makeSocket() /******************************************************************* * - * @brief Start TCP server in thread - * - * @details - * - * Function : start - * - * Functionality: - * - Start TCP server in thread - * - * @params[in] void - * @return true - success - * false - failure - ******************************************************************/ -bool TcpServer::start() -{ - return (pthread_create(&mThreadId, NULL, task, this) == 0); -} - -/******************************************************************* - * - * @brief A TCP server to handle multiple connection + * @brief A Unix server to handle multiple connection * * @details * * Function : run * * Functionality: - * - A TCP server to handle multiple connection + * - A Unix server to handle multiple connection * Uses select multiplexing * * @params[in] void * @return true - success * false - failure ******************************************************************/ -bool TcpServer::run() +bool UnixSocketServer::run() { fd_set active_fd_set, read_fd_set; int i; - struct sockaddr_in clientName; + struct sockaddr_un clientName; socklen_t size; - bool ret = true;; + mIsRunning = true; /* Create the socket and set it up to accept connections. */ if( makeSocket() == O1::SUCCESS ) { if (listen (mSock, 1) < 0) { - O1_LOG("\nO1 TcpServer : Listen error"); + O1_LOG("\nO1 UnixSocketServer : Listen error"); close(mSock); - ret = false; + mIsRunning = false; } else { @@ -258,9 +309,9 @@ bool TcpServer::run() read_fd_set = active_fd_set; if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) { - O1_LOG("\nO1 TcpServer : Select error"); + O1_LOG("\nO1 UnixSocketServer : Select error"); close(mSock); - ret = false; + mIsRunning = false; break; } @@ -278,14 +329,12 @@ bool TcpServer::run() newFd = accept(mSock,(struct sockaddr *) &clientName,&size); if (newFd < 0) { - O1_LOG("\nO1 TcpServer : Accept error"); + O1_LOG("\nO1 UnixSocketServer : Accept error"); close(mSock); - ret = false; + mIsRunning = false; break; } - O1_LOG("\nO1 TcpServer : Connected from host %s, port %hd.\n", - inet_ntoa (clientName.sin_addr), - ntohs (clientName.sin_port)); + O1_LOG("\nO1 UnixSocketServer : Connected from client\n"); FD_SET (newFd, &active_fd_set); } else @@ -304,58 +353,52 @@ bool TcpServer::run() } /* outer if ends */ else { - ret = false; + mIsRunning = false; } - return ret; + return mIsRunning; } /******************************************************************* * - * @brief Static function for launching a TCP server instance - * in a thread + * @brief Clean up open socket * * @details * - * Function : task + * Function : cleanUp * * Functionality: - * - Static function for launching a TCP server instance - * in a thread + * - Performs any clean ups before stopping the thread * - * @params[in] TcpServer instance + * @params[in] void * @return void ******************************************************************/ -void* TcpServer::task(void *args) +void UnixSocketServer::cleanUp(void) { - TcpServer *tcpServer = (TcpServer*)args; - tcpServer->run(); - return NULL; + close(mSock); + O1_LOG("\nO1 UnixSocketServer : Cleaning up Closing socket \n"); } - /******************************************************************* * - * @brief Wait for the thread to complete in the parent process + * @brief Check if the server is running * * @details * - * Function : wait + * Function : isRunning * * Functionality: - * - Waits for the thread to complete in the parent process + * - Returns the running status of the server * * @params[in] void - * @return true : success - * false : failure + * @return true : running + * false: not running ******************************************************************/ -bool TcpServer::wait() +bool UnixSocketServer::isRunning() const { - return (pthread_join(mThreadId,NULL) == 0); + return mIsRunning; } - - /********************************************************************** End of file **********************************************************************/ diff --git a/src/o1/TcpServer.hpp b/src/o1/UnixSocketServer.hpp similarity index 75% rename from src/o1/TcpServer.hpp rename to src/o1/UnixSocketServer.hpp index 862b57eab..cf3c18d27 100644 --- a/src/o1/TcpServer.hpp +++ b/src/o1/UnixSocketServer.hpp @@ -1,6 +1,6 @@ /******************************************************************************* ################################################################################ -# Copyright (c) [2020] [HCL Technologies Ltd.] # +# Copyright (c) [2020-2021] [HCL Technologies Ltd.] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # @@ -16,36 +16,38 @@ ################################################################################ *******************************************************************************/ -/* This file contains TcpServer class that listens for Netconf Alarm messages - on a TCP socket from ODU. It calls the AlarmManager functions for raising +/* This file contains UnixSocketServer class that listens for Netconf Alarm messages + on a Unix socket from ODU. It calls the AlarmManager functions for raising or clearing the alarms based on the actions received */ -#ifndef __TCP_SERVER_HPP__ -#define __TCP_SERVER_HPP__ +#ifndef __UNIX_SOCKET_SERVER_HPP__ +#define __UNIX_SOCKET_SERVER_HPP__ #include #include +#include "Thread.hpp" using std::string; #define BUFLEN 512 -class TcpServer +class UnixSocketServer : public Thread { private: - pthread_t mThreadId; int mSock; - const int16_t mPort; + string mSockPath; int readMessage(int); int makeSocket(); + + protected: bool run(); - static void* task(void*); + bool mIsRunning; public: - bool start(); - bool wait(); - TcpServer(const uint16_t port) : mPort(port){}; - ~TcpServer(); + UnixSocketServer(const string& sockPath); + ~UnixSocketServer(); + bool isRunning() const; + virtual void cleanUp(void); }; diff --git a/src/ric_stub/ric_stub.c b/src/ric_stub/ric_stub.c index 90f481c13..bbb4dde76 100644 --- a/src/ric_stub/ric_stub.c +++ b/src/ric_stub/ric_stub.c @@ -23,7 +23,7 @@ #include "du_log.h" #ifdef O1_ENABLE -#include "Config.h" +#include "ConfigInterface.h" #endif #define RIC_ID 1 @@ -51,9 +51,7 @@ #define PLMN_MNC2 0 #ifdef O1_ENABLE - extern StartupConfig g_cfg; - #endif /******************************************************************* @@ -137,10 +135,13 @@ void readRicCfg() DU_LOG("\nINFO --> RIC : Reading RIC configurations"); #ifdef O1_ENABLE - if( getStartupConfig(&g_cfg) != ROK ) + if( getStartupConfigForStub(&g_cfg) != ROK ) { - RETVALUE(RFAILED); + DU_LOG("\nError --> RIC : Could not fetch startup "\ + "configurations from Netconf interface\n"); + exit(1); } + cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du); cmInetAddr((S8*)g_cfg.RIC_IPV4_Addr, &ipv4_ric); -- 2.16.6