Dashboard

deployment—
UEs attached—
dilation—
alarms—
connecting

Emulation topology

open

Alarms

Components

Proxy barrier

Attach & mobility

Active jobs

all jobs

Host

Live topology

real-time side (host) · virtual-time side (VM workers) · drag boxes to rearrange · click for detailsreset layout

Selection

click a block

Coverage map — geometry-driven handover

100%

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-drop

Map = 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

Scale
UE worker nodes
Radio & timing

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.

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

dilation now—
before the fault—
peak during—
UEs with PDU—
ping UE → core, normal—
ping during the fault—
ping now—
probe—

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

StallSIGSTOP 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.
Killthe 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.
Recreatea 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

    read only

    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.

    Select a capture

    pcap

    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.

    Saved results

    Select a result

    CSVJSON

    Jobs

    Select a job