diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 24322bf8e6..b8888708aa 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -872,18 +872,22 @@ static inline void apply_ntn_config(PHY_VARS_NR_UE *UE, if (*update_ntn_system_information) { *update_ntn_system_information = false; - *duration_rx_to_tx = NR_UE_CAPABILITY_SLOT_RX_TO_TX + UE->ntn_config_message->ntn_config_params.cell_specific_k_offset; - UE->timing_advance = fp->samples_per_subframe * UE->ntn_config_message->ntn_config_params.ntn_total_time_advance_ms; - *timing_advance += - fp->get_samples_slot_timestamp(slot_nr, - fp, - UE->ntn_config_message->ntn_config_params.cell_specific_k_offset - *ntn_koffset); - *ntn_koffset = UE->ntn_config_message->ntn_config_params.cell_specific_k_offset; + double total_ta_ms = UE->ntn_config_message->ntn_config_params.ntn_total_time_advance_ms; + UE->timing_advance = fp->samples_per_subframe * total_ta_ms; + + int mu = fp->numerology_index; + int koffset = UE->ntn_config_message->ntn_config_params.cell_specific_k_offset; + if (*ntn_koffset != koffset) { + *duration_rx_to_tx = NR_UE_CAPABILITY_SLOT_RX_TO_TX + (koffset << mu); + *timing_advance += fp->get_samples_slot_timestamp(slot_nr, fp, (koffset - *ntn_koffset) << mu); + *ntn_koffset = koffset; + } LOG_I(PHY, - "cell_specific_k_offset = %d ms, ntn_total_time_advance_ms = %f ms (%d samples)\n", + "k_offset = %d ms (%d slots), ntn_total_time_advance_ms = %f ms (%d samples)\n", *ntn_koffset, - UE->ntn_config_message->ntn_config_params.ntn_total_time_advance_ms, + *ntn_koffset << mu, + total_ta_ms, UE->timing_advance); } } @@ -1080,7 +1084,7 @@ void *UE_thread(void *arg) if (UE->ntn_config_message->update) { UE->ntn_config_message->update = false; update_ntn_system_information = true; - nr_slot_tx_offset = UE->ntn_config_message->ntn_config_params.cell_specific_k_offset; + nr_slot_tx_offset = UE->ntn_config_message->ntn_config_params.cell_specific_k_offset << fp->numerology_index; } int slot_nr = absolute_slot % nb_slot_frame; diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index efe6a536e9..1b5518f0bc 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -305,6 +305,13 @@ void configure_ntn_ta(module_id_t module_id, ntn_timing_advance_componets_t *ntn ntn_ta->ntn_ta_commondrift = *ntn_Config_r17->ta_Info_r17->ta_CommonDrift_r17 * 0.2e-3; } ntn_ta->ntn_params_changed = true; + + LOG_D(NR_MAC, + "SIB19 Rxd. k_offset:%ld, N_Common_Ta:%f,drift:%f,N_UE_TA:%f \n", + ntn_ta->cell_specific_k_offset, + ntn_ta->N_common_ta_adj, + ntn_ta->ntn_ta_commondrift, + ntn_ta->N_UE_TA_adj); } static void config_common_ue(NR_UE_MAC_INST_t *mac, NR_ServingCellConfigCommon_t *scc, int cc_idP) diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index cfa3952759..838d1989f0 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -649,9 +649,9 @@ static inline double GET_COMPLETE_TIME_ADVANCE_MS(const ntn_timing_advance_compo return ntn_ta->N_common_ta_adj + ntn_ta->N_UE_TA_adj; } -static inline long GET_DURATION_RX_TO_TX(const ntn_timing_advance_componets_t *ntn_ta) +static inline long GET_DURATION_RX_TO_TX(const ntn_timing_advance_componets_t *ntn_ta, int scs) { - return NR_UE_CAPABILITY_SLOT_RX_TO_TX + ntn_ta->cell_specific_k_offset; + return NR_UE_CAPABILITY_SLOT_RX_TO_TX + (ntn_ta->cell_specific_k_offset << scs); } /*@}*/ diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 83bbcadbe5..c0cda918d1 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -927,10 +927,10 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac, const uint16_t feedback_ti = 1 + dci->pdsch_to_harq_feedback_timing_indicator.val + ntn_ue_koffset; if (rnti_type != TYPE_RA_RNTI_ && rnti_type != TYPE_SI_RNTI_) { - AssertFatal(feedback_ti > GET_DURATION_RX_TO_TX(&mac->ntn_ta), + AssertFatal(feedback_ti > GET_DURATION_RX_TO_TX(&mac->ntn_ta, dlsch_pdu->SubcarrierSpacing), "PDSCH to HARQ feedback time (%d) needs to be higher than DURATION_RX_TO_TX (%ld).\n", feedback_ti, - GET_DURATION_RX_TO_TX(&mac->ntn_ta)); + GET_DURATION_RX_TO_TX(&mac->ntn_ta, dlsch_pdu->SubcarrierSpacing)); // set the harq status at MAC for feedback const int tpc[] = {-1, 0, 1, 3}; set_harq_status(mac, @@ -1220,11 +1220,11 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac, const int ntn_ue_koffset = GET_NTN_UE_K_OFFSET(&mac->ntn_ta, dlsch_pdu->SubcarrierSpacing); const uint16_t feedback_ti = pucch_Config->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0] + ntn_ue_koffset; - AssertFatal(feedback_ti > GET_DURATION_RX_TO_TX(&mac->ntn_ta), + AssertFatal(feedback_ti > GET_DURATION_RX_TO_TX(&mac->ntn_ta, dlsch_pdu->SubcarrierSpacing), "PDSCH to HARQ feedback time (%d) needs to be higher than DURATION_RX_TO_TX (%ld). Min feedback time set in config " "file (min_rxtxtime).\n", feedback_ti, - GET_DURATION_RX_TO_TX(&mac->ntn_ta)); + GET_DURATION_RX_TO_TX(&mac->ntn_ta, dlsch_pdu->SubcarrierSpacing)); // set the harq status at MAC for feedback const int tpc[] = {-1, 0, 1, 3}; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index edd3bc1db7..3c18360d21 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1037,9 +1037,11 @@ void nr_ue_aperiodic_srs_scheduling(NR_UE_MAC_INST_t *mac, long resource_trigger return; } - AssertFatal(slot_offset > GET_DURATION_RX_TO_TX(&mac->ntn_ta), + int scs = mac->current_UL_BWP->scs; + AssertFatal(slot_offset > GET_DURATION_RX_TO_TX(&mac->ntn_ta, scs), "Slot offset between DCI and aperiodic SRS (%d) needs to be higher than DURATION_RX_TO_TX (%ld)\n", - slot_offset, GET_DURATION_RX_TO_TX(&mac->ntn_ta)); + slot_offset, + GET_DURATION_RX_TO_TX(&mac->ntn_ta, scs)); int n_slots_frame = mac->frame_structure.numb_slots_frame; int sched_slot = (slot + slot_offset) % n_slots_frame; if (!is_ul_slot(sched_slot, &mac->frame_structure)) { @@ -1563,23 +1565,24 @@ int nr_ue_pusch_scheduler(const NR_UE_MAC_INST_t *mac, AssertFatal(1 == 0, "Invalid numerology %i\n", mu); } - AssertFatal((k2 + delta) > GET_DURATION_RX_TO_TX(&mac->ntn_ta), - "Slot offset (%ld) for Msg3 needs to be higher than DURATION_RX_TO_TX (%ld). Please set min_rxtxtime at least to %ld in gNB config file or gNBs.[0].min_rxtxtime=%ld via command line.\n", + AssertFatal((k2 + delta) > GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu), + "Slot offset (%ld) for Msg3 needs to be higher than DURATION_RX_TO_TX (%ld). Please set min_rxtxtime at least to " + "%ld in gNB config file or gNBs.[0].min_rxtxtime=%ld via command line.\n", k2, - GET_DURATION_RX_TO_TX(&mac->ntn_ta), - GET_DURATION_RX_TO_TX(&mac->ntn_ta), - GET_DURATION_RX_TO_TX(&mac->ntn_ta)); + GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu), + GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu), + GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu)); *slot_tx = (current_slot + k2 + delta) % slots_per_frame; *frame_tx = (current_frame + (current_slot + k2 + delta) / slots_per_frame) % MAX_FRAME_NUMBER; } else { - - AssertFatal(k2 > GET_DURATION_RX_TO_TX(&mac->ntn_ta), - "Slot offset K2 (%ld) needs to be higher than DURATION_RX_TO_TX (%ld). Please set min_rxtxtime at least to %ld in gNB config file or gNBs.[0].min_rxtxtime=%ld via command line.\n", + AssertFatal(k2 > GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu), + "Slot offset K2 (%ld) needs to be higher than DURATION_RX_TO_TX (%ld). Please set min_rxtxtime at least to %ld in " + "gNB config file or gNBs.[0].min_rxtxtime=%ld via command line.\n", k2, - GET_DURATION_RX_TO_TX(&mac->ntn_ta), - GET_DURATION_RX_TO_TX(&mac->ntn_ta), - GET_DURATION_RX_TO_TX(&mac->ntn_ta)); + GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu), + GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu), + GET_DURATION_RX_TO_TX(&mac->ntn_ta, mu)); if (k2 < 0) { // This can happen when a false DCI is received LOG_W(PHY, "%d.%d. Received k2 %ld\n", current_frame, current_slot, k2); @@ -2203,7 +2206,7 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t add_slots++; } nr_timer_setup(&ra->response_window_timer, - ra->response_window_setup_time + add_slots + GET_DURATION_RX_TO_TX(&mac->ntn_ta), + ra->response_window_setup_time + add_slots + GET_DURATION_RX_TO_TX(&mac->ntn_ta, mac->current_DL_BWP->scs), 1); nr_timer_start(&ra->response_window_timer); } else if (ra->ra_type == RA_2_STEP) {