From 108fdae15904ab34ed2c97ae0f95ee7f019ad9f4 Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 2 Dec 2024 11:30:48 +0100 Subject: [PATCH] removing unnecessary nr_Msg1_transmitted function --- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 15 +- openair2/LAYER2/NR_MAC_UE/mac_proto.h | 1 - openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 270 +++++++++---------- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 112 +++----- 4 files changed, 166 insertions(+), 232 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 8536e4a081..ddb522dfb5 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -273,8 +273,6 @@ static const char *const nrra_ue_text[] = {"UE_IDLE", "GENERATE_PREAMBLE", "WAIT_RAR", "WAIT_MSGB", "WAIT_CONTENTION_RESOLUTION", "RA_SUCCEEDED", "RA_FAILED"}; typedef struct { - /// PRACH format retrieved from prach_ConfigIndex - uint16_t prach_format; /// Preamble Tx Counter uint8_t preamble_tx_counter; /// Preamble Power Ramping Counter @@ -282,9 +280,7 @@ typedef struct { /// 2-step RA power offset int power_offset_2step; /// Target received power at gNB. Baseline is range -202..-60 dBm. Depends on delta preamble, power ramping counter and step. - int ra_PREAMBLE_RECEIVED_TARGET_POWER; - /// PRACH index for TDD (0 ... 6) depending on TDD configuration and prachConfigIndex - uint8_t ra_TDD_map_index; + int ra_preamble_rx_target_power; /// RA Preamble Power Ramping Step in dB uint32_t preamble_power_ramping_step; uint8_t preamble_backoff; @@ -329,8 +325,6 @@ typedef struct { uint16_t MsgB_rnti; /// Temporary CRNTI uint16_t t_crnti; - /// number of attempt for rach - uint8_t RA_attempt_number; /// Random-access procedure flag bool RA_active; /// Random-access preamble index @@ -361,9 +355,9 @@ typedef struct { uint8_t *Msg3_buffer; // initial Random Access Preamble power int preambleRxTargetPower; - int deltaPreamble; + int msg3_deltaPreamble; bool msg3_C_RNTI; - + int preambleReceivedTargetPower_config; /// Random-access Contention Resolution Timer NR_timer_t contention_resolution_timer; /// Transmitted UE Contention Resolution Identifier @@ -373,6 +367,9 @@ typedef struct { NR_PRACH_RESOURCES_t prach_resources; + bool new_ssb; + int num_fd_occasions; + int ra_config_index; ssb_ro_preambles_t ssb_ro_config; int association_periods; prach_occasion_info_t sched_ro_info; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 848cbce9b1..6d2c7a1efd 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -336,7 +336,6 @@ NR_UE_L2_STATE_t nr_ue_get_sync_state(module_id_t mod_id); int16_t get_prach_tx_power(NR_UE_MAC_INST_t *mac); void schedule_RA_after_SR_failure(NR_UE_MAC_INST_t *mac); -void nr_Msg1_transmitted(NR_UE_MAC_INST_t *mac); void nr_Msg3_transmitted(NR_UE_MAC_INST_t *mac, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id); void trigger_MAC_UE_RA(NR_UE_MAC_INST_t *mac, dci_pdu_rel15_t *pdcch_order); void nr_get_Msg3_MsgA_PUSCH_payload(NR_UE_MAC_INST_t *mac, uint8_t *buf, int TBS_max); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index df9290ec3b..9a4caa7038 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -38,13 +38,12 @@ #include "LAYER2/NR_MAC_UE/mac_proto.h" #include #include "openair2/LAYER2/RLC/rlc.h" -#include "openair2/LAYER2/NR_MAC_UE/mac_defs.h" int16_t get_prach_tx_power(NR_UE_MAC_INST_t *mac) { RA_config_t *ra = &mac->ra; int16_t pathloss = compute_nr_SSB_PL(mac, mac->ssb_measurements.ssb_rsrp_dBm); - int16_t ra_preamble_rx_power = (int16_t)(ra->prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER + pathloss); + int16_t ra_preamble_rx_power = (int16_t)(ra->prach_resources.ra_preamble_rx_target_power + pathloss); return min(ra->prach_resources.Pc_max, ra_preamble_rx_power); } @@ -177,7 +176,7 @@ static void select_preamble_group(NR_UE_MAC_INST_t *mac) // if the pathloss is less than PCMAX (of the Serving Cell performing the Random Access Procedure) // – preambleReceivedTargetPower – msg3-DeltaPreamble – messagePowerOffsetGroupB int groupB_pow_offset = get_messagePowerOffsetGroupB(groupB->messagePowerOffsetGroupB); - int PLThreshold = ra->prach_resources.Pc_max - ra->preambleRxTargetPower - ra->deltaPreamble - groupB_pow_offset; + int PLThreshold = ra->prach_resources.Pc_max - ra->preambleRxTargetPower - ra->msg3_deltaPreamble - groupB_pow_offset; int pathloss = compute_nr_SSB_PL(mac, mac->ssb_measurements.ssb_rsrp_dBm); // TODO if the Random Access procedure was initiated for the CCCH logical channel and the CCCH SDU size // plus MAC subheader is greater than ra-Msg3SizeGroupA @@ -350,8 +349,7 @@ static void config_preamble_index(NR_UE_MAC_INST_t *mac) nb_of_preambles); } -// 38.321 Section 5.1.2 Random Access Resource selection -static void ra_resource_selection(NR_UE_MAC_INST_t *mac) +static void configure_ra_preamble(NR_UE_MAC_INST_t *mac) { RA_config_t *ra = &mac->ra; int ssb = -1; // init as not selected @@ -414,10 +412,12 @@ static void ra_resource_selection(NR_UE_MAC_INST_t *mac) config_preamble_index(mac); } } - AssertFatal(ra->ra_ssb >= 0, "Something wrong! RA resource selection didn't set any SSB\n"); + AssertFatal(ssb >= 0, "Something wrong! RA resource selection didn't set any SSB\n"); // setting the RA ssb value as the progressive number of SSB transmitted // non-transmitted SSBs are not taken into account - ra->ra_ssb = mac->ssb_list.nb_ssb_per_index[ssb]; + int ssb_idx = mac->ssb_list.nb_ssb_per_index[ssb]; + ra->new_ssb = ssb != ssb_idx ? true : false; + ra->ra_ssb = ssb_idx; // TODO not sure how to handle the RO mask when it is limiting the RO occasions AssertFatal(ra->ro_mask_index <= 0, "Handling of RACH occasion masking indication not implemented\n"); @@ -473,13 +473,13 @@ static void select_prach_occasion(RA_config_t *ra, ra->sched_ro_info.association_period_idx = ass_period_idx; } -static void configure_prach_occasions(NR_UE_MAC_INST_t *mac, int prach_config_index, int num_fd_occasions, int scs) +static void configure_prach_occasions(NR_UE_MAC_INST_t *mac, int scs) { RA_config_t *ra = &mac->ra; int num_ra_occasions_period = 0; frame_structure_t *fs = &mac->frame_structure; - nr_prach_info_t prach_info = get_nr_prach_occasion_info_from_index(prach_config_index, mac->frequency_range, fs->frame_type); - int max_num_occasions = prach_info.N_RA_sfn * prach_info.N_t_slot * prach_info.N_RA_slot * num_fd_occasions; + nr_prach_info_t prach_info = get_nr_prach_occasion_info_from_index(ra->ra_config_index, mac->frequency_range, fs->frame_type); + int max_num_occasions = prach_info.N_RA_sfn * prach_info.N_t_slot * prach_info.N_RA_slot * ra->num_fd_occasions; prach_occasion_info_t ra_occasions_period[max_num_occasions]; // Number of PRACH slots within a subframe (or 60kHz slot) to be taken into account only for 30 and 120kHz // as defined in 5.3.2 of 211 @@ -505,19 +505,23 @@ static void configure_prach_occasions(NR_UE_MAC_INST_t *mac, int prach_config_in if (!is_ul_slot(slot, fs)) continue; // valid PRACH occasion only if slot is UL for (int t = 0; t < prach_info.N_t_slot; t++) { // td occasions within a slot + // see 5.3.2 in 211 + int temp_format = prach_info.format >> 8; // B1, B2 or B3 if A1/B1, A2/B2 or A3/B3 formats in tables + if (t != prach_info.N_t_slot - 1 || temp_format == 0xff) + temp_format = prach_info.format & 0xff; int start_symbol = prach_info.start_symbol + t * prach_info.N_dur; int end_symbol = start_symbol + prach_info.N_dur; // valid occasion only if PRACH symbols are UL symbols in mixed slot if (fs->frame_type == TDD && !check_mixed_slot_prach(fs, slot, start_symbol, end_symbol)) continue; - for (int f = 0; f < num_fd_occasions; f++) { // fd occasions + for (int f = 0; f < ra->num_fd_occasions; f++) { // fd occasions ra_occasions_period[num_ra_occasions_period] = (prach_occasion_info_t){.slot = slot, .frame_info[0] = prach_info.x, .frame_info[1] = n == 0 ? prach_info.y : prach_info.y2, .start_symbol = start_symbol, .fdm = f, - .format = prach_info.format}; + .format = temp_format}; LOG_D(NR_MAC, "RA occasion %d: slot %d start symbol %d fd occasion %d\n", num_ra_occasions_period, @@ -555,6 +559,87 @@ static void configure_prach_occasions(NR_UE_MAC_INST_t *mac, int prach_config_in select_prach_occasion(ra, mac->ssb_list.nb_tx_ssb, max_num_occasions, ra_occasions_period, num_ra_occasions_period); } +/* TS 38.321 subclause 7.3 - return DELTA_PREAMBLE values in dB */ +static int nr_get_delta_preamble(int scs, int prach_format) +{ + int delta = 0; + switch (prach_format) { + case 0: + case 3: + delta = 0; + break; + case 1: + delta = -3; + break; + case 2: + delta = -6; + break; + case 0xa1: + case 0xb1: + delta = 8 + 3 * scs; + break; + case 0xa2: + case 0xb2: + case 0xc2: + delta = 5 + 3 * scs; + break; + case 0xa3: + case 0xb3: + delta = 3 + 3 * scs; + break; + case 0xb4: + delta = 3 * scs; + break; + case 0xc0: + delta = 11 + 3 * scs; + break; + default: + AssertFatal(false, "Invalid preamble format %x\n", prach_format); + } + return delta; +} + +static int get_ra_preamble_rx_target_power(RA_config_t *ra, int scs) +{ + NR_PRACH_RESOURCES_t *prach_resources = &ra->prach_resources; + int delta_preamble = nr_get_delta_preamble(scs, ra->sched_ro_info.format); + int tp = ra->preambleReceivedTargetPower_config + delta_preamble + prach_resources->power_offset_2step; + tp += (prach_resources->preamble_power_ramping_cnt - 1) * prach_resources->preamble_power_ramping_step; + return tp; +} + +// 38.321 Sections 5.1.3 and .3a +static void ra_preamble_msga_transmission(RA_config_t *ra, int scs) +{ + NR_PRACH_RESOURCES_t *prach_resources = &ra->prach_resources; + if (prach_resources->preamble_tx_counter > 1) { + // TODO if the notification of suspending power ramping counter has not been received from lower layers (not implemented) + // this happens if the L1 does not transmit PRACH of if the spacial filter changed (UE transmitting in another beam) + // TODO if LBT failure indication was not received from lower layers (LBT not implemented) + // if SSB or CSI-RS selected is not changed from the selection in the last Random Access Preamble transmission + if (!ra->new_ssb) + prach_resources->preamble_power_ramping_cnt++; + } + + + prach_resources->ra_preamble_rx_target_power = get_ra_preamble_rx_target_power(ra, scs); + + ra->ra_rnti = nr_get_ra_rnti(ra->sched_ro_info.start_symbol, ra->sched_ro_info.slot, ra->sched_ro_info.fdm, 0); + if (ra->ra_type == RA_2_STEP) + ra->MsgB_rnti = nr_get_MsgB_rnti(ra->sched_ro_info.start_symbol, ra->sched_ro_info.slot, ra->sched_ro_info.fdm, 0); +} + +// 38.321 Section 5.1.2 Random Access Resource selection +static void ra_resource_selection(NR_UE_MAC_INST_t *mac) +{ + configure_ra_preamble(mac); + const NR_UE_UL_BWP_t *current_UL_BWP = mac->current_UL_BWP; + const int ul_mu = mac->current_UL_BWP->scs; + const int mu = nr_get_prach_or_ul_mu(mac->current_UL_BWP->msgA_ConfigCommon_r16, current_UL_BWP->rach_ConfigCommon, ul_mu); + configure_prach_occasions(mac, mu); + ra_preamble_msga_transmission(&mac->ra, mu); +} + // Random Access procedure initialization as per 5.1.1 and initialization of variables specific // to Random Access type as specified in clause 5.1.1a (3GPP TS 38.321 version 16.2.1 Release 16) bool init_RA(NR_UE_MAC_INST_t *mac, int frame) @@ -743,6 +828,11 @@ bool init_RA(NR_UE_MAC_INST_t *mac, int frame) prach_resources->scaling_factor_bi = 1; + if (ra->ra_type == RA_2_STEP && twostep_generic && twostep_generic->msgA_PreambleReceivedTargetPower_r16) + ra->preambleReceivedTargetPower_config = *twostep_generic->msgA_PreambleReceivedTargetPower_r16; + else + ra->preambleReceivedTargetPower_config = rach_ConfigGeneric->preambleReceivedTargetPower; + if (ra->ra_type == RA_2_STEP && twostep_generic && twostep_generic->preambleTransMax_r16) set_preambleTransMax(ra, *twostep_generic->preambleTransMax_r16); else @@ -769,159 +859,39 @@ bool init_RA(NR_UE_MAC_INST_t *mac, int frame) && current_UL_BWP->msgA_ConfigCommon_r16 && current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16 && current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16->msgA_DeltaPreamble_r16) - ra->deltaPreamble = *current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16->msgA_DeltaPreamble_r16 << 1; + ra->msg3_deltaPreamble = *current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16->msgA_DeltaPreamble_r16 << 1; else - ra->deltaPreamble = mac->current_UL_BWP->msg3_DeltaPreamble ? *mac->current_UL_BWP->msg3_DeltaPreamble << 1 : 0; + ra->msg3_deltaPreamble = mac->current_UL_BWP->msg3_DeltaPreamble ? *mac->current_UL_BWP->msg3_DeltaPreamble << 1 : 0; ra->RA_RAPID_found = 0; ra->RA_backoff_cnt = 0; ra->RA_window_cnt = -1; + ra->new_ssb = false; - int ra_config_index = 0; if (ra->ra_type == RA_2_STEP && twostep_generic && twostep_generic->msgA_PRACH_ConfigurationIndex_r16) - ra_config_index = *twostep_generic->msgA_PRACH_ConfigurationIndex_r16; + ra->ra_config_index = *twostep_generic->msgA_PRACH_ConfigurationIndex_r16; else { if (rach_ConfigGeneric->ext1 && rach_ConfigGeneric->ext1->prach_ConfigurationIndex_v1610) - ra_config_index = *rach_ConfigGeneric->ext1->prach_ConfigurationIndex_v1610; + ra->ra_config_index = *rach_ConfigGeneric->ext1->prach_ConfigurationIndex_v1610; else - ra_config_index = rach_ConfigGeneric->prach_ConfigurationIndex; + ra->ra_config_index = rach_ConfigGeneric->prach_ConfigurationIndex; } - int fdm = 0; + if (ra->ra_type == RA_2_STEP && twostep_generic && twostep_generic->msgA_RO_FDM_r16) - fdm = 1 << *twostep_generic->msgA_RO_FDM_r16; + ra->num_fd_occasions = 1 << *twostep_generic->msgA_RO_FDM_r16; else - fdm = 1 << rach_ConfigGeneric->msg1_FDM; - configure_prach_occasions(mac, ra_config_index, fdm, prach_scs); + ra->num_fd_occasions = 1 << rach_ConfigGeneric->msg1_FDM; + return true; } -/* TS 38.321 subclause 7.3 - return DELTA_PREAMBLE values in dB */ -static int8_t nr_get_DELTA_PREAMBLE(const NR_UE_MAC_INST_t *mac, uint16_t prach_format) -{ - const NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = mac->current_UL_BWP->rach_ConfigCommon; - int prach_sequence_length = nr_rach_ConfigCommon->prach_RootSequenceIndex.present - 1; - - // Preamble formats given by prach_ConfigurationIndex and tables 6.3.3.2-2 and 6.3.3.2-2 in TS 38.211 - unsigned int prachConfigIndex = nr_rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex; - - if (prach_sequence_length == 0) { - AssertFatal(prach_format < 4, "Illegal PRACH format %d for sequence length 839\n", prach_format); - switch (prach_format) { - - // long preamble formats - case 0: - case 3: - return 0; - - case 1: - return -3; - - case 2: - return -6; - - default: - AssertFatal(1 == 0, "[UE %d] ue_procedures.c: FATAL, Illegal preambleFormat %d, prachConfigIndex %d\n", - mac->ue_id, - prach_format, - prachConfigIndex); - } - } else { - // SCS configuration from msg1_SubcarrierSpacing and table 4.2-1 in TS 38.211 - AssertFatal(nr_rach_ConfigCommon->msg1_SubcarrierSpacing, "msg1_SubcarrierSpacing required but missing\n"); - NR_SubcarrierSpacing_t scs = *nr_rach_ConfigCommon->msg1_SubcarrierSpacing; - AssertFatal(scs >= NR_SubcarrierSpacing_kHz15 && scs <= NR_SubcarrierSpacing_spare1, "Unknown msg1_SubcarrierSpacing %lu\n", scs); - const unsigned int mu = scs; - switch (prach_format) { // short preamble formats - case 0: - case 3: - return 8 + 3 * mu; - - case 1: - case 4: - case 8: - return 5 + 3 * mu; - - case 2: - case 5: - return 3 + 3 * mu; - - case 6: - return 3 * mu; - - case 7: - return 5 + 3 * mu; - - default: - AssertFatal(false, - "[UE %d] ue_procedures.c: FATAL, Illegal preambleFormat %d, prachConfigIndex %d\n", - mac->ue_id, - prach_format, - prachConfigIndex); - } - } - return 0; -} - -// TS 38.321 subclause 5.1.3 - RA preamble transmission - ra_PREAMBLE_RECEIVED_TARGET_POWER configuration -// Measurement units: -// - preambleReceivedTargetPower dBm (-202..-60, 2 dBm granularity) -// - delta_preamble dB -// - RA_PREAMBLE_POWER_RAMPING_STEP dB -// - POWER_OFFSET_2STEP_RA dB -// returns receivedTargerPower in dBm -static int nr_get_Po_NOMINAL_PUSCH(NR_UE_MAC_INST_t *mac, NR_PRACH_RESOURCES_t *prach_resources) -{ - int8_t receivedTargerPower; - int8_t delta_preamble; - - NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = mac->current_UL_BWP->rach_ConfigCommon; - long preambleReceivedTargetPower = nr_rach_ConfigCommon->rach_ConfigGeneric.preambleReceivedTargetPower; - delta_preamble = nr_get_DELTA_PREAMBLE(mac, prach_resources->prach_format); - - receivedTargerPower = preambleReceivedTargetPower + - delta_preamble + - (prach_resources->preamble_power_ramping_cnt - 1) * prach_resources->preamble_power_ramping_step + - prach_resources->power_offset_2step; - - LOG_D(MAC, "ReceivedTargerPower is %d dBm \n", receivedTargerPower); - return receivedTargerPower; -} - -// This routine implements Section 5.1.2 (UE Random Access Resource Selection) -// and Section 5.1.3 (Random Access Preamble Transmission) from 3GPP TS 38.321 -// - currently the PRACH preamble is set through RRC configuration for 4-step CFRA mode -// todo: -// - determine next available PRACH occasion -// -- if RA initiated for SI request and ra_AssociationPeriodIndex and si-RequestPeriod are configured -// -- else if SSB is selected above -// -- else if CSI-RS is selected above -// - switch initialisation cases -// -- RA initiated by beam failure recovery operation (subclause 5.17 TS 38.321) -// --- SSB selection, set ra_PreambleIndex -// -- RA initiated by PDCCH: ra_preamble_index provided by PDCCH && ra_PreambleIndex != 0b000000 -// --- set PREAMBLE_INDEX to ra_preamble_index -// --- select the SSB signalled by PDCCH -// -- RA initiated for SI request: -// --- SSB selection, set ra_PreambleIndex -// - condition on notification of suspending power ramping counter from lower layer (5.1.3 TS 38.321) -// - check if SSB or CSI-RS have not changed since the selection in the last RA Preamble tranmission -// - Contention-based RA preamble selection: -// -- selection of SSB with SS-RSRP above rsrp-ThresholdSSB else select any SSB -static void nr_get_prach_resources(NR_UE_MAC_INST_t *mac, - NR_PRACH_RESOURCES_t *prach_resources, - NR_RACH_ConfigDedicated_t *rach_ConfigDedicated) +static void nr_get_prach_resources(NR_UE_MAC_INST_t *mac, NR_PRACH_RESOURCES_t *prach_resources) { + const int ul_mu = mac->current_UL_BWP->scs; + const int mu = nr_get_prach_or_ul_mu(mac->current_UL_BWP->msgA_ConfigCommon_r16, mac->current_UL_BWP->rach_ConfigCommon, ul_mu); if (prach_resources->preamble_tx_counter > 1) prach_resources->preamble_power_ramping_cnt++; - prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER = nr_get_Po_NOMINAL_PUSCH(mac, prach_resources); -} - -// TbD: RA_attempt_number not used -void nr_Msg1_transmitted(NR_UE_MAC_INST_t *mac) -{ - RA_config_t *ra = &mac->ra; - ra->ra_state = nrRA_WAIT_RAR; - ra->RA_attempt_number++; + prach_resources->ra_preamble_rx_target_power = get_ra_preamble_rx_target_power(&mac->ra, mu); } void nr_Msg3_transmitted(NR_UE_MAC_INST_t *mac, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id) @@ -1028,8 +998,8 @@ void nr_get_Msg3_MsgA_PUSCH_payload(NR_UE_MAC_INST_t *mac, uint8_t *buf, int TBS void nr_ue_manage_ra_procedure(NR_UE_MAC_INST_t *mac, int CC_id, frame_t frame, uint8_t gNB_id, int nr_slot_tx) { RA_config_t *ra = &mac->ra; - NR_RACH_ConfigDedicated_t *rach_ConfigDedicated = ra->rach_ConfigDedicated; NR_PRACH_RESOURCES_t *prach_resources = &ra->prach_resources; + if (ra->ra_state == nrRA_UE_IDLE) { bool init_success = init_RA(mac, frame); if (!init_success) @@ -1072,7 +1042,7 @@ void nr_ue_manage_ra_procedure(NR_UE_MAC_INST_t *mac, int CC_id, frame_t frame, // Fill in preamble and PRACH resources ra->RA_window_cnt--; if (ra->ra_state == nrRA_GENERATE_PREAMBLE) { - nr_get_prach_resources(mac, prach_resources, rach_ConfigDedicated); + nr_get_prach_resources(mac, prach_resources); } } else if (ra->RA_backoff_cnt > 0) { @@ -1081,7 +1051,7 @@ void nr_ue_manage_ra_procedure(NR_UE_MAC_INST_t *mac, int CC_id, frame_t frame, ra->RA_backoff_cnt--; if ((ra->RA_backoff_cnt > 0 && ra->ra_state == nrRA_GENERATE_PREAMBLE) || ra->RA_backoff_cnt == 0) { - nr_get_prach_resources(mac, prach_resources, rach_ConfigDedicated); + nr_get_prach_resources(mac, prach_resources); } } } @@ -1288,7 +1258,7 @@ void nr_ra_failed(NR_UE_MAC_INST_t *mac, uint8_t CC_id, NR_PRACH_RESOURCES_t *pr ra->RA_backoff_cnt = rand_r(&seed) % (prach_resources->preamble_backoff + 1); prach_resources->preamble_tx_counter = 1; prach_resources->preamble_power_ramping_step += 2; // 2 dB increment - prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER = nr_get_Po_NOMINAL_PUSCH(mac, prach_resources); + prach_resources->ra_preamble_rx_target_power = get_ra_preamble_rx_target_power(ra, mac->current_UL_BWP->scs); } else { nr_get_RA_window(mac); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 85a6cd5942..d4d4aa3a4d 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -2083,10 +2083,7 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t return; } - uint16_t format = prach_occasion_info->format; - uint16_t format0 = format & 0xff; // single PRACH format - uint16_t format1 = (format >> 8) & 0xff; // dual PRACH format - + int format = prach_occasion_info->format; fapi_nr_prach_config_t *prach_config = &mac->phy_config.config_req.prach_config; pdu->prach_config_pdu = (fapi_nr_ul_config_prach_pdu){ .phys_cell_id = mac->physCellId, @@ -2094,7 +2091,7 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t .prach_slot = prach_occasion_info->slot, .prach_start_symbol = prach_occasion_info->start_symbol, .num_ra = prach_occasion_info->fdm, - .num_cs = get_NCS(ra->zeroCorrelationZoneConfig, format0, ra->restricted_set_config), + .num_cs = get_NCS(ra->zeroCorrelationZoneConfig, format, ra->restricted_set_config), .root_seq_id = prach_config->num_prach_fd_occasions_list[prach_occasion_info->fdm].prach_root_sequence_index, .restricted_set = prach_config->restricted_set_config, .freq_msg1 = prach_config->num_prach_fd_occasions_list[prach_occasion_info->fdm].k1}; @@ -2106,72 +2103,46 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t pdu->prach_config_pdu.prach_start_symbol, pdu->prach_config_pdu.num_ra); - if (format1 != 0xff) { - switch (format0) { // dual PRACH format - case 0xa1: - pdu->prach_config_pdu.prach_format = 11; - break; - case 0xa2: - pdu->prach_config_pdu.prach_format = 12; - break; - case 0xa3: - pdu->prach_config_pdu.prach_format = 13; - break; - default: - AssertFatal(1 == 0, "Only formats A1/B1 A2/B2 A3/B3 are valid for dual format"); - } - } else { - switch (format0) { // single PRACH format - case 0: - pdu->prach_config_pdu.prach_format = 0; - break; - case 1: - pdu->prach_config_pdu.prach_format = 1; - break; - case 2: - pdu->prach_config_pdu.prach_format = 2; - break; - case 3: - pdu->prach_config_pdu.prach_format = 3; - break; - case 0xa1: - pdu->prach_config_pdu.prach_format = 4; - break; - case 0xa2: - pdu->prach_config_pdu.prach_format = 5; - break; - case 0xa3: - pdu->prach_config_pdu.prach_format = 6; - break; - case 0xb1: - pdu->prach_config_pdu.prach_format = 7; - break; - case 0xb4: - pdu->prach_config_pdu.prach_format = 8; - break; - case 0xc0: - pdu->prach_config_pdu.prach_format = 9; - break; - case 0xc2: - pdu->prach_config_pdu.prach_format = 10; - break; - default: - AssertFatal(1 == 0, "Invalid PRACH format"); - } - } // if format1 + switch (format) { // single PRACH format + case 0: + pdu->prach_config_pdu.prach_format = 0; + break; + case 1: + pdu->prach_config_pdu.prach_format = 1; + break; + case 2: + pdu->prach_config_pdu.prach_format = 2; + break; + case 3: + pdu->prach_config_pdu.prach_format = 3; + break; + case 0xa1: + pdu->prach_config_pdu.prach_format = 4; + break; + case 0xa2: + pdu->prach_config_pdu.prach_format = 5; + break; + case 0xa3: + pdu->prach_config_pdu.prach_format = 6; + break; + case 0xb1: + pdu->prach_config_pdu.prach_format = 7; + break; + case 0xb4: + pdu->prach_config_pdu.prach_format = 8; + break; + case 0xc0: + pdu->prach_config_pdu.prach_format = 9; + break; + case 0xc2: + pdu->prach_config_pdu.prach_format = 10; + break; + default: + AssertFatal(false, "Invalid PRACH format"); + } pdu->prach_config_pdu.ra_PreambleIndex = ra->ra_PreambleIndex; pdu->prach_config_pdu.prach_tx_power = get_prach_tx_power(mac); - unsigned int slot_RA; - // 3GPP TS 38.321 Section 5.1.3 says t_id for RA-RNTI depends on mu as specified in clause 5.3.2 in TS 38.211 - // so mu = 0 for prach format < 4. - if (pdu->prach_config_pdu.prach_format < 4) { - unsigned int slots_per_sf = (1 << mac->current_UL_BWP->scs); - slot_RA = pdu->prach_config_pdu.prach_slot / slots_per_sf; - } else { - slot_RA = pdu->prach_config_pdu.prach_slot; - } - mac->ra.ra_rnti = nr_get_ra_rnti(pdu->prach_config_pdu.prach_start_symbol, slot_RA, pdu->prach_config_pdu.num_ra, 0); release_ul_config(pdu, false); nr_scheduled_response_t scheduled_response = {.ul_config = mac->ul_config_request + slotP, .mac = mac, @@ -2184,7 +2155,7 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t T_INT(pdu->prach_config_pdu.ra_PreambleIndex), T_INT(pdu->prach_config_pdu.prach_tx_power)); if (ra->ra_type == RA_4_STEP) { - nr_Msg1_transmitted(mac); + ra->ra_state = nrRA_WAIT_RAR; } else if (ra->ra_type == RA_2_STEP) { NR_MsgA_PUSCH_Resource_r16_t *msgA_PUSCH_Resource = mac->current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16->msgA_PUSCH_ResourceGroupA_r16; @@ -2217,9 +2188,6 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t remove_ul_config_last_item(pdu); release_ul_config(pdu, false); - // Compute MsgB RNTI - ra->MsgB_rnti = - nr_get_MsgB_rnti(prach_occasion_info->start_symbol, slot_RA, prach_occasion_info->fdm, 0); LOG_D(NR_MAC, "ra->ra_state %s\n", nrra_ue_text[ra->ra_state]); ra->ra_state = nrRA_WAIT_MSGB; ra->t_crnti = 0;