[FHI72] [xran F] Handle fragmented (un)compressed packets In both E and F, the radio-transport fragmentation is not supported, and all the "fragmented" (not seen as fragments in the xran, only as sections) packets contain "E-bit" equal to 1. Per spec, the value 1 for "E-bit" signifies the last fragment of one symbol. For more info, please see "ecpriSeqid" section in the spec. In E: - nRBStart and nRBSize is updated according to the sent/received packet; - max sections = 1; - when a packet is fragmented, the xran uses memcpy(pos, iq_data_start, size) function, and nothing is stored in start_prbu , num_prbu ,... In F: - nRBStart and nRBSize is only used for C-plane messages; - nPrbElm represents the number of sections for DL only; - based on the nPrbElm, each section contains UP_nRBStart and UP_nRBSize parameters which represent the start and number of PRBs in one section or one fragment; - when a packet is fragmented, the xran uses nSecDesc and sec_desc to extract the packet section content, and the data is stored in start_prbu , num_prbu ,... Previous work on the fragmentation in F: - #884 - !3394 - only increases the XRAN_MAX_FRAGMENT from 4 to 6, since it was only tested with BFP 8, but not end-to-end unfortunately. But this MR fixes all the issues. Tested with VVDN RU, 2x2, 16 bits, 100MHz, 30kHz, MTU <= 9216 B, and Quectel UE RM520N-GL Revision: RM520NGLAAR03A03M4G.
This document describes the driver for the xran driver, implementing O-RAN FHI 7.2 interface. This is for developers; for user documentation, consider the O-RAN 7.2 tutorial instead.
The main source files and their purpose are as follows:
oaioran.c: definition of xran-specific callback functions.oran-config.c: reading of 7.2-specific configuration and preparing xran configration.oran-init.c: initialization of xran.oran_isolate.c: main entry point and definition of function pointers for OAI callbacks.
The entry point for the driver library is transport_init() in oran_isolate.c.
This function is concerned with setting necessary function pointers for OAI
integration, and prepares xran configuration through get_xran_config(). This
function reads 7.2 specific configuration and deduces some of the parameters
(e.g., frequency) from OAI-provided radio configuration in openair0_config_t.
Actual xran initialization happens in oai_oran_initialize() in oran-init.c.
It calls various helper function in the same file to set up DPDK memory buffer
(pools). Notably, these callbacks are installed:
oai_xran_fh_rx_callback()throughxran_5g_fronthault_config(): callback for PUSCH data; used to provide timing data.oai_xran_fh_rx_prach_callback()throughxran_5g_prach_req(): callback for PRACH data; not currently used and implemented in PUSCH data callback.oai_physide_dl_tti_call_back()throughxran_reg_physide_cb(): only used to unblock timing inoai_xran_fh_rx_callback()upon first xran call.
More detailed information about the xran callbacks can be taken from the xran documentation.
During normal operation, OAI calls into the driver through functions
oran_fh_if4p5_south_in() for PUSCH/PRACH and oran_fh_if4p5_south_out() for
PDSCH.
For PDSCH, oran_fh_if4p5_south_out() calls xran_fh_tx_send_slot() that
optionally compresses IQ data, then writes it into IQ buffers of xran.
For PUSCH/PRACH, oran_fh_if4p5_south_in() calls xran_fh_rx_read_slot() that
blocks and waits for the next slot. This is done through either a message
queue, or through polling, which in both cases depends on xran calling the
callback oai_xran_fh_rx_callback() as installed during xran initialization.
Once unblocked, it reads first PRACH data, then PUSCH data, before returning to
OAI.