Files
openairinterface5g/ci-scripts/yaml_files/5g_l2sim_tdd/README.md
T
Robert Schmidt 94497435e7 Upgrade CI images to Ubuntu 22
This updates all images in the CI to Ubuntu 22. It also updates
corresponding documentation. Remove python(2) from the image, as it is
not needed. Update documentation.

It seems that the gcc coming in Ubuntu 22 does not like
stack-protector-strong, so remove it as well.

Since we compile Flexric, which does not support Ubuntu 22's default
gcc-11 (it hits a compile bug), switch to gcc-12 manually.

Since we update the compiler, we also need to be careful to use the right
address sanitizer version (which is bundled with the compiler version).
To avoid a reinstallation of the wrong asan version in target images, we
modify Ubuntu 22 targets to copy libasan from the base image. This is necessary
since we use update-alternative in the base image, but we don't want to
install compilers in the target images to use update-alternatives to
install the right asan version... This should be undone when switching
to Ubuntu 24 in the future, as it will have a newer default gcc version,
such that we don't need to update the compile in the first place.

Upgrade libpython in lteUE for U22 upgrade to make it compatible with
UHD.
2024-06-25 17:02:03 +02:00

397 lines
14 KiB
Markdown

<table style="border-collapse: collapse; border: none;">
<tr style="border-collapse: collapse; border: none;">
<td style="border-collapse: collapse; border: none;">
<a href="http://www.openairinterface.org/">
<img src="../../../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
</img>
</a>
</td>
<td style="border-collapse: collapse; border: none; vertical-align: center;">
<b><font size = "5">OAI Full Stack 5G-NR L2 simulation with containers and a proxy</font></b>
</td>
</tr>
</table>
It is also valid for `Ubuntu 22.04`.
# 1. Adapt the `docker-compose` to your environment #
The yaml file is in the following directory: `ci-scripts/yaml_files/5g_l2sim_tdd`
In the `SMF` section, provide your own DNS IP address:
```yaml
DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
```
gNB section:
All the parameter values will be taken from the mounted config file:
```yaml
oai-gnb:
[...]
volumes:
- ../../conf_files/gnb.sa.band78.106prb.l2sim.conf:/opt/oai-gnb/etc/gnb.conf
```
You need to provide your docker-host primary IP address and interface name: in our case `172.21.16.128` and `eno1`.
The following refers to the contents of the previously mentioned .conf file
```yaml
GNB_NGA_IF_NAME: eno1
GNB_NGA_IP_ADDRESS: 172.21.16.128
GNB_NGU_IF_NAME: eno1
GNB_NGU_IP_ADDRESS: 172.21.16.128
```
For the UE, all the parameter values will be taken from the mounted config
file, in the section `oai-nr-ue0`:
```yaml
oai-nr-ue0:
[...]
volumes:
- ../../conf_files/nrue.band78.106prb.l2sim.conf:/opt/oai-nr-ue/etc/nr-ue.conf
- ../../../openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results:/opt/oai-nr-ue/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results
```
In this section, you need to set the proper value `remote_n_address`
where the UE configuration (mounted to `/opt/oai-nr-ue/etc/nr-ue.conf`) reads:
```libconfig
MACRLCs = (
{
num_cc = 1;
tr_n_preference = "nfapi";
remote_n_address = "127.0.0.1"; //Proxy IP
local_n_address = "127.0.0.1";
...
```
This tutorial is a first draft. This nFAPI feature and the proxy are still under development.
At time of writing, we were able to run in `host-mode`, 1 `NR-UE` and just ping traffic.
# 2. Retrieving the images on Docker-Hub #
Currently the images are hosted under the team account `oaisoftwarealliance`. They were previously hosted under the user account `rdefosseoai`.
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
```bash
docker login
```
```bash
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
```
Now pull images.
```bash
docker pull mysql:8.0
docker pull oaisoftwarealliance/oai-amf:v2.0.0
docker pull oaisoftwarealliance/oai-smf:v2.0.0
docker pull oaisoftwarealliance/oai-upf:v2.0.0
docker pull oaisoftwarealliance/trf-gen-cn5g:focal
docker pull oaisoftwarealliance/oai-gnb:develop
docker pull oaisoftwarealliance/oai-nr-ue:develop
docker pull oaisoftwarealliance/proxy:develop
```
And **re-tag** them for tutorials' docker-compose file to work.
```bash
docker image tag oaisoftwarealliance/proxy:develop oai-lte-multi-ue-proxy:latest
```
```bash
docker logout
```
Note that the proxy image is based on the source available at [https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy](https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy).
At time of writing, the `latest` tag corresponded to `56cfdc046a5f96d5e67d42a2fc2bf6ba2fe58b41` commit.
# 3. Deploy containers #
**CAUTION: this SHALL be done in multiple steps.**
**Just `docker-compose up -d` WILL NOT WORK!**
All the following commands **SHALL** be run from the `ci-scripts/yaml_files/5g_l2sim_tdd` folder.
The `gNB`, `proxy` and `NR-UE` containers will be deployed in `host`-mode. It will use the host loopback interface to connect.
```bash
sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
```
## 3.1. Deploy OAI 5G Core Network ##
```bash
cd ci-scripts/yaml_files/5g_l2sim_tdd
docker-compose up -d mysql oai-amf oai-smf oai-upf oai-ext-dn
```
```bash
Creating network "l2sim-oai-public-net" with driver "bridge"
Creating network "l2sim-oai-traffic_net-net" with driver "bridge"
Creating l2sim-mysql ... done
Creating l2sim-oai-upf ... done
Creating l2sim-oai-amf ... done
Creating l2sim-oai-smf ... done
Creating l2sim-oai-ext-dn ... done
```
Wait for a bit.
```bash
docker-compose ps -a
```
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
l2sim-oai-upf /bin/bash /openair-upf/bin ... Up (healthy) 2152/udp, 8805/udp
```
At this point, you can prepare a capture on the newly-created public docker bridges:
```bash
ifconfig
```
```bash
...
l2sim-public: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.71.129 netmask 255.255.255.192 broadcast 192.168.71.191
inet6 fe80::42:c4ff:fe2b:3d38 prefixlen 64 scopeid 0x20<link>
ether 02:42:c4:2b:3d:38 txqueuelen 0 (Ethernet)
RX packets 4 bytes 112 (112.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7 bytes 626 (626.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
l2sim-traffic: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.72.129 netmask 255.255.255.192 broadcast 192.168.72.191
inet6 fe80::42:b5ff:fed3:e732 prefixlen 64 scopeid 0x20<link>
ether 02:42:b5:d3:e7:32 txqueuelen 0 (Ethernet)
RX packets 2652 bytes 142335 (142.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3999 bytes 23367972 (23.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
```
```bash
sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)" -i l2sim-public -i l2sim-traffic -w /tmp/capture_5g_l2sim_tdd.pcap > /tmp/tshark.log 2>&1 &
```
## 3.2. Deploy OAI gNB in Standalone Mode as a VNF ##
**CAUTION: To execute this 2nd step, the whole `CN5G` SHALL be in `healthy` state (especially the `mysql` container).**
```bash
docker-compose up -d oai-gnb
```
```bash
l2sim-oai-upf is up-to-date
l2sim-oai-ext-dn is up-to-date
Creating l2sim-oai-gnb ... done
```
Wait for a bit.
```bash
$ docker-compose ps -a
```
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
l2sim-oai-upf /bin/bash /openair-upf/bin ... Up (healthy) 2152/udp, 8805/udp
```
You can verify that the `gNB` is connected with the `AMF`:
```bash
docker logs l2sim-oai-amf
```
```bash
...
[AMF] [amf_app] [info ] |----------------------------------------------------gNBs' information-------------------------------------------|
[AMF] [amf_app] [info ] | Index | Status | Global ID | gNB Name | PLMN |
[AMF] [amf_app] [info ] | 1 | Connected | 0x0 | gnb-l2sim-vnf | 208, 99 |
[AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
...
```
## 3.3. Deploy OAI NR-UE and proxy
```bash
docker-compose up -d proxy oai-nr-ue
```
```bash
l2sim-mysql is up-to-date
l2sim-oai-amf is up-to-date
l2sim-oai-smf is up-to-date
l2sim-oai-upf is up-to-date
l2sim-oai-ext-dn is up-to-date
l2sim-oai-gnb is up-to-date
Creating l2sim-oai-nr-ue ... done
Creating l2sim-proxy ... done
```
Wait for a bit.
```bash
docker-compose ps -a
```
```bash
Name Command State Ports
-------------------------------------------------------------------------------------------------
l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
l2sim-oai-nr-ue0 /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
l2sim-oai-upf /bin/bash /openair-upf/bin ... Up (healthy) 2152/udp, 8805/udp
l2sim-proxy /oai-lte-multi-ue-proxy/bi ... Up (healthy)
```
```bash
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}} {{.MemUsage}}\t{{.MemPerc}}" l2sim-mysql l2sim-oai-amf l2sim-oai-ext-dn l2sim-oai-gnb l2sim-oai-nr-ue0 l2sim-oai-smf l2sim-oai-upf l2sim-proxy
```
```bash
CONTAINER CPU % MEM USAGE / LIMIT MEM %
l2sim-mysql 0.03% 206.7MiB / 62.54GiB 0.32%
l2sim-oai-amf 4.05% 29.49MiB / 62.54GiB 0.05%
l2sim-oai-ext-dn 0.00% 31.27MiB / 62.54GiB 0.05%
l2sim-oai-gnb 1.29% 1.853GiB / 62.54GiB 2.96%
l2sim-oai-nr-ue0 1.43% 350.8MiB / 62.54GiB 0.55%
l2sim-oai-smf 3.24% 30.23MiB / 62.54GiB 0.05%
l2sim-oai-upf 0.00% 11.78MiB / 62.54GiB 0.02%
l2sim-proxy 6.97% 290.4MiB / 62.54GiB 0.45%
```
**CAUTION: As you can see the CPU usage is not that important compared to a 5G RF simulator equivalent.**
But the CPU speed matters; I am running on a fast server:
```bash
lscpu
```
```bash
Architecture: x86_64
CPU(s): 16
...
Model name: Intel(R) Xeon(R) Silver 4215R CPU @ 3.20GHz
```
I tried on a slower server with more CPUs and it did not work:
```bash
oaici@orion:~$ lscpu
Architecture: x86_64
CPU(s): 48
...
Model name: Intel(R) Xeon(R) CPU E5-2658 v3 @ 2.20GHz
```
We will work on this issue.
Making sure the OAI UE is connected:
```bash
docker exec -it l2sim-oai-nr-ue0 /bin/bash
```
```bash
root@bb4d400a832d:/opt/oai-nr-ue# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.71.137 netmask 255.255.255.192 broadcast 192.168.71.191
ether 02:42:c0:a8:47:89 txqueuelen 0 (Ethernet)
RX packets 224259 bytes 5821372018 (5.8 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 235916 bytes 7848786376 (7.8 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
oaitun_ue1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 12.1.1.2 netmask 255.255.255.0 destination 12.1.1.2
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
```
# 4. Check traffic #
## 4.1. Check your Internet connectivity ##
You can also check with the `ext-dn` container (IP address is `192.168.72.135` in docker-compose)
```bash
docker exec -it l2sim-oai-nr-ue0 /bin/bash
```
```bash
ping -I oaitun_ue1 -c 20 192.168.72.135
```
```bash
root@bb4d400a832d# ping -I oaitun_ue1 -c 20 192.168.72.135
PING 192.168.72.135 (192.168.72.135) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data.
64 bytes from 192.168.72.135: icmp_seq=1 ttl=63 time=65.1 ms
64 bytes from 192.168.72.135: icmp_seq=2 ttl=63 time=74.2 ms
...
64 bytes from 192.168.72.135: icmp_seq=19 ttl=63 time=25.0 ms
64 bytes from 192.168.72.135: icmp_seq=20 ttl=63 time=34.7 ms
--- 192.168.72.135 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19025ms
rtt min/avg/max/mdev = 16.413/120.639/209.673/57.159 ms
```
# 5. Un-deployment #
```bash
docker-compose down
```
```bash
Stopping l2sim-oai-nr-ue2 ... done
Stopping l2sim-oai-nr-ue ... done
Stopping l2sim-oai-gnb ... done
Stopping l2sim-oai-ext-dn ... done
Stopping l2sim-oai-upf ... done
Stopping l2sim-oai-smf ... done
Stopping l2sim-oai-amf ... done
Stopping l2sim-mysql ... done
Removing l2sim-oai-nr-ue2 ... done
Removing l2sim-oai-nr-ue ... done
Removing l2sim-oai-gnb ... done
Removing l2sim-oai-ext-dn ... done
Removing l2sim-oai-upf ... done
Removing l2sim-oai-smf ... done
Removing l2sim-oai-amf ... done
Removing l2sim-mysql ... done
Removing network l2sim-oai-public-net
Removing network l2sim-oai-traffic-net
```