OCUDU provisions and runs the OCUDU gNB and the optional srsRAN UE simulator against Aether SD-Core using Ansible and Docker. The repository includes playbooks for Docker bootstrap, routing changes required on OCUDU nodes, gNB lifecycle management, and UE simulation.
git clone https://github.com/opennetworkinglab/aether-ocudu.git
cd aether-ocuduMakefile: convenience targets for the Ansible playbookshosts.ini: inventory for OCUDU and core hostsvars/main.yml: default runtime variables used by the playbooksdocker.yml: installs Docker on hosts in theocudu_nodesgrouprouter.yml: applies or removes routing and sysctl changes on OCUDU nodesgNB.yml: starts and stops the OCUDU gNB containeruEsimulator.yml: starts and stops the UE simulator container
- Ansible installed on the control machine
- Reachability from the control machine to every host in
hosts.ini - Docker-capable Ubuntu hosts for the
ocudu_nodesgroup - A reachable Aether SD-Core AMF address
- For simulated UE runs, valid UPF-related values for
core.upf.default_upf.ue_ip_poolandcore.upf.core_subnet
The playbooks use community.docker and ansible.posix modules. Make sure
those collections are available in the Ansible environment used to run the
targets.
The checked-in ansible.cfg keeps SSH host key checking enabled and does not
enable agent forwarding. If you are bringing up disposable lab machines and
need the previous relaxed behavior, provide those SSH options through a local
Ansible config override instead of committing them in-repo.
Update hosts.ini to match your deployment.
ocudu_nodes: machines that run Docker, the gNB container, and the optional UE simulatormaster_nodes: core-side nodes used to avoid adding the OCUDU static route on the core host itself
The number of entries under ocudu.servers in vars/main.yml must match the
number of hosts in ocudu_nodes. The playbooks fail early if those counts differ.
Most deployment settings live in vars/main.yml.
Example defaults:
ocudu:
docker:
container:
gnb_image: aetherproject/ocudu:rel-0.5.0
ue_image: aetherproject/srsran-ue:rel-0.5.0
network:
name: host
simulation: true
servers:
0:
gnb_ip: "10.76.28.115"
gnb_conf: gnb_zmq.yaml
ue_conf: ue_zmq.conf
core:
upf:
access_subnet: "192.168.252.1/24"
multihop_gnb: false
amf:
ip: "172.16.248.6"Key variables:
ocudu.docker.container.gnb_image: gNB container imageocudu.docker.container.ue_image: UE simulator imageocudu.docker.network.name: Docker network used by the containers. The checked-in defaults usehost.ocudu.simulation: must betrueto run the UE simulatorocudu.servers[n].gnb_ip: bind address used by the gNB for NGAP trafficocudu.servers[n].gnb_conf: gNB template name or path resolvable by Ansible's template lookup for that OCUDU node. The checked-in default uses the role'stemplates/directory.ocudu.servers[n].ue_conf: UE simulator template name or path resolvable by Ansible's template lookup for that OCUDU node. The checked-in default uses the role'stemplates/directory.core.amf.ip: AMF address used by the gNB and routing playbookscore.upf.access_subnet: subnet used to install the OCUDU-side route toward the UPFcore.upf.multihop_gnb: disables the static route task when set totrue
Additional UE simulator variables are required by roles/uEsimulator/tasks/start.yml:
core.upf.default_upf.ue_ip_poolcore.upf.core_subnet
If those values are not defined in vars/main.yml, provide them with EXTRA_VARS when invoking make.
The repository includes templates for both simulated and hardware-backed deployments:
roles/gNB/templates/gnb_zmq.yaml: ZMQ-based simulated radio pathroles/gNB/templates/gnb_uhd_b210.yaml: UHD configuration for B210roles/gNB/templates/gnb_uhd_x310.yaml: UHD configuration for X310
TODO: add a DPDK-based gNB template to document and support DPDK deployments explicitly.
All commands are exposed through the Makefile.
make ocudu-pingallmake ocudu-docker-installmake ocudu-router-installRemove the routing changes:
make ocudu-router-uninstallmake ocudu-gnb-startStop the gNB:
make ocudu-gnb-stopmake ocudu-uesim-startStop the UE simulator:
make ocudu-uesim-stopThis target installs Docker, applies the router changes, and starts the gNB:
make ocudu-gnb-installTear it down:
make ocudu-gnb-uninstallThe Makefile supports overriding the inventory, root paths, and Ansible variables:
make ocudu-uesim-start \
HOSTS_INI_FILE=hosts.ini \
EXTRA_VARS='{"core":{"upf":{"default_upf":{"ue_ip_pool":"10.250.0.0"},"core_subnet":"192.168.250.1/24"}}}'Relevant environment variables:
HOSTS_INI_FILE: inventory file passed toansible-playbookOCUDU_ROOT_DIR: location of this repository when called from another workspaceEXTRA_VARS: raw extra vars string forwarded to Ansible
- The gNB container is created as
ocudu-gnb. - The UE simulator container is created as
rfsim5g-nr-ue. - The gNB start playbook mounts
/dev/hugepagesand/dev/vfioand runs the container in privileged mode. - The router playbook updates ARP and reverse-path filtering sysctls on OCUDU nodes.
- The UE simulator start playbook adds a default route inside
ue1and runs a ping test after startup.
For a single-node simulated setup, the minimum flow is:
- Update
hosts.iniandvars/main.ymlfor your hosts and AMF address. - Ensure
ocudu.serverscontains one entry per OCUDU node. - Provide
core.upf.default_upf.ue_ip_poolandcore.upf.core_subnetif you plan to run the UE simulator. - Run
make ocudu-gnb-install. - Run
make ocudu-uesim-start.
If you only want the gNB, or if ocudu.simulation is false, stop after step 4.
In that case, do not run step 5 because the UE simulator playbook aborts when
simulation is disabled.