I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/F1AP
I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/RRC
I_OPTS+=-I$(ROOT_DIR)/src/codec_utils/E2AP
+I_OPTS+=-I$(ROOT_DIR)/src/o1/o1_client
#-------------------------------------------------------------#
#Linker macros
--- /dev/null
+################################################################################
+# 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 module
+
+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))
+
+lib: $(LIB_DIR)/libo1.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/
+I_OPTS+=-I$(ROOT_DIR)/src/o1/o1_client
+
+#-------------------------------------------------------------#
+#Linker macros
+#-------------------------------------------------------------#
+
+$(LIB_DIR)/libo1.a:$(CPP_OBJS)
+ @echo -e "Creating Archive $(COLOR) $@ $(REVERT_COLOR)"
+ $(Q)ar -cr $(LIB_DIR)/libo1.a $(CPP_OBJS)
+
+#-------------------------------------------------------------#
+#Clean macros
+#-------------------------------------------------------------#
+clean:
+ @echo -e "$(COLOR_RED)Cleaning O1$(REVERT_COLOR)"
+ $(Q)\rm -f $(LIB_DIR)/libo1.a $(CPP_OBJS)
+
+#**********************************************************************
+# End of file
+#**********************************************************************
--- /dev/null
+################################################################################
+# 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
+#**********************************************************************
--- /dev/null
+################################################################################
+# 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. #
+################################################################################
+
+#!/bin/bash
+
+# Pre-requisite script for installing Netconf Libraries
+# and compiling the O1 module
+
+#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"
+
+INSTALL="netconf"
+CLEANUP="no"
+SUDO="sudo"
+
+#logging functions
+log_error(){
+ echo ""
+ echo -e "\e[1;31m ***** $1 ***** \e[0m"
+ echo ""
+}
+log_warning() {
+ echo ""
+ echo -e "\e[1;35m ***** $1 ***** \e[0m"
+ echo ""
+}
+log_success() {
+ echo ""
+ echo -e "\e[1;32m ***** $1 ***** \e[0m"
+ echo ""
+}
+log() {
+ echo -e "$1 "
+}
+
+
+
+#functions definitions
+#TBD: install only mandatory packages
+
+#install pre-requisite packages
+
+prerequisite_netconf() {
+ $SUDO apt-get update
+
+ $SUDO apt-get install -y jq \
+ cmake \
+ build-essential \
+ supervisor \
+ libpcre3-dev \
+ pkg-config \
+ libavl-dev \
+ libev-dev \
+ libprotobuf-c-dev \
+ protobuf-c-compiler \
+ libssh-dev \
+ libssl-dev \
+ swig \
+ iputils-ping \
+ python-dev
+}
+
+#check return value
+check_ret() {
+
+ if [ $2 -eq 0 ]; then
+ log_success " $1 INSTALLATION DONE"
+ else
+ log_error " $1 INSTALLATION FAILED "
+ show_help
+ fi
+}
+
+
+#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"
+ fi
+
+ mkdir -p $NETCONF_PATH
+
+ #1. libssh
+ cd $NETCONF_PATH && \
+ git clone http://git.libssh.org/projects/libssh.git && \
+ cd libssh; mkdir build; cd build && \
+ cmake .. && \
+ make && \
+ $SUDO make install
+
+ check_ret "LIBSSH" "$?"
+
+ # libyang
+ cd $NETCONF_PATH && \
+ git clone https://github.com/CESNET/libyang.git && \
+ cd libyang && mkdir build && cd build && \
+ cmake -DGEN_LANGUAGE_BINDINGS=ON -DGEN_PYTHON_BINDINGS=OFF \
+ -DCMAKE_BUILD_TYPE:String="Debug" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ $SUDO make install && \
+ $SUDO ldconfig
+
+ check_ret "LIBYANG" "$?"
+
+ # sysrepo
+ cd $NETCONF_PATH && \
+ git clone https://github.com/sysrepo/sysrepo.git && \
+ cd sysrepo && sed -i -e 's/2000/30000/g;s/5000/30000/g' src/common.h.in && \
+ mkdir build && cd build && \
+ cmake -DGEN_LANGUAGE_BINDINGS=ON -DGEN_PYTHON_BINDINGS=OFF \
+ -DCMAKE_BUILD_TYPE:String="Debug" -DENABLE_TESTS=OFF \
+ -DREPOSITORY_LOC:PATH=/etc/sysrepo .. && \
+ make -j2 && \
+ $SUDO make install && $SUDO make sr_clean && \
+ $SUDO ldconfig
+
+ check_ret "SYSREPO" "$?"
+
+ # libnetconf2
+ cd $NETCONF_PATH && \
+ git clone https://github.com/CESNET/libnetconf2.git && \
+ cd libnetconf2 && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Debug" -DENABLE_BUILD_TESTS=OFF .. && \
+ make -j2 && \
+ $SUDO make install && \
+ $SUDO ldconfig
+
+ check_ret "LIBNETCONF2" "$?"
+
+ # netopeer2
+ cd $NETCONF_PATH && \
+ git clone https://github.com/CESNET/Netopeer2.git && \
+ cd Netopeer2 && mkdir build && cd build && \
+ cmake -DCMAKE_BUILD_TYPE:String="Debug" -DNP2SRV_DATA_CHANGE_TIMEOUT=30000 \
+ -DNP2SRV_DATA_CHANGE_WAIT=OFF .. && \
+ make -j2 && \
+ $SUDO make install -d
+ check_ret "NETOPEER2" "$?"
+
+}
+
+#install yang module
+
+install_yang_module() {
+ $SYSREPOCTL_PATH -i "$YANG_PATH/o-ran-sc-du-alarm-v1.yang"
+}
+
+
+#wait for ack of user
+acknowledge() {
+ echo "$1"
+ read -n 1 -p "Press any key to continue, or CTRL+C to abort" mainmenuinout
+ echo
+ }
+
+#show help for user to provide valid input
+show_help(){
+ echo "use -c option for cleanup"
+ echo "ex : $./install_netconf.sh -c"
+ exit
+}
+
+main() {
+
+ unset INSTALL CLEANUP
+ while (( "$#" )); do
+ case "$1" in
+ -h|\?)
+ show_help
+ shift
+ exit 0
+ ;;
+ -c) CLEANUP="cleanup"
+ shift
+ ;;
+ esac
+ done
+
+ shift $((OPTIND-1))
+
+ [ "${1:-}" = "--" ] && shift
+
+ log_success "MAIN: PARSING OF ARGUMENT DONE"
+
+}
+
+#start execution / function calls
+if [[ "$#" -ge 2 ]] ; then
+ log_error " NUMBER OF PARAMETER : $# "
+ show_help
+fi
+
+main $@
+
+prerequisite_netconf
+
+install_netconf_lib
+
+#yang installation yet not enabled
+if [[ "$INSTALL" == "yang" ]] ; then
+{
+ log " YANG INSTALLATION PROCESSING "
+ install_yang_module
+ log_success " YANG INSTALLATION DONE "
+}
+fi
+
+
+log_success " SCRIPT COMPLETED"
+exit
+
+#**********************************************************************
+# End of file
+#**********************************************************************
--- /dev/null
+################################################################################
+# 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
+#**********************************************************************
--- /dev/null
+module o-ran-sc-odu-alarm-v1 {
+ yang-version 1;
+ namespace "urn:o-ran:odu:alarm:1.0";
+ prefix rxad;
+
+ organization
+ "O-RAN Software Community";
+ contact
+ "www.o-ran.org";
+ description
+ "This module defines active alarm information visible to operators
+
+ Copyright 2020 the O-RAN Alliance.
+
+ Licensed under the Apache License, Version 2.0 (the 'License');
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an 'AS IS' BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.";
+
+ revision 2020-01-29 {
+ description
+ "initial revision";
+ reference
+ "O-RAN-OAM-Interface-Specification (O1)";
+ }
+
+ grouping alarm-info {
+ leaf alarm-id {
+ type string;
+ description
+ "The unique alarm ID";
+ }
+ leaf resource {
+ type string;
+ description
+ "The alarm 'resource' which is
+ basically the xpath to the entity
+ which raises the alarm and the
+ alarm-type-qualifier, which can be
+ in our case a static string for all
+ the alarms, e.g. 'O-RAN-SC:O-DU'.";
+ }
+ leaf alarm-text {
+ type string;
+ description
+ "The detailed text of the alarm";
+ }
+ leaf severity {
+ type string;
+ description
+ "The severity of the alarm";
+ }
+ leaf status {
+ type string;
+ description
+ "The status of the alarm";
+ }
+ leaf additional-info {
+ type string;
+ description
+ "Additional info about the alarm";
+ }
+ description
+ "Alarm information";
+ }
+
+ container odu {
+ container alarms {
+ config false;
+ list alarm {
+ key "alarm-id";
+ uses alarm-info;
+ description
+ "The list of active alarms in RIC";
+ }
+ description
+ "State data container of the alarms";
+ }
+ description
+ "Root object for RIC alarms";
+ }
+}
PLTFRM_FLAGS+=-DODU_TEST_STUB
endif
+ifeq ($(O1_ENABLE),YES)
+ PLTFRM_FLAGS+=-DO1_ENABLE
+endif
+
# The include options get merged with the options needed by
# # the called makefiles and hence we export these to make them
# # available to them.
export CNM_ENABLE
export TEXT_LOG
export CA_ENABLE
+export O1_ENABLE
help:
@echo -e "******************************************************************"
$(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)'
$(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)'
+ $(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)'
link_du: du
$(Q)$(CC1) -g -o $(OBJ_ROOT)/odu/odu -Wl,-R../lib/:. $(OBJ_ROOT)/odu/*.o\
$(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.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)/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)'
+ $(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)rm -rf $(OBJ_ROOT)/odu/*
$(Q)rm -rf $(LIB_ROOT)/odu/*
$(Q)rm -rf $(BIN_DIR)/odu/*
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
2. l2/docs/ : contains README and other configuration files for building docs
-2. l2/src/ : contains layer specific source code
+3. l2/src/ : contains layer specific source code
a. 5gnrmac : MAC source code
b. 5gnrrlc : RLC source code
c. cm : common, environment and interface files
f. mt : wrapper functions over OS
g. phy_stub : Stub code for Physical layer
h. rlog : logging module
+ i. o1 : o1 module
Pre-requisite for Compilation :
b. On CentOS : yum install libpcap-devel
+Pre-requisite for running O1 module:
+-----------------------------------
+Install netconf server
+----------------------
+
+1. Create new netconf user (login with root user and run following command)
+ $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
+2. Install netconf packages.
+ $cd l2/build/o1/
+ $chmod +x install_lib.sh
+ $ ./install_lib.sh
+
+Install the yang module
+-----------------------
+1. cd l2/build/o1/yang
+ sysrepoctl -i o-ran-sc-odu-alarm-v1.yang
+
+
How to Clean and Build:
-----------------------
1. Building ODU binary:
cd l2/build/odu
b. Building ODU binary
make odu MACHINE=BIT64 MODE=FDD
+
+ Build with O1 module enabled:
+ make odu MACHINE=BIT64 MODE=FDD O1_ENABLE=YES
+
c. Cleaning ODU binary
make clean_odu MACHINE=BIT64 MODE=FDD
c. Cleaning CU Stub binary
make clean_cu NODE=TEST_STUB MACHINE=BIT64 MODE=FDD
-2. Building RIC Stub binary:
+3. Building RIC Stub binary:
a. Build folder
cd l2/build/odu
b. Building RIC Stub binary
4. Cleaning ODU, CU Stub and RIC Stub:
make clean_all
+5. Building O1 binary:
+ a. Build folder
+ cd l2/build/o1
+ b. Building O1 binary
+ make o1 MACHINE=BIT64
+ c. Cleaning O1 binary
+ make clean_o1
+
+
How to execute:
---------------
1. Assign virtual IP addresses as follows:
5. Run RIC Stub binary:
./ric_stub
-4. DU execution folder:
+6. DU execution folder:
cd l2/bin/odu
-5. Run ODU binary:
+7. Run ODU binary:
./odu
+8. O1 execution folder:
+ cd l2/build/o1/bin/o1
+
+9. Run O1 binary:
+ ./o1
+
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
#include "du_utils.h"
#include "du_cell_mgr.h"
+#ifdef O1_ENABLE
+
+#include "GlobalDefs.h"
+#include "AlarmInterface.h"
+
+#endif
+
uint8_t rlcDlCfg = 0;
uint8_t numRlcDlSaps = 0;
uint8_t rlcUlCfg = 0;
{
DU_LOG("\nDU APP : 5G-NR Cell %d is UP", slotInfo->cellId);
cellCb->cellStatus = ACTIVATED;
+
+#ifdef O1_ENABLE
+ DU_LOG("\nDU APP : Raise cell UP alarm for cell id=%d", slotInfo->cellId);
+ raiseCellAlrm(CELL_UP_ALARM_ID, slotInfo->cellId);
+#endif
}
}
{
DU_LOG("\nDU APP : 5G-NR Cell %d is DOWN", cellStopId->cellId);
cellCb->cellStatus = DELETION_IN_PROGRESS;
+
+#ifdef O1_ENABLE
+ DU_LOG("\nDU APP : Raise cell down alarm for cell id=%d", cellStopId->cellId);
+ raiseCellAlrm(CELL_DOWN_ALARM_ID, cellStopId->cellId);
+#endif
}
}
if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 Alarm class defining Netconf Yang based alarm fields */
+
+#ifndef __ALARM_HPP__
+#define __ALARM_HPP__
+
+#include <string>
+#include <string.h>
+#include "Alarm.h"
+
+using std::string;
+
+
+class Alarm
+{
+
+ private:
+ EventType mEventType;
+ string mObjectClassObjectInstance;
+ uint16_t mAlarmId;
+ string mAlarmRaiseTime;
+ string mAlarmChangeTime;
+ string mAlarmClearTime;
+ string mProbableCause;
+ SeverityLevel mPerceivedSeverity;
+ string mRootCauseIndicator;
+ string mAdditionalText;
+ string mAdditionalInfo;
+ string mSpecificProblem;
+
+ public:
+ Alarm(){};
+ ~Alarm(){};
+ /* Getter functions */
+ inline const EventType& getEventType()const
+ {
+ return mEventType;
+ }
+ inline const string& getObjectClassObjectInstance()const
+ {
+ return mObjectClassObjectInstance;
+ }
+ inline const uint16_t& getAlarmId()const
+ {
+ return mAlarmId;
+ }
+ inline const string& getAlarmRaiseTime()const
+ {
+ return mAlarmRaiseTime;
+ }
+ inline const string& getAlarmChangeTime()const
+ {
+ return mAlarmChangeTime;
+ }
+ inline const string& getAlarmClearTime()const
+ {
+ return mAlarmClearTime;
+ }
+ inline const string& getProbableCause()const
+ {
+ return mProbableCause;
+ }
+ inline const SeverityLevel getPerceivedSeverity()const
+ {
+ return mPerceivedSeverity;
+ }
+ inline const string getRootCauseIndicator()const
+ {
+ return mRootCauseIndicator;
+ }
+ inline const string getAdditionalText()const
+ {
+ return mAdditionalText;
+ }
+ inline const string getAdditionalInfo()const
+ {
+ return mAdditionalInfo;
+ }
+ inline const string getSpecificProblem()const
+ {
+ return mSpecificProblem;
+ }
+
+ /* Setter functions */
+ inline void setEventType(const EventType& eventType)
+ {
+ mEventType = eventType;
+ }
+ inline void setObjectClassObjectInstance(const string& objectClassObjectInstance )
+ {
+ mObjectClassObjectInstance = objectClassObjectInstance;
+ }
+ inline void setObjectClassObjectInstance(const char* objectClassObjectInstance )
+ {
+ mObjectClassObjectInstance = objectClassObjectInstance;
+ }
+ inline void setAlarmId(const uint16_t& alarmId)
+ {
+ mAlarmId = alarmId;
+ }
+ inline void setAlarmRaiseTime(const string& alarmRaiseTime)
+ {
+ mAlarmRaiseTime = alarmRaiseTime;
+ }
+ inline void setAlarmRaiseTime(const char* alarmRaiseTime)
+ {
+ mAlarmRaiseTime = alarmRaiseTime;
+ }
+ inline void setAlarmChangeTime(const string& alarmChangeTime)
+ {
+ mAlarmChangeTime = alarmChangeTime;
+ }
+ inline void setAlarmChangeTime(const char* alarmChangeTime)
+ {
+ mAlarmChangeTime = alarmChangeTime;
+ }
+ inline void setAlarmClearTime(const string& alarmClearTime)
+ {
+ mAlarmClearTime = alarmClearTime;
+ }
+ inline void setAlarmClearTime(const char* alarmClearTime)
+ {
+ mAlarmClearTime = alarmClearTime;
+ }
+ inline void setProbableCause(const string& probableCause)
+ {
+ mProbableCause = probableCause;
+ }
+ inline void setProbableCause(const char* probableCause)
+ {
+ mProbableCause = probableCause;
+ }
+ inline void setPerceivedSeverity(const SeverityLevel& perceivedSeverity)
+ {
+ mPerceivedSeverity = perceivedSeverity;
+ }
+ inline void setRootCauseIndicator(const string& rootCauseIndicator)
+ {
+ mRootCauseIndicator = rootCauseIndicator;
+ }
+ inline void setRootCauseIndicator(const char* rootCauseIndicator)
+ {
+ mRootCauseIndicator = rootCauseIndicator;
+ }
+ inline void setAdditionalText(const string& additionalText)
+ {
+ mAdditionalText = additionalText;
+ }
+ inline void setAdditionalText(const char* additionalText)
+ {
+ mAdditionalText = additionalText;
+ }
+ inline void setAdditionalInfo(const string& additionalInfo)
+ {
+ mAdditionalInfo = additionalInfo;
+ }
+ inline void setAdditionalInfo(const char* additionalInfo)
+ {
+ mAdditionalInfo = additionalInfo;
+ }
+ inline void setSpecificProblem(const string& specificProblem)
+ {
+ mSpecificProblem = specificProblem;
+ }
+ inline void setSpecificProblem(const char* specificProblem)
+ {
+ mSpecificProblem = specificProblem;
+ }
+
+
+};
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 Alarm Yang model data filling and sending related methods */
+
+#include "Alarm3GPPYangModel.hpp"
+
+using namespace std;
+
+
+/**********************************************************************
+ Description : It is a callback function, called on get request of
+ alarm-list (overridden function of sysrepo::Callback )
+ Params[In] : (sysrepo::S_Session, module_name, path,
+ request_xpath, request_id, &parent, private_data)
+ Return : SR_ERR_OK - success
+**********************************************************************/
+
+int Alarm3GPPYangModel::oper_get_items(sysrepo::S_Session session,
+ const char *module_name,
+ const char *path,
+ const char *request_xpath,
+ uint32_t request_id,
+ libyang::S_Data_Node &parent,
+ void *private_data)
+{
+ O1_LOG("\n\n ========== CALLBACK CALLED TO PROVIDE \" %s DATA ==========\n", path);
+
+ libyang::S_Context ctx = session->get_context();
+ libyang::S_Module mod = ctx->get_module(module_name);
+
+ parent.reset(new libyang::Data_Node(ctx, ALARM_MODULE_PATH_3GPP, nullptr, LYD_ANYDATA_CONSTSTRING, 0));
+ //read the data from map
+ //tree of alarmRecord : AlarmList/AlarmListGrp/alarmRecordList/AlarmRecordGrp
+
+ libyang::S_Data_Node alarms(new libyang::Data_Node(parent, mod, "AlarmList"));
+ libyang::S_Data_Node alarm(new libyang::Data_Node(alarms, mod, "AlarmListGrp"));
+ libyang::S_Data_Node ifc3(new libyang::Data_Node(parent, mod, "alarmRecordList"));
+ libyang::S_Data_Node ifc4(new libyang::Data_Node(ifc3, mod, "AlarmRecordGrp"));
+
+
+ libyang::S_Data_Node id;
+ libyang::S_Data_Node text;
+ libyang::S_Data_Node severity;
+ libyang::S_Data_Node status;
+ libyang::S_Data_Node add_info;
+
+ //read the data from map
+ map<uint16_t,Alarm>::const_iterator it;
+
+ AlarmManager& alrmMgr = AlarmManager::instance();
+ const map<uint16_t,Alarm>& alrmList = alrmMgr.getAlarmList();
+
+ for(it = alrmList.begin(); it !=alrmList.end(); it++)
+ {
+ O1_LOG("\nAlarm ID %hu", it->second.getAlarmId());
+ alarm.reset(new libyang::Data_Node(alarms, mod, "alarm"));
+ id.reset(new libyang::Data_Node(alarm, mod, "alarm-id", to_string(it->second.getAlarmId()).c_str()));
+ text.reset(new libyang::Data_Node(alarm, mod, "alarm-text", it->second.getAdditionalText().c_str()));
+ severity.reset(new libyang::Data_Node(alarm, mod, "severity", to_string(it->second.getEventType()).c_str()));
+ status.reset(new libyang::Data_Node(alarm, mod, "status", it->second.getSpecificProblem().c_str()));
+ add_info.reset(new libyang::Data_Node(alarm, mod, "additional-info", it->second.getAdditionalInfo().c_str()));
+ }
+ return SR_ERR_OK;
+}
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 Alarm Yang model data filling and sending related methods */
+
+#ifndef __ALARM_3GPP_YANG_MODEL_HPP__
+#define __ALARM_3GPP_YANG_MODEL_HPP__
+
+/*#include <string.h>
+#include <stdlib.h>
+#include "sysrepo-cpp/Session.hpp"
+#include "AlarmManager.hpp"
+#include "GlobalDefs.hpp"
+*/
+
+#include "AlarmOranYangModel.hpp"
+
+class Alarm3GPPYangModel:public sysrepo::Callback {
+ public:
+ int oper_get_items(sysrepo::S_Session session,\
+ const char *module_name,\
+ const char *path,\
+ const char *request_xpath,\
+ uint32_t request_id,\
+ libyang::S_Data_Node &parent,\
+ void *private_data) override;
+};
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 AlarmManager singleton class which is responsible for
+ storing and managing alarms.
+*/
+
+#include <iostream>
+#include "AlarmManager.hpp"
+
+using std::pair;
+
+/* Default constructor */
+AlarmManager::AlarmManager()
+{
+
+}
+
+/* Destructor */
+AlarmManager::~AlarmManager()
+{
+
+}
+
+
+
+/**********************************************************************
+ Description : Raise an Alarm and store it in alarm list
+ Params[In] : Alarm
+ Return : true - insert in map successful
+ false - insert in map unsuccessful
+**********************************************************************/
+bool AlarmManager::raiseAlarm(const Alarm& alarm)
+{
+ pair<map<uint16_t,Alarm>::iterator,bool> ret;
+ ret = mAlarmList.insert(pair<uint16_t,Alarm>(alarm.getAlarmId(),alarm));
+ return ret.second;
+}
+
+
+
+/**********************************************************************
+ Description : Clear an Alarm and delete it from alarm list
+ Params[In] : Alarm instance
+ Return : true - delete successful
+ false - delete unsuccessful
+**********************************************************************/
+bool AlarmManager::clearAlarm(const Alarm& alarm)
+{
+ map<uint16_t,Alarm>::iterator it;
+ bool ret = false;
+ it = mAlarmList.find(alarm.getAlarmId());
+ if( it != mAlarmList.end() )
+ {
+ mAlarmList.erase(it);
+ ret = true;
+ }
+ return ret;
+}
+
+
+/**********************************************************************
+ Description : Clear an Alarm and delete it from alarm list with
+ alarmId
+ Params[In] : Alarm Id
+ Return : true - delete successful
+ false - delete unsuccessful
+**********************************************************************/
+bool AlarmManager::clearAlarm(const uint16_t& alarmId)
+{
+ return (mAlarmList.erase(alarmId) > 0);
+}
+
+
+/**********************************************************************
+ Description : Return the list of active alarms
+ Params[In] : None
+ Return : constant reference to the map<int, Alarm>
+**********************************************************************/
+const map<uint16_t, Alarm>& AlarmManager::getAlarmList()const
+{
+ return mAlarmList;
+}
+
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 AlarmManager singleton class responsible for
+ storing and managing alarms.
+*/
+
+#ifndef __ALARM_MANAGER_HPP__
+#define __ALARM_MANAGER_HPP__
+
+#include <map>
+#include "Alarm.hpp"
+#include "Singleton.hpp"
+
+using std::map;
+
+
+class AlarmManager : public Singleton<AlarmManager>
+{
+
+ friend Singleton<AlarmManager>;
+
+ private:
+ map<uint16_t,Alarm> mAlarmList;
+
+ protected:
+ AlarmManager();
+ ~AlarmManager();
+
+ public:
+ bool raiseAlarm(const Alarm& alarm);
+ bool clearAlarm(const uint16_t& alarmId);
+ bool clearAlarm(const Alarm& alarm );
+ const map<uint16_t, Alarm>& getAlarmList()const;
+
+};
+
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 Alarm Yang model data filling and sending related methods */
+
+#include "AlarmOranYangModel.hpp"
+
+using namespace std;
+
+/**********************************************************************
+ Description : It is a callback function, called on get request of
+ alarm-list (overridden function of sysrepo::Callback )
+ Params[In] : (sysrepo::S_Session, module_name, path,
+ request_xpath, request_id, &parent, private_data)
+ Return : SR_ERR_OK - success
+**********************************************************************/
+
+int AlarmOranYangModel::oper_get_items(sysrepo::S_Session session, \
+ const char *module_name, \
+ const char *path, \
+ const char *request_xpath, \
+ uint32_t request_id, \
+ libyang::S_Data_Node &parent, \
+ void *private_data)
+{
+ O1_LOG("\n\n ========== CALLBACK CALLED TO PROVIDE \" %s DATA ==========\n", path);
+ libyang::S_Context ctx = session->get_context();
+ libyang::S_Module mod = ctx->get_module(module_name);
+
+ //first create root of the tree then add nodes and leaves and fill data
+ parent.reset(new libyang::Data_Node(ctx, ALARM_MODULE_PATH_ORAN, nullptr, LYD_ANYDATA_CONSTSTRING, 0));
+ libyang::S_Data_Node alarms(new libyang::Data_Node(parent, mod, "alarms"));
+
+ libyang::S_Data_Node alarm;
+ libyang::S_Data_Node id;
+ libyang::S_Data_Node text;
+ libyang::S_Data_Node severity;
+ libyang::S_Data_Node status;
+ libyang::S_Data_Node add_info;
+
+ //read the data from map
+ map<uint16_t,Alarm>::const_iterator it;
+
+ AlarmManager& alrmMgr = AlarmManager::instance();
+ const map<uint16_t,Alarm>& alrmList = alrmMgr.getAlarmList();
+ char alarmId[MAX_ALARM_ID_LEN];
+
+ for(it = alrmList.begin(); it !=alrmList.end(); it++)
+ {
+ strcpy(alarmId, to_string(it->second.getAlarmId()).c_str());
+ O1_LOG("\nAlarm ID %s",alarmId);
+ alarm.reset(new libyang::Data_Node(alarms, mod, "alarm"));
+ id.reset(new libyang::Data_Node(alarm, mod, "alarm-id", alarmId));
+ text.reset(new libyang::Data_Node(alarm, mod, "alarm-text", it->second.getAdditionalText().c_str()));
+ severity.reset(new libyang::Data_Node(alarm, mod, "severity", to_string(it->second.getEventType()).c_str()));
+ status.reset(new libyang::Data_Node(alarm, mod, "status", it->second.getSpecificProblem().c_str()));
+ add_info.reset(new libyang::Data_Node(alarm, mod, "additional-info", it->second.getAdditionalInfo().c_str()));
+ }
+
+ return SR_ERR_OK;
+}
+
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 Alarm Yang model data filling and sending related methods */
+
+#ifndef __ALARM_ORAN_YANG_MODEL_HPP__
+#define __ALARM_ORAN_YANG_MODEL_HPP__
+#include <string.h>
+#include <stdlib.h>
+#include "sysrepo-cpp/Session.hpp"
+#include "AlarmManager.hpp"
+#include "GlobalDefs.hpp"
+
+
+class AlarmOranYangModel : public sysrepo::Callback {
+ public:
+ int oper_get_items(sysrepo::S_Session session,\
+ const char *module_name,\
+ const char *path,\
+ const char *request_xpath,\
+ uint32_t request_id,\
+ libyang::S_Data_Node &parent,\
+ void *private_data);
+
+};
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 global definitions for O1 interface modules */
+
+#include "GlobalDefs.hpp"
+
+const short O1::TCP_PORT = 8282;
+const int O1::SUCCESS = 0;
+const int O1::FAILURE = 1;
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 global definitions for O1 interface modules */
+
+#ifndef __GLOBAL_DEFS_HPP__
+#define __GLOBAL_DEFS_HPP__
+
+#include <syslog.h>
+
+#define O1_LOG(...) ( {\
+ printf(__VA_ARGS__);\
+ syslog(LOG_DEBUG,__VA_ARGS__);\
+ } )
+
+#define ALARM_MODULE_NAME_3GPP "_3gpp-common-fm"
+#define ALARM_MODULE_PATH_3GPP "/_3gpp-common-fm:AlarmListGrp"
+#define ALARM_MODULE_NAME_ORAN "o-ran-sc-odu-alarm-v1"
+#define ALARM_MODULE_PATH_ORAN "/o-ran-sc-odu-alarm-v1:odu"
+
+#define MAX_ALARM_ID_LEN 10
+
+class O1
+{
+ public:
+ static const short TCP_PORT;
+ static const int SUCCESS;
+ static const int FAILURE;
+};
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 class is the netconf manager class. It will handle netopeer-server start and stop along with session handler init. Additionally it will provide the
+ signal handling. */
+
+#include "NetconfManager.hpp"
+
+/* Default constructor */
+NetconfManager::NetconfManager()
+{
+}
+
+
+/* Destructor */
+NetconfManager::~NetconfManager()
+{
+ if( NULL != mSessHndl)
+ {
+ delete mSessHndl;
+ }
+}
+
+/**********************************************************************
+ Description : This function will start the netopeer2-server and
+ redirect logs to the /etc/netopeer2-server.log file
+ Params[In] : void
+ Return : true - started successful
+ false - start failed
+**********************************************************************/
+
+bool NetconfManager::startNetopeerServer ()
+{
+ int status = system("netopeer2-server -d -v3 > /etc/netopeer2-server.log 2>&1 &");
+ if (status < 0)
+ {
+ O1_LOG("\nO1 NetconfManager : Error during netopeer server start status : %s",\
+ strerror(errno));
+ }
+ else
+ {
+ if (WIFEXITED(status))
+ O1_LOG("\nO1 NetconfManager : netopeer server started normally with status : %d",\
+ WEXITSTATUS(status));
+ else
+ O1_LOG("\nO1 NetconfManager : netopeer server started abnormally with status : %d",\
+ WEXITSTATUS(status));
+ }
+ return (status == 0);
+}
+
+
+/**********************************************************************
+ Description : This function will stop the netopeer2-server
+ Params[In] : void
+ Return : true - started successful
+ false - start failed
+**********************************************************************/
+bool NetconfManager::stopNetopeerServer(void)
+{
+ int status = system("kill -9 `pidof netopeer2-server`");
+ if (status < 0)
+ {
+ O1_LOG("\nO1 NetconfManager : Error during Netopeer server stopped status : %s\n",\
+ strerror(errno));
+ }
+ else
+ {
+ if (WIFEXITED(status))
+ {
+ O1_LOG("\nO1 NetconfManager : Netopeer server stopped normally with status : %d\n",\
+ WEXITSTATUS(status));
+ }
+ else
+ {
+ O1_LOG("\nO1 NetconfManager : Netopeer server stopped abnormally with status : %d\n",\
+ WEXITSTATUS(status));
+ }
+ }
+ return (status == 0);
+}
+
+
+/**********************************************************************
+ Description : catch and handle the SIGINT signal
+ Params[In] : signum
+ Return : void
+**********************************************************************/
+void NetconfManager::sigintHandler(int signum)
+{
+ if (true != NetconfManager::stopNetopeerServer())
+ {
+ O1_LOG("\nO1 NetconfManager : Error stopping Netopeer server");
+ }
+}
+
+
+/**********************************************************************
+ Description : This function will start the netopeer2-server and
+ session handler
+ Params[In] : void
+ Return : true - started successful
+ false - start failed
+**********************************************************************/
+bool NetconfManager::init(void)
+{
+ if(startNetopeerServer())
+ {
+ O1_LOG("\nO1 NetconfManager : netopeer server started");
+ }
+
+ try
+ {
+ mSessHndl = new SessionHandler;
+
+ O1_LOG("\nO1 NetconfManager : SessionHandler created ");
+
+ if( !mSessHndl->init())
+ {
+ O1_LOG("\nO1 NetconfManager : SessionHandler init failed ");
+ return false;
+ }
+ }
+ catch( const std::exception& e )
+ {
+ O1_LOG("\nO1 O1_main : Exception : %s", e.what());
+ return false;
+ }
+}
+
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 class is the netconf manager class. It creates instance of the
+ SessionHandler that provides connections/sessions related funtionality
+ and signal handling.
+*/
+
+#ifndef __NETCONF_MANAGER_HPP__
+#define __NETCONF_MANAGER_HPP__
+
+#include "SessionHandler.hpp"
+#include "Singleton.hpp"
+
+class NetconfManager : public Singleton<NetconfManager>
+{
+
+ friend Singleton<NetconfManager>;
+
+ public:
+ /*initialize variables*/
+ bool init();
+
+ /*handler for netopeer server*/
+ bool startNetopeerServer(void);
+ static bool stopNetopeerServer(void);
+ static void sigintHandler(int signum);
+
+ /*getter setter for SessionHandler obj*/
+ bool setSessionHandler (SessionHandler sessMgr);
+ SessionHandler getSessionHandler(void);
+
+
+ protected:
+ NetconfManager();
+ ~NetconfManager();
+
+ private:
+ SessionHandler *mSessHndl;
+};
+
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 <signal.h>
+
+/**********************************************************************
+ 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
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 methods of Session/Connection creation and Subscription to
+ YANG modules */
+
+#include "SessionHandler.hpp"
+
+
+/* Default constructor */
+SessionHandler::SessionHandler()
+{
+}
+
+
+/* Destructor */
+SessionHandler::~SessionHandler()
+{
+}
+
+/**********************************************************************
+ Description : This function will create Connection, Session, and
+ subscribe. These sysrepo class provide netconf connection
+ related services.
+ Params[In] : void
+ Return : true - started successful
+ false - start failed
+**********************************************************************/
+bool SessionHandler::init()
+{
+ try
+ {
+ mConn = createConnection();
+ mSess = createSession(mConn);
+ mSub = createSubscribe(mSess);
+ O1_LOG("\nO1 SessionHandler : Initialization done");
+ return true;
+ }
+ catch( const std::exception& e )
+ {
+ O1_LOG("\nO1 SessionHandler : Exception : %s", e.what());
+ return false;
+ }
+}
+
+/**********************************************************************
+ Description : This function will create Connection instance and
+ return the same
+ Params[In] : void
+ Return : sysrepo::S_Connection instance
+**********************************************************************/
+sysrepo::S_Connection SessionHandler::createConnection()
+{
+ sysrepo::S_Connection conn(new sysrepo::Connection());
+ return conn;
+}
+
+
+/**********************************************************************
+ Description : This function will create Session instance and
+ return the same
+ Params[In] : sysrepo::S_Connection
+ Return : sysrepo::S_Session instance
+**********************************************************************/
+sysrepo::S_Session SessionHandler::createSession(sysrepo::S_Connection conn)
+{
+ sysrepo::S_Session sess(new sysrepo::Session(conn));
+ return sess;
+}
+
+
+
+/**********************************************************************
+ Description : This function will create Subscribe instance and
+ return the same
+ Params[In] : sysrepo::S_Session
+ Return : sysrepo::S_Subscribe instance
+**********************************************************************/
+sysrepo::S_Subscribe SessionHandler::createSubscribe(sysrepo::S_Session sess)
+{
+ sysrepo::S_Subscribe subscrb(new sysrepo::Subscribe(sess));
+ if(subscribeModule(subscrb))
+ {
+ O1_LOG("\nO1 SessionHandler : Subscription done successfully");
+ }
+ return subscrb;
+}
+
+
+/**********************************************************************
+ Description : This function will create a callback object and register
+ it for callback.
+ Params[In] : sysrepo::S_Subscribe
+ Return : true - on success
+**********************************************************************/
+bool SessionHandler::subscribeModule(sysrepo::S_Subscribe subscrb)
+{
+ sysrepo::S_Callback alarmOranCb(new AlarmOranYangModel());
+
+ subscrb->oper_get_items_subscribe(ALARM_MODULE_NAME_ORAN, \
+ ALARM_MODULE_PATH_ORAN, \
+ alarmOranCb);
+ return true;
+}
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 SessionHandler class header*/
+
+#ifndef __SESSION_MANAGER_HPP__
+#define __SESSION_MANAGER_HPP__
+
+#include "sysrepo-cpp/Session.hpp"
+#include "Alarm3GPPYangModel.hpp"
+#include "AlarmOranYangModel.hpp"
+
+
+class SessionHandler
+{
+ public:
+ SessionHandler();
+ ~SessionHandler();
+
+ bool init();
+
+
+ private:
+ sysrepo::S_Connection mConn;
+ sysrepo::S_Session mSess;
+ sysrepo::S_Subscribe mSub;
+
+ /*creation of Connection, Session, Subscribe obj functions*/
+ bool subscribeModule(sysrepo::S_Subscribe sub);
+ sysrepo::S_Connection createConnection();
+ sysrepo::S_Session createSession(sysrepo::S_Connection conn);
+ sysrepo::S_Subscribe createSubscribe(sysrepo::S_Session sess);
+};
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 constains a singleton class template */
+
+#ifndef __SINGLETON_HPP__
+#define __SINGLETON_HPP__
+
+template<class T>
+class Singleton
+{
+ public:
+ static T& instance();
+ static T *instancePtr();
+
+ protected:
+ Singleton() { }
+ ~Singleton() { }
+
+ private:
+ static T* mPtr;
+};
+
+/* Define and initialize the static instance pointer */
+template<class T>
+T* Singleton<T>::mPtr = 0;
+
+
+/**********************************************************************
+ Description : Check if instance already exists.
+ Create a new instance if none exists
+ Params[In] : None
+ Return : Reference to the instance
+***********************************************************************/
+template<class T>
+T& Singleton<T>::instance()
+{
+
+ if( mPtr == 0)
+ mPtr = new T();
+
+ return *mPtr;
+}
+
+
+/**********************************************************************
+ Description : Check if instance already exists.
+ Create a new instance if none exists
+ Params[In] : None
+ Return : Pointer to the instance
+***********************************************************************/
+template<class T>
+T *Singleton<T>::instancePtr()
+{
+ return &(instance());
+}
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
+
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 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
+*/
+
+#include "TcpServer.hpp"
+#include "Alarm.hpp"
+#include "AlarmManager.hpp"
+#include "GlobalDefs.hpp"
+#include <iostream>
+#include <cstdio>
+#include <cerrno>
+#include <cstdlib>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+using std::map;
+using std::pair;
+
+/* Destructor */
+TcpServer::~TcpServer()
+{
+
+}
+
+
+/**********************************************************************
+ Description : Read the data from the connected client application
+ Params[In] : fd - File descriptor
+ Return : int - No of bytes read
+**********************************************************************/
+int TcpServer::readMessage(int fd)
+{
+ AlarmRecord alrmRec;
+ bzero(&alrmRec,sizeof(alrmRec));
+ int nbytes = read (fd, &alrmRec, sizeof(alrmRec));
+ if (nbytes > 0)
+ {
+ Alarm alrm;
+ uint16_t alrmId;
+ 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
+ );
+
+ /*Fill the alarm structure */
+ sscanf(alrmRec.alarmId,"%hu",&alrmId);
+ alrm.setAlarmId(alrmId);
+ alrm.setPerceivedSeverity(alrmRec.perceivedSeverity);
+ alrm.setAdditionalText(alrmRec.additionalText);
+ alrm.setEventType(alrmRec.eventType);
+ alrm.setSpecificProblem(alrmRec.specificProblem);
+ alrm.setAdditionalInfo(alrmRec.additionalInfo);
+
+ switch(alrmRec.msgHeader.action)
+ {
+ case RAISE:
+ if(AlarmManager::instance().raiseAlarm(alrm))
+ {
+ O1_LOG("\nO1 TcpServer : Alarm raised for alarm Id %s", alrmRec.alarmId);
+ }
+ else
+ {
+ O1_LOG("\nO1 TcpServer : Error in raising alarm for alrm Id %s", alrmRec.alarmId);
+ }
+ break;
+ case CLEAR:
+ if(AlarmManager::instance().clearAlarm(alrm))
+ {
+ O1_LOG("\nO1 TcpServer : Alarm cleared for alarm Id %s", alrmRec.alarmId);
+ }
+ else
+ {
+ O1_LOG("\nO1 TcpServer : Error in clearing alarm for alarm Id %s", alrmRec.alarmId);
+ }
+ break;
+ default:
+ O1_LOG("\nO1 TcpServer : No action performed");
+ break;
+ }
+
+ }
+ return nbytes;
+}
+
+
+/**********************************************************************
+ Description : Open a TCP socket and bind on the port
+ Params[In] : None
+ Return : O1::SUCCESS - socket open and bind successful
+ O1::FAILURE - socket open and bind failed
+**********************************************************************/
+int TcpServer::makeSocket()
+{
+ struct sockaddr_in name;
+ /* Create the socket. */
+ mSock = socket (PF_INET, SOCK_STREAM, 0);
+ if (mSock < 0)
+ {
+ O1_LOG("\nO1 TcpServer : 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);
+ if (bind (mSock, (struct sockaddr *) &name, sizeof (name)) < 0)
+ {
+ close(mSock);
+ O1_LOG("\nO1 TcpServer : Bind error");
+ return O1::FAILURE;
+ }
+ return O1::SUCCESS;
+}
+
+
+/**********************************************************************
+ Description : Start TCP server in thread
+ Params[In] : None
+ Return : true - task launched in pthread successfully
+ false - task failed to launch
+**********************************************************************/
+bool TcpServer::start()
+{
+ return (pthread_create(&mThreadId, NULL, task, this) == 0);
+}
+
+/**********************************************************************
+ Description : A TCP server to handle multiple connection using
+ select multiplexing
+ Params[In] : None
+ Return : true - task launched in pthread successfully
+ false - task failed to launch
+**********************************************************************/
+bool TcpServer::run()
+{
+
+ fd_set active_fd_set, read_fd_set;
+ int i;
+ struct sockaddr_in clientName;
+ socklen_t size;
+ bool ret = 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");
+ close(mSock);
+ ret = false;
+ }
+ else
+ {
+ /* Initialize the set of active sockets. */
+ FD_ZERO (&active_fd_set);
+ FD_SET (mSock, &active_fd_set);
+
+ while (1)
+ {
+ /* Block until input arrives on one or more active sockets. */
+ read_fd_set = active_fd_set;
+ if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
+ {
+ O1_LOG("\nO1 TcpServer : Select error");
+ close(mSock);
+ ret = false;
+ break;
+ }
+
+ /* Service all the sockets with input pending. */
+ for (i = 0; i < FD_SETSIZE; ++i)
+ {
+ if (FD_ISSET (i, &read_fd_set))
+ {
+ if (i == mSock)
+ {
+ /* Connection request on original socket. */
+ int newFd;
+ bzero(&clientName, sizeof(clientName));
+ size = sizeof (clientName);
+ newFd = accept(mSock,(struct sockaddr *) &clientName,&size);
+ if (newFd < 0)
+ {
+ O1_LOG("\nO1 TcpServer : Accept error");
+ close(mSock);
+ ret = false;
+ break;
+ }
+ O1_LOG("\nO1 TcpServer : Connected from host %s, port %hd.\n",
+ inet_ntoa (clientName.sin_addr),
+ ntohs (clientName.sin_port));
+ FD_SET (newFd, &active_fd_set);
+ }
+ else
+ {
+ /* Data arriving on an already-connected socket. */
+ if (readMessage(i) < 0)
+ {
+ close (i);
+ FD_CLR (i, &active_fd_set);
+ }
+ }
+ }
+ }/* for loop ends */
+ } /* while(1) ends */
+ } /* else ends */
+ } /* outer if ends */
+ else
+ {
+ ret = false;
+ }
+ return ret;
+}
+
+
+/**********************************************************************
+ Description : Static function for launching a TCP server instance
+ in a thread
+ Params[In] : TcpServer instance
+ Return : NULL
+**********************************************************************/
+void* TcpServer::task(void *args)
+{
+ TcpServer *tcpServer = (TcpServer*)args;
+ tcpServer->run();
+ return NULL;
+}
+
+
+/**********************************************************************
+ Description : Wait for the thread to complete in the parent process
+ Params[In] : None
+ Return : true - pthread join success
+ false - pthread join failed
+**********************************************************************/
+bool TcpServer::wait()
+{
+ return (pthread_join(mThreadId,NULL) == 0);
+}
+
+
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 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
+*/
+
+#ifndef __TCP_SERVER_HPP__
+#define __TCP_SERVER_HPP__
+#include <string>
+#include <pthread.h>
+
+using std::string;
+
+class TcpServer
+{
+
+ private:
+ pthread_t mThreadId;
+ int mSock;
+ const int16_t mPort;
+ int readMessage(int);
+ int makeSocket();
+ bool run();
+ static void* task(void*);
+
+ public:
+ bool start();
+ bool wait();
+ TcpServer(const uint16_t port) : mPort(port){};
+ ~TcpServer();
+
+};
+
+#endif
+
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 definitions of Alarm structure */
+
+#ifndef __ALARM_H__
+#define __ALARM_H__
+
+#include <string.h>
+#define ALRM_ID_SIZE 10
+#define OBJ_INST_SIZE 15
+#define TEXT_SIZE 50
+#define DATE_TIME_SIZE 30
+
+typedef enum
+{
+ CRITICAL = 3,
+ MAJOR = 4,
+ MINOR = 5,
+ WARNING = 6,
+ INDETERMINATE = 7,
+ CLEARED = 8
+}SeverityLevel;
+
+typedef enum
+{
+ COMMUNICATIONS_ALARM = 2,
+ QUALITY_OF_SERVICE_ALARM = 3,
+ PROCESSING_ERROR_ALARM = 4,
+ EQUIPMENT_ALARM = 5,
+ ENVIRONMENTAL_ALARM = 6,
+ INTEGRITY_VIOLATION = 7,
+ OPERATIONAL_VIOLATION = 8,
+ PHYSICAL_VIOLATION = 9,
+ SECURITY_SERVICE_OR_MECHANISM_VIOLATION = 10,
+ TIME_DOMAIN_VIOLATION = 11
+}EventType;
+
+typedef enum
+{
+ CLEAR = 0,
+ RAISE = 1
+}AlarmAction;
+
+typedef struct
+{
+ AlarmAction action;
+}MsgHeader;
+
+typedef struct
+{
+ MsgHeader msgHeader;
+ EventType eventType;
+ char objectClassObjectInstance[OBJ_INST_SIZE];
+ char alarmId[ALRM_ID_SIZE];
+ char alarmRaiseTime[DATE_TIME_SIZE];
+ char alarmChangeTime[DATE_TIME_SIZE];
+ char alarmClearTime[DATE_TIME_SIZE];
+ char probableCause[TEXT_SIZE];
+ SeverityLevel perceivedSeverity;
+ char rootCauseIndicator[TEXT_SIZE];
+ char additionalText[TEXT_SIZE];
+ char additionalInfo[TEXT_SIZE];
+ char specificProblem[TEXT_SIZE];
+}AlarmRecord;
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 interfaces to raise and clear alarms */
+
+#include "AlarmInterface.h"
+#include "TcpClient.h"
+
+
+/**********************************************************************
+ Description : Raise an alarm by sending alarm info to O1 module over
+ TCP socket with action set to RAISE
+ Params[In] : Alarm information
+ Return : ROK - success
+ RFAILED - failure
+**********************************************************************/
+uint8_t raiseAlarm(AlarmRecord* alrm)
+{
+ if (openSocket(TCP_SERVER_IP,TCP_PORT) == RFAILED)
+ {
+ return RFAILED;
+ }
+ alrm->msgHeader.action = RAISE;
+ if (sendData(alrm,sizeof(AlarmRecord)) < 0 )
+ {
+ closeSocket();
+ return RFAILED;
+ }
+ closeSocket();
+ return ROK;
+}
+
+/**********************************************************************
+ Description : Clears an alarm raised earlier by sending the alrm
+ information to O1 module over TCP socket with action
+ set to CLEAR
+ Params[In] : Alarm information
+ Return : ROK - success
+ RFAILED - failure
+**********************************************************************/
+uint8_t clearAlarm(AlarmRecord* alrm)
+{
+ if (openSocket(TCP_SERVER_IP,TCP_PORT) == RFAILED)
+ {
+ return RFAILED;
+ }
+ alrm->msgHeader.action = CLEAR;
+ if (sendData(alrm,sizeof(AlarmRecord)) < 0)
+ {
+ closeSocket();
+ return RFAILED;
+ }
+ closeSocket();
+ return ROK;
+}
+
+
+/**********************************************************************
+ Description : Fill the cell specific alarm parmeters and generate
+ the alarm
+ Params[In] : alarm Id, cell Id
+ Return : ROK - success
+ RFAILED - failure
+**********************************************************************/
+uint8_t raiseCellAlrm(uint16_t alrmId, uint16_t cellId)
+{
+ char buff[BUFF_SIZE];
+ time_t now = time(NULL);
+
+ AlarmRecord alrm;
+ alrm.eventType = COMMUNICATIONS_ALARM;
+ snprintf (alrm.alarmId, sizeof(alrm.alarmId), "%d",alrmId);
+ alrm.perceivedSeverity = INDETERMINATE;
+
+ strftime(buff, BUFF_SIZE, "%Y-%m-%d %H:%M:%S", localtime(&now));
+ if(CELL_UP_ALARM_ID == alrmId)
+ {
+ /* Fill cell up parameters */
+ snprintf (alrm.additionalText, sizeof(alrm.additionalText), \
+ "cell id [%d] is up",cellId);
+ strcpy(alrm.additionalInfo , "cell UP");
+ strcpy(alrm.specificProblem, "Active");
+ strcpy(alrm.alarmRaiseTime, buff);
+ }
+ else
+ {
+ /* Clear the cell up alarm */
+ clearCellAlrm(CELL_UP_ALARM_ID);
+ /* Fill the cell down parameters */
+ snprintf (alrm.additionalText, sizeof(alrm.additionalText), \
+ "cell [%d] is down",cellId);
+ strcpy(alrm.additionalInfo , "cell down");
+ strcpy(alrm.specificProblem, "Active");
+ strcpy(alrm.alarmRaiseTime, buff);
+ }
+ /*Raise the alarm */
+ return raiseAlarm(&alrm);
+}
+
+/**********************************************************************
+ Description : Clear the cell alarm
+ Params[In] : alarm Id
+ Return : ROK - success
+ RFAILED - failure
+**********************************************************************/
+uint8_t clearCellAlrm(uint16_t alrmId)
+{
+ AlarmRecord alrm;
+ snprintf (alrm.alarmId, sizeof(alrm.alarmId), "%d",alrmId);
+ return clearAlarm(&alrm);
+}
+
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 interfaces to raise and clear alarms */
+
+#ifndef __ALARM_INTERFACE_H__
+#define __ALARM_INTERFACE_H__
+
+#include <stdint.h>
+#include "Alarm.h"
+#include "ssi.h"
+#include "GlobalDefs.h"
+
+#define BUFF_SIZE 20
+
+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);
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
+
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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. #
+################################################################################
+*******************************************************************************/
+
+/* Class for global defines and constants for O1 interface */
+
+#ifndef __GLOBAL_DEFS_H__
+#define __GLOBAL_DEFS_H__
+
+#include <syslog.h>
+
+#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
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 functions to connect to TCP server and send massages */
+
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+#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;
+
+
+/**********************************************************************
+ Description : Initilize the sockadd_in structure
+ Params[In] : None
+ Return : ROK - success
+ RFAILED - failure
+**********************************************************************/
+static uint8_t initSockaddr()
+{
+
+ 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;
+}
+
+
+/**********************************************************************
+ Description : Open a TCP socket
+ Params[In] : hostName, port
+ Return : ROK - success
+ RFAILED - failure
+**********************************************************************/
+uint8_t openSocket(const char* hostName, const uint16_t port)
+{
+ /* Create the socket. */
+ s_port = port;
+ s_hostName = hostName;
+ s_sock = socket (PF_INET, SOCK_STREAM, 0);
+ if (s_sock < 0)
+ {
+ O1_LOG("\nO1 TcpClient : Error opening socket");
+ return RFAILED;
+ }
+
+ /* Init the sockaddr_in structure */
+ if (initSockaddr() == RFAILED)
+ {
+ return RFAILED;
+ }
+ /* Connect to the server */
+ if (0 > connect (s_sock,
+ (struct sockaddr_in *)&s_serverName ,
+ sizeof (s_serverName)))
+ {
+ O1_LOG("\nO1 TcpClient : Error connecting");
+ return RFAILED;
+ }
+
+ return ROK;
+
+}
+
+/**********************************************************************
+ Description : Send the message on TCP socket
+ Params[In] : message, size of the message
+ Return : Number of bytes sent
+**********************************************************************/
+int sendData(void* data, const int size)
+{
+ int nbytes = write (s_sock, data, size);
+ if (nbytes < 0)
+ {
+ O1_LOG("\nO1 TcpClient : Error writing. %d bytes sent", nbytes);
+ }
+ return nbytes;
+}
+
+/**********************************************************************
+ Description : Close the TCP socket
+ Params[In] : None
+ Return : ROK - success
+ RFAILED - failure
+**********************************************************************/
+uint8_t closeSocket()
+{
+ if( close(s_sock) != 0 )
+ return RFAILED;
+ return ROK;
+}
+
+/**********************************************************************
+ End of file
+**********************************************************************/
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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 functions to connect to a TCP server and send massages */
+
+#ifndef __TCP_CLIENT_H__
+#define __TCP_CLIENT_H__
+#include <stdint.h>
+#include "ssi.h"
+
+uint8_t openSocket(const char*, const uint16_t);
+int sendData(void*, const int);
+uint8_t closeSocket();
+
+#endif
+
+/**********************************************************************
+ End of file
+**********************************************************************/