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, 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 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 d. cu_stub : Stub code for CU e. du_app : DU application and F1 code f. mt : wrapper functions over OS g. phy_stub : Stub code for Physical layer h. rlog : logging module i. o1 : o1 module B. Pre-requisite for Compilation : ---------------------------------- 1. Linux 32-bit/64-bit machine 2. GCC version 4.6.3 and above 3. Install LKSCTP a. On Ubuntu : sudo apt-get install -y libsctp-dev b. On CentOS : sudo yum install -y lksctp-tools-devel 4. Install PCAP: a. On ubuntu : sudo apt-get install -y libpcap-dev b. On CentOS : sudo yum install -y libpcap-devel C. Pre-requisite for O1 Interface (Required only if run with O1 interface enabled) ----------------------------------------------------------------------------------- 1. Setup netconf server Create new netconf user (login with 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 Install netconf packages. $cd l2/build/scripts $chmod +x install_lib_O1.sh $ ./install_lib_O1.sh -c 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 5. Configure the netconf server details for VES PNF Event $cd l2/build/config Open the netconfConfig.xml and edit the desired MAC address, IP, Port, Username and Password for VES PNF Registration. 6. Configure the VES server details to send VES Events $cd l2/build/config Open the vesConfig.xml and edit the desired IP, Port, Username and Password to send VES Event. D. How to Clean and Build: -------------------------- 1. Build commands: a. odu - Builds all components of ODU b. cu_stub - Builds all CU Stub c. ric_stub - Builds all RIC_Stub d. clean_odu - clean up ODU e. clean_cu - clean up CU Stub f. clean_ric - clean up RIC Stub g. clean_all - cleanup everything h. options: i. MACHINE=BIT64/BIT32 - Specify underlying machine type. Default is BIT32 ii. NODE=TEST_STUB - Specify if it is a test node. Mandatory for cu_stub/ric_stub. Must not be used for odu iii. MODE=FDD/TDD - Specify duplex mode. Default is FDD iv. PHY=INTEL_L1 - Specify type of phy. If not specified, PHY stub is used v. PHY_MODE=TIMER - Specify mode of phy. Used only if PHY=INTEL_L1. Default is radio mode vi. O1_ENABLE=YES - Specify if O1 interface is enabled. If not specified, it is disabled 2. Building ODU binary: a. Build folder cd l2/build/odu b. Building ODU binary make odu MACHINE= MODE= c. Cleaning ODU binary make clean_odu MACHINE= MODE= 3. Building CU Stub binary: a. Build folder cd l2/build/odu b. Building CU Stub binary make cu_stub NODE= MACHINE= MODE= c. Cleaning CU Stub binary make clean_cu NODE= MACHINE= MODE= 4. Building RIC Stub binary: a. Build folder cd l2/build/odu b. Building RIC Stub binary make ric_stub NODE= MACHINE= MODE= c. Cleaning RIC Stub binary make clean_ric NODE= MACHINE= MODE= 5. Cleaning ODU, CU Stub and RIC Stub: make clean_all 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 binary make odu MACHINE= MODE= O1_ENABLE= c. Cleaning ODU binary make clean_odu MACHINE= MODE= O1_ENABLE= 2. Building CU Stub binary: a. Build folder cd l2/build/odu b. Building CU Stub binary make cu_stub NODE= MACHINE= MODE= O1_ENABLE= c. Cleaning CU Stub binary make clean_cu NODE= MACHINE= MODE= O1_ENABLE= 3. Building RIC Stub binary: a. Build folder cd l2/build/odu b. Building RIC Stub binary make ric_stub NODE= MACHINE= MODE= O1_ENABLE= c. Cleaning RIC Stub binary make clean_ric NODE= MACHINE= MODE= O1_ENABLE= 4. Cleaning ODU, CU Stub and RIC Stub: make clean_all 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" PS: If O1 interface is enabled, IP should match those configured in step C.4. 2. Execute CU Stub: a. CU execution folder: cd l2/bin/cu_stub b. Run CU Stub binary: ./cu_stub 3. Execute RIC Stub: a. RIC execution folder: cd l2/bin/ric_stub b. Run RIC Stub binary: ./ric_stub 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 G. How to test with Intel L1: ----------------------------- I. Compilation 1. Build ODU : a. Create folder l2/src/wls_lib. Copy wls_lib.h from /phy/wls_lib/ to l2/src/wls_lib. b. Create folder l2/src/dpdk_lib. Copy following files from /dpdk-19.11/x86_64-native-linuxapp-gcc/include/ to l2/sr c/dpdk_lib. rte_branch_prediction.h rte_common.h rte_config.h rte_dev.h rte_log.h rte_pci_dev_feature_defs.h rte_bus.h rte_compat.h rte_debug.h rte_eal.h rte_os.h rte_per_lcore.h c. Build folder cd l2/build/odu d. Build ODU Binary: make odu PHY= PHY_MODE= MACHINE= MODE= 2. Build CU Stub and RIC Stub: a. Execute steps in sections D.3 and D.4 II. Execution 1. Refer to below link for assumptions, dependencies, pre-requisites etc for ODU-Low execution https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/ 2. Execute L1: a. Setup environment: cd /phy/ source ./setupenv.sh b. Run L1 binary : cd /FlexRAN/l1/bin/nr5g/gnb/l1 To run i. In timer mode : ./l1.sh -e ii. In radio mode : ./l1.sh -xran L1 is up when console prints follow: Non BBU threads in application =========================================================================================================== nr5g_gnb_phy2mac_api_proc_stats_thread: [PID:   8659] binding on [CPU  0] [PRIO:  0] [POLICY:  1] wls_rx_handler (non-rt):                [PID:   8663] binding on [CPU  0] ===========================================================================================================   PHY>welcome to application console 3. Execute FAPI Translator: a. Setup environment: cd /phy/ source ./setupenv.sh b. Run FAPI translator binary: cd /phy/fapi_5g/bin/ ./oran_5g_fapi --cfg=oran_5g_fapi.cfg 4. Execute CU Stub and RIC Stub: a. Run steps in sections E.1-E.3 5. Execute DU: a. DU execution folder cd l2/bin/odu b. Export WLS library path export LD_LIBRARY_PATH=/phy/wls_lib/lib:$LD_LIBRARY_PATH c. Run ODU binary ./odu H. How to execute the Health Check : get alarm-list ---------------------------------------------------- Steps: 1. Start Netconf netopeer client 2. Connect to the server with user: netconf pwd: netconf! 3. Send a Netconf get request for alarms xpath Here are the steps as executed in the terminal $netopeer2-cli > connect --login netconf Interactive SSH Authentication Type your password: Password: > get --filter-xpath /o-ran-sc-odu-alarm-v1:odu/alarms DATA 1009 cell id [1] is up 2 Active cell UP The XML output is a list of active alarms in the O-DU High system.