removing unnecessary nr_Msg1_transmitted function
This commit is contained in:
@@ -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"};
|
{"UE_IDLE", "GENERATE_PREAMBLE", "WAIT_RAR", "WAIT_MSGB", "WAIT_CONTENTION_RESOLUTION", "RA_SUCCEEDED", "RA_FAILED"};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// PRACH format retrieved from prach_ConfigIndex
|
|
||||||
uint16_t prach_format;
|
|
||||||
/// Preamble Tx Counter
|
/// Preamble Tx Counter
|
||||||
uint8_t preamble_tx_counter;
|
uint8_t preamble_tx_counter;
|
||||||
/// Preamble Power Ramping Counter
|
/// Preamble Power Ramping Counter
|
||||||
@@ -282,9 +280,7 @@ typedef struct {
|
|||||||
/// 2-step RA power offset
|
/// 2-step RA power offset
|
||||||
int power_offset_2step;
|
int power_offset_2step;
|
||||||
/// Target received power at gNB. Baseline is range -202..-60 dBm. Depends on delta preamble, power ramping counter and step.
|
/// 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;
|
int ra_preamble_rx_target_power;
|
||||||
/// PRACH index for TDD (0 ... 6) depending on TDD configuration and prachConfigIndex
|
|
||||||
uint8_t ra_TDD_map_index;
|
|
||||||
/// RA Preamble Power Ramping Step in dB
|
/// RA Preamble Power Ramping Step in dB
|
||||||
uint32_t preamble_power_ramping_step;
|
uint32_t preamble_power_ramping_step;
|
||||||
uint8_t preamble_backoff;
|
uint8_t preamble_backoff;
|
||||||
@@ -329,8 +325,6 @@ typedef struct {
|
|||||||
uint16_t MsgB_rnti;
|
uint16_t MsgB_rnti;
|
||||||
/// Temporary CRNTI
|
/// Temporary CRNTI
|
||||||
uint16_t t_crnti;
|
uint16_t t_crnti;
|
||||||
/// number of attempt for rach
|
|
||||||
uint8_t RA_attempt_number;
|
|
||||||
/// Random-access procedure flag
|
/// Random-access procedure flag
|
||||||
bool RA_active;
|
bool RA_active;
|
||||||
/// Random-access preamble index
|
/// Random-access preamble index
|
||||||
@@ -361,9 +355,9 @@ typedef struct {
|
|||||||
uint8_t *Msg3_buffer;
|
uint8_t *Msg3_buffer;
|
||||||
// initial Random Access Preamble power
|
// initial Random Access Preamble power
|
||||||
int preambleRxTargetPower;
|
int preambleRxTargetPower;
|
||||||
int deltaPreamble;
|
int msg3_deltaPreamble;
|
||||||
bool msg3_C_RNTI;
|
bool msg3_C_RNTI;
|
||||||
|
int preambleReceivedTargetPower_config;
|
||||||
/// Random-access Contention Resolution Timer
|
/// Random-access Contention Resolution Timer
|
||||||
NR_timer_t contention_resolution_timer;
|
NR_timer_t contention_resolution_timer;
|
||||||
/// Transmitted UE Contention Resolution Identifier
|
/// Transmitted UE Contention Resolution Identifier
|
||||||
@@ -373,6 +367,9 @@ typedef struct {
|
|||||||
|
|
||||||
NR_PRACH_RESOURCES_t prach_resources;
|
NR_PRACH_RESOURCES_t prach_resources;
|
||||||
|
|
||||||
|
bool new_ssb;
|
||||||
|
int num_fd_occasions;
|
||||||
|
int ra_config_index;
|
||||||
ssb_ro_preambles_t ssb_ro_config;
|
ssb_ro_preambles_t ssb_ro_config;
|
||||||
int association_periods;
|
int association_periods;
|
||||||
prach_occasion_info_t sched_ro_info;
|
prach_occasion_info_t sched_ro_info;
|
||||||
|
|||||||
@@ -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);
|
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 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 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 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);
|
void nr_get_Msg3_MsgA_PUSCH_payload(NR_UE_MAC_INST_t *mac, uint8_t *buf, int TBS_max);
|
||||||
|
|||||||
@@ -38,13 +38,12 @@
|
|||||||
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
#include "LAYER2/NR_MAC_UE/mac_proto.h"
|
||||||
#include <executables/softmodem-common.h>
|
#include <executables/softmodem-common.h>
|
||||||
#include "openair2/LAYER2/RLC/rlc.h"
|
#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)
|
int16_t get_prach_tx_power(NR_UE_MAC_INST_t *mac)
|
||||||
{
|
{
|
||||||
RA_config_t *ra = &mac->ra;
|
RA_config_t *ra = &mac->ra;
|
||||||
int16_t pathloss = compute_nr_SSB_PL(mac, mac->ssb_measurements.ssb_rsrp_dBm);
|
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);
|
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)
|
// if the pathloss is less than PCMAX (of the Serving Cell performing the Random Access Procedure)
|
||||||
// – preambleReceivedTargetPower – msg3-DeltaPreamble – messagePowerOffsetGroupB
|
// – preambleReceivedTargetPower – msg3-DeltaPreamble – messagePowerOffsetGroupB
|
||||||
int groupB_pow_offset = get_messagePowerOffsetGroupB(groupB->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);
|
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
|
// 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
|
// 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);
|
nb_of_preambles);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 38.321 Section 5.1.2 Random Access Resource selection
|
static void configure_ra_preamble(NR_UE_MAC_INST_t *mac)
|
||||||
static void ra_resource_selection(NR_UE_MAC_INST_t *mac)
|
|
||||||
{
|
{
|
||||||
RA_config_t *ra = &mac->ra;
|
RA_config_t *ra = &mac->ra;
|
||||||
int ssb = -1; // init as not selected
|
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);
|
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
|
// setting the RA ssb value as the progressive number of SSB transmitted
|
||||||
// non-transmitted SSBs are not taken into account
|
// 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
|
// 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");
|
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;
|
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;
|
RA_config_t *ra = &mac->ra;
|
||||||
int num_ra_occasions_period = 0;
|
int num_ra_occasions_period = 0;
|
||||||
frame_structure_t *fs = &mac->frame_structure;
|
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);
|
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 * num_fd_occasions;
|
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];
|
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
|
// 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
|
// 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))
|
if (!is_ul_slot(slot, fs))
|
||||||
continue; // valid PRACH occasion only if slot is UL
|
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
|
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 start_symbol = prach_info.start_symbol + t * prach_info.N_dur;
|
||||||
int end_symbol = start_symbol + 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
|
// 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))
|
if (fs->frame_type == TDD && !check_mixed_slot_prach(fs, slot, start_symbol, end_symbol))
|
||||||
continue;
|
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] =
|
ra_occasions_period[num_ra_occasions_period] =
|
||||||
(prach_occasion_info_t){.slot = slot,
|
(prach_occasion_info_t){.slot = slot,
|
||||||
.frame_info[0] = prach_info.x,
|
.frame_info[0] = prach_info.x,
|
||||||
.frame_info[1] = n == 0 ? prach_info.y : prach_info.y2,
|
.frame_info[1] = n == 0 ? prach_info.y : prach_info.y2,
|
||||||
.start_symbol = start_symbol,
|
.start_symbol = start_symbol,
|
||||||
.fdm = f,
|
.fdm = f,
|
||||||
.format = prach_info.format};
|
.format = temp_format};
|
||||||
LOG_D(NR_MAC,
|
LOG_D(NR_MAC,
|
||||||
"RA occasion %d: slot %d start symbol %d fd occasion %d\n",
|
"RA occasion %d: slot %d start symbol %d fd occasion %d\n",
|
||||||
num_ra_occasions_period,
|
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);
|
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
|
// 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)
|
// 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)
|
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;
|
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)
|
if (ra->ra_type == RA_2_STEP && twostep_generic && twostep_generic->preambleTransMax_r16)
|
||||||
set_preambleTransMax(ra, *twostep_generic->preambleTransMax_r16);
|
set_preambleTransMax(ra, *twostep_generic->preambleTransMax_r16);
|
||||||
else
|
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
|
||||||
&& current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16
|
&& current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16
|
||||||
&& current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16->msgA_DeltaPreamble_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
|
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_RAPID_found = 0;
|
||||||
ra->RA_backoff_cnt = 0;
|
ra->RA_backoff_cnt = 0;
|
||||||
ra->RA_window_cnt = -1;
|
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)
|
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 {
|
else {
|
||||||
if (rach_ConfigGeneric->ext1 && rach_ConfigGeneric->ext1->prach_ConfigurationIndex_v1610)
|
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
|
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)
|
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
|
else
|
||||||
fdm = 1 << rach_ConfigGeneric->msg1_FDM;
|
ra->num_fd_occasions = 1 << rach_ConfigGeneric->msg1_FDM;
|
||||||
configure_prach_occasions(mac, ra_config_index, fdm, prach_scs);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TS 38.321 subclause 7.3 - return DELTA_PREAMBLE values in dB */
|
static void nr_get_prach_resources(NR_UE_MAC_INST_t *mac, NR_PRACH_RESOURCES_t *prach_resources)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
|
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)
|
if (prach_resources->preamble_tx_counter > 1)
|
||||||
prach_resources->preamble_power_ramping_cnt++;
|
prach_resources->preamble_power_ramping_cnt++;
|
||||||
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(&mac->ra, mu);
|
||||||
}
|
|
||||||
|
|
||||||
// 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++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 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)
|
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;
|
RA_config_t *ra = &mac->ra;
|
||||||
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated = ra->rach_ConfigDedicated;
|
|
||||||
NR_PRACH_RESOURCES_t *prach_resources = &ra->prach_resources;
|
NR_PRACH_RESOURCES_t *prach_resources = &ra->prach_resources;
|
||||||
|
|
||||||
if (ra->ra_state == nrRA_UE_IDLE) {
|
if (ra->ra_state == nrRA_UE_IDLE) {
|
||||||
bool init_success = init_RA(mac, frame);
|
bool init_success = init_RA(mac, frame);
|
||||||
if (!init_success)
|
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
|
// Fill in preamble and PRACH resources
|
||||||
ra->RA_window_cnt--;
|
ra->RA_window_cnt--;
|
||||||
if (ra->ra_state == nrRA_GENERATE_PREAMBLE) {
|
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) {
|
} 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--;
|
ra->RA_backoff_cnt--;
|
||||||
|
|
||||||
if ((ra->RA_backoff_cnt > 0 && ra->ra_state == nrRA_GENERATE_PREAMBLE) || ra->RA_backoff_cnt == 0) {
|
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);
|
ra->RA_backoff_cnt = rand_r(&seed) % (prach_resources->preamble_backoff + 1);
|
||||||
prach_resources->preamble_tx_counter = 1;
|
prach_resources->preamble_tx_counter = 1;
|
||||||
prach_resources->preamble_power_ramping_step += 2; // 2 dB increment
|
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 {
|
} else {
|
||||||
nr_get_RA_window(mac);
|
nr_get_RA_window(mac);
|
||||||
|
|||||||
@@ -2083,10 +2083,7 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t format = prach_occasion_info->format;
|
int format = prach_occasion_info->format;
|
||||||
uint16_t format0 = format & 0xff; // single PRACH format
|
|
||||||
uint16_t format1 = (format >> 8) & 0xff; // dual PRACH format
|
|
||||||
|
|
||||||
fapi_nr_prach_config_t *prach_config = &mac->phy_config.config_req.prach_config;
|
fapi_nr_prach_config_t *prach_config = &mac->phy_config.config_req.prach_config;
|
||||||
pdu->prach_config_pdu = (fapi_nr_ul_config_prach_pdu){
|
pdu->prach_config_pdu = (fapi_nr_ul_config_prach_pdu){
|
||||||
.phys_cell_id = mac->physCellId,
|
.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_slot = prach_occasion_info->slot,
|
||||||
.prach_start_symbol = prach_occasion_info->start_symbol,
|
.prach_start_symbol = prach_occasion_info->start_symbol,
|
||||||
.num_ra = prach_occasion_info->fdm,
|
.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,
|
.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,
|
.restricted_set = prach_config->restricted_set_config,
|
||||||
.freq_msg1 = prach_config->num_prach_fd_occasions_list[prach_occasion_info->fdm].k1};
|
.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.prach_start_symbol,
|
||||||
pdu->prach_config_pdu.num_ra);
|
pdu->prach_config_pdu.num_ra);
|
||||||
|
|
||||||
if (format1 != 0xff) {
|
switch (format) { // single PRACH format
|
||||||
switch (format0) { // dual PRACH format
|
case 0:
|
||||||
case 0xa1:
|
pdu->prach_config_pdu.prach_format = 0;
|
||||||
pdu->prach_config_pdu.prach_format = 11;
|
break;
|
||||||
break;
|
case 1:
|
||||||
case 0xa2:
|
pdu->prach_config_pdu.prach_format = 1;
|
||||||
pdu->prach_config_pdu.prach_format = 12;
|
break;
|
||||||
break;
|
case 2:
|
||||||
case 0xa3:
|
pdu->prach_config_pdu.prach_format = 2;
|
||||||
pdu->prach_config_pdu.prach_format = 13;
|
break;
|
||||||
break;
|
case 3:
|
||||||
default:
|
pdu->prach_config_pdu.prach_format = 3;
|
||||||
AssertFatal(1 == 0, "Only formats A1/B1 A2/B2 A3/B3 are valid for dual format");
|
break;
|
||||||
}
|
case 0xa1:
|
||||||
} else {
|
pdu->prach_config_pdu.prach_format = 4;
|
||||||
switch (format0) { // single PRACH format
|
break;
|
||||||
case 0:
|
case 0xa2:
|
||||||
pdu->prach_config_pdu.prach_format = 0;
|
pdu->prach_config_pdu.prach_format = 5;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 0xa3:
|
||||||
pdu->prach_config_pdu.prach_format = 1;
|
pdu->prach_config_pdu.prach_format = 6;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 0xb1:
|
||||||
pdu->prach_config_pdu.prach_format = 2;
|
pdu->prach_config_pdu.prach_format = 7;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 0xb4:
|
||||||
pdu->prach_config_pdu.prach_format = 3;
|
pdu->prach_config_pdu.prach_format = 8;
|
||||||
break;
|
break;
|
||||||
case 0xa1:
|
case 0xc0:
|
||||||
pdu->prach_config_pdu.prach_format = 4;
|
pdu->prach_config_pdu.prach_format = 9;
|
||||||
break;
|
break;
|
||||||
case 0xa2:
|
case 0xc2:
|
||||||
pdu->prach_config_pdu.prach_format = 5;
|
pdu->prach_config_pdu.prach_format = 10;
|
||||||
break;
|
break;
|
||||||
case 0xa3:
|
default:
|
||||||
pdu->prach_config_pdu.prach_format = 6;
|
AssertFatal(false, "Invalid PRACH format");
|
||||||
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
|
|
||||||
|
|
||||||
pdu->prach_config_pdu.ra_PreambleIndex = ra->ra_PreambleIndex;
|
pdu->prach_config_pdu.ra_PreambleIndex = ra->ra_PreambleIndex;
|
||||||
pdu->prach_config_pdu.prach_tx_power = get_prach_tx_power(mac);
|
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);
|
release_ul_config(pdu, false);
|
||||||
nr_scheduled_response_t scheduled_response = {.ul_config = mac->ul_config_request + slotP,
|
nr_scheduled_response_t scheduled_response = {.ul_config = mac->ul_config_request + slotP,
|
||||||
.mac = mac,
|
.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));
|
T_INT(pdu->prach_config_pdu.ra_PreambleIndex), T_INT(pdu->prach_config_pdu.prach_tx_power));
|
||||||
|
|
||||||
if (ra->ra_type == RA_4_STEP) {
|
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) {
|
} else if (ra->ra_type == RA_2_STEP) {
|
||||||
NR_MsgA_PUSCH_Resource_r16_t *msgA_PUSCH_Resource =
|
NR_MsgA_PUSCH_Resource_r16_t *msgA_PUSCH_Resource =
|
||||||
mac->current_UL_BWP->msgA_ConfigCommon_r16->msgA_PUSCH_Config_r16->msgA_PUSCH_ResourceGroupA_r16;
|
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);
|
remove_ul_config_last_item(pdu);
|
||||||
release_ul_config(pdu, false);
|
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]);
|
LOG_D(NR_MAC, "ra->ra_state %s\n", nrra_ue_text[ra->ra_state]);
|
||||||
ra->ra_state = nrRA_WAIT_MSGB;
|
ra->ra_state = nrRA_WAIT_MSGB;
|
||||||
ra->t_crnti = 0;
|
ra->t_crnti = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user