Support beam index for LiteON FR2 RU that needs per symbol section in CP packets This branch supports beam index for LiteOn FR2 RU and others. It adds the support of beam index for LiteOn RU that uses per-symbol CP packet and is a sequel of MR !3605 (merged) that supports beam index for RU that uses per-slot CP packets. A. To support LiteOn FR2 RU, the following are needed. a. Per symbol beamforming. Need separate section for each symbol on CP packet. b. Handle these two bugs: - section ID on UP packet is set wrongly to 13 for all sections - prach eAxC offset starts from 0 instead of from last antenna port number used by other channels. B. Implementation a. set fh_config->RunSlotPrbMapBySymbolEnable based on the setting in the configuration file - if disable, the existing per-slot scheme is run on xran. - if enable, RunSlotPrbMapBySymbolEnable mode is on in xran so that xran will generate PrbElm per symbol (aka total of 14)and perform per-symbol processing on the corresponding PrbElm. b. set fh_config->LiteOnIgnoreUPSectionIdEnable based on the setting in the configuration file if enable, handle 2 "features" of Liteon: - To handle the section_id = 13 issue on Liteon where section ID is set wrongly to 13 for all sections - To handle the prach eAxC offset issue on Liteon where it starts from 0 instead of from the end of last antenna port number c. if fh_config->RunSlotPrbMapBySymbolEnable, OAI FHI - invoke xran_fh_rx_read_slot_BySymbol() instead of xran_fh_rx_read_slot() - invoke xran_fh_tx_send_slot_BySymbol() instead of xran_fh_tx_send_slot() C. Testing a. Command to test benetel RU sudo LD_LIBRARY_PATH=.:$DPDK_INST/lib/x86_64-linux-gnu/ ./nr-softmodem -O /etc/ran_development/CONFs/gnb.sa.band77.273prb.fhi72.4x4-benetel550_c0.conf --thread-pool 21,22,23,24,25,26,27,28 Results: iperf UDP uplink [ 5] 0.00-10.22 sec 87.3 MBytes 71.6 Mbits/sec 0.100 ms 370/63081 (0.59%) receiver iperf UDP downlink [ 5] 0.00-10.00 sec 796 MBytes 668 Mbits/sec 0.017 ms 1824/586404 (0.31%) receiver b. Command to test LiteOn FR2 RU sudo LD_LIBRARY_PATH=.:$DPDK_INST/lib/x86_64-linux-gnu/ ./nr-softmodem -O /etc/ran_development/CONFs/gnb.sa.band78.66prb.fhi72.2x2-liteon-F-Release.conf--thread-pool 21,22,23,24,25,26,27,28 Result: iperf UDP uplink [ 5] 0.00-10.20 sec 89.9 MBytes 73.9 Mbits/sec 0.156 ms 212/64848 (0.33%) receiver iperf UDP downlink [ 5] 0.00-10.00 sec 361 MBytes 303 Mbits/sec 0.077 ms 277662/542891 (51%) receiver D. Difference between LiteOn FR2 E release configuration file and that for F release is diff gnb.sa.band78.66prb.fhi72.2x2-liteon-KB.conf gnb.sa.band78.66prb.fhi72.2x2-liteon-F-Release.conf 39d38 < beam_weights = [1, 1]; 225a225 > beam_weights = [1]; 312c312,313 < mtu = 1500; # check if xran uses this properly --- > #mtu = 1500; # check if xran uses this properly > mtu = 9000; # check if xran uses this properly 313a315,316 > RunSlotPrbMapBySymbol = 1; > LiteOnIgnoreUPSectionId = 1;
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.