---
# System prepended metadata

title: 'O-DU Installation Guide [Rel. F]'
tags: [NTUST O-RAN]

---

---
title: 'O-DU Installation Guide [Rel. F]'
disqus: hackmd
---

O-DU Installation Guide [Rel. F]
===

![downloads](https://img.shields.io/github/downloads/atom/atom/total.svg)
![build](https://img.shields.io/appveyor/ci/:user/:repo.svg)
![chat](https://img.shields.io/discord/:serverId.svg)

# 目錄
[TOC]

# Server Specifications
If you are first time to install O-DU Low in the new environment or new HDD, remember to adjust your OS Setting as below
Refer to : https://github.com/intel/FlexRAN#os-configuration
## server 1
![](https://i.imgur.com/2t7Y6Ja.png)

# System installation settings
## Bios Configuration
### Advanced -> Power & Performance
```gherkin=
CPU Power and Performance Policy : Performance
```
### Advanced -> Power & Performance -> Uncore Power Management

```gherkin=
Uncore Frequency Scaling : Disabled
Performance P-limit : Disabled
```
### Advanced -> Power -> CPU P State Control
```gherkin=
Enhanced Intel SpeedStep (R) Tech : Enabled
Intel Configurable TDP : Enabled
Configurable TDP Level : Level 2
Intel(R) Turbo Boost Technology : Enabled
Energey Efficient Turbo : Disabled 
```

### Advanced -> Power & Performance -> Hardware P States
```gherkin=
Hardware P-States : Disabled
```

### Advanced -> Power & Performance -> CPU C States Control
```gherkin=
Package C-State : C0/C1 state
C1E : Disabled
Processor C6 : Disabled
```

## OS configuration
First you should install CentOS 7 (7.5+) from CentOS official site, then install Real Time kernel and required tools to tune the OS real timer performance. CentOS 7.7 and RT kernel kernel-rt-3.10.0-1062.12.1.rt56.1042 have been validated for this release.

```gherkin=
yum install -y kernel-rt kernel-rt-devel kernel-rt-kvm rtctl rt-setup rt-tests tuna tuned-profiles-nfv tuned-profiles-nfv-host tuned-profiles-nfv-guest qemu-kvm-tools-ev
```

### root 權限設定

```gherkin=
1）進入超級用戶模式。也就是輸入 su - ,系統會讓你輸入超級用戶密碼，輸入密碼後就進入了超級用戶模式。
2）添加文件的寫權限。也就是輸入命令 chmod u+w /etc/sudoers。
3）編輯/etc/sudoers文件，也就是輸入命令 nano /etc/sudoers，找到這一行： root ALL=(ALL) ALL 在這下面添加 xxx ALL=(ALL) ALL (這裡的xxx是你的用戶名)
```

### Install RT Kernel
1. Download kernel-rt
* Here we need use https://linuxsoft.cern.ch/cern/centos/7/rt/x86_64/Packages/kernel-rt-3.10.0-1062.12.1.rt56.1042.el7.x86_64.rpm

```gherkin=
uname -a
sudo wget https://linuxsoft.cern.ch/cern/centos/7/rt/x86_64/Packages/kernel-rt-3.10.0-1062.12.1.rt56.1042.el7.x86_64.rpm
```
* ![](https://i.imgur.com/kyC95IU.png)

2. Install other packages first
* Before install the kernel-rt, you need to install the following packages(must be in order)

tuna
```gherkin=
sudo yum install -y tuna
rpm -q tuna
```
* ![](https://i.imgur.com/Fbjy9Jj.png)
tuned
```gherkin=
sudo wget https://linuxsoft.cern.ch/cern/centos/7/rt/x86_64/Packages/tuned-2.9.0-1.el7fdp.noarch.rpm
sudo yum remove tuned.noarch -y
sudo rpm -ivh tuned-2.9.0-1.el7fdp.noarch.rpm
rpm -q tuned
```
* ![](https://i.imgur.com/6oyBrCb.png)

tuned-profiles-realtime
```gherkin=
sudo wget http://mirror.centos.org/centos/7/rt/x86_64/Packages/tuned-profiles-realtime-2.9.0-1.el7fdp.noarch.rpm
sudo rpm -ivh tuned-profiles-realtime-2.9.0-1.el7fdp.noarch.rpm
rpm -q tuned-profiles-realtime
```
* ![](https://i.imgur.com/kOGWxbg.png)

rt-setup
```gherkin=
sudo wget http://mirror.centos.org/centos/7/rt/x86_64/Packages/rt-setup-2.0-9.el7.x86_64.rpm
sudo rpm -ivh rt-setup-2.0-9.el7.x86_64.rpm
rpm -q rt-setup
```
* ![](https://i.imgur.com/g1RTNjD.png)
3. Install the kernel-rt
```gherkin=
sudo wget https://linuxsoft.cern.ch/cern/centos/7/rt/x86_64/Packages/kernel-rt-3.10.0-1062.12.1.rt56.1042.el7.x86_64.rpm
sudo rpm -ivh kernel-rt-3.10.0-1062.12.1.rt56.1042.el7.x86_64.rpm
rpm -q kernel-rt
```
* ![](https://i.imgur.com/YNUKYjX.png)
4. Real-time Kernel Patching
* https://wiki.archlinux.org/title/Realtime_kernel_patchset
```gherkin=
sudo yum-config-manager --add-repo=http://linuxsoft.cern.ch/cern/centos/7/rt/CentOS-RT.repo
```
* Set **gpgcheck=1 to gpgcheck=0** for each entry in /etc/yum.repos.d/CentOS-RT.repo
* 路徑需要對，不然會找不到此資料夾
* ![](https://i.imgur.com/5OcbJAm.png)

```gherkin=
sudo nano /etc/yum.repos.d/CentOS-RT.repo 
```
* ![](https://i.imgur.com/z9colFk.png)

* Install the yum group RealTime via
```gherkin=
sudo yum group install -y RealTime
```

* Install other packages
```gherkin=
sudo yum update -y
sudo yum install -y rt-tests
```

* Reboot server
```gherkin=
sudo reboot
```

* use uname -a to check the kernel is rt kernel
```gherkin=
uname -a
```
* ![](https://i.imgur.com/L5KyxMT.png)

* Centos 7 upgrade and switch kernel : 如需使用指定舊版本或是新版本時可切換
```gherkin=
uname -r #查看當前版本
cat /boot/grub2/grub.cfg |grep "menuentry " # 查看所有可用內核
rpm -qa |grep kernel-[0-9] # 查看全部內核包
grub2-set-default 'CentOS Linux (3.10.0-1062.12.1.rt56.1042.el7.x86_64) 7 (Core)' #設置默認啟動的內核
grub2-editenv list # 查看內核修改結果
yum remove kernel-3.10.0-1160.76.1.el7.x86_64 # 刪除指定的無用內核

sudo awk -F\' /^menuentry/{print\$2} /etc/grub2.cfg #列出目前安裝的內核
-------------------------------------------------------------
CentOS Linux (3.10.0-1160.80.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1062.12.1.rt56.1042.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-98d012eba8c7443aa602c226f7d2baed) 7 (Core)
---------------------------------------------------------------
sudo grub2-set-default 2 #根據上面列出的內核，它們從上到下編號。初始編號為0

sudo cat /boot/grub2/grubenv |grep saved #檢查設置是否配置

sudo grub2-mkconfig -o /boot/grub2/grub.cfg # 重建 GRUB2


```
* My build log
* https://1drv.ms/t/s!AtLp1AqbBT3_hQdhcQ4sVK9dkQ7q?e=V8Z7Za

### Install other packages
1. Install NFV packages
packager source : https://cbs.centos.org/koji/buildinfo?buildID=27696

qemu-kvm-tools-ev
```gherkin=
sudo wget http://ftp.ksu.edu.tw/FTP/CentOS/7/virt/x86_64/kvm-common/Packages/q/qemu-kvm-tools-ev-2.12.0-33.1.el7_7.4.x86_64.rpm
sudo rpm -ivh qemu-kvm-tools-ev-2.12.0-33.1.el7_7.4.x86_64.rpm
rpm -q qemu-kvm-tools-ev
```
* ![](https://i.imgur.com/qRPNx7u.png)



tuned-profiles-nfv-host
```gherkin=
sudo wget http://mirror.centos.org/centos/7/rt/x86_64/Packages/tuned-profiles-nfv-host-2.9.0-1.el7fdp.noarch.rpm
sudo rpm -ivh tuned-profiles-nfv-host-2.9.0-1.el7fdp.noarch.rpm
rpm -q tuned-profiles-nfv-host
```
* ![](https://i.imgur.com/ZggB6Zl.png)

tuned-profiles-nfv-guest
```gherkin=
sudo wget http://mirror.centos.org/centos/7/rt/x86_64/Packages/tuned-profiles-nfv-guest-2.9.0-1.el7fdp.noarch.rpm
sudo rpm -ivh tuned-profiles-nfv-guest-2.9.0-1.el7fdp.noarch.rpm
rpm -q tuned-profiles-nfv-guest
```
* ![](https://i.imgur.com/Sc6NS4A.png)

tuned-profiles-nfv
```gherkin=
sudo wget http://mirror.centos.org/centos/7/rt/x86_64/Packages/tuned-profiles-nfv-2.9.0-1.el7fdp.noarch.rpm
sudo rpm -ivh tuned-profiles-nfv-2.9.0-1.el7fdp.noarch.rpm
rpm -q tuned-profiles-nfv
```

* ![](https://i.imgur.com/UZVdEYh.png)



2.  Install other RT packages
    *  Packages version Must be installed same as kernel-rt (3.10.0-1062.12.1.rt56.1042.el7.x86_64)

kernel-rt-devel
```gherkin=
sudo wget https://linuxsoft.cern.ch/cern/centos/7/rt/x86_64/Packages/kernel-rt-devel-3.10.0-1062.12.1.rt56.1042.el7.x86_64.rpm
sudo rpm -ivh kernel-rt-devel-3.10.0-1062.12.1.rt56.1042.el7.x86_64.rpm 
rpm -q kernel-rt-devel
```
* ![](https://i.imgur.com/EtLYCot.png)

rtctl
```gherkin=
sudo wget https://linuxsoft.cern.ch/cern/centos/7/rt/x86_64/Packages/rtctl-1.13-2.el7.noarch.rpm
sudo rpm -ivh rtctl-1.13-2.el7.noarch.rpm
rpm -q rtctl
```
* ![](https://i.imgur.com/3aqGrCN.png)

* My build log
```gherkin=

```

### Tune the RT kernel performance
1. Edit /etc/tuned/realtime-virtual-host-variables.conf to add isolated_cores:
 * Below give one example to tune the RT kernel performance for Intel Cascade Lake CPU 6248 Edit /etc/tuned/realtime-virtual-host-variables.conf to add isolated_cores=1-19:

```gherkin=
sudo nano /etc/tuned/realtime-virtual-host-variables.conf 

# Examples: Here's the example of setting isolated_cores while having two CPUs and enable HT
# isolated_cores=1- <Equation 1*Equation 2 -1>
# 
isolated_cores=1-19
```


2. Activate Real Time Profile
```gherkin=
tuned-adm profile realtime-virtual-host
```



3. Edit /etc/default/grub
* Append the following to the GRUB_CMDLINE_LINUX
```gherkin=
sudo nano /etc/default/grub
```
將下列文字內容複製到文件內

```gherkin=
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT:+$GRUB_CMDLINE_LINUX_DEFAULT }\$tuned_params"
GRUB_INITRD_OVERLAY="${GRUB_INITRD_OVERLAY:+$GRUB_INITRD_OVERLAY }\$tuned_initrd"
GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX_DEFAULT:+$GRUB_CMDLINE_LINUX_DEFAULT }\$tuned_params"
GRUB_INITRD_OVERLAY="${GRUB_INITRD_OVERLAY:+$GRUB_INITRD_OVERLAY }\$tuned_initrd"
```

4. Update the grub
* Apply the kernel-rt profile that we just modified to the grub

```gherkin=
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
```
* If you are using a UEFI based system
```gherkin=
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
```
5. Reboot the server
```gherkin=
sudo reboot
```

6. Check the kernel parameter
* 來自Intel Flrexran的內核參數範例 https://github.com/intel/FlexRAN#os-configuration
```gherkin=
cat /proc/cmdline
```

* ![](https://i.imgur.com/7L8G74M.png)




7. Set CPU Frequency Policy to Performance.
```gherkin=
sudo cpupower frequency-set -g performance
```
* ![](https://i.imgur.com/JpOm56b.png)

8. Set CPU frequency using msr-tools
```gherkin=
git clone https://github.com/intel/msr-tools/
cd msr-tools/
git checkout msr-tools-1.3
make
cat <<EOF > turbo-2.5G.sh
#!/bin/sh
for i in {0..39}
do
#Set core 0-39 to 2.5GHz (0x1900). Please change according to your CPU model
./wrmsr -p \${i} 0x199 0x1900
done
#Set Uncore to Max
./wrmsr -p 0 0x620 0x1e1e
./wrmsr -p 39 0x620 0x1e1e
EOF
chmod 755 turbo-2.5G.sh
sh turbo-2.5G.sh
```
10. RT Test and Verify the test result
```gherkin=
sudo cyclictest -m -p95 -d0 -a 0-15 -t 16
```

# Build O-DO low

## Prerequisite
### Download odu/l2
```gherkin=
git clone -b f-release "https://gerrit.o-ran-sc.org/r/o-du/l2"
```
### Download odu/phy
```gherkin=
git clone "https://gerrit.o-ran-sc.org/r/o-du/phy"
```

### Download l1app
1. Download the Git-LFS
```gherkin=
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
```

2. Install Git-LFS
```gherkin=
sudo yum install git-lfs -y
```

3. Set up Git LFS for your user account by running:
```gherkin=
git lfs install
```

* ![](https://i.imgur.com/IVGLhd6.png)


4. Download l1app
```gherkin=
git clone https://github.com/intel/FlexRAN.git
```

## O-DU Low Installation
### Download and Install oneAPI
1. Download and Install oneAPI
```gherkin=
#Download the oneAPI installer
wget https://registrationcenter-download.intel.com/akdlm/irc_nas/18673/l_BaseKit_p_2022.2.0.262_offline.sh
#Install oneAPI
sudo sh ./l_BaseKit_p_2022.2.0.262_offline.sh
```
#### One Api 安裝步驟

1. 下一步
![](https://i.imgur.com/THnzWe8.png)
2. Recommended install 是預設安裝全部套件
3. custom install 是選擇要安裝什麼套件
![](https://i.imgur.com/vQeJppz.png)
4. 下一步
![](https://i.imgur.com/Xy5uFO3.png)
5. 選擇 skip Eclipse IDE
![](https://i.imgur.com/mTWx8Eu.png)
6. 下一步
![](https://i.imgur.com/7LNb3MZ.png)
7. Setup ICX(oneAPI) environment variable
```gherkin=
nano ~/.bashrc
# 將下列命令寫在文件變數中
source /opt/intel/oneapi/setvars.sh
export PATH=$PATH:/opt/intel/oneapi/compiler/2022.1.0/linux/bin
```
8. Check the version of ICX
```gherkin=
icx --version
```
![](https://i.imgur.com/02mLG7N.png)
### Install DPDK 20.11.3
1. Install python3 & pip3 (If you have installed them, you can skip this step)
```gherkin=
sudo yum install epel-release python36 python3-pip -y
```
2. Install meson & ninja (If you have installed them, you can skip this step)
```gherkin=
sudo pip3 install meson
sudo yum -y install ninja-build
```
![](https://i.imgur.com/leYwjwS.png)
![](https://i.imgur.com/kId4OCU.png)

3. Download DPDK
```gherkin=
wget http://static.dpdk.org/rel/dpdk-20.11.3.tar.xz
tar -xf dpdk-20.11.3.tar.xz 
```
4. Set up the environment variable
```gherkin=
nano ~/.bashrc
export RTE_TARGET=x86_64-native-linuxapp-icx
export RTE_SDK=/home/osc/dpdk-stable-20.11.3
export WIRELESS_SDK_TOOLCHAIN=icx
export SDK_BUILD=build-avx512-icc
export PATH=$PATH:/opt/intel/oneapi/compiler/2022.1.0/linux/bin-llvm/
```

5. Modify the meson_options.txt
```gherkin=
cd dpdk-stable-20.11.3
nano meson_options.txt
```
:::success
In meson_options.txt
Before:
```gherkin=
option('machine', type: 'string', value: **'native'**,
        description: 'set the target machine type')
```

After:
```gherkin=
option('machine', type: 'string', value: **'default'**,
        description: 'set the target machine type')
```
:::
6. Edit Patch

* Edit drivers/net/i40e/i40e_ethdev.c
```gherkin=
none dpdk-stable-20.11.3/drivers/net/i40e/i40e_ethdev.c
```
* Change i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_DEFAULT); 
* into i40e_vsi_queues_bind_intr(main_vsi, I40E_ITR_INDEX_NONE)

![](https://i.imgur.com/bbSuQum.png)
* Add some lines in about line 2485
```gherkin=
i40e_aq_debug_write_global_register(hw,
                        0x0012A504,
                        0, NULL);
```
![](https://i.imgur.com/sO7it0H.png)
* Edit drivers/net/i40e/i40e_ethdev_vf.c
```gherkin=
none dpdk-stable-20.11.3/drivers/net/i40e/i40e_ethdev_vf.c
```
* Change map_info->vecmap[0].rxitr_idx = I40E_ITR_INDEX_DEFAULT; 
* into map_info->vecmap[0].rxitr_idx = I40E_ITR_INDEX_NONE

![](https://i.imgur.com/afIZwTE.png)

* Edit drivers/net/ixgbe/ixgbe_ethdev.c
```gherkin=
nano dpdk-stable-20.11.3/drivers/net/ixgbe/ixgbe_ethdev.c
```
* Change hw->mac.type != ixgbe_mac_82598EB
* into hw->mac.type != ixgbe_mac_82598EB && hw->mac.type != ixgbe_mac_82599EB

![](https://i.imgur.com/2ODlBlu.png)

7. Build DPDK
```gherkin=
meson build
cd build
ninja
ninja install
```

8. My build steps log
* https://1drv.ms/t/s!AtLp1AqbBT3_hQS85fC4Ssx99ge6?e=hM4Yhs
### Install Google Test

#### Background
:::info
* Google Test is a unit testing library for the C++ programming language, based on the xUnit architecture.
* Used by O-DU Low
:::

1. Download google test
https://github.com/google/googletest/releases/tag/release-1.7.0

```gherkin=
cd ~
wget https://github.com/google/googletest/archive/release-1.7.0.tar.gz
tar -xvf release-1.7.0.tar.gz
# change folder name
mv googletest-release-1.7.0 gtest-1.7.0
```

2. Build and installation

```gherkin=
#Install GCC from repository
sudo yum -y update
sudo yum -y install gcc
gcc --version #check version
sudo yum -y install gcc-c++

#modify variable
export GTEST_DIR=~/gtest-1.7.0
cd ${GTEST_DIR}
g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} -pthread -c ${GTEST_DIR}/src/gtest-all.cc
```

* build libgtest.a
```gherkin=
ar -rv libgtest.a gtest-all.o
```

![](https://i.imgur.com/ALKYBYq.png)
* cmake google-test & cmake is used to install google-test
```gherkin=
#install cmake 3.15.5
wget https://github.com/Kitware/CMake/releases/download/v3.15.5/cmake-3.15.5.tar.gz
tar -zxf cmake-3.15.5.tar.gz
cd cmake-3.15.5
./bootstrap --prefix=/usr --datadir=share/cmake --docdir=doc/cmake && make
sudo make install
cmake --version

#cmake is used to install google-test
cd ${GTEST_DIR}/build-aux
cmake ${GTEST_DIR}
```

![](https://i.imgur.com/ar28zII.png)

```gherkin=
make
```

![](https://i.imgur.com/8SWogn5.png)
* build linked file
```gherkin=
cd ${GTEST_DIR}
ln -s build-aux/libgtest_main.a libgtest_main.a
```

#### Set the google test Path
* Add gtest path to bashrc so that linux can recognize installed google test
```gherkin=
sudo nano ~/.bashrc

export DIR_ROOT_GTEST=~/gtest-1.7.0
export GTEST_ROOT=/home/osc/gtest-1.7.0
# Apply it
source ~/.bashrc
```
### Set up the environment

:::info
Remember to modify the path according to your own directory, this environtment is used in all O-DU-PHY installation.
:::

1. Set the environment variable
```gherkin=
sudo nano phy/setupenv.sh
source phy/setupenv.sh
```

![](https://i.imgur.com/p0ECrQg.png)
2. Append the command into .bashrc file

Whenever you start a session, it will run the all commands in .bashrc file automatically.

```gherkin=
# Edit the .bashrc file
nano ~/.bashrc
# Append the command below into the file
source phy/setupenv.sh
```

![](https://i.imgur.com/23NL3oC.png)


3. My build steps log
* https://1drv.ms/t/s!AtLp1AqbBT3_hQZacQjipwD7S5De?e=ypbnmf

### Install xRAN Library (FHI Library)
:::warning
環境路徑設定
* 記得根據自己的目錄修改路徑，所有O-DU-PHY安裝都會用到這個環境。
* 確保在 shell 文件中使用絕對路徑
* 確保所有變量都在你的setupenv.sh上（下面有一個例子）

**- Important parameter to double check**

| Parameter               | Filled with                          | Example                       |
| ----------------------- | ------------------------------------ | ----------------------------- |
| DIR_ROOT_L1_BIN         | your FlexRAN folder path             | /home/osc/FlexRAN             |
| DIR_ROOT_PHY            | your phy folder path                 | /home/osc/phy                 |
| DIR_ROOT_DPDK           | your dpdk installation folder path   | /home/osc/dpdk-stable-20.11.3 |
| DIR_ROOT_GTEST          | your google test installation folder | /home/osc/gtest-1.7.0         |
| WIRELESS_SDK_TARGET_ISA | avx512                               | avx512                        |

:::

設置環境變量
```gherkin=
## Edit the file and change the environtment variable to your own directory
sudo vim <Your_Directory>/phy/setupenv.sh

# Run the script
$ source <Your_Directory>/phy/setupenv.sh
```

將命令附加到.bashrc文件中
```gherkin=
nano vim ~/.bashrc
source <Your_Directory>/phy/setupenv.sh
```
install FHI Library

```gherkin=
# Because the `build.sh` run the command "pkgconf", but in CentOS, this application is called "pkg-config". Hence, we need to link them together.
sudo ln -s /usr/bin/pkg-config /usr/bin/pkgconf

#cannot execute
#cd $XRAN_DIR
#./build.sh xclean

# Build the FHI library
cd $XRAN_DIR/lib
make
# Compile sample-app.c
cd $XRAN_DIR/app
make

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
sudo yum install octave -y
sudo yum install -y expect

# Generate IQ Samples of Sample app
cd $XRAN_DIR/app
octave gen_test.m
```

* My build steps log
>  https://1drv.ms/t/s!AtLp1AqbBT3_hQVVXzJOenxNPd9I?e=FdnlFw

* My IQ data log
> https://1drv.ms/t/s!AtLp1AqbBT3_hQPI_22e2p5xbsVo?e=SI4eIU
### Install WLS Library
#### Background
* Wls_lib 是一個無線服務庫，它支持實現 gNb 或 eNb 的應用程序使用的共享內存和緩衝區管理。
* 該庫使用 DPDK、libhugetlbfs 和 pthreads 通過從 DPDK 的角度共享相同的內存區域，在 L2 應用程序、API 轉換器模塊和 L1 應用程序之間提供更少的 memcpy 數據交換。

![](https://i.imgur.com/hg8USqy.png)


```gherkin=
# Install the essential package
sudo yum install libmlx5
# Change directory to wls_lib
cd phy/wls_lib
# Build WLS Library
./build.sh xclean  #unable to execute
./build.sh #"Please define valid WIRELESS_SDK_TARGET_ISA environment variable ".  Stop.

# Copy library to wls_lib
cd ../fapi_5g/include/
cp fapi_interface.h ../../wls_lib/
cp fapi_vendor_extension.h ../../wls_lib/

```
### FAPI 5G Install
#### Background
:::info
* ORAN FAPI 5G 轉換器模塊 (FAPI TM) 是一個獨立的應用程序，它使用 Small Cell Forum 定義的 5G FAPI 協議與 ODU-High 通信，並使用無線子系統接口使用 Intel L2-L1 API 與 ODU Low 通信用於處理接口所需的共享內存和緩衝區管理的庫 (WLS)。
* ORAN 5G FAPI TM 需要與 WLS 庫集成的數據平面設計套件 (DPDK)。

![](https://i.imgur.com/ubO4GwT.png)

:::

#### Building and Installation FAPI
* Make sure RTE_SDK & DIR_WIRELESS_WLS variables are already set

#### Building & Installation
```gherkin=
# Build fapi_5g
cd <Your_DIR>/phy/fapi_5g/build
./build.sh xclean
./build.sh
```

:::warning
ISSUE:
![](https://i.imgur.com/Kj9JUW1.png)

* Error message nr5g_mac_phy_api.h file not found

![](https://i.imgur.com/FGrLa4f.png)
* There is no nr5g_mac_phy_api.h in the folder

需修改makefile，待補
:::

### L1app & Testmac Testing (FAPI TM Testing)

```gherkin
# Run L1.sh on one console/ssh session
cd FlexRAN/l1/bin/nr5g/gnb/l1

# RUN L1.sh
sudo -E LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./l1.sh -e

# Run FAPI on another console/ssh session
cd phy/fapi_5g/bin

#  Run FAPI
sudo -E LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./oran_5g_fapi --cfg=oran_5g_fapi.cfg
```
:::warning


:::


###### tags: `NTUST O-RAN`