1. 21 Jul, 2026 6 commits
  2. 20 Jul, 2026 3 commits
    • Rakesh Mundlamuri's avatar
    • Rakesh Mundlamuri's avatar
      Introduce group-based processing using FAPI groups · 60da0bf0
      Rakesh Mundlamuri authored
      Refactor ULSCH_id based processing of the PUSCH PDUs to group based
      processing using FAPI groups. This is required to process multiple
      PUSCH PDUs jointly for MU-MIMO. This is an initial commit that
      supports group size = 1 and will be extended to > 1 in the following
      commits.
      
      The flow of group information from MAC to PHY using FAPI is as follows:
      
      - In MAC, nr_fill_pusch_fapi_groups() is introduced to fill UEs in
        groups. The FAPI groups consist of UE lists filled with a PDU index.
        Based on the parameter UL_tti_req->n_group, the number of unique groups are
        identified. In each group, the parameter group->n_ue defines the
        number of UEs present in the group along with their PDU indices.
      
      - After receiving the FAPI message in the PHY from MAC, in
        nr_save_ul_tti_req(), a group number and group size for each
        PUSCH PDU is allocated in nr_fill_ulsch(), and a PUSCH job is created.
      
      - Further, after a job is created, in phy_procedures_gNB_uespec_RX(),
        the PUSCH PDUs of the ULSCH_ids for each group are segregated based
        on the group index. They are processed jointly using
        handle_pusch_rx_group_trigger(), and the PUSCH DTX per UE in the
        group is calculated using handle_pusch_DTX().
      Signed-off-by: default avatarRakesh Mundlamuri <rakesh.mundlamuri@openairinterface.org>
      60da0bf0
    • Rakesh Mundlamuri's avatar
      Refactor handle_pusch_decode_trigger separating pusch_rx and pusch_DTX · f61d1834
      Rakesh Mundlamuri authored
      The function handle_pusch_decode_trigger() consists of PUSCH RX processing and PUSCH DTX detection
      per UE. This is now split into two functions: handle_pusch_rx_trigger() and handle_pusch_DTX(). This
      is needed for group based processing where each group consists of multiple UEs and
      handle_pusch_rx_trigger() processes PUSCH RX for multiple UEs jointly while handle_pusch_DTX() need to
      detect PUSCH DTX per UE.
      Signed-off-by: default avatarRakesh Mundlamuri <rakesh.mundlamuri@openairinterface.org>
      f61d1834
  3. 17 Jul, 2026 7 commits
    • 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 17 commits