O-RAN xApps with an E2E 5G deployment: base example and GBR SLA

How to setup an OAI-based O-RAN deployment with a basic monitoring xApp and an advanced xApp that manages GBR SLA


OpenAirInterface (OAI) is a 3GPP-compliant software implementation of the full 5G NR stack. In this tutorial, we show how OpenRAN Gym users can get started with deploying an OAI 5G NR SA network composed of a gNB and a few UEs on Colosseum. Additionally, this tutorial shows how to deploy a nRT-RIC and an xApp developed to manage Guaranteed Bit Rate (GBR) Service Level Agreements (SLAs) of the RAN UEs.

More details in this paper:

E. Moro, M. Polese, A. Capone, T. Melodia, "An Open RAN Framework for the Dynamic Control of 5G Service Level Agreements," in Proceedings of IEEE NFV-SDN, Dresden, Germany, November 2023. [pdf] [bibtex]

Please consider citing the paper above if you use the O-RAN-compliant OAI gNB, the xApp SDK and the custom E2SM definitions in your research.

The basic repository for this project can be found here. It contains submodules that point to the different projects that are relevant to this tutorial.


Please make a Colosseum reservation with the following images (credentials are root/pass for all):

  • oai-core-gbr for the core network
  • oai-gbr-ran for both the gNB and the UEs (at least 3 UEs are suggested)
  • nrt-ric-gbr for the nRT-RIC and the xApp

Deployment and testing

Once the reservation is ready, start the core network in the oai-core SRN:


Then start the near-RT RIC in the oai-ric SRN:


and take note of the IP address of the SRN:

ifconfig col0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

You can check if all the ric components are running by using the command docker ps, whose result should be this:


Start the gNB in the oai-ran-gbr SRN:

./run_gnb.sh -t donor

In the same SRN, start the e2term:

./run_e2sim.sh RIC_IP RIC_PORT

where RIC_IP is the col0 IP address you have previously found, and RIC_PORT is the default 36422. The E2 Agent of the gNB is successfully connected with the RIC if the following line is shown:


Before connecting the reserved UEs to the gNB, start the following Colosseum RF scenario:

colosseumcli rf start -c 10011

Now connect all the UEs by running the following in the UE containers:


We now start the xApp. Back to the RIC container, attach a terminal to the xApp docker container:

docker exec -it xapp bash

Different SLA management xApps are available, please refer to the paper above for all the details. We start the advanced xApp implementing an elastic SLA policy:

python3 elastic_sla.py

Finally, we can generate downlink UE traffic as follows. In every UE container, add the route to the core network host:

ip route add via

and take note of the UE GPRS Tunneling Protocol (GTP) endpoint IP:

ifconfig oaitun_ue1 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

Run an iperf3 server in the UE SRN:

iperf3 -s

and test the connection in downlink by running this in the oai-core SRN:

iperf3 -c UE_IP 

where UE_IP is the UE GTP endpoint IP.