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.
This commit is contained in:
committed by
Thomas Schlichter
parent
b3581ce1b8
commit
2b4ca7e47d
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user