Dashboard
Live topology
real-time side (host) · virtual-time side (VM workers) · drag boxes to rearrange · click for detailsreset layoutSelection
click a blockCoverage map — geometry-driven handover
Apply sends the trigger to the gNBs through the RIC; the map shows the handovers.
Each cell's coverage is drawn around its site: the shaded area is where that cell serves (its site is the nearest, up to its 150 m radius), darker near the site (strong / good / cell-edge signal bands), the dashed circle its full range where it overlaps its neighbours. Cells are drawn with their coverage radius; UEs are dropped at random inside the coverage of the cell that serves them in the emulation. Drag a UE into the other cell's coverage, or enable random motion: as soon as a UE's position belongs to another cell (nearest cell, with hysteresis at the overlap), the map sends it measurements through the proxy and the real N2 handover runs — the dot changes colour when the proxy reports the cell switch. Position replaces signal: there is no channel model in the emulation.
Handover trigger (A3) per cell — set it on the map above
A neighbour triggers a handover when its RSRP exceeds the serving cell's by offset + hysteresis for the time to trigger. Lower: earlier, more handovers (and ping-pong); higher: later, fewer.
Map events
Handovers processed by the network
since the last re-dropMap = handovers this page triggered and saw completed through the proxy. Network = what the 5G core's AMF processed on N2 (Handover Required from the source cell, Handover Request Ack from the target, Handover Notify after the UE arrived) and what each cell counted. The three AMF numbers should track each other and the map's count; a gap between Required and Notify is a handover that failed or is still running.
Pending handovers
User equipment
Cells (gNBs)
5G core
The core network functions share one pod on the core node (host network): Open5GS (AMF, SMF, UPF, NRF, AUSF, UDM, UDR, PCF, NSSF, BSF, MongoDB), or the OAI CN5G when selected; the DN pod answers iperf3.
Proxy & virtual time
Cluster nodes
Logs
Quick start
New here? Test scenarios are ready-made tests: pick one (Standard is a good start) and press Run. It uses the running deployment, or deploys one first if nothing is running.
New deployment
Sequence: tear down → resync VM clocks → 5G core → cells (NG setup) → UE pods → proxy pod on the host node → admission ramp in cell time → settle → result. Every component is a Kubernetes pod; the proxy and the global slot checker are pinned to the host node (real-time side).
Current deployment
Handover scenarios
The UE receives the cell RSRPs from the proxy, its RRC evaluates event A3 and sends a MeasurementReport; source gNB, AMF and target gNB then execute the N2 handover (Handover Required / Request / Command, RRCReconfiguration with sync, CFRA). Rates are measured in cell time between the first and last Handover Notify on the target.
Run
User-plane tests
iperf3's duration runs on the UE's clock = cell time (10 s at dilation 6 is a minute of wall time); "Stop all traffic" kills iperf3 clients in every UE pod. Ping targets the UPF gateway 12.1.0.1 through the UE's PDU session; iperf3 targets the DN container on the core node. Latencies are in cell time.
Result
Test scenarios
Pick a scenario to view or edit it. Pre-made ones are never overwritten: Save on them stores an edited copy under Custom. Verified suites run the console's e2e test files as they are, on 3 gNBs × 10 UEs.
Scenario
Channel errors (SINR / BLER)
SINR: every transport block fails with the probability OAI's AWGN SINR→BLER curve gives for its MCS at this SINR (HARQ retransmissions get the combining gain), and the UE's CQI follows the DL SINR — so the gNB's link adaptation settles on the MCS the SINR supports, as on a real channel. Fixed BLER: the same failure rate at any MCS (the gNB then keeps lowering the MCS while the BLER is above its 15 % target). No gNB change: a failed DL TB is NACKed on PUCCH, a failed UL TB is reported with a CRC error. Takes effect on the next TB; counters restart at each change.
Cloud faults — chronos keeps the 5G stack in time
Under chronos a slot closes only when every gNB and UE has finished it. A preempted or badly connected VM finishes late, so every VM's clock waits: the dilation (host time per cell time) rises, and the gNBs and UEs keep their timing. Registrations, PDU sessions and handovers carry on, only slower. When the fault ends, dilation returns to its earlier level. Below: a UE pings the core all along. Its round trip, timed by the UE's own clock, stays the same.
Fault injection
| Stall | SIGSTOP on the node: the UE stops echoing while its socket lives on. The proxy repeats ticks, times the rounds out, evicts it after 10 s and takes it back when it echoes again. |
| Kill | the pod is deleted: the proxy's connected socket reports the peer gone, the UE is evicted at once and its thread waits for a new discovery. |
| Recreate | a new pod from the deployment's manifest (new IP); it is discovered, rejoins the barrier and re-attaches. |
Timeline
Profiles (conf/)
gNB, UE, core and neighbour-cell configuration of the emulator. Saves are backed up under data/conf-backups and used by the next deployment.
Select a file
Captures
gNB MAC/RRC trace (T tracer)
The gNB must be deployed with the "gNB T tracer" option (it only opens the tracer port; nothing is traced until you press Start). Start records both directions' MAC PDUs in the pod, Stop ends the recording, Fetch pulls the file here for decoding.
N2 is captured with tcpdump on the core node (SCTP, all interfaces) and decoded here: NGAP procedure, AMF/RAN UE ids and the NAS message inside DL/UL NAS transport. The MAC-NR pcap comes from a gNB deployed with the "T tracer" option (both directions, via OAI's T tracer + macpdu2wireshark) or the "OPT" option (uplink only) and shows the control-plane MAC PDUs (RAR, BCCH, PCCH, CCCH/DCCH, MAC CEs) with the RRC message inside CCCH/DCCH decoded (RLC AM → PDCP → RRC ASN.1, and the NAS message inside RRC); data-plane PDUs (DTCH) are left out — see the Data plane page.
Near-RT RIC — E2 nodes and E2SM-KPM
E2 nodes and cells
UEs — latest KPM report
Source: FlexRIC near-RT RIC (pod ric) with the phobos xApp xapp_kpm_json, subscribed to every E2 node's E2SM-KPM REPORT styles (1000 ms granularity of the gNB's clock — in host time that is one report every ~dilation seconds). Throughput DRB.UEThpDl/Ul, volume DRB.PdcpSduVolumeDL/UL, RLC delay DRB.RlcSduDelayDl, PRB share RRU.PrbTotDl/Ul per UE; a cell's PRB use is the sum over its UEs. Raw xApp output: kubectl exec ric -c kpm -- tail -f /work/kpm.jsonl.
Data plane — per-cell MAC statistics
Source: the OAI gNB's nrMAC_stats.log (per-UE HARQ rounds, BLER, MCS, uplink PRBs, goodput per logical channel, SNR/RSRP). Goodput is per the gNB's measurement window; run Traffic → iperf3 to load the cells. PRB figures: OAI's stats file only exposes each UE's last PUSCH allocation (NPRB), not a PRB rate — with idle UEs it reads 0. The gNB keeps cumulative dl/ul total_rbs per UE internally but does not print them; adding them to nrMAC_stats.log (openair2/LAYER2/NR_MAC_gNB/main.c) is the planned way to get PRB utilisation per cell.