- 23 Jul, 2026 1 commit
-
-
Robert Schmidt authored
I took three runs, averaged the respective times. For the thresholds, always apply a 20% margin. Signed-off-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
- 22 Jul, 2026 1 commit
-
-
Robert Schmidt authored
UL Indications typically is fast, so the 1-3us have all a guard interval of 100%. Worse, in phy-test, we typically don't actually forward any RLC PDUs, so we don't measure much anyway. Remove this from all configs. Signed-off-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
- 21 Jul, 2026 1 commit
-
-
Robert Schmidt authored
Each "datalog" filename contains a Title. In all files, it is basically "Processing Time from <file>", which <file> should be the current filename, but is occasionally wrong. Remove this title, and print the same automatically with the right filename. Signed-off-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
- 17 Jul, 2026 17 commits
-
-
Abdennour ABDI authored
Signed-off-by:Abdennour ABDI <abdennour.abdi@open-cells.com>
-
Robert Schmidt authored
These arrays, from what I can see, are only written. As such, it seems that resetting these arrays first is futile. Running OAI_RNGSEED=2222 perf stat -d ./ldpctest '-l7040' '-s3' -n1000 shows that the average decoding time is reduced, from ldpc_decoder: 177.625 us; 1000; 355.389 us; ldpc_decoder: 179.794 us; 1000; 421.170 us; ldpc_decoder: 173.362 us; 1000; 360.085 us; ldpc_decoder: 176.322 us; 1000; 323.194 us; ldpc_decoder: 174.158 us; 1000; 368.887 us; to ldpc_decoder: 163.437 us; 1000; 387.684 us; ldpc_decoder: 164.242 us; 1000; 329.896 us; ldpc_decoder: 165.561 us; 1000; 386.442 us; ldpc_decoder: 162.239 us; 1000; 387.872 us; ldpc_decoder: 164.808 us; 1000; 325.659 us; while exhibiting reduced number of L1d cache misses. Signed-off-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
Robert Schmidt authored
Signed-off-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
Raymond Knopp authored
Signed-off-by:Raymond Knopp <raymond.knopp@eurecom.fr>
-
Raymond Knopp authored
Replace 1360-line bnProc.h (BG1-only, 256-bit only, 13 copy-pasted degree groups) and all 36 generated bnProc/bnProcPc #includes with two generic loops over the 30 BN-degree groups, dispatching at compile time to: - AVX512BW: 512-bit accumulation in bnProcPc (mm512_cvtepi8_epi16 + mm512_cvtsepi16_epi8), 512-bit subs in bnProc - AVX2: existing 256-bit paired-128 widen/accumulate/pack pattern - 128-bit: hi/lo split via mm_srli_si128, always compiled Both functions now cover all BG variants (BG1/BG2, all rates) without rate-specific dispatch in the decoder. bnProc includes degree-1 BNs (previously special-cased) via the generic loop. nrLDPC_decoder.c dispatch blocks for UNROLL_BN_PROC / UNROLL_BN_PROC_PC are removed; UNROLL_CN_PROC remains commented-in for benchmarking. Assisted-by: Claude:claude-sonnet-4.6 Signed-off-by:Raymond Knopp <raymond.knopp@eurecom.fr>
-
Raymond Knopp authored
Add nrLDPC_cnProc_group_2pass_512() — a native 512-bit variant of the two-pass min-sum CN processor — and update the BG1/BG2 wrappers to dispatch to the widest available register set. Kernel design: - Uses AVX512BW mask-register comparisons (simde__mmask64) and predicated blend (simde_mm512_mask_blend_epi8) for single-cycle select instead of the vector-mask XOR trick used in the 256-bit path. - Pass 1: simde_mm512_abs/xor/min_epu8/max_epu8 — same structure as 256-bit kernel, 64 CNs per iteration. - Pass 2: eq_mask = cmpeq_epi8_mask(|vk|, vmin1); out_mag = mask_blend_epi8(eq_mask, vmin1, vmin2); neg_mask = cmpgt_epi8_mask(zeros, other_xor); result = mask_blend_epi8(neg_mask, out_mag, -out_mag) Wrapper dispatch (compile-time): __AVX512BW__: 512-bit, M = ceil(numCN*Z/64), off >>= 6 __AVX2__: 256-bit, M = ceil(numCN*Z/32), off >>= 5 else: 128-bit, M = ceil(numCN*Z/16), off >>= 4 All buffer strides (lut_numCnInCnGroups_{BG1_R13,BG2_R15}[grp] * NR_LDPC_ZMAX) are divisible by 64, so the 512-bit stride is exact. Compile-tested: -mavx512bw → exit 0 (512-bit path) -mavx2 → exit 0 (256-bit path) -mno-avx2 → exit 0 (128-bit path, pre-existing Wpsabi warning) Signed-off-by:Raymond Knopp <raymond.knopp@eurecom.fr> Assisted-by: Claude:claude-sonnet-4.6
-
Raymond Knopp authored
Remove TWOPASS_CN_PROC guard now that the two-pass path is the only non-unrolled option: - Comment out #define UNROLL_CN_PROC 1 so the two-pass path is active by default on all targets (AVX2, AVX512, aarch64/NEON). - Collapse the four dispatch sites from #ifndef UNROLL_CN_PROC #ifdef TWOPASS_CN_PROC ... #else ... #endif #else <unrolled switch> to the simpler #ifndef UNROLL_CN_PROC nrLDPC_cnProc_BG{1,2}_2pass(...) #else <unrolled switch> - The unrolled path (UNROLL_CN_PROC) is retained for benchmarking and will be removed in a follow-up once the two-pass path is confirmed as the permanent default. Tested on: AMD Ryzen (AVX2), Intel (AVX512), Rockchip A76 (NEON), NVIDIA Neoverse (DGX Spark, GH200). Signed-off-by:Raymond Knopp <raymond.knopp@eurecom.fr> Assisted-by: Claude:claude-sonnet-4.6
-
Raymond Knopp authored
Add //#define TWOPASS_CN_PROC alongside UNROLL_CN_PROC=1. When UNROLL_CN_PROC is commented out and TWOPASS_CN_PROC is defined, all four cnProc call sites (first-iter BG1/BG2, loop BG1/BG2) dispatch to nrLDPC_cnProc_BG1_2pass / nrLDPC_cnProc_BG2_2pass instead of the LUT-based variants. To benchmark: comment UNROLL_CN_PROC and uncomment TWOPASS_CN_PROC. To revert to LUT generic: comment both. Assisted-by: Claude:claude-sonnet-4.6 Signed-off-by:Raymond Knopp <raymond.knopp@eurecom.fr>
-
Raymond Knopp authored
Add nrLDPC_cnProc_group_2pass_128() — a native 128-bit variant of the two-pass min1/min2 CN processor — and restructure the file so the two-pass section compiles on every target. Changes: - Close the #if !AVX512BW guard immediately after the existing generic BG1/BG2 256-bit functions (line ~857); the two-pass section is now outside that guard so it is visible on all platforms. - Add #if defined(__AVX2__) || defined(__AVX512BW__) guard around the 256-bit nrLDPC_cnProc_group_2pass kernel; the 128-bit kernel below it is always compiled. - nrLDPC_cnProc_BG1_2pass / _BG2_2pass wrappers now dispatch at compile time: AVX2 / AVX512: 256-bit path, M = ceil(numCN*Z/32), off >>= 5 aarch64 / SSE2: 128-bit path, M = ceil(numCN*Z/16), off >>= 4 Each simde__m128i op maps to a single NEON instruction on aarch64, matching the code-generation strategy used by the existing cnProc128/ generated functions. Compile-tested: -mavx2 → exit 0 (256-bit path taken) -mno-avx2 → exit 0 (128-bit path taken, one pre-existing warning) -mavx512bw → pre-existing errors in nrLDPC_cnProc_avx512.h (ones512_epi8 undeclared); not caused by this change. Signed-off-by:Raymond Knopp <raymond.knopp@eurecom.fr> Assisted-by: Claude:claude-sonnet-4.6
-
Raymond Knopp authored
nrLDPC_cnProc_BG1_2pass and nrLDPC_cnProc_BG2_2pass replace the LUT-exclude-self approach with a two-pass algorithm: Pass 1: single sweep over all numBN inputs to collect min1, min2 (two smallest |vk|) and the full sign product via sign_epi8. Pass 2: re-read each vk, select min2 where |vk|==min1 (tie approx), remove self sign with sign_epi8(vsgn_all, vk), and store. Memory reads per CN group: 2*numBN vs numBN*(numBN-1) for LUT approach: numBN= 4: 8 vs 12 (1.5x fewer) numBN= 7: 14 vs 42 (3.0x fewer) numBN=10: 20 vs 90 (4.5x fewer) numBN=19: 38 vs 342 (9.0x fewer) A generic nrLDPC_cnProc_group_2pass(buf, res, numBN, M, off) helper does the work; the BG1/BG2 wrappers loop over their degree groups and derive the BN stride from lut_numCnInCnGroups_BG1/2_R13/15 exactly as the existing functions do. No new LUT tables are required. Placed inside the #else (non-AVX512) block alongside the existing BG1/BG2 functions; AVX512 path is unchanged. Assisted-by: Claude:claude-sonnet-4.6 Signed-off-by:Raymond Knopp <raymond.knopp@eurecom.fr>
-
Robert Schmidt authored
Integration: 2026.w29 - #280 Optimize syscalls in GTP receiver/sender, GTP F1 UL callback optimization - #287 demote LOG_E for RRC Release with deprioritisationReq - #259 [FHI72] Remove xran F release support - #286 NR_PHY: Optimize layer demapping for PDSCH/PUSCH receiver performance - #248 Allocate multiple UEs in one slot (DL/UL) - #283 Update WLS library dependencies - #284 Update OpenAirInterface repository links to the new Duranta Project repository - #301 fix(t2): Accept CBs decoded across separate HARQ rounds - #302 fix(phy): Fix an uninitialized variable bug in dot_product - #303 fix(phy): use simde_mm_setr_epi16 to initialize alpha_128 in rotate_cpx_vector - #298 ITTI: cleanup memset after alloc, adopt calloc_or_fail - #299 Update the OAI UE config parameters check range with the standard SST and SD values - #268 nfapi: support SRS channel reports for 64 gNB antenna elements - fix for WLS PR - #304 fix(PHY): compare NID2 instead of NID1 in rx_sss_nr() coherence check - #277 chore: migrate FlexRIC submodule to GitHub - #195 Add cell-level E2SM-KPM measurements - #300 CI: Update Aerial setup to 26-1 Closes: #296
-
Robert Schmidt authored
CI: Update Aerial setup to 26-1 (#300) This PR updates the cuBB image in the Aerial setup to release 26-1. Reviewed-By:Rúben Soares Silva <rsilva@allbesmart.pt>
-
Robert Schmidt authored
Add cell-level E2SM-KPM measurements (#195) This PR adds five 3GPP TS 28.552 cell-level measurements, exposed through the E2SM-KPM service model. The five metrics are: | Metric | 3GPP TS 28.552 | Object class | Advertised by | |---------------------|----------------|--------------|---------------------------| | `CARR.PDSCHMCSDist` | §5.1.1.12.1 | NRCellDU | DU, monolithic gNB | | `CARR.PUSCHMCSDist` | §5.1.1.12.2 | NRCellDU | DU, monolithic gNB | | `L1M.SS-RSRP` | §5.1.1.22.1 | Beam | CU, CU-CP, monolithic gNB | | `MR.NRScSSSINR` | §5.1.1.32 | NRCellCU | CU, CU-CP, monolithic gNB | | `RRC.ConnMean` | §5.1.1.4.1 | NRCellCU | CU, monolithic gNB | Each metric is delivered as one signed commit. Metrics: CARR.PDSCHMCSDist — §5.1.1.12.1: PRB-weighted distribution of the MCS used on PDSCH, modelled as a 3D histogram over (rank, MCS-table, MCS-index). The collection hook in the DL scheduling path increments the matching bin by the number of scheduled PDSCH RBs. Carried as E2SM-KPM Style 1 / Indication Message Format 1 with the `distBinX/Y/Z` measurement labels. CARR.PUSCHMCSDist — §5.1.1.12.2: Uplink counterpart of the above, over (rank, MCS-table-family, MCS-index) for PUSCH. The UL scheduling hook increments the bin by the number of scheduled PUSCH RBs. L1M.SS-RSRP — §5.1.1.22.1: Distribution of the SS-RSRP reported by UEs, resolved per SSB beam. The RRC layer accumulates a per-beam histogram from each periodic Measurement Report; RSRP level `L` maps to `L − 157` dBm (TS 38.133 §10.1.6). The reader returns the per-beam value when the `ssbIndex` label is present, or the cell-wide sum over beams otherwise. MR.NRScSSSINR — §5.1.1.32: Distribution of the NR serving-cell SS-SINR reported by UEs. The RRC layer accumulates a per-cell histogram from each periodic Measurement Report; level `L` maps to `(L − 46) / 2` dB (0.5 dB steps, TS 38.133 §10.1.16). RRC.ConnMean — §5.1.1.4.1: Mean number of UEs in RRC-CONNECTED state over the granularity period. The RRC task samples the connected-UE count at a fixed interval and accumulates a running `{sum, samples}`. The reported mean is the delta of that cumulative accumulator between two consecutive readings. Notes: - All five metrics are carried as E2SM-KPM **Measurement Report Style 1** - Distribution metrics use the standard `distBinX/Y/Z` (and `ssbIndex` where applicable) measurement labels; bins are 1-based on the wire and mapped to 0-based array indices. Where TS 28.552 defines no scalar aggregate, a request without the required label or a `noLabel` subscriptions, are answered with `NO_VALUE`. Reviewed-by:Robert Schmidt <robert.schmidt@openairinterface.org> Reviewed-by:
Teodora Vladić <teodora.vladic@openairinterface.org>
-
Robert Schmidt authored
chore: migrate FlexRIC submodule to GitHub (#277) This PR migrates the FlexRIC submodule from the EURECOM GitLab repository to the GitHub repository under the duranta-project organization. - Update the FlexRIC submodule URL. - Remove submodule branch remotes/origin/service-models-integration from .gitmodules introduced in the commit 2fef830d. After removing the explicit branch configuration, git submodule update --remote will follow the default branch of the FlexRIC remote repository (in this case, dev) Reviewed-by:
Robert Schmidt <robert.schmidt@openairinterface.org> Reviewed-by:
Teodora Vladić <teodora.vladic@openairinterface.org>
-
Robert Schmidt authored
fix(PHY): compare NID2 instead of NID1 in rx_sss_nr() coherence check (#304) target_Nid_cell was being decomposed with GET_NID1() and compared against pss->nid2 (the detected PSS NID2). Since Nid1 != Nid2 in almost all cases, the coherence check always failed, forcing an exhaustive 336-hypothesis SSS search instead of the intended single-candidate fast path when validating a known neighbor PCI, and spamming LOG_E on every such call. Closes: #296 Reviewed-by:Francesco Mani <email@francescomani.it>
-
Teodora Vladić authored
Relevant PR: * https://github.com/duranta-project/openairinterface5g/pull/259 * https://github.com/duranta-project/openairinterface5g/pull/293Signed-off-by:
Teodora Vladić <teodora.vladic@openairinterface.org> Signed-off-by:
Robert Schmidt <robert.schmidt@openairinterface.org>
-
- 16 Jul, 2026 7 commits
-
-
Noemi Giustini authored
Implement RRC.ConnMean (3GPP TS 28.552 §5.1.1.4.1): mean number of UEs in RRC-CONNECTED state over the granularity period, computed as a time-average of periodic samples. - ran_func_kpm.c: append RRC.ConnMean to kpm_node_meas_cu[] and kpm_node_meas_gnb[]. - ran_func_kpm_subs.h: add rrc_conn_count_sum and rrc_conn_count_samples to e2_node_level_stats_t for per-report start/end snapshots. - ran_func_kpm_subs.c: add fill_RRC_ConnMean(); snapshots the live RRC counters into node_stats[1], computes the mean as Δsum/Δsamples over the granularity window, returns a real-valued record (noLabel); extend cp_node_level_stats() to copy the two new fields; add dispatch entry to lst_measure[]. - nr_rrc_defs.h: add rrc_conn_count_sum and rrc_conn_count_samples to gNB_RRC_INST. - rrc_gNB.c: add nr_rrc_sample_conn_count(); it samples the connected-UE count and accumulates it into the cumulative counters, invoked from the existing stats timer in the RRC task loop. It is always compiled: counting is harmless when the E2 agent is disabled, and it leaves the timer setup and write_rrc_stats() untouched. Advertised by CU and monolithic gNB node types. Signed-off-by:Noemi Giustini <giustini.n@northeastern.edu>
-
Noemi Giustini authored
Implement MR.NRScSSSINR (3GPP TS 28.552 §5.1.1.32): distribution of the NR serving-cell SS-SINR reported by UEs. Level L maps to (L-46)/2 dB (0.5 dB steps, range -23..+40.5 dB) per TS 38.133 §10.1.16. This is the RRC serving-cell SS-SINR (TS 38.331 Measurement Report), so it is collected at RRC and kept as a per-cell RRC statistic. - ran_func_kpm.c: introduce kpm_node_meas_cu[] with MR.NRScSSSINR; add it to kpm_node_meas_gnb[]; wire kpm_node_meas_cu into the ran_def_kpm table for the CU and CU-CP rows. - ran_func_kpm_subs.c: add fill_MR_NRScSSSINR(); distBinX (SINR level) is 0-based on the wire (valid range 0..127) and used directly as the array index, returning RC.nrrrc[0]->ss_sinr_cell_dist[bin]; requests without distBinX yield NO_VALUE; add dispatch entry to lst_measure[]. - nr_rrc_defs.h: add ss_sinr_cell_dist[128] to gNB_RRC_INST. - rrc_gNB.c: add nr_rrc_count_ss_sinr_dist(); it reads the serving-cell SINR of a periodic Measurement Report and increments the histogram. It is invoked from rrc_gNB_process_MeasurementReport() on the report itself, before process_Periodical_Measurement_Report() consumes it, so the latter keeps its original signature. It is always compiled: counting is harmless when the E2 agent is disabled. Advertised by CU, CU-CP, and monolithic gNB node types. Signed-off-by:Noemi Giustini <giustini.n@northeastern.edu>
-
Noemi Giustini authored
Implement L1M.SS-RSRP (3GPP TS 28.552 §5.1.1.22.1): distribution of the L1 SS-RSRP reported by UEs, resolved per SSB beam. Each bin accumulates the count of reports at a given (beam, RSRP-level); level L maps to (L-157) dBm per TS 38.133 §10.1.6. SS-RSRP used as L1-RSRP originates in L1 (TS 38.214), so it is collected at MAC when the per-beam L1-RSRP report is decoded, not from RRC Measurement Reports (which carry the L3-filtered RRC measurement). The histogram is therefore a per-cell DU statistic. - nr_mac_gNB.h: add ss_rsrp_ssb_dist[64][128] to NR_du_stats, plus the NR_KPM_NB_SSB / NR_KPM_SS_RSRP_NB_LEVELS dimensions. - gNB_scheduler_uci.c: in evaluate_rsrp_report(), for SS-RSRP (per-SSB) reports, increment ss_rsrp_ssb_dist[ssb][level] for every reported beam. RSRP is available in dBm; the 0..127 report level is recovered as (RSRP + 157), so that level L maps back to (L-157) dBm per TS 38.133 §10.1.6, and both the strongest beam and the differential beams are binned. - ran_func_kpm_subs.c: add fill_L1M_SS_RSRP(); distBinX (RSRP level) and the optional ssbIndex are 0-based on the wire and used directly as array indices (valid ranges 0..127 and 0..63); returns the per-beam value du_stats->ss_rsrp_ssb_dist[ssb][bin] or the cell-wide sum over beams when ssbIndex is absent; add dispatch entry to lst_measure[]. - ran_func_kpm.c: advertise L1M.SS-RSRP as a DU measurement (kpm_node_meas_du and kpm_node_meas_gnb). Advertised by DU and monolithic gNB node types. Signed-off-by:Noemi Giustini <giustini.n@northeastern.edu>
-
Noemi Giustini authored
Implement CARR.PUSCHMCSDist (3GPP TS 28.552 §5.1.1.12.2): uplink counterpart of CARR.PDSCHMCSDist; PRB-weighted 3D histogram over (rank, MCS-table, MCS-index) for PUSCH transmissions. PUSCH may use MCS tables 0 (64-QAM), 1 (256-QAM) and 3 (SC-FDMA), so the MCS-table dimension is indexed directly by current_BWP->mcs_table and sized to 4 (index 2 unused). Remapping the tables into fewer bins would lose the 64-QAM/256-QAM distinction, so no remapping is applied. - ran_func_kpm.c: register CARR.PUSCHMCSDist in the RAN Function Definition advertisement (kpm_node_meas_* lists). - ran_func_kpm_subs.c: add fill_CARR_PUSCHMCSDist(); distBinX (rank) is 1-based on the wire and converted to a 0-based index, while distBinY (MCS table, values 0/1/3) and distBinZ (MCS index) are 0-based and used directly, returning du_stats->pusch_mcs_dist[rank-1][table][mcs]; add dispatch entry to lst_measure[]. - nr_mac_gNB.h: the pusch_mcs_dist histogram was sized [8][2][32], too small for MCS table 3 (SC-FDMA) and thus overflowing at collection time; size the MCS-table dimension to 4 via NR_KPM_NB_MCS_TABLE_UL to hold tables 0, 1, 3. - gNB_scheduler_ulsch.c: the UL collection into pusch_mcs_dist already exists; align its surrounding DevAsserts with the KPM dimension macros (NR_KPM_MAX_LAYERS, NR_KPM_NB_MCS). Carried as E2SM-KPM Style 1 / Format 1 with distBinX/Y/Z labels. Advertised by DU and monolithic gNB node types. Signed-off-by:Noemi Giustini <giustini.n@northeastern.edu>
-
Noemi Giustini authored
CARR.PDSCHMCSDist (3GPP TS 28.552 §5.1.1.12.1) and its du_stats histogram already existed, but the metric was never collected and the reader indexed the histogram incorrectly. Rework it into a correct PRB-weighted 3D histogram over (rank, MCS-table, MCS-index). - gNB_scheduler_dlsch.c: add the missing collection hook in the DL scheduling path; increment the (rank, MCS-table, MCS) bin by the number of scheduled PRBs on each PDSCH. mcsTableIdx is 0-based (0..2), so it is used directly to index the MCS-table axis of the histogram. - ran_func_kpm_subs.c: make fill_CARR_PDSCHMCSDist() fully label-driven; reject with NO_VALUE if any of distBinX/Y/Z is absent. distBinX (rank) and distBinY (MCS table) are 1-based on the wire and converted to 0-based indices; distBinZ (MCS index) is already 0-based and used directly, reading du_stats->pdsch_mcs_dist[rank-1][table-1][mcs]. Carried as E2SM-KPM Style 1 measurement (Indication Message Format 1) with standard MeasurementLabel fields distBinX/Y/Z (INTEGER 1..65535). Advertised by DU and monolithic gNB node types. Signed-off-by:Noemi Giustini <giustini.n@northeastern.edu>
-
Mohammed Safwan authored
target_Nid_cell was being decomposed with GET_NID1() and compared against pss->nid2 (the detected PSS NID2). Since Nid1 != Nid2 in almost all cases, the coherence check spuriously failed, forcing an exhaustive 336-hypothesis SSS search instead of the intended single-candidate fast path when validating a known neighbor PCI, and spamming LOG_E on every such call. Fixes #296 Signed-off-by:Mohammed Safwan <mohammed.safwan@openairinterface.org>
-
Robert Schmidt authored
nfapi: support SRS channel reports for 64 gNB antenna elements (#268) This MR is part of the reciprocity-based dynamic BF series and goes together with #156 and #267. Additional MRs will follow with the FAPI changes to support Dynamic Beamforming, as well as adaptations to the scheduler. SRS-reciprocity workflows with Aerial mMIMO (Cat-B, 64-element arrays) return the normalized channel IQ matrix over FAPI, but the SRS.indication structs and codec were dimensioned for 8 gNB antenna elements. A 64-element report needs up to 272 PRGs × 4 UE ports × 64 elements × 4 B ≈ 272 KiB, which the current code truncates or silently drops. Changes: - Buffer dimensioning (nfapi_nr_interface_scf.h): new NFAPI_NR_SRS_MAX_* macros size channel_matrix and the SRS report TLV value[] for 64 antenna elements / 4 UE SRS ports / 272 PRGs. The two buffers are now sized consistently (previously the report TLV allowed more UE ports than channel_matrix could hold). - Integer overflow fixes on the SRS report path, which become fatal at these report sizes: * unpack_nr_srs_report_tlv_value(): last_idx was int16_t, overflowing for reports >= 128 KiB so the copy loop never ran and the report was dropped. Widened to int32_t, and oversized reports are now rejected instead of overrunning the value buffer. * pack/unpack_nr_srs_normalized_channel_iq_matrix(): channel_matrix_size was uint16_t (wraps at 64 KiB). Widened to uint32_t and bounded by sizeof(channel_matrix). * handle_nr_srs_measurements(): the SRS_IND_DEBUG print indexed the matrix with a uint16_t, which wraps for Nu·Ng·Np > 65535. Reviewed-by:Robert Schmidt <robert.schmidt@openairinterface.org> Reviewed-By:
Rúben Soares Silva <rsilva@allbesmart.pt>
-
- 15 Jul, 2026 13 commits
-
-
Robert Schmidt authored
Update the OAI UE config parameters check range with the standard SST and SD values (#299) This PR updates the SST and SD authorized range provided for OAI UE UICC configuration check as per the S-NSSAI as defined in TS 24.501 Sec. 9.11.2.8 and TS 23.003 Sec. 28.4.2. The standard SST range is from 0 to 127 (while 128 to 255 are reserved for operator-specific purposes) and standard SD range is from 0x000000 to 0xFFFFFF. Thanks to IOS-MCN, IISc for providing the IOS-MCN-CORE setup to test the ue-nas-simulator. Reviewed-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
Robert Schmidt authored
ITTI: cleanup memset after alloc, adopt calloc_or_fail (#298) In NGAP/RRC memset calls after itti_alloc_new_message are redundant since memory is already zero-initialized by itti_alloc_new_message via calloc(). Also, in itti_malloc, manual calloc + AssertFatal is replaced by calloc_or_fail, which provides better error messages and calls abort(). Reviewed-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
Robert Schmidt authored
fix(phy): use simde_mm_setr_epi16 to initialize alpha_128 in rotate_cpx_vector (#303) Avoid direct pointer-casting of the SIMD variable alpha_128 to int16_t * in rotate_cpx_vector(), which is a strict-aliasing violation and can cause undefined behavior or compiler optimization bugs. Instead, use the simde_mm_setr_epi16 intrinsic to initialize the vector. The bug was observed on an arm system, and would lead to non-deterministic results. Reviewed-by:Laurent THOMAS <laurent.thomas@open-cells.com>
-
Robert Schmidt authored
fix(phy): Fix an uninitialized variable bug in dot_product (#302) This was only present on non x86 systems. Reviewed-by:Laurent THOMAS <laurent.thomas@open-cells.com>
-
Robert Schmidt authored
fix(t2): Accept CBs decoded across separate HARQ rounds (#301) See commit 8481bd3e for more details. Reviewed-by:
Robert Schmidt <robert.schmidt@openairinterface.org>
-
Robert Schmidt authored
Update OpenAirInterface repository links to the new Duranta Project repository (#284) Reviewed-by:
Robert Schmidt <robert.schmidt@openairinterface.org> Reviewed-by:
Shubhika Garg <shubhika.garg@openairinterface.org>
-
Robert Schmidt authored
Update WLS library dependencies (#283) This PR aims to upgrade the used WLS library and dependencies to align with Release K , following the drop of support for Release F previously used PR #259. This was tested locally after installing the new DPDK version and WLS library according to ORAN_FHI7.2_Tutorial.md and nfapi.md. Reviewed-by:
Robert Schmidt <robert.schmidt@openairinterface.org> Reviewed-by:
Teodora Vladić <teodora.vladic@openairinterface.org> Reviewed-by:
Jaroslava Fiedlerova <jaroslava.fiedlerova@openairinterface.org>
-
Jaroslava Fiedlerova authored
Allocate multiple UEs in one slot (DL/UL) (#248) This PR allows to schedule multiple UEs in one slot via a 2-pass loop. Since we still use type-1 RB allocation, we use start+length. Thus, once an allocation is made, it is non-trivial to change it if another UE has been allocated, because it would be necessary to change the allocation of multiple UEs retroactively. Thus, the two-pass algorithm - calculates the amount of RBs relevant for each UE, storing the number of requested RBs - makes allocations while accounting for excess RBs (excess RBs are given to the first UE(s) to preserve the PF property) Further, the number of DCIs in DL/UL is capped to 4 to prevent excessive computation times, as shown in nrdlbench. Also, increase the number of DCIs per slot to 12 (from 8, which might be reached with 4 DL/4 UL UEs) and add asserts. Reviewed-By:
Maxime Elkael <m.elkael@northeastern.edu> Reviewed-By:
Karim Boutiba <karim.boutiba@openairinterface.org>
-
Robert Schmidt authored
NR_PHY: Optimize layer demapping for PDSCH/PUSCH receiver performance (#286) Optimizes layer de-mapping in the NR receiver path and refactors the implementation into a common function shared by both the UE (PDSCH) and gNB (PUSCH) receive paths. Commit 1: [NR_UE_PDSCH] Optimize PDSCH layer de-mapping Uses a switch with a LAYER_DEMAPPING(MO) macro for modulation orders 2, 4, 6, and 8. Since the copy size is now known at compile time, the compiler can replace memcpy calls with inline fixed-size vector stores. Commit 2: [NR_PHY] Common layer de-mapping implementation Extract a common nr_layer_demapping() function for both UE and gNB. Update the UE and gNB receive paths to use the shared implementation, reducing code duplication while bringing the same optimization to the gNB PUSCH path. With ./nr_dlsim -s30 -b106 -R106 -n100 -e25 -x2 -y2 -z2 -P i.e. 64 QAM, 2 layers case, the layer demapping compute time reduces by ~35x times. Develop: |__ DLSCH_CHANNEL_COMPENSATION_STATS 3.03 us (1300 trials) ( 3.94 total [ms]) |__ DLSCH_LLR_STATS 17.54 us (100 trials) ( 1.75 total [ms]) |__ DLSCH_LAYER_DEMAPPING 571.11 us (100 trials) ( 57.11 total [ms]) Post-optimization: |__ DLSCH_CHANNEL_COMPENSATION_STATS 2.67 us (1300 trials) ( 3.47 total [ms]) |__ DLSCH_LLR_STATS 16.50 us (100 trials) ( 1.65 total [ms]) |__ DLSCH_LAYER_DEMAPPING 16.14 us (100 trials) ( 1.61 total [ms]) Mod 2 Layers (µs) 3 Layers (µs) 4 Layers (µs) develop PB speedup develop PB speedup develop PB speedup 64 QAM 571.11 16.14 35.39x 649.16 19.92 32.59x 953.22 30.00 31.77x 16 QAM 523.60 8.35 62.71x 651.99 13.39 48.69x 844.49 14.67 57.57x QPSK 32.43 8.09 4.01x 35.17 9.21 3.82x 63.64 11.44 5.56x Reviewed-By: Rakesh Mundlamuri <rakesh.mundlamuri@openairinterface.org Reviewed-by:Bartosz Podrygajlo <bartosz.podrygajlo@openairinterface.org>
-
Robert Schmidt authored
[FHI72] Remove xran F release support (#259) Additionally, downgrade required DPDK version from v24 to v22 for xran K release. Initially, we wanted to use more recent version, but for the compatibility with T2 card v22 is required. Reviewed-by:Robert Schmidt <robert.schmidt@openairinterface.org>
-
Bartosz Podrygajlo authored
Avoid direct pointer-casting of the SIMD variable `alpha_128` to `int16_t *` in rotate_cpx_vector(), which is a strict-aliasing violation and can cause undefined behavior or compiler optimization bugs. Instead, use the simde_mm_setr_epi16 intrinsic to initialize the vector. The bug was observed on an arm system, and would lead to non-deterministic results. Signed-off-by:Bartosz Podrygajlo <bartosz.podrygajlo@openairinterface.org>
-
Bartosz Podrygajlo authored
This was only present on non x86 systems. Signed-off-by:Bartosz Podrygajlo <bartosz.podrygajlo@openairinterface.org>
-
Rúben Soares Silva authored
Signed-off-by:Rúben Soares Silva <rsilva@allbesmart.pt>
-