O-RAN Components
We originally intended to setup everything via Ansible playbooks, but in the end we ended up giving up on porting O-RAN to ARM. It was just too much work for two people actively working on the code.
We ended up using the SRS + Open5GS core setup by Supreeth Herle (https://github.com/herlesupreeth/docker_open5gs) and O-RAN setup by SRSRAN (https://github.com/srsran/oran-sc-ric).
We made slight modifications to integrate them. The modified versions are available in https://github.com/Gabrielcarvfer/docker_open5gs and https://github.com/Gabrielcarvfer/oran-sc-ric.
This setup was tested with the following system configurations (minimum, recommended):
SO: Linux, WSL (Windows 11)
Distro: Ubuntu 22.04, Ubuntu 24.04
Host RAM: (16, 64) GB
Host processor cores: (8, 18)
Host free disk space: (30, 50) GB
To get things working, first clone the two repos:
~/$ git clone https://github.com/Gabrielcarvfer/docker_open5gs
~/$ git clone https://github.com/Gabrielcarvfer/oran-sc-ric
Then build docker images for the core network:
~/docker_open5gs/base/$ docker build --no-cache --force-rm -t docker_open5gs .
~/docker_open5gs/base/$ cd ../srslte
~/docker_open5gs/srslte/$ docker build --no-cache --force-rm -t docker_srslte .
~/docker_open5gs/srslte/$ cd ../srsran
~/docker_open5gs/srsran/$ docker build --no-cache --force-rm -t docker_srsran .
~/docker_open5gs/srsran/$ cd ../
~/docker_open5gs/$ docker compose -f sa-deploy.yaml build
Note: To run ORAN, you need access to the protected SCTP port, which REQUIRES ROOTful docker…
Before starting the network, modify the DOCKER_HOST_IP address in ~/docker_open5gs/.env.
You should put your local network IP (this is especially true if using a docker-on-WSL-on-Windows setup).
The UE register is done via a web interface, so you must be able to reach this service from your browser.
You can get the available IPs with command hostname -I.
In the original manual, they suggest disabling the firewall, enabling IPv4 forwarding and setting CPU governor to performance mode (typically energy saving for laptops).
sudo ufw disable
sudo sysctl -w net.ipv4.ip_forward=1
sudo cpupower frequency-set -g performance
After altering the host IP, start the core network and then the near-RT RIC, run the following commands. Use ps to inspect if containers are running, or began restarting (indicating an error).
~/docker_open5gs/$ sudo docker compose -f ./sa-deploy.yaml up -d
~/docker_open5gs/$ sudo docker compose ps
~/docker_open5gs/$ pushd ../oran-sc-ric
~/oran-sc-ric/$ sudo docker compose up -d
~/oran-sc-ric/$ sudo docker compose ps
~/oran-sc-ric/$ popd
~/docker_open5gs/$
At this point, you should verify if the core network and the near-RT RIC are functioning properly.
To check the core network, and take the opportunity to register the IMSI of the user (SIM card),
according to the values in the .env file previously altered, go to http://<DOCKER_HOST_IP>:9999,
enter user admin, password 1423. Then fill the data for the subscriber and its phone.
UE1_IMEI=356938035643803
UE1_IMEISV=4370816125816151
UE1_IMSI=001011234567895
UE1_KI=8baf473f2f8fd09487cccbd7097c6862
UE1_OP=11111111111111111111111111111111
UE1_AMF=8000
After this, check if the RIC is ready for gNB connections with:
~/docker_open5gs/$ docker compose logs | grep "RMR is ready now"
After checking this, start the gNB
~/docker_open5gs/$ sudo docker-compose -f ./srsgnb_zmq.yaml up -d
Check if it was properly associated to the AMF in the core, and to the E2MGR in the RIC:
~/oran-sc-ric/docker compose logs | grep "gnbd_"
If it is working fine, you should have found the gNB E2Node ID. You are going to use now, to instruct the xApp in which E2Node to hook up for messages. RUN THIS IN A SEPARATE TERMINAL.
~/oran-sc-ric/docker compose exec python_xapp_runner ./kpm_implemented_xapp.py --e2_node_id=gnbd_999_099_000XXX_0
If the xApp registers successfully, then we can FINALLY proceed to the UE.
~/docker_open5gs/$ sudo docker-compose -f ./srsue_5g_zmq.yaml up -d
After starting the UE, access the docker container and create some traffic via the 5G interface. Do that as quickly as possible, to prevent the connection from going to sleep/paging mode.
~/docker_open5gs/$ sudo docker compose exec -it srsue_5g_zmq bash
root@ir2390i23:/# ping -I tun_srsue google.com
root@ir2390i23:/# apt update && apt install -y curl
root@ir2390i23:/# curl --interface tun_srsue --output bigbuckbunny.mp4.zip https://download.blender.org/demo/movies/BBB/bbb_sunflower_1080p_30fps_normal.mp4.zip
At this point, you should be able to observe the KPMs in the xApp terminal.