From 1fa6be2a3d7db56061c5b0317546fcc645293504 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 5 Mar 2024 19:03:21 +0100 Subject: [PATCH 1/2] fix procedure after T300 expiry --- executables/nr-ue.c | 2 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 20 +++++++++---------- openair2/LAYER2/NR_MAC_UE/config_ue.c | 1 - openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 12 +++++------ openair2/RRC/NR/MESSAGES/asn1_msg.h | 2 -- openair2/RRC/NR_UE/rrc_UE.c | 7 +++++-- openair2/RRC/NR_UE/rrc_defs.h | 2 +- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/executables/nr-ue.c b/executables/nr-ue.c index c93cb1064b..a03b1afe78 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -538,7 +538,7 @@ void processSlotTX(void *arg) { nr_rxtx_thread_data_t *rxtxD = (nr_rxtx_thread_data_t *) arg; const UE_nr_rxtx_proc_t *proc = &rxtxD->proc; - PHY_VARS_NR_UE *UE = rxtxD->UE; + PHY_VARS_NR_UE *UE = rxtxD->UE; nr_phy_data_tx_t phy_data = {0}; if (UE->if_inst) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 52fc2569bb..5873384a10 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -105,8 +105,7 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, int pbch_initial_symbol, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) { - NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - int ret =-1; + NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_UE_SSB *best_ssb = NULL; NR_UE_SSB *current_ssb; @@ -138,8 +137,9 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, } } - NR_UE_SSB *temp_ptr=best_ssb; - while (ret!=0 && temp_ptr != NULL) { + NR_UE_SSB *temp_ptr = best_ssb; + int ret = -1; + while (ret != 0 && temp_ptr != NULL) { start_meas(&ue->dlsch_channel_estimation_stats); // computing channel estimation for selected best ssb @@ -165,14 +165,10 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, free_list(best_ssb); - if (ret == 0) + if (ret == 0) { frame_parms->nb_antenna_ports_gNB = 1; // pbch_tx_ant; - - // set initial transmission mode to 1 or 2 depending on number of detected TX antennas - // frame_parms->mode1_flag = (pbch_tx_ant==1); - // openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1; - - LOG_I(PHY, "[UE%d] Initial sync: pbch decoded sucessfully, ssb index %d\n", ue->Mod_id, frame_parms->ssb_index); + LOG_I(PHY, "[UE%d] Initial sync: pbch decoded sucessfully, ssb index %d\n", ue->Mod_id, frame_parms->ssb_index); + } return ret; } @@ -429,6 +425,8 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY, "[UE%d] Initial sync : Estimated power: %d dB\n", ue->Mod_id, ue->measurements.rx_power_avg_dB[0]); #endif + } else { + LOG_A(PHY, "Initial sync successful\n"); } // exit_fun("debug exit"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INITIAL_UE_SYNC, VCD_FUNCTION_OUT); diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index ef5df5beb9..0282b3489f 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -1358,7 +1358,6 @@ void nr_rrc_mac_config_req_reset(module_id_t module_id, NR_UE_MAC_reset_cause_t cause) { NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); - switch (cause) { case GO_TO_IDLE: reset_ra(&mac->ra); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index e6013fdc37..526a406d9c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -86,26 +86,26 @@ void init_RA(NR_UE_MAC_INST_t *mac, if (rach_ConfigDedicated) { if (rach_ConfigDedicated->cfra){ - LOG_I(MAC, "Initialization of 2-step contention-free random access procedure\n"); + LOG_I(NR_MAC, "Initialization of 2-step contention-free random access procedure\n"); prach_resources->RA_TYPE = RA_2STEP; ra->cfra = 1; } else if (rach_ConfigDedicated->ext1){ if (rach_ConfigDedicated->ext1->cfra_TwoStep_r16){ - LOG_I(MAC, "Setting RA type to 2-step...\n"); + LOG_I(NR_MAC, "Setting RA type to 2-step...\n"); prach_resources->RA_TYPE = RA_2STEP; ra->cfra = 1; } else { - LOG_E(MAC, "Config not handled\n"); + LOG_E(NR_MAC, "Config not handled\n"); } } else { - LOG_E(MAC, "Config not handled\n"); + LOG_E(NR_MAC, "Config not handled\n"); } } else if (nr_rach_ConfigCommon){ - LOG_I(MAC, "Initialization of 4-step contention-based random access procedure\n"); + LOG_I(NR_MAC, "Initialization of 4-step contention-based random access procedure\n"); prach_resources->RA_TYPE = RA_4STEP; ra->cfra = 0; } else { - LOG_E(MAC, "Config not handled\n"); + LOG_E(NR_MAC, "Config not handled\n"); } switch (rach_ConfigGeneric->powerRampingStep){ // in dB diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h index de57a339d5..99fb0efda4 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.h +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h @@ -41,10 +41,8 @@ #include -#include "RRC/NR/nr_rrc_defs.h" #include "RRC/NR/nr_rrc_config.h" - /* * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) * output into the chosen string buffer. diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index a2056e5be7..23da4916e0 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -616,7 +616,7 @@ static void nr_rrc_handle_msg3_indication(NR_UE_RRC_INST_t *rrc, rnti_t rnti) { NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants; switch (rrc->ra_trigger) { - case INITIAL_ACCESS_FROM_RRC_IDLE: + case RRC_CONNECTION_SETUP: // After SIB1 is received, prepare RRCConnectionRequest rrc->rnti = rnti; // start timer T300 @@ -744,7 +744,7 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(NR_UE_RRC_INST_t *rrc, LOG_A(NR_RRC, "SIB1 decoded\n"); nr_timer_start(&SI_info->sib1_timer); if (rrc->nrRrcState == RRC_STATE_IDLE_NR) { - rrc->ra_trigger = INITIAL_ACCESS_FROM_RRC_IDLE; + rrc->ra_trigger = RRC_CONNECTION_SETUP; // preparing RRC setup request payload in advance nr_rrc_ue_prepare_RRCSetupRequest(rrc); } @@ -2221,6 +2221,9 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc, void handle_t300_expiry(NR_UE_RRC_INST_t *rrc) { + rrc->ra_trigger = RRC_CONNECTION_SETUP; + nr_rrc_ue_prepare_RRCSetupRequest(rrc); + // reset MAC, release the MAC configuration NR_UE_MAC_reset_cause_t cause = T300_EXPIRY; nr_rrc_mac_config_req_reset(rrc->ue_id, cause); diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h index 936247f655..621eec6443 100644 --- a/openair2/RRC/NR_UE/rrc_defs.h +++ b/openair2/RRC/NR_UE/rrc_defs.h @@ -105,7 +105,7 @@ typedef enum requested_SI_List_e { // 3GPP TS 38.300 Section 9.2.6 typedef enum RA_trigger_e { RA_NOT_RUNNING, - INITIAL_ACCESS_FROM_RRC_IDLE, + RRC_CONNECTION_SETUP, RRC_CONNECTION_REESTABLISHMENT, DURING_HANDOVER, NON_SYNCHRONISED, From ee3dcc5c77ca3f0a8271d97c110549ca1e7456fc Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 13 Mar 2024 14:34:44 +0100 Subject: [PATCH 2/2] replacing cell_notdetected with cell_detected in initial_sync structure --- executables/nr-ue.c | 2 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 45 +++++++++++-------- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 8 ++-- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/executables/nr-ue.c b/executables/nr-ue.c index a03b1afe78..4d29d5f8e2 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -440,7 +440,7 @@ static void UE_synch(void *arg) { uint64_t dl_carrier, ul_carrier; nr_get_carrier_frequencies(UE, &dl_carrier, &ul_carrier); nr_initial_sync_t ret = nr_initial_sync(&syncD->proc, UE, 2, get_softmodem_params()->sa); - if (!ret.cell_notdetected) { + if (ret.cell_detected) { syncD->rx_offset = ret.rx_offset; freq_offset = UE->common_vars.freq_offset; // frequency offset computed with pss in initial sync hw_slot_offset = diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 5873384a10..09ea85fbd4 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -100,10 +100,10 @@ void free_list(NR_UE_SSB *node) { free(node); } -int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, - PHY_VARS_NR_UE *ue, - int pbch_initial_symbol, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) +static bool nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, + PHY_VARS_NR_UE *ue, + int pbch_initial_symbol, + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) { NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; @@ -138,8 +138,8 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, } NR_UE_SSB *temp_ptr = best_ssb; - int ret = -1; - while (ret != 0 && temp_ptr != NULL) { + bool ret = false; + while (!ret && temp_ptr != NULL) { start_meas(&ue->dlsch_channel_estimation_stats); // computing channel estimation for selected best ssb @@ -153,11 +153,18 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, stop_meas(&ue->dlsch_channel_estimation_stats); fapiPbch_t result = {0}; - ret = nr_rx_pbch(ue, proc, estimateSz, dl_ch_estimates, frame_parms, temp_ptr->i_ssb, &result, rxdataF); - if (DUMP_PBCH_CH_ESTIMATES && (ret == 0)) { + int pbch_res = nr_rx_pbch(ue, proc, estimateSz, dl_ch_estimates, frame_parms, temp_ptr->i_ssb, &result, rxdataF); + ret = pbch_res == 0; + + if (DUMP_PBCH_CH_ESTIMATES && ret) { write_output("pbch_ch_estimates.m", "pbch_ch_estimates", dl_ch_estimates, frame_parms->nb_antennas_rx*estimateSz, 1, 1); - write_output("pbch_ch_estimates_time.m", "pbch_ch_estimates_time", dl_ch_estimates_time, frame_parms->nb_antennas_rx*frame_parms->ofdm_symbol_size, 1, 1); + write_output("pbch_ch_estimates_time.m", + "pbch_ch_estimates_time", + dl_ch_estimates_time, + frame_parms->nb_antennas_rx * frame_parms->ofdm_symbol_size, + 1, + 1); } temp_ptr=temp_ptr->next_ssb; @@ -165,7 +172,7 @@ int nr_pbch_detection(const UE_nr_rxtx_proc_t *proc, free_list(best_ssb); - if (ret == 0) { + if (ret) { frame_parms->nb_antenna_ports_gNB = 1; // pbch_tx_ant; LOG_I(PHY, "[UE%d] Initial sync: pbch decoded sucessfully, ssb index %d\n", ue->Mod_id, frame_parms->ssb_index); } @@ -258,7 +265,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i int freq_offset_sss = 0; bool ret_sss = rx_sss_nr(ue, proc, &metric_tdd_ncp, &phase_tdd_ncp, &freq_offset_sss, rxdataF); - ret.cell_notdetected = !ret_sss; // rx_sss_nr returns true if success + ret.cell_detected = ret_sss; // rx_sss_nr returns true if success // digital compensation of FFO for SSB symbols if (ue->UE_fo_compensation) { double s_time = 1 / (1.0e3 * fp->samples_per_subframe); // sampling time @@ -278,12 +285,12 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i ue->common_vars.freq_offset += freq_offset_sss; } - if (ret.cell_notdetected == 0) { // we got sss channel + if (ret.cell_detected) { // we got sss channel nr_gold_pbch(ue); - ret.cell_notdetected = nr_pbch_detection(proc, ue, 1, rxdataF); // start pbch detection at first symbol after pss + ret.cell_detected = nr_pbch_detection(proc, ue, 1, rxdataF); // start pbch detection at first symbol after pss } - if (ret.cell_notdetected == 0) { + if (ret.cell_detected) { // sync at symbol ue->symbol_offset // computing the offset wrt the beginning of the frame int mu = fp->numerology_index; @@ -343,7 +350,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i fp->Nid_cell, metric_tdd_ncp, phase_tdd_ncp, - !ret.cell_notdetected, + ret.cell_detected, ret.rx_offset); #endif @@ -352,11 +359,11 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i LOG_I(PHY, "TDD Normal prefix: SSS error condition: sync_pos %d\n", sync_pos); #endif } - if (ret.cell_notdetected == 0) + if (ret.cell_detected) break; } } else { - ret.cell_notdetected = true; + ret.cell_detected = false; } /* Consider this is a false detection if the offset is > 1000 Hz @@ -367,7 +374,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset); }*/ - if (ret.cell_notdetected == 0) { // PBCH found so indicate sync to higher layers and configure frame parameters + if (ret.cell_detected) { // PBCH found so indicate sync to higher layers and configure frame parameters //#ifdef DEBUG_INITIAL_SYNCH @@ -402,7 +409,7 @@ nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, i } // gain control - if (ret.cell_notdetected != 0) { // we are not synched, so we cannot use rssi measurement (which is based on channel estimates) + if (!ret.cell_detected) { // we are not synched, so we cannot use rssi measurement (which is based on channel estimates) int rx_power = 0; // do a measurement on the best guess of the PSS diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 6e37549349..c58fd5888e 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -319,7 +319,7 @@ int dump_ue_stats(PHY_VARS_NR_UE *phy_vars_ue, @param sa current running mode */ typedef struct { - bool cell_notdetected; + bool cell_detected; int rx_offset; } nr_initial_sync_t; nr_initial_sync_t nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *phy_vars_ue, int n_frames, int sa); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 7d738c4ed7..b79f438e17 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -766,10 +766,10 @@ int main(int argc, char **argv) } if (UE->is_synchronized == 0) { UE_nr_rxtx_proc_t proc={0}; - nr_initial_sync_t ret = nr_initial_sync(&proc, UE, 1, 0); - printf("nr_initial_sync1 returns %d\n", ret.cell_notdetected); - if (ret.cell_notdetected) - n_errors++; + nr_initial_sync_t ret = nr_initial_sync(&proc, UE, 1, 0); + printf("nr_initial_sync1 returns %s\n", ret.cell_detected ? "cell detected" : "cell not detected"); + if (!ret.cell_detected) + n_errors++; } else { UE_nr_rxtx_proc_t proc={0};