Commit Graph
423 Commits
Author SHA1 Message Date
Robert Schmidt 7da5d3889f Split common_lib.c in separate compilation unit
This avoids double compilation.
2026-02-12 08:47:07 +01:00
Jaroslava Fiedlerova 0858ee8877 Merge remote-tracking branch 'origin/972-7-2-split-ru_thread-slot-miss' into integration_2026_w06 (!3801)
Resolve "7.2 split ru_thread slot miss"

Closes #972
2026-02-05 15:21:25 +01:00
andrewse 95c8fa468a fhi_72: Track delay processing via atomic variable
Add xran_queue_length atomic variable to count the number of messages in
oran_sync_fifo (as notifiedFIFO_t does not do this). Use this to
tolerate some double messages (e.g. excessive processing delay), but
start to skip if messages accumulate.

Prior to this change, "Detected double sync message" was printed each
time there was more than one message, which reflected the previous
behavior when using polling, but the gNB might catch up if it is only
once. The new logic ensure that we don't skip individual slots but do so
once messages start to accumulate.
2026-02-05 13:19:12 +01:00
Xin Zhe Khooi 003d72c859 fhi7.2: introduce support for T1a and Ta4 values larger than TTI interval
In xRAN, it appears that T1a/Ta4 values are assumed to be within a TTI.
When T1a/Ta4 values with larger than a TTI are used, this causes two issues: (1) C-plane packets to be generated later than expected and (2) oai_xran_fh_rx_callback() receives the wrong timing information resulting in potentially empty/stale PUSCH/PRACH data to be read.

