README

December 10, 2024 · View on GitHub

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

  4. l2/container/ : contains helm charts of DU, CU and RIC a. cu_helm : CU helm chart b. du_helm : DU helm chart c. ric_helm : RIC helm chart

  5. l2/tools/ : a. Fapi_Decoder : Decodes FAPI messages b. Memory_Leak_Detector : Detects memory leaks

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
  5. Install libxml2: a. On Ubuntu : sudo apt-get install -y libxml2-dev b. On CentOS : sudo yum install -y libxml2

C. Pre-requisite for O1 Interface (Required only if run with O1 interface enabled)

  1. Setup netconf server

    a. Add new netconf user (login with root user or use sudo and run following script) cdl2/build/scriptscd l2/build/scripts sudo ./add_netconf_user.sh

    b. Install netconf packages. chmod+xinstalllibO1.shchmod +x install_lib_O1.sh sudo ./install_lib_O1.sh -c

  2. Update the configuration according to your setup.

    $cd l2/build/config

    a. Open the startup_config.xml and edit the desired IP and Port for CU, DU and RIC. b. Open the nacm_config.xml and edit the desired user name to provide the access to that user. c. Open the netconf_server_ipv6.xml and edit the desired netconf server configuration. d. Open the oamVesConfig.json and edit the details of OAM VES collector. e. Open the smoVesConfig.json and edit the details of SMO VES collector. f. Open the netconfConfig.json and edit the details of Netopeer server.

  3. Install the yang modules and load initial configuration:

    cdl2/build/scriptscd l2/build/scripts sudo ./load_yang.sh

  4. Start Netopeer2-server:

    cdl2/build/scriptscd l2/build/scripts sudo ./netopeer-server.sh start

  5. In case standard defined VES format is to be enabled (this step is optional):

    cd l2/src/o1/ves

    Enable the Macro "StdDef" in file VesUtils.h

    #define StdDef

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.2.a.

  1. Execute CU Stub: a. CU execution folder: cd l2/bin/cu_stub b. Run CU Stub binary: ./cu_stub

  2. Execute RIC Stub: a. RIC execution folder: cd l2/bin/ric_stub b. Run RIC Stub binary: ./ric_stub

  3. 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 In case O1 is enabled and SMO is not available run section H to start the stack.

G. How to test with Intel L1:

I. Compilation

  1. Build ODU : a. Create folder l2/src/wls_lib. Copy wls_lib.h from <intel_directory>/phy/wls_lib/ to l2/src/wls_lib. b. Create folder l2/src/dpdk_lib. Copy following files from <intel_directory>/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 <intel_directory>/phy/
            source ./setupenv.sh
   b. Run L1 binary :
            cd <intel_directory>/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 <intel_directory>/phy/
            source ./setupenv.sh
   b. Run FAPI translator binary:
            cd <intel_directory>/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=<intel_directory>/phy/wls_lib/lib:$LD_LIBRARY_PATH
   c. Run ODU binary
      	./odu

H. Push cell and slice configuration over O1 using netopeer-cli

When O-DU High is run with O1 enabled it waits for initial cell configuration to be pushed by SMO before starting the stack. In case the SMO is not available then these configurations can be pushed via netopeer-cli as follows:

  $cd l2/build/config
  $netopeer2-cli
   > connect --login netconf
   Interactive SSH Authentication
   Type your password:
   Password: netconf!
   > edit-config --target candidate --config=cellConfig.xml
   > OK
   > commit
   > OK
   > edit-config --target candidate --config=rrmPolicy.xml
   > OK
   > commit
   > OK

For pushing these configurations in subsequent runs please edit cellConfig.xml and rrmPolicy.xml and increment number in the tag to a new value e.g.

<id>rrm-2</id 

I. How to execute the Health Check using netopeer-cli : get alarm-list

In case the SMO is not available the alarm list can be checked using netopeer-cli as follows:

  $netopeer2-cli
   > connect --login netconf
   Interactive SSH Authentication
   Type your password:
   Password: netconf!
   > get --filter-xpath /o-ran-sc-odu-alarm-v1:odu/alarms
   DATA
   <odu xmlns="urn:o-ran:odu:alarm:1.0">
     <alarms>
       <alarm>
         <alarm-id>1009</alarm-id>
         <alarm-text>cell id  [1] is up</alarm-text>
         <severity>2</severity>
         <status>Active</status>
         <additional-info>cell UP</additional-info>
       </alarm>
     </alarms>
   </odu>

The XML output is a list of active alarms in the O-DU High system.

J. Troubleshooting Netconf server issues

In case the Netconf server and sysrepo breaks down, run the following steps:

cdl2/build/scriptscd l2/build/scripts sudo ./troubleshoot_netconf.sh cleanup execute section C.3 and C.4 again

K. Running the DU, CU Stub and RIC Stub in containerization mode

  1. Pre-requisite for Running in Containerization Mode

    • Install Docker

    • Set Up Kubernetes Cluster Using Minikube and Use Docker as the Driver

  2. Steps to Run the DU, CU Stub, and RIC Stub in Containerization Mode a. Clone and compile the Code - Create a directory: i. mkdir ODU_CONTAINER

     - Navigate to the directory:
         i. cd ODU_CONTAINER
    
     - Clone the repository:
         i. git clone "https://gerrit.o-ran-sc.org/r/o-du/l2"
    
     - Compilation steps are mentioned in section d.
    

    b. Set Docker Environment - Set up Docker environment for Minikube: i. eval $(minikube docker-env)

    c. Generate Docker Images - Navigate to the l2 directory: i. cd l2

     - Build the Docker images:
         i.   docker build -f Dockerfile.cu -t new-cu-container:v1 .
         ii.  docker build -f Dockerfile.ric -t new-ric-container:v1 .
         iii. docker build -f Dockerfile.du -t new-du-container:v1 .
    

    d. Check Docker Images - Run the following command to check if the Docker images are created: i. docker images

    e. Deploy with Helm - Go to the container/cu_helm directory and deploy the ocu chart: i. cd container/cu_helm ii. helm install ocu cu

     - Go to the du_helm directory and deploy the odu chart:
         i.  cd ../du_helm
         ii. helm install odu du
    
     - Go to the ric_helm directory and deploy the ric chart:
         i.  cd ../ric_helm
         ii. helm install ric ric
    

    f. Get Pod, Deployment, and Service Info - Run the following command to get information about the pod, deployment, and service: i. kubectl get all

    g. Run the Pods in Separate Terminals - Terminal 1 (CU Pod): i. kubectl exec -it <CU_POD_NAME> -- bash ii. ./cu-docker-entrypoint.sh iii. cd /root/l2/build/odu/bin iv. ./cu_stub/cu_stub

     - Terminal 2 (RIC Pod):
         i. kubectl exec -it <RIC_POD_NAME> -- bash
         ii. ./ric-docker-entrypoint.sh
         iii. cd /root/l2/build/odu/bin
         iv. ./ric_stub/ric_stub
    
     - Terminal 3 (DU Pod):
         i. kubectl exec -it <DU_POD_NAME> -- bash
         ii. ./docker-entrypoint.sh
         iii. cd /root/l2/bin
         iv. ./odu/odu