1. 22 Jul, 2026 1 commit
  2. 21 Jul, 2026 1 commit
  3. 17 Jul, 2026 17 commits
    • Abdennour ABDI's avatar
    • Robert Schmidt's avatar
      ldpc: remove seemingly useless memset() in LDPC decoder · d07c1897
      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: default avatarRobert Schmidt <robert.schmidt@openairinterface.org>
      d07c1897
    • Robert Schmidt's avatar
    • Raymond Knopp's avatar
    • Raymond Knopp's avatar
      perf: replace generated bnProc/bnProcPc with generic three-width kernels · cd7093b7
      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: default avatarRaymond Knopp <raymond.knopp@eurecom.fr>
      cd7093b7
    • Raymond Knopp's avatar
      perf: add 512-bit two-pass cnProc kernel for AVX512BW · e0e12e07
      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: default avatarRaymond Knopp <raymond.knopp@eurecom.fr>
      Assisted-by: Claude:claude-sonnet-4.6
      e0e12e07
    • Raymond Knopp's avatar
      perf: make two-pass cnProc the default, keep unrolled as opt-in · 7a8d07ce
      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: default avatarRaymond Knopp <raymond.knopp@eurecom.fr>
      Assisted-by: Claude:claude-sonnet-4.6
      7a8d07ce
    • Raymond Knopp's avatar
      perf: add TWOPASS_CN_PROC dispatch in nrLDPC_decoder · 05190ad8
      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: default avatarRaymond Knopp <raymond.knopp@eurecom.fr>
      05190ad8
    • Raymond Knopp's avatar
      perf: add 128-bit two-pass cnProc for aarch64/NEON targets · 4b58b31b
      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: default avatarRaymond Knopp <raymond.knopp@eurecom.fr>
      Assisted-by: Claude:claude-sonnet-4.6
      4b58b31b
    • Raymond Knopp's avatar
      perf: add two-pass min1/min2 cnProc for BG1 and BG2 (CPU) · 889e8873
      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: default avatarRaymond Knopp <raymond.knopp@eurecom.fr>
      889e8873
    • Robert Schmidt's avatar
      Merge remote-tracking branch 'origin/integration_2026_w29' into develop · 31ffb21a
      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
      31ffb21a
    • Robert Schmidt's avatar
      Merge remote-tracking branch 'jfiedlerova/ci-update-aerial' into integration_2026_w29 · b989b8b9
      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: default avatarRúben Soares Silva <rsilva@allbesmart.pt>
      b989b8b9
    • Robert Schmidt's avatar
      Merge remote-tracking branch 'Noemi2001/Cell-level_KPMs' into integration_2026_w29 · 774094cc
      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: default avatarRobert Schmidt <robert.schmidt@openairinterface.org>
      Reviewed-by: default avatarTeodora Vladić <teodora.vladic@openairinterface.org>
      774094cc
    • Jaroslava Fiedlerova's avatar
    • Robert Schmidt's avatar
      Merge remote-tracking branch 'origin/flexric-duranta-change' into integration_2026_w29 · efaf8006
      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: default avatarRobert Schmidt <robert.schmidt@openairinterface.org>
      Reviewed-by: default avatarTeodora Vladić <teodora.vladic@openairinterface.org>
      efaf8006
    • Robert Schmidt's avatar
      Merge remote-tracking branch 'safwan2mo/fix/sss-nid1-nid2-mismatch' into integration_2026_w29 · 69deb749
      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: default avatarFrancesco Mani <email@francescomani.it>
      69deb749
    • Teodora Vladić's avatar
  4. 16 Jul, 2026 7 commits
    • Noemi Giustini's avatar
      Add RRC.ConnMean metric · fe228e57
      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: default avatarNoemi Giustini <giustini.n@northeastern.edu>
      fe228e57
    • Noemi Giustini's avatar
      Add MR.NRScSSSINR metric · 97dee1ac
      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: default avatarNoemi Giustini <giustini.n@northeastern.edu>
      97dee1ac
    • Noemi Giustini's avatar
      Add L1M.SS-RSRP metric · 1ba5150f
      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: default avatarNoemi Giustini <giustini.n@northeastern.edu>
      1ba5150f
    • Noemi Giustini's avatar
      Add CARR.PUSCHMCSDist metric · 471df044
      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: default avatarNoemi Giustini <giustini.n@northeastern.edu>
      471df044
    • Noemi Giustini's avatar
      Rework CARR.PDSCHMCSDist metric · 23ef597c
      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: default avatarNoemi Giustini <giustini.n@northeastern.edu>
      23ef597c
    • Mohammed Safwan's avatar
      fix(PHY): compare NID2 instead of NID1 in rx_sss_nr() coherence check · a2685262
      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: default avatarMohammed Safwan <mohammed.safwan@openairinterface.org>
      a2685262
    • Robert Schmidt's avatar
      Merge remote-tracking branch 'gabri94/aerial-64l-srs' into integration_2026_w29 · 1fc4bb6f
      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: default avatarRobert Schmidt <robert.schmidt@openairinterface.org>
      Reviewed-By: default avatarRúben Soares Silva <rsilva@allbesmart.pt>
      1fc4bb6f
  5. 15 Jul, 2026 14 commits