Files
openairinterface5g/fronthaul
Bartosz Podrygajlo 31084d6698 fix(fronthaul): Make fh_timer robust in case of PTP sync
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>
2026-06-11 12:52:14 +02:00
..
2026-05-25 09:48:38 +02:00

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. The fh_timer is driven by a tick() 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.