This tutorial sets up a complete 5G O-RAN Split 7.2 network on COSMOS SB1 using OAI or srsRAN as the CU/DU stack together with real O-RU hardware (LiteOn, Jabil, or Benetel), then connects a SIMCom USB modem as the UE to confirm end-to-end data connectivity.
O-RAN Split 7.2 places the boundary between the Distributed Unit (DU) and the Radio Unit (O-RU) inside the physical layer, requiring a fronthaul interface that transports IQ samples over Ethernet using the eCPRI/O-RAN 7.2 protocol. This tutorial demonstrates that full chain on COSMOS SB1: the Amarisoft MME/5GC provides the core, the OAI nr-softmodem runs as the combined CU+DU on a server-grade node (srv1-lg1) with DPDK for fronthaul offload, and one of the available O-RUs (LiteOn in the worked example) provides the air interface. A Waveshare SIM8200EA-M2 (SIMCom SIM8200EA-M2) USB modem attached to sdr1-in3 acts as the NR UE.
Running this experiment gives hands-on experience with DPDK-accelerated fronthaul, O-RU management via SSH/CLI, and the AT-command and QMI-based data connection flow needed to bring a 5G NR UE on-air.
After completing this tutorial you will be able to:
| Difficulty | Advanced |
| Estimated time | 90 min |
| Domain / sandbox | sb1.cosmos-lab.org (COSMOS SB1) |
| Topic group | Cellular 4G/5G & O-RAN |
| Last verified | Not re-tested (migrated 2026-06-20) |
Background knowledge
Account & access
Devices / nodes
| Resource | Role | Qty | Notes |
|---|---|---|---|
| srv1-lg1 | 5G Core + CU/DU host | 1 | Server-grade node in COSMOS SB1; runs Amarisoft MME and OAI nr-softmodem with DPDK fronthaul |
| sdr1-in3 | UE host | 1 | Hosts the Waveshare SIM8200EA-M2 (SIMCom SIM8200EA-M2) USB modem |
| LiteOn O-RU (worked example) | Radio Unit | 1 | Reachable at liteon-oru-mgmt.instrument.orbit-lab.org |
| Jabil O-RU (alternate) | Radio Unit | 1 | TODO: verify hostname |
| Benetel O-RU (alternate) | Radio Unit | 1 | TODO: verify hostname |
Disk images
| Image | Load onto | Provides |
|---|---|---|
| sb1_oai_liteon_11_8_2024.ndz | srv1-lg1 | OAI nr-softmodem build, Amarisoft ltemme/ltemme config, DPDK init scripts, O-RU configuration files |
| waveshare-sim8200.ndz | sdr1-in3 | SIMCom QMI/network drivers (qmi_wwan_simcom), simcom-cm connection manager, minicom |
Software components
| Component | Version | Source |
|---|---|---|
| OAI nr-softmodem | as bundled in image (built ~Nov 2024) | /root/openairinterface5g/cmake_targets/ran_build/build/nr-softmodem in image |
| Amarisoft ltemme (5G Core/MME) | 2024-09-13 | /opt/amarisoft/ltemme-linux-2024-09-13/ in image |
| DPDK / VF init script | as bundled | ~/init_dpdk.sh in image |
| simcom-cm (QMI connection manager) | TODO: verify | ~/SIM8200_code/Goonline/simcom-cm in waveshare-sim8200.ndz |
| minicom | 2.7.1 | preinstalled in waveshare-sim8200.ndz |
| iperf3 | TODO: verify | preinstalled in images |
Spectrum / RF / special
The experiment uses three logical segments:
enp134s0f0, MTU 9000, VLAN 4) ↔ LiteOn O-RU fronthaul port. DPDK VFs handle packet I/O in userspace.192.168.2.2; the core-side PDN gateway is 192.168.2.1.Reserve the resources and log into the console:
ssh <username>@console.sb1.cosmos-lab.org
Make sure all resources in the domain are turned off:
omf tell -a offh -t system:topo:allres
Load the OAI/Amarisoft image onto srv1-lg1:
omf load -i sb1_oai_liteon_11_8_2024.ndz -t srv1-lg1
Load the UE image (SIMCom modem drivers) onto sdr1-in3:
omf load -i waveshare-sim8200.ndz -t sdr1-in3
Turn on the required nodes and confirm they are up:
omf tell -a on -t srv1-lg1,sdr1-in3
omf stat -t system:topo:allres
Open SSH sessions to both nodes (use -Y if GUI output is needed):
ssh root@srv1-lg1
(Open a second terminal session to the console for sdr1-in3 steps later.)
Run the DPDK initialization script. This disables CPU sleep states, resizes the fronthaul NIC ring buffers, sets the MTU to 9000, creates two SRIOV virtual functions (VFs), and binds them to the DPDK driver:
root@srv1-lg1:~# ./init_dpdk.sh
Expected output:
--- Disable CPU sleep state ---
WARNING: cpupower not found for kernel 5.15.0-1071
You may need to install the following packages for this specific kernel:
linux-tools-5.15.0-1071-realtime
linux-cloud-tools-5.15.0-1071-realtime
You may also want to install one of the following packages to keep up to date:
linux-tools-realtime
linux-cloud-tools-realtime
--- Set interface enp134s0f0 ring buffer size to 4096 ---
----- Set RX buffer size -----
----- Set TX buffer size -----
--- Set interface enp134s0f0 MTU to 9000 ---
--- Create VFs (enp134s0f0, MTU: 9000, VLAN: 4) ---
----- Creating VF 1 -----
----- Creating VF 2 -----
--- Unbind/rebind DPDK devices (86:01.0 86:01.1) ---
----- Unbinding VF 0 -----
----- Unbinding VF 1 -----
----- Binding VF 0 -----
----- Binding VF 1 -----
--- Final VF setup ---
3: enp134s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 50:7c:6f:6c:76:9c brd ff:ff:ff:ff:ff:ff
vf 0 link/ether 00:11:22:33:44:66 brd ff:ff:ff:ff:ff:ff, vlan 4, spoof checking off, link-state auto, trust off
vf 1 link/ether 00:11:22:33:44:67 brd ff:ff:ff:ff:ff:ff, vlan 4, spoof checking off, link-state auto, trust off
The cpupower not found warning is expected on this kernel; the VF creation and binding steps are what matter.
In a second terminal on srv1-lg1, initialize NAT routing and start the core:
root@srv1-lg1:/opt/amarisoft/ltemme-linux-2024-09-13# ./lte_init.sh
Select enp134s0f0 enp94s0f0np0 default interface
Configure NAT for enp134s0f0
Configure NAT for enp94s0f0np0
net.ipv4.tcp_congestion_control = bbr
net.core.rmem_max = 62500000
net.core.wmem_max = 62500000
Then start the MME/5GC:
root@srv1-lg1:/opt/amarisoft/ltemme-linux-2024-09-13# ./ltemme config/mme.cfg
Core Network version 2024-09-13, Copyright (C) 2012-2024 Amarisoft
This software is licensed to Rutgers University (The State University of New Jersey).
License server: license.orbit-lab.org (0b-b4-46-dc-2f-83-58-cb)
Support and software update available until 2025-08-18.
(mme)
The (mme) prompt indicates the core is running and waiting for gNB connections.
In a third terminal on srv1-lg1, start the OAI stack in Split 7.2 mode for the LiteOn O-RU:
root@srv1-lg1:~# ./run_oai_liteon.sh
Expected startup output (abridged — backslash escapes removed):
CMDLINE: "./openairinterface5g/cmake_targets/ran_build/build/nr-softmodem" "-O" "/root/liteon/band78.2x2.40M.timing.conf" "--sa" "--thread-pool" "0,2,4,6,8,10,12,14"
[LIBCONFIG] Path for include directive set to: /root/liteon
[CONFIG] function config_libconfig_init returned 0
[CONFIG] config module libconfig loaded
[CONFIG] debug flags: 0x00000000
log init done
Reading in command-line options
[ENB_APP] nfapi (0) running mode: MONOLITHIC
The softmodem will continue printing initialization messages as it establishes the eCPRI fronthaul session with the O-RU.
SSH into the LiteOn O-RU management interface to confirm it has synchronized and is ready:
ssh user@liteon-oru-mgmt.instrument.orbit-lab.org
user@liteon-oru-mgmt.instrument.orbit-lab.org's password:
Welcome to Liteon ORU Wed Nov 13 17:51:48 UTC 2024
Please enter help
Enter privileged mode and check status:
> enable
Enter Password:
Auto exit privileged commands in 300 Seconds
# show oru-status
Sync State : SYNCHRONIZED
RF State : Ready
DPD : Ready
DuConnected : Ready
All four fields should read Ready / SYNCHRONIZED. Then inspect performance data:
# show pm-data
1,POWER,2024-11-13T17:59:55Z,2024-11-13T18:00:12Z,o-ran-hardware:O-RU-FPGA,10.6144,11.7710,11.1235,iana-hardware:cpu,10.6144,11.7710,11.1235
2,TEMPERATURE,2024-11-13T17:59:55Z,2024-11-13T18:00:12Z,o-ran-hardware:O-RU-FPGA,57.9699,59.9283,58.6268,iana-hardware:cpu,56.8352,58.9491,57.6974
13,VOLTAGE,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,0,0.0000,2024-11-13T17:59:56Z,2.0142,2024-11-13T18:00:19Z,0.0000,2024-11-13T17:59:56Z,0.0000,2024-11-13T18:00:29Z,3499680000
1,POWER,2024-11-13T18:00:12Z,2024-11-13T18:00:29Z,o-ran-hardware:O-RU-FPGA,10.6720,12.2464,11.1989,iana-hardware:cpu,10.6720,12.2464,11.1989
2,TEMPERATURE,2024-11-13T18:00:12Z,2024-11-13T18:00:29Z,o-ran-hardware:O-RU-FPGA,57.9854,59.7729,58.8154,iana-hardware:cpu,56.5866,59.6641,57.9875
1,RX_ON_TIME,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,1537482
2,RX_EARLY,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,0
3,RX_LATE,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,0
6,RX_TOTAL,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,1604032
7,RX_ON_TIME_C,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,64192
8,RX_EARLY_C,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,0
9,RX_LATE_C,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,0
1,TX_TOTAL,2024-11-13T17:59:55Z,2024-11-13T18:00:29Z,ru1,192841
Non-zero RX_ON_TIME and TX_TOTAL counters confirm the fronthaul is actively exchanging IQ data.
On sdr1-in3, open a minicom session to the modem's AT command port:
root@sdr1-in3:~# minicom -D /dev/ttyUSB2
Welcome to minicom 2.7.1
OPTIONS: I18n
Compiled on Aug 13 2017, 15:25:34.
Port /dev/ttyUSB2, 17:45:12
Press CTRL-A Z for help on special keys
at
OK
Trigger a network scan (this command takes a few minutes to return; you should see the Amarisoft network in the result):
at+cops=?
+COPS: (1,"Amarisoft Network","Amarisof","310014",12),(1,"Verizon","Verizon","311480",7),(3,"T-Mobile","T-Mobile","310260",7),(3,"AT&T","AT&T","310410",7),(3,"313 100","313 100","313100",7),(3,"T-Mobile","T-Mobile","310260",12),(1,"311 490","311 490","311490",12),(3,"313 340","313 340)
OK
The presence of "Amarisoft Network" with MCC/MNC 310/14 confirms the modem has found the base station.
Exit minicom (Ctrl-A then X) and run the simcom-cm connection manager to bring up the data channel:
root@sdr1-in3:~/SIM8200_code/Goonline# ./simcom-cm
[11-13_18:27:19:600] Build Version: 2020-07-14 10:20:15
[11-13_18:27:19:600] SIMCOM_CM START...
[11-13_18:27:19:600] ./simcom-cm profile[1] = (null)/(null)/(null)/0, pincode = (null)
[11-13_18:27:19:600] Find /sys/bus/usb/devices/2-4.4 idVendor=1e0e idProduct=9001
[11-13_18:27:19:600] Find /sys/bus/usb/devices/2-4.4:1.5/net/wwp0s20f0u4u4i5
[11-13_18:27:19:600] Find usbnet_adapter = wwp0s20f0u4u4i5
[11-13_18:27:19:600] Find /sys/bus/usb/devices/2-4.4:1.5/usbmisc/cdc-wdm0
[11-13_18:27:19:600] Find qmichannel = /dev/cdc-wdm0
[11-13_18:27:19:601] netcard driver = qmi_wwan_simcom
[11-13_18:27:19:604] cdc_wdm_fd = 7
[11-13_18:27:19:676] Get clientWDS = 15
[11-13_18:27:19:708] Get clientDMS = 1
[11-13_18:27:19:740] Get clientNAS = 2
[11-13_18:27:19:772] Get clientUIM = 1
[11-13_18:27:19:804] Get clientWDA = 1
[11-13_18:27:19:836] requestBaseBandVersion MPSS.HI.2.0.c3-00246-SDX55_CPEALL_PACK-1 1 [Oct 26 2020 16:00:00]
[11-13_18:27:19:900] requestGetSIMStatus SIMStatus: SIM_READY
[11-13_18:27:19:932] requestGetProfile[1] cosmos-5G///0
[11-13_18:27:19:964] requestRegistrationState2 MCC: 310, MNC: 14, PS: Attached, DataCap: NR5G
[11-13_18:27:19:996] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED
[11-13_18:27:20:060] requestRegistrationState2 MCC: 310, MNC: 14, PS: Attached, DataCap: NR5G
[11-13_18:27:20:124] requestSetupDataCall WdsConnectionIPv4Handle: 0x734209c0
[11-13_18:27:20:188] requestQueryDataCall IPv4ConnectionStatus: CONNECTED
[11-13_18:27:20:220] ifconfig wwp0s20f0u4u4i5 up
[11-13_18:27:20:252] Fail to access /usr/share/udhcpc/default.script, errno: 2 (No such file or directory)
[11-13_18:27:20:252] busybox udhcpc -f -n -q -t 5 -s /usr/share/udhcpc/default.script -i wwp0s20f0u4u4i5
udhcpc: started, v1.27.2
udhcpc: sending discover
udhcpc: sending select for 192.168.2.2
udhcpc: lease of 192.168.2.2 obtained, lease time 7200
The udhcpc script path error (No such file or directory) is expected and non-fatal; the DHCP lease is still obtained. Set the IP address on the wwan interface to the address allocated by the MME (adjust if your lease differs):
root@sdr1-in3:~# ifconfig wwp0s20f0u4u4i5 192.168.2.2 netmask 255.255.255.0
Ping the core-network PDN gateway from the UE:
root@sdr1-in3:~# ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=21.8 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=19.2 ms
64 bytes from 192.168.2.1: icmp_seq=3 ttl=64 time=18.2 ms
64 bytes from 192.168.2.1: icmp_seq=4 ttl=64 time=16.8 ms
^C
--- 192.168.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 16.800/19.043/21.802/1.828 ms
Start an iperf3 server on the UE side (sdr1-in3), binding to the UE's 5G IP:
root@sdr1-in3:~# iperf3 -s -B 192.168.2.2
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Then run the client from srv1-lg1 (the core side):
root@srv1-lg1:~# iperf3 -c 192.168.2.2 -i 1 -b 0 -t 10
Connecting to host 192.168.2.2, port 5201
[ 5] local 192.168.2.1 port 45344 connected to 192.168.2.2 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 7.99 MBytes 67.0 Mbits/sec 100 35.4 KBytes
[ 5] 1.00-2.00 sec 3.75 MBytes 31.5 Mbits/sec 52 583 KBytes
[ 5] 2.00-3.00 sec 6.25 MBytes 52.4 Mbits/sec 91 250 KBytes
[ 5] 3.00-4.00 sec 6.25 MBytes 52.4 Mbits/sec 88 1.03 MBytes
[ 5] 4.00-5.00 sec 7.50 MBytes 62.9 Mbits/sec 99 631 KBytes
[ 5] 5.00-6.00 sec 5.00 MBytes 41.9 Mbits/sec 107 578 KBytes
[ 5] 6.00-7.00 sec 6.25 MBytes 52.4 Mbits/sec 24 806 KBytes
[ 5] 7.00-8.00 sec 8.75 MBytes 73.4 Mbits/sec 38 1.06 MBytes
[ 5] 8.00-9.00 sec 6.25 MBytes 52.4 Mbits/sec 100 653 KBytes
[ 5] 9.00-10.00 sec 7.50 MBytes 62.9 Mbits/sec 15 585 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 65.5 MBytes 54.9 Mbits/sec 714 sender
[ 5] 0.00-10.00 sec 62.1 MBytes 52.1 Mbits/sec receiver
(mme) prompt is displayed and stays stable (no crash messages) after starting the core.show oru-status on the O-RU returns Sync State: SYNCHRONIZED, RF State: Ready, DPD: Ready, DuConnected: Ready.show pm-data shows non-zero RX_ON_TIME and TX_TOTAL counters, confirming active eCPRI IQ exchange.simcom-cm reports IPv4ConnectionStatus: CONNECTED and a DHCP lease on the wwan interface.ping 192.168.2.1 from sdr1-in3 returns replies with RTT in the range of ~15–25 ms (0% loss).omf tell -a offh -t system:topo:allres
No omf save is needed unless you modified the images during the experiment.
| Symptom | Likely cause | Fix |
|---|---|---|
init_dpdk.sh fails to create VFs |
SRIOV not enabled in BIOS or VF count already at max | Verify cat /sys/bus/pci/devices/<PCI_ADDR>/sriov_numvfs; reboot may be needed to reset VF state |
ltemme exits with license error |
License server license.orbit-lab.org unreachable or expired |
Check connectivity to license server; confirm Amarisoft license is current for your allocation |
| OAI nr-softmodem crashes at startup | Wrong config file path or mismatch between DPDK VF PCI addresses | Check that PCI addresses printed by init_dpdk.sh (e.g. 86:01.0) match those in the OAI config; rerun init_dpdk.sh if needed |
O-RU shows DuConnected: Not Ready |
eCPRI/fronthaul session not established | Verify VLAN 4 is correctly set on the NIC (check init_dpdk.sh output), check O-RU IP reachability from srv1-lg1 |
O-RU shows Sync State: NOT SYNCHRONIZED |
GPS/PTP timing source not locked | Wait up to 2 minutes after starting the OAI stack; check the O-RU's timing port cabling |
at+cops=? returns empty or only commercial networks |
OAI/O-RU not transmitting, wrong band/PLMN | Confirm nr-softmodem is running without errors and O-RU shows RF Ready; check that the modem SIM is provisioned for MCC/MNC 310/14 |
simcom-cm stays DISCONNECTED |
UE not camped or PDN setup failed | Retry after at+cops=? succeeds; check Amarisoft MME log for PDN allocation errors |
| iperf3 throughput much lower than ~50 Mbits/sec | RF interference, modem position, or DPDK IRQ affinity issues | Rerun init_dpdk.sh, confirm no competing processes on the CPU cores used by the softmodem |
Author(s): COSMOS team · Last verified: Not re-tested (migrated 2026-06-20) · Tested image/release: sb1_oai_liteon_11_8_2024.ndz / waveshare-sim8200.ndz · Tags: 5g, oran, split7.2, oai, amarisoft, liteon, jabil, benetel, dpdk, simcom, ue, sb1