---
# System prepended metadata

title: Open5gs and Openairinterface CU/DU split
tags: [3. Source Code]

---

Open5gs and Openairinterface CU/DU split 
===

###### tags: `open5gs` `openairinterface`

:::info
- **Location:** RT LAB
- **Agenda**
1. Open5gs v2.7.2
    - VM OS : Ubuntu 22.04.4 LTS
    - IP : 192.168.60.2
1. Openairinterface (main branch)
    - VM OS : Ubuntu 22.04.4 LTS
    - IP : 192.168.60.8
- **Author:** Saffana Zyan DINI
- **Contact:** Zyzy <M11102815@gapps.ntust.edu.tw>
- **Reference:** 
    - [Building Open5GS from Sources](https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/)
    - [How to build Openairinterface](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/doc/BUILD.md)
    - [Open5gs ueransim sample config](https://github.com/s5uishida/open5gs_5gc_ueransim_sample_config?tab=readme-ov-file)

:::
### The Architecture

![image](https://hackmd.io/_uploads/rJ2-OWAUJl.png)

### The Call Flow
![open5gs oai-Halaman-2.drawio](https://hackmd.io/_uploads/BkKG0Q1Myg.png)

:dart: Build Open5gs(VM1)
---

#### Getting MongoDB

Import the public key used by the package management system.

```yaml
sudo apt update
sudo apt install gnupg
curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
```
Install the MongoDB packages.
```
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
```
Check Mongod status
```
sudo systemctl status mongod
```
![image](https://hackmd.io/_uploads/rkcW3h3Zkl.png)

#### Setting up TUN device (not persistent after rebooting)

Create the TUN device with the interface name ogstun.
```
sudo ip tuntap add name ogstun mode tun
sudo ip addr add 10.45.0.1/16 dev ogstun
sudo ip addr add 2001:db8:cafe::1/48 dev ogstun
sudo ip link set ogstun up
```
![image](https://hackmd.io/_uploads/H1iWpnhZJl.png)

check ogstun interface:
```
ifconfig ogstun
```
![image](https://hackmd.io/_uploads/Hk67p2nWyx.png)


#### Building Open5GS
Install the dependencies for building the source code.
   ```bash
sudo apt install python3-pip python3-setuptools python3-wheel ninja-build build-essential flex bison git cmake libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libidn11-dev libmongoc-dev libbson-dev libyaml-dev libnghttp2-dev libmicrohttpd-dev libcurl4-gnutls-dev libnghttp2-dev libtins-dev libtalloc-dev meson
   ```
Git clone.
```
git clone https://github.com/open5gs/open5gs
```
To compile with meson:
```
cd open5gs
git checkout v2.7.2
meson build --prefix=`pwd`/install
ninja -C build
```
![image](https://hackmd.io/_uploads/rJuEMp3bJe.png)
![image](https://hackmd.io/_uploads/r1yeza3b1e.png)
>The test program has been run on [VirtualBox - CPU: 1, Memory: 4.00 GB] and [Docker for Mac - CPU: 2, Memory: 2.00 GB] with default setting (max.ue: 4,096, pool.packet: 32,768).

Check whether the compilation is correct.(5g core only)
```
./build/tests/registration/registration
```
![image](https://hackmd.io/_uploads/Hk54Xah-1l.png)
Run all test programs as below.(you can skip this process)
```
cd build
meson test -v
```
![image](https://hackmd.io/_uploads/rkVOSphZkg.png)
>In some cases, you may encounter a failure — but don't panic. Just check your configuration, make the necessary fixes, and try running it again later.

install this to before you config nrf, amf and upf. next you will get /install folder 
```
cd build
ninja install
cd ../
ls
```

#### Configure Open5GS
NRF configuration
```
sudo nano install/etc/open5gs/nrf.yaml 
```
edit mcc & mnc
```cmd=
logger:
  file:
    path: /home/zyzy/open5gs/install/var/log/open5gs/nrf.log
#  level: info   # fatal|error|warn|info(default)|debug|trace

global:
  max:
    ue: 1024  # The number of UE can be increased depending on memory size.
#    peer: 64

nrf:
  serving:  # 5G roaming requires PLMN in NRF
    - plmn_id:
        mcc: 208 #same as oai
        mnc: 99  #same as oai
  sbi:
    server:
      - address: 127.0.0.10
        port: 7777
```
AMF configuration:
```
sudo nano install/etc/open5gs/amf.yaml
```
edit ngap ip address, mcc & mnc
```cmd=
amf:
  sbi:
    server:
      - address:  127.0.0.5 
        port: 7777
    client:
#      nrf:
#        - uri: http://127.0.0.10:7777
      scp:
        - uri: http://127.0.0.200:7777
  ngap:
    server:
      - address: 192.168.60.2 #open5gs interface
  metrics:
    server:
      - address: 127.0.0.5
        port: 9090
  guami:
    - plmn_id:
        mcc: 208 #same as oai
        mnc: 99 #same as oai
      amf_id:
        region: 2
        set: 1
  tai:
    - plmn_id:
        mcc: 208
        mnc: 99
      tac: 1
  plmn_support:
    - plmn_id:
        mcc: 208
        mnc: 99
      s_nssai:
        - sst: 1
  security:
    integrity_order : [ NIA2, NIA1, NIA0 ]
    ciphering_order : [ NEA0, NEA1, NEA2 ]
  network_name:
    full: Open5GS
    short: Next
  amf_name: open5gs-amf0
  time:

```
UPF configuration
```
sudo nano install/etc/open5gs/upf.yaml
```
edit gtpu interface address
```cmd=
logger:
  file:
    path: /home/zyzy/open5gs/install/var/log/open5gs/upf.log
#  level: info   # fatal|error|warn|info(default)|debug|trace

global:
  max:
    ue: 1024  # The number of UE can be increased depending on memory size.
#    peer: 64

upf:
  pfcp:
    server:
      - address: 127.0.0.7
    client:
#      smf:     #  UPF PFCP Client try to associate SMF PFCP Server
#        - address: 127.0.0.4
  gtpu:
    server:
      - address: 192.168.60.2
  session:
    - subnet: 10.45.0.0/16
      gateway: 10.45.0.1
    - subnet: 2001:db8:cafe::/48
      gateway: 2001:db8:cafe::1
  metrics:
    server:
      - address: 127.0.0.7
        port: 9090

```
#### Running Open5GS
to run all NF:
   ```bash
./install/bin/open5gs-nrfd &
./install/bin/open5gs-scpd &
./install/bin/open5gs-amfd &
./install/bin/open5gs-smfd &
./install/bin/open5gs-upfd &
./install/bin/open5gs-ausfd &
./install/bin/open5gs-udmd &
./install/bin/open5gs-pcfd &
./install/bin/open5gs-nssfd &
./install/bin/open5gs-bsfd &
./install/bin/open5gs-udrd 
   ```
* check **ngap** run in right interface
   ![image](https://hackmd.io/_uploads/SkNz3anW1e.png)

* check **gtpu** run in right interface
   ![image](https://hackmd.io/_uploads/HkWpsTh-yg.png)

to **stop** open5gs
   ```bash
sudo pkill open5gs
   ```
#### Building the WebUI of Open5GS
Node.js is required to build WebUI of Open5GS

```
# Download and import the Nodesource GPG key
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

# Create deb repository
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

# Run Update and Install
sudo apt update
sudo apt install nodejs -y
```
Install the dependencies to run WebUI

```
cd webui
npm ci
```
The WebUI runs as an npm script.
```
npm run dev
```

Server listening can be changed by setting the environment variable HOSTNAME

```
HOSTNAME=192.168.60.2 npm run dev
```
![image](https://hackmd.io/_uploads/SJIuB1pWkg.png)

Open web console to http://<open5gs_ip>:9999, for example: http://192.168.60.2:9999 and login with admin account.

Username : admin
Password : 1423
![image](https://hackmd.io/_uploads/SkosrypbJx.png)

>Note: You can change the password in Account Menu.

To add subscriber information, you can do WebUI operations in the following order:

Go to Subscriber Menu.
1. Click + Button to add a new subscriber.
1. Fill the IMSI, security context(K, OPc, AMF), and APN of the subscriber.
1. Click SAVE Button
![image](https://hackmd.io/_uploads/BykmUkT-1e.png)

#### Adding a route for the UE to have WAN connectivity
In order to bridge between the PGWU/UPF and WAN (Internet), you must enable IP forwarding and add a NAT rule to your IP Tables.

To enable forwarding and add the NAT rule, enter

```
### Enable IPv4/IPv6 Forwarding
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

### Add NAT Rule
sudo iptables -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE
sudo ip6tables -t nat -A POSTROUTING -s 2001:db8:cafe::/48 ! -o ogstun -j MASQUERADE
```
Configure the firewall correctly. Some operating systems (Ubuntu) by default enable firewall rules to block traffic.

```
sudo ufw status
sudo ufw disable
sudo ufw status
```
Optionally, you may consider the settings below for security purposes.

```
sudo iptables -I INPUT -i ogstun -j ACCEPT
sudo iptables -I INPUT -s 10.45.0.0/16 -j DROP
sudo ip6tables -I INPUT -s 2001:db8:cafe::0/48 -j DROP
```
:books: Install Openairinterface (VM2)
---
#### prepare the required interface
create tun interface 
```
sudo nano create_tunnel.sh
```
fill this file with this code:
```
#!/bin/bash

create_tunnel() {

    ip link add tun_cu-du type veth 
    ip link add tun_du-cu type veth
    ip link add oai_br0 type bridge


    ip addr add 192.168.35.12/24 dev tun_cu-du
    ip addr add 192.168.35.13/24 dev tun_du-cu
    
    ip link set oai_br0 up
    ip link set tun_cu-du master oai_br0
    ip link set tun_du-cu master oai_br0
    
    ip link set up dev tun_cu-du
    ip link set up dev tun_du-cu
}

clean_tunnel() {
    ip link del tun_cu-du
    ip link del tun_du-cu
}

if [ "$#" -eq 0 ]
then
    echo "No arguments supplied"
    exit 1
else
    if [ "$1" == "create" ]
    then
        create_tunnel;
    fi

    if [ "$1" == "clean" ]
    then
        clean_tunnel;
    fi
fi
```
Ensure that create_tunnel.sh is executable:
```
sudo chmod +x create_tunnel.sh
```
run the create_tunnel.sh to create the tun interface
```
sudo ./create_tunnel.sh create
```

#### Build OAI from Source Code
Clone Openairinterface5g
```
sudo apt install git cmake build-essentials
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
```
Build the source code
```
cd openairinterface5g
source oaienv
cd cmake_targets/
./build_oai -I --gNB --nrUE -w SIMU
```
add `sudo` if you get issue in permission, for example `sudo ./build_oai -I --gNB --nrUE -w SIMU` 

Check the compiled binary
```
ls ran_build/build/
```
#### set configuration
```
cd ~/openairinterface5g/cmake_targets/ran_build/build/
```
CU configuration
```
sudo nano ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
```
edit CU & DU IP
```
Active_gNBs = ( "gNB-Eurecom-CU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";
Num_Threads_PUSCH = 8;

gNBs =
(
 {
    ////////// Identification parameters:
    gNB_ID = 0xe00;

#     cell_type =  "CELL_MACRO_GNB";

    gNB_name  =  "gNB-Eurecom-CU";

    // Tracking area code, 0x0000 and 0xfffe are reserved values
    tracking_area_code  =  1;
    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1}) });

    nr_cellid = 12345678L;

    tr_s_preference = "f1";

    local_s_address = "192.168.35.12"; //cu ip
    remote_s_address = "192.168.35.13"; //du ip
    local_s_portc   = 501;
    local_s_portd   = 2152;
    remote_s_portc  = 500;
    remote_s_portd  = 2152;

    # ------- SCTP definitions
    SCTP :
    {
        # Number of streams to use in input/output
        SCTP_INSTREAMS  = 2;
        SCTP_OUTSTREAMS = 2;
    };


    ////////// AMF parameters:
    amf_ip_address = ({ ipv4 = "192.168.60.2"; }); //amf & upf ip

    NETWORK_INTERFACES :
    {

        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.60.8"; //cu to amf  
        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.60.8"; //cu to upf
        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
    };
```
DU configuration
```
sudo nano ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
```
edit CU & DU IP
```
Active_gNBs = ( "gNB-Eurecom-DU");
# Asn1_verbosity, choice in: none, info, annoying
Asn1_verbosity = "none";

gNBs =
(
 {
    ////////// Identification parameters:
    gNB_ID = 0xe00;
    gNB_DU_ID = 0xe00;

#     cell_type =  "CELL_MACRO_GNB";

    gNB_name  =  "gNB-Eurecom-DU";

    // Tracking area code, 0x0000 and 0xfffe are reserved values
    tracking_area_code  =  1;
    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });

    nr_cellid = 12345678L;

    ////////// Physical parameters:

    min_rxtxtime                                              = 6;
    force_256qam_off = 1;

    servingCellConfigCommon = (
    {

...

MACRLCs = (
  {
    num_cc           = 1;
    tr_s_preference  = "local_L1";
    tr_n_preference  = "f1";
    local_n_address = "192.168.35.13"; //du ip
    remote_n_address = "192.168.35.12"; //cu ip
    local_n_portc   = 500;
    local_n_portd   = 2152;
    remote_n_portc  = 501;
    remote_n_portd  = 2152;
  }
);

...

rfsimulator: {
serveraddr = "server";
    serverport = 4043;
    options = (); #("saviq"); or/and "chanmod"
    modelname = "AWGN";
    IQfile = "/tmp/rfsimulator.iqs"
}

```                      
UE configuration
```
sudo nano ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf
```
make sure all UE parameter same as open5gs webui
```
uicc0 = {
imsi = "208990000007487";
key = "fec86ba6eb707ed08905757b1bb44b8f";
opc= "C42449363BBAD02B66D16BC975D77CC1";
dnn= "internet";
nssai_sst=1;
}
```
![image](https://hackmd.io/_uploads/rySVvy6Z1g.png)

#### Run Openairinterface

terminal 1: run CU
```
cd ~/openairinterface5g/cmake_targets/ran_build/build/
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf --sa --rfsim
```
terminal 2: run DU
```

cd ~/openairinterface5g/cmake_targets/ran_build/build/
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf --sa --rfsim
```
terminal 3: run UE
```
cd ~/openairinterface5g/cmake_targets/ran_build/build/
sudo ./nr-uesoftmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.conf --sa --rfsim -r 106 --numerology 1 -C 3619200000
```
#### Check ue registration request 
![image](https://hackmd.io/_uploads/Hy6OJlpW1l.png)
![image](https://hackmd.io/_uploads/rJx0yg6bJx.png)


#### Check established interface
![image](https://hackmd.io/_uploads/SJQGAJ6-1g.png)
#### Check GTPU tunnel
open5gs
![image](https://hackmd.io/_uploads/rJcR0ypWyl.png)
CU
![image](https://hackmd.io/_uploads/B1yxke6bJx.png)
DU
![image](https://hackmd.io/_uploads/BygW1eTWJg.png)
UE
![image](https://hackmd.io/_uploads/HJ5jC16W1e.png)
![image](https://hackmd.io/_uploads/ByjQyeTZJe.png)
test ping gtpu tunnel
![image](https://hackmd.io/_uploads/ryz_0kTZ1g.png)
![image](https://hackmd.io/_uploads/H1OqiWrO1x.png)

wireshark result
![image](https://hackmd.io/_uploads/Sk2gUEyMJe.png)


==Importance== webui trobleshooting
![image](https://hackmd.io/_uploads/SkFESypWyx.png)
![image](https://hackmd.io/_uploads/S1AHBk6W1l.png)

```
VBoxManage modifyhd "/home/zyzy/VirtualBox VMs/zyoai-du/zyoai-du.vdi" --resize 35000
```
