---
# System prepended metadata

title: 'TEEP@2024 - OSC L2 Setup [ODU-HIGH]'

---

{%hackmd ElOJTlJjTg-GQtxooVV5iw %}


# BUILD OSC O-DU HIGH

![DU_Plugins](https://hackmd.io/_uploads/rJBM3iHdp.png)

## Prerequisites
1. libxml2
```
sudo yum install -y libxml2
```
2. pcap
```
sudo yum install -y libpcap-devel
```
3. GCC
```
sudo yum groups mark install -y “Development Tools”
```
4. lksctp
```
sudo yum install -y libxml2
```
## Clone O-DU L2 Repository
```
$ git clone https://github.com/o-ran-sc/o-du-l2
```
or 
```
git clone “https://gerrit.o-ran-sc.org/r/o-du/l2”
```

## Setup Environment
1. Copy necessary file/library from DPDK to O-DU lib
```
## Change to the directory of header files
$ cd <DPDK Directory>/dpdk-stable-20.11.3/lib/librte_eal/include

## Copy the header files
$ cp rte_branch_prediction.h rte_common.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_per_lcore.h <O-DU High Directory>/l2/src/dpdk_lib
    
## Change to the directory which has rte_config.h
$ cd <DPDK Directory>/dpdk-stable-20.11.3/config
    
## Copy rte_config.h
$ cp rte_config.h <O-DU High Directory>/l2/src/dpdk_lib
    
## Change to the directory which has rte_os.h
$ cd <DPDK Directory>/dpdk-stable-20.11.3/lib/librte_eal/linux/include
    
## Copy rte_os.h
$ cp rte_os.h <O-DU High Directory>/l2/src/dpdk_lib

```

2. Integrate WLS shared library to DU L2 code
```
## Change directory to <O-DU High Directory>/l2/src
$ cd <O-DU High Directory>/l2/src

## Create folder called `wls_lib`
$ mkdir wls_lib

## Change directory to <O-DU Low Directory>/phy
$ cd <O-DU Low Directory>/phy
    
## Copy the content of wls_lib to O-DU High
$ cp -r wls_lib/.  <O-DU High Directory>/l2/src/wls_lib
```

3. Edit make file as your environment
```
$ cd $your_dir/o-du-l2/build/odu/
$ vim ./makefile
```

Adjust the script as your environment

```
L_OPTS+=-lnsl -lrt -lm -lpthread -lsctp 
ifeq ($(PHY), INTEL_L1)
        # -lhugetlbfs -lnuma -ldl -L/root/Intel-L1-20.11.1/dpdk-20.11.1/build/lib                        
        L_OPTS+=-L/home/jsaputro/ORAN/phy/wls_lib/ -lwls                         \
        -lhugetlbfs -lnuma -ldl -L/home/jsaputro/ORAN/dpdk-stable-20.11.3/build/lib                   \
        -lrte_gso -lrte_acl -lrte_hash -lrte_bbdev -lrte_ip_frag -lrte_bitratestats -lrte_ipsec        \
        -lrte_bpf -lrte_jobstats -lrte_telemetry -lrte_kni -lrte_kvargs -lrte_latencystats -lrte_port  \
        -lrte_lpm -lrte_power -lrte_mbuf -lrte_rawdev -lrte_member -lrte_cfgfile -lrte_mempool         \
                  -lrte_cmdline -lrte_rcu -lrte_compressdev -lrte_reorder -lrte_cryptodev -lrte_rib              \
                  -lrte_distributor -lrte_meter  -lrte_ring -lrte_eal -lrte_metrics -lrte_sched -lrte_efd        \
                  -lrte_net -lrte_security -lrte_ethdev -lrte_pci -lrte_stack -lrte_eventdev -lrte_pdump         \
                  -lrte_table -lrte_fib -lrte_pipeline -lrte_timer -lrte_flow_classify -lrte_vhost               \
        -lrte_gro
endif
```

## Build O-DU
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:
      * MACHINE=BIT64/BIT32 - Specify underlying machine type. Default is BIT32
      * NODE=TEST_STUB      - Specify if it is a test node. Mandatory for cu_stub/ric_stub. Must not be used for odu
      * MODE=FDD/TDD        - Specify duplex mode. Default is FDD
      * PHY=INTEL_L1        - Specify type of phy. If not specified, PHY stub is used
      * PHY_MODE=TIMER      - Specify mode of phy. Used only if PHY=INTEL_L1. Default is radio mode
      * 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=<refer section D.1.h>  MODE=<refer section D.1.h>
```
   c. Cleaning ODU binary
```
$ make clean_odu MACHINE=<refer section D.1.h> MODE=<refer section D.1.h>
```

3. Building CU Stub binary:
   a. Build folder
```
$ cd l2/build/odu
```
   b. Building CU Stub binary
```
$ make cu_stub NODE=<refer section D.1.h> MACHINE=<refer section D.1.h> MODE=<refer section D.1.h>
```
   c. Cleaning CU Stub binary
```
$ make clean_cu NODE=<refer section D.1.h> MACHINE=<refer section D.1.h> MODE=<refer section D.1.h>
```

4. Building RIC Stub binary:
   a. Build folder
```
$ cd l2/build/odu
```
   b. Building RIC Stub binary
```
$ make ric_stub NODE=<refer section D.1.h> MACHINE=<refer section D.1.h> MODE=<refer section D.1.h>
```
   c. Cleaning RIC Stub binary
```
$ make clean_ric NODE=<refer section D.1.h> MACHINE=<refer section D.1.h> MODE=<refer section D.1.h>
```

5. Cleaning ODU, CU Stub and RIC Stub:
```
$ make clean_all
```





## Container ODU
1. Build container image using docker or podman [in here uses podman as container platform]


2. Run ODU same as baremetal do

Captures:
1. ODU
![Screenshot from 2024-01-09 21-56-40](https://hackmd.io/_uploads/S1i01louT.png)


2. CU Stub, RIC Stub, fapi
![Screenshot from 2024-01-09 21-56-46](https://hackmd.io/_uploads/HyDWelid6.png)

3. Packet Capture
![Screenshot from 2024-01-09 21-58-10](https://hackmd.io/_uploads/HJdzlxsOT.png)
![Screenshot from 2024-01-09 21-56-50](https://hackmd.io/_uploads/rJ_GegsOa.png)
