From 35e9d1e0c246b43cb2cad20123678d839e7f3bae Mon Sep 17 00:00:00 2001 From: francescomani <email@francescomani.it> Date: Fri, 13 Dec 2024 09:26:45 +0100 Subject: [PATCH] tentative fix for double sib1 decoding --- openair2/RRC/NR_UE/rrc_UE.c | 156 +++++++++++------- openair2/RRC/NR_UE/rrc_defs.h | 48 +++--- openair2/RRC/NR_UE/rrc_timers_and_constants.c | 100 +++-------- 3 files changed, 151 insertions(+), 153 deletions(-) diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index bba75ffa67e..072317e95d8 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -187,59 +187,59 @@ static void nr_decode_SI(NR_UE_RRC_SI_INFO *SI_info, NR_SystemInformation_t *si, LOG_I(NR_RRC, "Found SIB%d\n", typeandinfo->present + 1); switch(typeandinfo->present) { case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2: - SI_info->sib2_validity = true; + SI_info->sib2_validity = SIB_VALID; nr_timer_start(&SI_info->sib2_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3: - SI_info->sib3_validity = true; + SI_info->sib3_validity = SIB_VALID; nr_timer_start(&SI_info->sib3_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib4: - SI_info->sib4_validity = true; + SI_info->sib4_validity = SIB_VALID; nr_timer_start(&SI_info->sib4_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib5: - SI_info->sib5_validity = true; + SI_info->sib5_validity = SIB_VALID; nr_timer_start(&SI_info->sib5_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib6: - SI_info->sib6_validity = true; + SI_info->sib6_validity = SIB_VALID; nr_timer_start(&SI_info->sib6_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib7: - SI_info->sib7_validity = true; + SI_info->sib7_validity = SIB_VALID; nr_timer_start(&SI_info->sib7_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib8: - SI_info->sib8_validity = true; + SI_info->sib8_validity = SIB_VALID; nr_timer_start(&SI_info->sib8_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib9: - SI_info->sib9_validity = true; + SI_info->sib9_validity = SIB_VALID; nr_timer_start(&SI_info->sib9_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib10_v1610: - SI_info->sib10_validity = true; + SI_info->sib10_validity = SIB_VALID; nr_timer_start(&SI_info->sib10_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib11_v1610: - SI_info->sib11_validity = true; + SI_info->sib11_validity = SIB_VALID; nr_timer_start(&SI_info->sib11_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib12_v1610: - SI_info->sib12_validity = true; + SI_info->sib12_validity = SIB_VALID; nr_timer_start(&SI_info->sib12_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib13_v1610: - SI_info->sib13_validity = true; + SI_info->sib13_validity = SIB_VALID; nr_timer_start(&SI_info->sib13_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib14_v1610: - SI_info->sib14_validity = true; + SI_info->sib14_validity = SIB_VALID; nr_timer_start(&SI_info->sib14_timer); break; case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib19_v1700: - SI_info->SInfo_r17.sib19_validity = true; + SI_info->SInfo_r17.sib19_validity = SIB_VALID; if (g_log->log_component[NR_RRC].level >= OAILOG_DEBUG) xer_fprint(stdout, &asn_DEF_NR_SIB19_r17, (const void *)typeandinfo->choice.sib19_v1700); @@ -315,7 +315,7 @@ static void nr_rrc_process_sib1(NR_UE_RRC_INST_t *rrc, NR_UE_RRC_SI_INFO *SI_inf xer_fprint(stdout, &asn_DEF_NR_SIB1, (const void *) sib1); LOG_A(NR_RRC, "SIB1 decoded\n"); nr_timer_start(&SI_info->sib1_timer); - SI_info->sib1_validity = true; + SI_info->sib1_validity = SIB_VALID; if (rrc->nrRrcState == RRC_STATE_IDLE_NR) { rrc->ra_trigger = RRC_CONNECTION_SETUP; // preparing RRC setup request payload in advance @@ -627,56 +627,82 @@ bool check_si_validity(NR_UE_RRC_SI_INFO *SI_info, int si_type) { switch (si_type) { case NR_SIB_TypeInfo__type_sibType2: - if (!SI_info->sib2_validity) + if (SI_info->sib2_validity == SIB_NOT_VALID) { + SI_info->sib2_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType3: - if (!SI_info->sib3_validity) + if (SI_info->sib3_validity == SIB_NOT_VALID) { + SI_info->sib3_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType4: - if (!SI_info->sib4_validity) + if (SI_info->sib4_validity == SIB_NOT_VALID) { + SI_info->sib4_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType5: - if (!SI_info->sib5_validity) + if (SI_info->sib5_validity == SIB_NOT_VALID) { + SI_info->sib5_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType6: - if (!SI_info->sib6_validity) + if (SI_info->sib6_validity == SIB_NOT_VALID) { + SI_info->sib6_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType7: - if (!SI_info->sib7_validity) + if (SI_info->sib7_validity == SIB_NOT_VALID) { + SI_info->sib7_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType8: - if (!SI_info->sib8_validity) + if (SI_info->sib8_validity == SIB_NOT_VALID) { + SI_info->sib8_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType9: - if (!SI_info->sib9_validity) + if (SI_info->sib9_validity == SIB_NOT_VALID) { + SI_info->sib9_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType10_v1610: - if (!SI_info->sib10_validity) + if (SI_info->sib10_validity == SIB_NOT_VALID) { + SI_info->sib10_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType11_v1610: - if (!SI_info->sib11_validity) + if (SI_info->sib11_validity == SIB_NOT_VALID) { + SI_info->sib11_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType12_v1610: - if (!SI_info->sib12_validity) + if (SI_info->sib12_validity == SIB_NOT_VALID) { + SI_info->sib12_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType13_v1610: - if (!SI_info->sib13_validity) + if (SI_info->sib13_validity == SIB_NOT_VALID) { + SI_info->sib13_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo__type_sibType14_v1610: - if (!SI_info->sib14_validity) + if (SI_info->sib14_validity == SIB_NOT_VALID) { + SI_info->sib14_validity = SIB_REQUESTED; return false; + } break; default : AssertFatal(false, "Invalid SIB type %d\n", si_type); @@ -688,32 +714,46 @@ bool check_si_validity_r17(NR_UE_RRC_SI_INFO_r17 *SI_info, int si_type) { switch (si_type) { case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType15: - if (!SI_info->sib15_validity) + if (SI_info->sib15_validity == SIB_NOT_VALID) { + SI_info->sib15_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType16: - if (!SI_info->sib16_validity) + if (SI_info->sib16_validity == SIB_NOT_VALID) { + SI_info->sib16_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType17: - if (!SI_info->sib17_validity) + if (SI_info->sib17_validity == SIB_NOT_VALID) { + SI_info->sib17_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType18: - if (!SI_info->sib18_validity) + if (SI_info->sib18_validity == SIB_NOT_VALID) { + SI_info->sib18_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType19: - if (!SI_info->sib19_validity) + if (SI_info->sib19_validity == SIB_NOT_VALID) { + SI_info->sib19_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType20: - if (!SI_info->sib20_validity) + if (SI_info->sib20_validity == SIB_NOT_VALID) { + SI_info->sib20_validity = SIB_REQUESTED; return false; + } break; case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType21: - if (!SI_info->sib21_validity) + if (SI_info->sib21_validity == SIB_NOT_VALID) { + SI_info->sib21_validity = SIB_REQUESTED; return false; + } break; default : AssertFatal(false, "Invalid SIB r17 type %d\n", si_type); @@ -724,8 +764,10 @@ bool check_si_validity_r17(NR_UE_RRC_SI_INFO_r17 *SI_info, int si_type) int check_si_status(NR_UE_RRC_SI_INFO *SI_info) { // schedule reception of SIB1 if RRC doesn't have it - if (!SI_info->sib1_validity) + if (SI_info->sib1_validity == SIB_NOT_VALID) { + SI_info->sib1_validity = SIB_REQUESTED; return 1; + } else { if (SI_info->default_otherSI_map) { // Check if RRC has configured default SI @@ -2482,27 +2524,27 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc, rrcPerNB_t *nb = &rrc->perNB[i]; NR_UE_RRC_SI_INFO *SI_info = &nb->SInfo; init_SI_timers(SI_info); - SI_info->sib1_validity = false; - SI_info->sib2_validity = false; - SI_info->sib3_validity = false; - SI_info->sib4_validity = false; - SI_info->sib5_validity = false; - SI_info->sib6_validity = false; - SI_info->sib7_validity = false; - SI_info->sib8_validity = false; - SI_info->sib9_validity = false; - SI_info->sib10_validity = false; - SI_info->sib11_validity = false; - SI_info->sib12_validity = false; - SI_info->sib13_validity = false; - SI_info->sib14_validity = false; - SI_info->SInfo_r17.sib15_validity = false; - SI_info->SInfo_r17.sib16_validity = false; - SI_info->SInfo_r17.sib17_validity = false; - SI_info->SInfo_r17.sib18_validity = false; - SI_info->SInfo_r17.sib19_validity = false; - SI_info->SInfo_r17.sib20_validity = false; - SI_info->SInfo_r17.sib21_validity = false; + SI_info->sib1_validity = SIB_NOT_VALID; + SI_info->sib2_validity = SIB_NOT_VALID; + SI_info->sib3_validity = SIB_NOT_VALID; + SI_info->sib4_validity = SIB_NOT_VALID; + SI_info->sib5_validity = SIB_NOT_VALID; + SI_info->sib6_validity = SIB_NOT_VALID; + SI_info->sib7_validity = SIB_NOT_VALID; + SI_info->sib8_validity = SIB_NOT_VALID; + SI_info->sib9_validity = SIB_NOT_VALID; + SI_info->sib10_validity = SIB_NOT_VALID; + SI_info->sib11_validity = SIB_NOT_VALID; + SI_info->sib12_validity = SIB_NOT_VALID; + SI_info->sib13_validity = SIB_NOT_VALID; + SI_info->sib14_validity = SIB_NOT_VALID; + SI_info->SInfo_r17.sib15_validity = SIB_NOT_VALID; + SI_info->SInfo_r17.sib16_validity = SIB_NOT_VALID; + SI_info->SInfo_r17.sib17_validity = SIB_NOT_VALID; + SI_info->SInfo_r17.sib18_validity = SIB_NOT_VALID; + SI_info->SInfo_r17.sib19_validity = SIB_NOT_VALID; + SI_info->SInfo_r17.sib20_validity = SIB_NOT_VALID; + SI_info->SInfo_r17.sib21_validity = SIB_NOT_VALID; } if (rrc->nrRrcState == RRC_STATE_DETACH_NR) { diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h index 6d22e4ad6c9..7cf9593313f 100644 --- a/openair2/RRC/NR_UE/rrc_defs.h +++ b/openair2/RRC/NR_UE/rrc_defs.h @@ -104,53 +104,59 @@ typedef enum RA_trigger_e { BEAM_FAILURE_RECOVERY, } RA_trigger_t; +typedef enum { + SIB_NOT_VALID, + SIB_VALID, + SIB_REQUESTED, +} SIB_validity_t; + typedef struct UE_RRC_SI_INFO_NR_r17_s { uint32_t default_otherSI_map_r17; - bool sib15_validity; + SIB_validity_t sib15_validity; NR_timer_t sib15_timer; - bool sib16_validity; + SIB_validity_t sib16_validity; NR_timer_t sib16_timer; - bool sib17_validity; + SIB_validity_t sib17_validity; NR_timer_t sib17_timer; - bool sib18_validity; + SIB_validity_t sib18_validity; NR_timer_t sib18_timer; - bool sib19_validity; + SIB_validity_t sib19_validity; NR_timer_t sib19_timer; - bool sib20_validity; + SIB_validity_t sib20_validity; NR_timer_t sib20_timer; - bool sib21_validity; + SIB_validity_t sib21_validity; NR_timer_t sib21_timer; } NR_UE_RRC_SI_INFO_r17; typedef struct UE_RRC_SI_INFO_NR_s { uint32_t default_otherSI_map; - bool sib1_validity; + SIB_validity_t sib1_validity; NR_timer_t sib1_timer; - bool sib2_validity; + SIB_validity_t sib2_validity; NR_timer_t sib2_timer; - bool sib3_validity; + SIB_validity_t sib3_validity; NR_timer_t sib3_timer; - bool sib4_validity; + SIB_validity_t sib4_validity; NR_timer_t sib4_timer; - bool sib5_validity; + SIB_validity_t sib5_validity; NR_timer_t sib5_timer; - bool sib6_validity; + SIB_validity_t sib6_validity; NR_timer_t sib6_timer; - bool sib7_validity; + SIB_validity_t sib7_validity; NR_timer_t sib7_timer; - bool sib8_validity; + SIB_validity_t sib8_validity; NR_timer_t sib8_timer; - bool sib9_validity; + SIB_validity_t sib9_validity; NR_timer_t sib9_timer; - bool sib10_validity; + SIB_validity_t sib10_validity; NR_timer_t sib10_timer; - bool sib11_validity; + SIB_validity_t sib11_validity; NR_timer_t sib11_timer; - bool sib12_validity; + SIB_validity_t sib12_validity; NR_timer_t sib12_timer; - bool sib13_validity; + SIB_validity_t sib13_validity; NR_timer_t sib13_timer; - bool sib14_validity; + SIB_validity_t sib14_validity; NR_timer_t sib14_timer; NR_UE_RRC_SI_INFO_r17 SInfo_r17; } NR_UE_RRC_SI_INFO; diff --git a/openair2/RRC/NR_UE/rrc_timers_and_constants.c b/openair2/RRC/NR_UE/rrc_timers_and_constants.c index 6629055b3a7..39e73fa5a43 100644 --- a/openair2/RRC/NR_UE/rrc_timers_and_constants.c +++ b/openair2/RRC/NR_UE/rrc_timers_and_constants.c @@ -43,83 +43,33 @@ void init_SI_timers(NR_UE_RRC_SI_INFO *SInfo) nr_timer_setup(&SInfo->SInfo_r17.sib19_timer, 10800000, 10); } -void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo) +static SIB_validity_t check_sib_timer_validity(SIB_validity_t sib_validity, NR_timer_t *sib_timer) { - if (SInfo->sib1_validity) { - bool sib1_expired = nr_timer_tick(&SInfo->sib1_timer); - if (sib1_expired) - SInfo->sib1_validity = false; - } - if (SInfo->sib2_validity) { - bool sib2_expired = nr_timer_tick(&SInfo->sib2_timer); - if (sib2_expired) - SInfo->sib2_validity = false; - } - if (SInfo->sib3_validity) { - bool sib3_expired = nr_timer_tick(&SInfo->sib3_timer); - if (sib3_expired) - SInfo->sib3_validity = false; - } - if (SInfo->sib4_validity) { - bool sib4_expired = nr_timer_tick(&SInfo->sib4_timer); - if (sib4_expired) - SInfo->sib4_validity = false; - } - if (SInfo->sib5_validity) { - bool sib5_expired = nr_timer_tick(&SInfo->sib5_timer); - if (sib5_expired) - SInfo->sib5_validity = false; - } - if (SInfo->sib6_validity) { - bool sib6_expired = nr_timer_tick(&SInfo->sib6_timer); - if (sib6_expired) - SInfo->sib6_validity = false; - } - if (SInfo->sib7_validity) { - bool sib7_expired = nr_timer_tick(&SInfo->sib7_timer); - if (sib7_expired) - SInfo->sib7_validity = false; - } - if (SInfo->sib8_validity) { - bool sib8_expired = nr_timer_tick(&SInfo->sib8_timer); - if (sib8_expired) - SInfo->sib8_validity = false; - } - if (SInfo->sib9_validity) { - bool sib9_expired = nr_timer_tick(&SInfo->sib9_timer); - if (sib9_expired) - SInfo->sib9_validity = false; - } - if (SInfo->sib10_validity) { - bool sib10_expired = nr_timer_tick(&SInfo->sib10_timer); - if (sib10_expired) - SInfo->sib10_validity = false; - } - if (SInfo->sib11_validity) { - bool sib11_expired = nr_timer_tick(&SInfo->sib11_timer); - if (sib11_expired) - SInfo->sib11_validity = false; - } - if (SInfo->sib12_validity) { - bool sib12_expired = nr_timer_tick(&SInfo->sib12_timer); - if (sib12_expired) - SInfo->sib12_validity = false; - } - if (SInfo->sib13_validity) { - bool sib13_expired = nr_timer_tick(&SInfo->sib13_timer); - if (sib13_expired) - SInfo->sib13_validity = false; - } - if (SInfo->sib14_validity) { - bool sib14_expired = nr_timer_tick(&SInfo->sib14_timer); - if (sib14_expired) - SInfo->sib14_validity = false; - } - if (SInfo->SInfo_r17.sib19_validity) { - bool sib19_expired = nr_timer_tick(&SInfo->SInfo_r17.sib19_timer); - if (sib19_expired) - SInfo->SInfo_r17.sib19_validity = false; + if (sib_validity == SIB_VALID) { + bool sib_expired = nr_timer_tick(sib_timer); + if (sib_expired) + return SIB_NOT_VALID; } + return sib_validity; +} + +void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo) +{ + SInfo->sib1_validity = check_sib_timer_validity(SInfo->sib1_validity, &SInfo->sib1_timer); + SInfo->sib2_validity = check_sib_timer_validity(SInfo->sib2_validity, &SInfo->sib2_timer); + SInfo->sib3_validity = check_sib_timer_validity(SInfo->sib3_validity, &SInfo->sib3_timer); + SInfo->sib4_validity = check_sib_timer_validity(SInfo->sib4_validity, &SInfo->sib4_timer); + SInfo->sib5_validity = check_sib_timer_validity(SInfo->sib5_validity, &SInfo->sib5_timer); + SInfo->sib6_validity = check_sib_timer_validity(SInfo->sib6_validity, &SInfo->sib6_timer); + SInfo->sib7_validity = check_sib_timer_validity(SInfo->sib7_validity, &SInfo->sib7_timer); + SInfo->sib8_validity = check_sib_timer_validity(SInfo->sib8_validity, &SInfo->sib8_timer); + SInfo->sib9_validity = check_sib_timer_validity(SInfo->sib9_validity, &SInfo->sib9_timer); + SInfo->sib10_validity = check_sib_timer_validity(SInfo->sib10_validity, &SInfo->sib10_timer); + SInfo->sib11_validity = check_sib_timer_validity(SInfo->sib11_validity, &SInfo->sib11_timer); + SInfo->sib12_validity = check_sib_timer_validity(SInfo->sib12_validity, &SInfo->sib12_timer); + SInfo->sib13_validity = check_sib_timer_validity(SInfo->sib13_validity, &SInfo->sib13_timer); + SInfo->sib14_validity = check_sib_timer_validity(SInfo->sib14_validity, &SInfo->sib14_timer); + SInfo->SInfo_r17.sib19_validity = check_sib_timer_validity(SInfo->SInfo_r17.sib19_validity, &SInfo->SInfo_r17.sib19_timer); } void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc) -- GitLab