mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 04:30:28 +00:00
Make fh_timer_tick robust against CLOCK_REALTIME jumps. In case of forward jump the symbol callback will be called for each missed symbol. In case of backwards jump the function will return without calling any callbacks. This continues until the local timer catches up to the last callback symbol. Signed-off-by: Bartosz Podrygajlo <bartosz.podrygajlo@openairinterface.org>
Fronthaul Library
Fronthaul stack for 7.2x split using DPDK. Currently supports O-RU only; O-DU support is not implemented.
Architecture overview
Software component diagram
graph TD
O-RU
subgraph integration ["Fronthaul API"]
oru_fh["oru_fh"]
end
subgraph internals ["O-RU fronthaul internals"]
oru_io["oru_io"]
oru_pkt["oru_packet_processor"]
end
subgraph fronthaul_core ["Fronthaul Core (core/)"]
direction LR
fh_rx["fh_recv (RX)"]
fh_tx["fh_send (TX)"]
fh_timer["fh_timer (Clock)"]
fh_rx --> fh_tx
fh_tx --> fh_timer
end
subgraph protocol ["Protocol Layer (xran_pkt/)"]
xran_api["xran_pkt_api"]
end
dpdk[("DPDK / NIC")]
O-RU --> oru_fh
oru_fh --> oru_pkt
oru_fh --> oru_io
oru_io --> oru_pkt
oru_io --> fh_rx
oru_io --> fh_tx
oru_pkt --> xran_api
fh_rx --> xran_api
fh_tx --> xran_api
fh_rx --> dpdk
fh_tx --> dpdk
fh_timer --> dpdk
Threading
The library uses a simplified threading model designed for low-latency synchronization:
- Single Worker Thread: A single worker thread (pinned to
rx_core) handles both packet reception and timing. Thefh_timeris driven by atick()function called within the RX poll loop. This ensures that timing events are processed with minimal context-switching overhead. - Immediate Transmission: Packet transmission happens immediately when the application calls the send function.
Sequence Diagram
sequenceDiagram
participant HW as Hardware / NIC
participant FW as Fronthaul Worker (lcore)
participant PP as Packet Processor
participant DL as DL App Threads (Multi)
participant UL as UL App Threads (Multi)
Note over FW: Continuous Loop (fh_recv_run)
FW->>HW: Poll for Packets
HW-->>FW: eCPRI Packets (C/U-Plane)
FW->>PP: handle_packet()
alt [All IQ Samples Received]
PP-->>DL: Enqueue Job (Multi-Consumer Ring)
end
FW->>FW: fh_timer_tick()
FW->>PP: handle_symbol_tick()
alt [Window Expired (Handling Missing Packets)]
PP-->>DL: Enqueue Job (Multi-Consumer Ring)
end
Note over DL: Parallel consumption of DL IQ data
DL->>PP: read_dl_iq()
PP-->>DL: IQ Data (Blocking MC Dequeue)
Note over UL: Parallel production of UL packets
UL->>PP: write_ul_iq()
PP->>HW: send_mbuf() (Direct Parallel TX)
Note over HW,FW: rte_spinlock ensures thread-safe TX burst
Core API (oru_fh.h)
oru_fh_init: Initializes DPDK EAL, configures ports, and sets up memory pools based on PRB requirements.oru_fh_start: Launches the worker thread and starts the fronthaul processing loop.oru_fh_stop: Gracefully stops the worker thread and releases resources.oru_fh_tx_read_symbol: Intended for reading UPlane data for a specific slot/symbol in a synchronized manner.oru_fh_rx_send_pusch/prach: Sends IQ via UPlane to DU
Configuration
See oru_fh_config_t for details
Tools
Packet Dissector - xran_pcap_dump
A tool used to verify that packets are correctly formed. It reads PCAP files and dissects them using the xran_pkt
library to ensure compatibility with O-RU/O-DU implementations.