From 2b4ca7e47da90c6feeaad57c03a8c37ef5e593f4 Mon Sep 17 00:00:00 2001 From: Raghavendra Dinavahi Date: Fri, 31 Jan 2025 17:10:33 +0100 Subject: [PATCH] cellbarredNTN indicates notbarred in SIB1 if NTN access is available 38.331 release 18 section 5.2.2.4.2 indicates that to access NTN, cellbarredNTN in SIB1 should be set to notbarred. --- openair2/RRC/NR/nr_rrc_config.c | 34 +++++++++++++++++++++++++++++---- openair2/RRC/NR_UE/rrc_UE.c | 20 ++++++++++++++++++- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 18487e9657..b186c4ca04 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -2303,6 +2303,19 @@ static long get_NR_UE_TimersAndConstants_t319(const nr_mac_timers_t *timer_confi } } +static bool is_ntn_band(int band) +{ + // TS 3GPP 38.101-5 V1807 Section 5.2.2 + if (band >= 254 && band <= 256) // FR1 NTN + return true; + + // TS 3GPP 38.101-5 V1807 Section 5.2.3 + if (band >= 510 && band <= 512) // FR2 NTN + return true; + + return false; +} + NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const NR_ServingCellConfigCommon_t *scc, const f1ap_plmn_t *plmn, uint64_t cellID, @@ -2401,12 +2414,26 @@ NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const NR_ServingCellConfigCommon_t *scc, asn1cSeqAdd(&sib1->si_SchedulingInfo->schedulingInfoList.list,schedulingInfo);*/ - // sib19 scheduling info - // ensure ntn-config is initialized - if (scc->ext2 && scc->ext2->ntn_Config_r17) { + const NR_FreqBandIndicatorNR_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; + if (is_ntn_band(band)) { sib1->nonCriticalExtension = CALLOC(1, sizeof(struct NR_SIB1_v1610_IEs)); sib1->nonCriticalExtension->nonCriticalExtension = CALLOC(1, sizeof(struct NR_SIB1_v1630_IEs)); sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension = CALLOC(1, sizeof(struct NR_SIB1_v1700_IEs)); + // If cell provides NTN access, set cellBarredNTN to notBarred. + struct NR_SIB1_v1700_IEs *sib1_v1700 = sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension; + sib1_v1700->cellBarredNTN_r17 = CALLOC(1, sizeof(long)); + *sib1_v1700->cellBarredNTN_r17 = NR_SIB1_v1700_IEs__cellBarredNTN_r17_notBarred; + } + + // sib19 scheduling info + // ensure ntn-config is initialized + if (scc->ext2 && scc->ext2->ntn_Config_r17) { + if (sib1->nonCriticalExtension == NULL) + sib1->nonCriticalExtension = CALLOC(1, sizeof(struct NR_SIB1_v1610_IEs)); + if (sib1->nonCriticalExtension->nonCriticalExtension == NULL) + sib1->nonCriticalExtension->nonCriticalExtension = CALLOC(1, sizeof(struct NR_SIB1_v1630_IEs)); + if (sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension == NULL) + sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension = CALLOC(1, sizeof(struct NR_SIB1_v1700_IEs)); struct NR_SI_SchedulingInfo_v1700 *sib_v17_scheduling_info = CALLOC(1, sizeof(struct NR_SI_SchedulingInfo_v1700)); @@ -2438,7 +2465,6 @@ NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const NR_ServingCellConfigCommon_t *scc, frequencyInfoDL->frequencyBandList.list.array[i]; } - const NR_FreqBandIndicatorNR_t band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; frequency_range_t frequency_range = band > 256 ? FR2 : FR1; sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = get_ssb_offset_to_pointA(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA, diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 26b9f51046..9d3d6d7111 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -308,6 +308,20 @@ static void nr_rrc_configure_default_SI(NR_UE_RRC_SI_INFO *SI_info, } } +static void verify_NTN_access(const NR_UE_RRC_SI_INFO *SI_info, const NR_SIB1_v1700_IEs_t *sib1_v1700) +{ + // SIB1 indicates if NTN access is present in the cell + bool ntn_access = false; + if (sib1_v1700 && sib1_v1700->cellBarredNTN_r17 + && *sib1_v1700->cellBarredNTN_r17 == NR_SIB1_v1700_IEs__cellBarredNTN_r17_notBarred) + ntn_access = true; + + uint32_t sib19_mask = 1 << NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType19; + int sib19_present = SI_info->SInfo_r17.default_otherSI_map_r17 & sib19_mask; + + AssertFatal(!ntn_access || sib19_present, "NTN cell, but SIB19 not configured.\n"); +} + static void nr_rrc_process_sib1(NR_UE_RRC_INST_t *rrc, NR_UE_RRC_SI_INFO *SI_info, NR_SIB1_t *sib1) { if(g_log->log_component[NR_RRC].level >= OAILOG_DEBUG) @@ -321,15 +335,19 @@ static void nr_rrc_process_sib1(NR_UE_RRC_INST_t *rrc, NR_UE_RRC_SI_INFO *SI_inf nr_rrc_ue_prepare_RRCSetupRequest(rrc); } + NR_SIB1_v1700_IEs_t *sib1_v1700 = NULL; NR_SI_SchedulingInfo_v1700_t *si_SchedInfo_v1700 = NULL; if (sib1->nonCriticalExtension && sib1->nonCriticalExtension->nonCriticalExtension && sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension) { - si_SchedInfo_v1700 = sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->si_SchedulingInfo_v1700; + sib1_v1700 = sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension; + si_SchedInfo_v1700 = sib1_v1700->si_SchedulingInfo_v1700; } // configure default SI nr_rrc_configure_default_SI(SI_info, sib1->si_SchedulingInfo, si_SchedInfo_v1700); + verify_NTN_access(SI_info, sib1_v1700); + // configure timers and constant nr_rrc_set_sib1_timers_and_constants(&rrc->timers_and_constants, sib1); // RRC storage of SIB1 timers and constants (eg needed in re-establishment)