In this patch, we modify xRAN to make it handle large T1a/Ta4 values properly.
The changes include: (1) three additional variables in offset_num_slots_* (xran_dev.h), (2) modify "xran_timing_create_cbs" and "xran_timer_arm_for_deadline" (xran_cb_proc.c), and (3) revise "tx_cp_dl_cb" and "tx_cp_ul_cb" (xran_main.c).
Additionally, we add additional guard conditions to prevent xran_tx_proc.c from sending U-plane packets when it is not a downlink slot.
2026-02-02 15:00:01 +00:00
Robert Schmidt bc6f710b23 Merge remote-tracking branch 'origin/uncompressed-f' into integration_2026_w05 (!3821)
[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.
2026-01-29 17:20:54 +01:00
Teodora b24fd337ba Update xran F release patch
The sufficient number of fragments needed for MTU 1500 and 8b compression is 6.
However, XRAN_MAX_FRAGMENT must be incremented by one (6+1 = 7).

In the MR https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/3394, XRAN_MAX_FRAGMENT was increased to 6,
but the Tx data was actually copied 5 times, and unfortunately I haven't tested end-to-end back then.

This commit was successfully tested with Liteon FR1.
2026-01-29 10:59:24 +01:00
Teodora 88c74dc07f Correct the MTU for 7.2 config files
Even though the jumbo frame has 9600 bytes by the spec, the max MTU is limited to the MTU of a switch, if any used.
However, the value can be < max MTU of a switch.

This is very important for fragmentation purposes. If not properly set, the PDSCH packets will be missing.
2026-01-29 10:59:15 +01:00
Robert Schmidt a0a68d56d5 Merge remote-tracking branch 'origin/remove-dead-code' into integration_2026_w05 (!3831)
semi-manual remove of not used #define commands

As i was upset to see all these #define with no code under, i made a
global pass to remove the obvious cases semi-manual remove of not used
bodies

manual script, then a lot of manual review

    grep -IRs "#define" ../openair* ../common/* ../executables/ ../nfapi/ ../radio/ | \
        fgrep -v '(' | fgrep -v '//' |awk '{print $2}' | egrep -v "#define *$n"| \
            while read n ; do
              grep -IRs $n ../openair* ../common/* ../executables/ ../nfapi/ ../radio/  | grep -v "#define *$n" | grep -q $n || echo $n;
            done

will give a decent list of #define never used.  Then, I think we should
keep lists of # define when it comes from standards, even if the code
doesn't use it right now
2026-01-29 08:23:41 +01:00
Jaroslava Fiedlerova e1a327ca4f Merge remote-tracking branch 'origin/nr_ue_multiple_rf' into integration_2026_w05 (!3593)
NR UE: add support for multiple RF frontends

This MR adds basic support for multiple RF-frontends at the UE.
There are multiple reasons why we might want this:
1. There might be different antennas needed for different bands (e.g. NTN or
   TN antennas). These antennas might be connected to different RF-frontends.
   In case of Handover, the UE needs to dynamically switch between these
   RF-frontends.
2. Each rf-simulator connection carries baseband I/Q samples. To be able to
   perform a handover between two cells at different frequencies, there must
   be two rf-simulator connections, as the baseband channels should not
   interfere and thus cannot simply be added.
3. When we want to support multiple UE simulation within one instance of
   nr-uesoftmodem, and allow multiple cells and probably even handover between
   these cells, we need either:
   1. dedicated RF-frontends for each simulated UE, or
   2. dedicated RF-frontends for each connected cell and dynamically assign
      simulated UEs accordingly.

This MR implements what is needed for 1., 2. and 3.1.
2026-01-28 20:19:48 +01:00
Jaroslava Fiedlerova db902afbe4 Merge remote-tracking branch 'origin/liteon_FFT' into integration_2026_w05 (!3875)
Fix FFT size for xran_fh_tx_send_slot_BySymbol() and xran_fh_rx_read_slot_BySymbol()

This MR handles
- Fix FFT size for xran_fh_tx_send_slot_BySymbol() and
  xran_fh_rx_read_slot_BySymbol() (!3809)
- Fix E release build
2026-01-28 20:17:20 +01:00
Mario Joa-NgandTeodora Vladić f65b8f564f Correctly extract the PUSCH PRBs from an internet frame (one fragment)
Prior to this commit, all the PRBs had no signal. Only the "PRACH I0" was ~40dB which is expected.

The L1 stats with this commit:
```
Blacklisted PRBs 0/273
 0.-1.-1. 0. 0.-1.-1.-1. 0. 0. 0.-1.-1. 0.-1.-1. 0. 0.-1.-1. 0. 0.-1. 0. 4.
-1. 0. 0.-1. 0. 0.-1. 0.-1. 0. 0. 0.-1.-1.-1. 0. 0. 0. 0. 0. 0.-1.-1.-1. 0.
-1. 0. 0. 0. 0. 0. 0.-1.-1.-1.-1. 0.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.
-1.-1.-1.-1.-1.-2.-1.-1.-2.-2.-1.-2.-1.-1.-2.-1.-1.-2.-1.-2.-1.-1.-1.-1.-2.
-1.-1.-1.-2.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.
-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-20. 3. 0. 0.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.
-1. 0.-1.-1. 0.-1.-1. 0. 0.-1. 0.-1. 0. 0.-1.-1.-1. 0. 0. 0.-1. 1. 0.-1.-1.
 0. 0. 0. 0.-1. 0.-1. 0. 0. 0. 0. 0. 0. 0. 0.-1. 0.-1. 0. 0.-1. 0.-1.-1. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.
 1. 0. 0. 1. 0. 0. 0.-1. 0. 0. 1. 1. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 0.
 0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 1. 1. 1. 1. 0. 1. 1. 1.
max_IO = 24 (24), min_I0 = 0 (136), avg_I0 = 20 dB(19.20.)
PRACH I0 = 42.1 dB
```

Co-authored-by: Teodora Vladić <teodora.vladic@openairinterface.org>
2026-01-28 13:00:24 +01:00
TeodoraandMario Joa-Ng 8b60466916 Correct the UL C-plane packet
Even after this commit, we still have duplicated UL C-plane packets due to xran F release internal architecture.

Note: in E, all PRBs were in one section of one C-plane DL and UL. It is working even though the U-plane has "fragmented" packets.

Co-authored-by: Mario Joa-Ng <mario.joa-ng@openairinterface.com>
2026-01-28 13:00:24 +01:00
TeodoraandMario Joa-Ng cf8f24710b Resolves the missing DL symbols
Previously, in F, only the following (subframe, slot, symbol) combinations were sent every frame:
(0, 0, 0)
(2, 1, 0)
(5, 0, 0)
(7, 1, 0)

Now, all the DL symbols are sent.

Notes:
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.

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.

Co-authored-by: Mario Joa-Ng <mario.joa-ng@openairinterface.com>
2026-01-28 13:00:18 +01:00
Jaroslava Fiedlerova c2d3a3d0c2 Merge remote-tracking branch 'origin/oru-rebased' into integration_2026_w05 (!3848)
Initial implementation of O-RU for 7.2 emulator

Added new executable nr-oru which acts as a 7.2 O-RU.
2026-01-27 20:30:12 +01:00
Thomas Schlichter fce8185467 use function pointer instead of weak function for openair0_write_reorder_common() 2026-01-27 16:46:02 +01:00
Laurent THOMAS dd8a25524a remove dead code in common_lib.h 2026-01-27 13:23:18 +01:00
Laurent THOMAS 5b0d34c3ad semi-manual remove of not used #define commands. I let the unused defintions that come from standard bodies 2026-01-27 13:23:10 +01:00
Thomas Schlichter 3435fcc010 update documentation and configuration files reflecting the rfsimulator changes 2026-01-27 11:30:16 +01:00
Thomas Schlichter 4d215b5c95 rfsimulator: add support for providing different parameters to each instance 2026-01-27 11:30:16 +01:00
Thomas Schlichter ce83a78271 remove unused variables from struct openair0_config 2026-01-27 11:30:16 +01:00
Thomas Schlichter b24052d2dc rfsimulator: remove static variable last_TS from function rxAddInput()
This static variable creates issues when there are multiple instances of the LEO channel model in use.
2026-01-27 11:30:16 +01:00
Thomas Schlichter 8e18e5b3aa NR UE: wrap all direct trx_*() function calls in nr_ue_ru_*() functions 2026-01-27 11:30:14 +01:00
Thomas Schlichter 6297c40423 remove unused variables from struct openair0_config 2026-01-27 11:10:54 +01:00
Jaroslava Fiedlerova 2acc8b6a08 Merge remote-tracking branch 'origin/vrtsim-fix-timing' into integration_2026_w05 (!3850)
Update vrtsim timing job thread

List of changes:
- avoid calculating accumulated rounding error by calculating absolute
  sample index based on CLOCK_REALTIME every time.
- use threadCreate instead of plain pthread_create which assigns a unique
  thread name and simplifies debugging
2026-01-26 10:42:18 +01:00
Thomas Schlichter 75df29a333 consistenty use suffix _t for openair0_* types 2026-01-23 18:30:39 +01:00
Mario Joa-Ng 2f6b30cdb4 Fix FFT size for xran_fh_tx_send_slot_BySymbol() and xran_fh_rx_read_slot_BySymbol() 2026-01-22 02:54:03 +01:00
Bartosz Podrygajlo 13f46a0c0a Fix compilation issues with vrtsim taps client
Fix two issues regarding vrtsims taps client implementation:
 - Incorrect #define used to enable taps socket handling
 - flatbuffers package name changing between ubuntu versions
2026-01-21 11:35:12 +01:00
48bcbc316c Initial implementation of O-RU for 7.2 emulator
Added new executable oainr_ru which acts as a 7.2 O-RU.

Co-authored-by: Bartosz Podrygajlo <bartosz.podrygajlo@openairinterface.org>
Co-authored-by: Mario Joa-Ng <mario.joa-ng@openairinterface.org>
2026-01-16 11:56:25 +01:00
Robert Schmidt 91e0388180 Merge remote-tracking branch 'origin/liteon_develop_F' into integration_2026_w03 (!3668)
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;
2026-01-14 14:47:52 +01:00
Mario Joa-Ng c96aa4e740 use a single OAI FHI to handle both liteon and others. liteon uses xran_fh_tx_send_slot_BySymbol() and xran_fh_rx_read_slot_BySymbol() to send CP one section per sysmbol 2026-01-14 14:34:18 +01:00
Mario Joa-Ng 48247ecc1d Add F release patch fh_config parameters RunSlotPrbMapBySymbol and LiteOnIgnoreUPSectionId.
Add the F patch that work on both Benetel and LiteOn RU. support
fh_config parameters RunSlotPrbMapBySymbol and LiteOnIgnoreUPSectionId.
Change version number.
2026-01-14 14:33:30 +01:00
Robert Schmidt 815a5719cd Merge remote-tracking branch 'origin/define_c' into integration_2026_w03 (!3826)
Define speed of light

Common definition for speed of light constant, instead of multiple local
definitions
2026-01-13 11:23:49 +01:00
Robert Schmidt 788cc5f79d Merge remote-tracking branch 'origin/gpd' into integration_2026_w03 (!3849)
Make gpd config utility global

Make gpd a global utility macro for reading config/command line
parameters. Add a corresponding function with full name for clarity,
keep the short name for the macro for backward compatibility and ease of
use.

The main benefit of gpd/config_get_paramdef_from_name macro/function is
that it does not require maintaining a separate parameter index list.
2026-01-12 16:38:13 +01:00
francescomani d4e3c5d384 define speed of light in utils to avoid multiple local definitions 2026-01-09 02:16:49 +01:00
Bartosz Podrygajlo afb861dc0c Update vrtsim timing job thread
List of changes:
 - avoid calculating accumulated rounding error by calculating absolute
   sample index based on CLOCK_REALTIME every time.
 - use threadCreate instead of plain pthread_create which assigns a unique
   thread name and simplifies debugging
2026-01-08 14:11:15 +01:00
Bartosz Podrygajlo 11ae7e7993 Make gpd config utility global
Make gpd a global utility macro for reading config/command line parameters.
Add a corresponding function with full name for clarity, keep the short name
for the macro for backward compatibility and ease of use.

The main benefit of gpd/config_get_paramdef_from_name macro/function is that
it does not require maintaining a separate parameter index list.
2026-01-08 13:57:13 +01:00
Robert Schmidt c8866651fb Merge remote-tracking branch 'origin/oran_prach_start_symbol' into integration_2026_w02 (!3677)
Support prach with start symbol of PRACH not at symbol 0

The following PRACH indice have been tested.

    index / format (nf mod x = y) / Subframe/ start_symbol /no_of_slot / occ / duration
    152     B4     2 1                4,9          0               2      1    12
    151     B4     2 1                4,9          2               1      1    12
    157     B4     1 0                 4           0               1      1    12
    159     B4     1 0                 9           0               1      1    12
2026-01-08 13:03:39 +01:00
Jaroslava Fiedlerova 4b32dc58e6 Merge remote-tracking branch 'origin/fix-usage-iq_rxrescale-iq_txshift' into integration_2026_w02 (!3832)
Remove global iq_txshift and iq_rxrescale

iq_txshift and iq_rxrescale are defined but not used, this commit fixes it
2026-01-08 12:14:15 +01:00
Mario Joa-Ng 0ddf21db12 support prach with non-zero start symbol. 2026-01-07 21:31:48 +01:00
Laurent THOMAS 6313c71b83 remove unused iq_txshift and iq_rxrescale variables
improve comments in usrp_lib.cpp
2026-01-06 09:02:08 +01:00
Bartosz Podrygajlo f8f7bc890b rfsim: fix replay_node when used for rfsim without beamforming 2026-01-05 08:49:20 +01:00
Bartosz Podrygajlo 2a94a42397 rfsim: fix linking issue
Fix an issue caused by assuming C++ linkage of get_currentchannels_type
2026-01-05 08:43:13 +01:00
Robert Schmidt aaaaa35d42 Merge remote-tracking branch 'origin/beams-to-rf-board' into integration_2025_w52 (!3656)
Rfsimulator beam reception/transmission

A simplified beam switching simulation for rfsimulator. This works
mainly in 1 gNB - N UEs scenarios. This is not a real beamformer with
antenna, channel and propagation model. The way it works is that the
peers inform each other about the beams they transmit in, and on
reception before channel modelling, the beam data is combined based on
preconfigured rx_beam/tx_beam gain matrix.

Usage:

- Add --rfsimulator.enable_beams to enable beam simulation

- Add --rfsimulator.beam_gains .

    Example list: 0,-5,-10

    Resulting matrix:

    [[0, -5, -10] [-5, 0, -5]] [-10, -5, 0]]

- Add --telnetsrv if you want to control the beams manually. The command
  in telnet is "rfsimu setbeam <beam_map>", where beam_map is a uint64_t
  controling the reception beam and transmission beam. If the
  application is switching the beams automatically the beams will be
  overwritten as soon as the application chooses to switch beams.

Supports up to 64 concurrent TX and RX beams.
2025-12-24 10:53:04 +01:00
Bartosz Podrygajlo ade7901fb2 RFSim: Add beamids list based user interface for beam domain simulation
Add CLI parameter rfsimulator.beam_ids which uses a list of beam ids instead of a
beam map. The beam map API is still present and can be used interchangably.

Add telnet command setbeamids which has similar semantics
2025-12-23 10:05:14 +01:00
Bartosz Podrygajlo ac97ba4e64 RFsim: Disable beam API if beam simulation is disabled 2025-12-23 10:05:14 +01:00
Bartosz Podrygajlo 8a36b9b85b rfsimulator: fix beam_ctrl_t leak. 2025-12-23 10:05:14 +01:00
Bartosz Podrygajlo 56970390f2 RFsim: handle additional channel offset from CLI
Handle extra channel offset coming from CLI parameter prop_delay.
2025-12-23 10:05:14 +01:00
Bartosz Podrygajlo d6bd2d295f Add beam section to RFSimulator README.md 2025-12-23 10:05:14 +01:00
Bartosz Podrygajlo d6da7a5605 vrtsim: add stubs to beam functions
Add stubbed versions of _beam_ apis to vrtsim.
2025-12-23 10:05:14 +01:00
Bartosz Podrygajlo b10617607a RFsim: Allow arbitrary order of beams.
Allow arbitrary order of beam ids in set_beams2 function. This
allows the application to select any arbitrary order of beam ids.
The underlying transport mechanism still uses beam_map so the beam_ids
are ordered before sending.

Also replaced tx_beam_map/rx_beam_map into beam_map.

Also fixed an issue where --rfsimulator.enable_beams required an argument.
2025-12-23 10:05:14 +01:00