fix for contention resolution timer at NR UE
This commit is contained in:
@@ -315,7 +315,7 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
|
|||||||
mac->RA_attempt_number++;
|
mac->RA_attempt_number++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id){
|
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id){
|
||||||
AssertFatal(CC_id == 0, "Transmission on secondary CCs is not supported yet\n");
|
AssertFatal(CC_id == 0, "Transmission on secondary CCs is not supported yet\n");
|
||||||
LOG_D(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Starting contention resolution timer\n", mod_id, frameP);
|
LOG_D(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Starting contention resolution timer\n", mod_id, frameP);
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||||
|
|||||||
@@ -292,8 +292,8 @@ typedef struct {
|
|||||||
|
|
||||||
/// Random-access Contention Resolution Timer active flag
|
/// Random-access Contention Resolution Timer active flag
|
||||||
uint8_t RA_contention_resolution_timer_active;
|
uint8_t RA_contention_resolution_timer_active;
|
||||||
/// Random-access Contention Resolution Timer count value
|
int RA_contention_resolution_target_frame;
|
||||||
uint8_t RA_contention_resolution_cnt;
|
int RA_contention_resolution_target_slot;
|
||||||
/// Transmitted UE Contention Resolution Identifier
|
/// Transmitted UE Contention Resolution Identifier
|
||||||
uint8_t cont_res_id[6];
|
uint8_t cont_res_id[6];
|
||||||
|
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ void nr_get_prach_resources(module_id_t mod_id,
|
|||||||
|
|
||||||
void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
|
void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
|
||||||
|
|
||||||
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
|
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id);
|
||||||
|
|
||||||
void nr_ue_msg2_scheduler(module_id_t mod_id, uint16_t rach_frame, uint16_t rach_slot, uint16_t *msg2_frame, uint16_t *msg2_slot);
|
void nr_ue_msg2_scheduler(module_id_t mod_id, uint16_t rach_frame, uint16_t rach_slot, uint16_t *msg2_frame, uint16_t *msg2_slot);
|
||||||
|
|
||||||
|
|||||||
@@ -457,18 +457,27 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
|
|||||||
ra->RA_attempt_number++;
|
ra->RA_attempt_number++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id){
|
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id){
|
||||||
|
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||||
NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc) ?
|
RA_config_t *ra = &mac->ra;
|
||||||
|
NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc) ?
|
||||||
mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
|
mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
|
||||||
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
|
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
|
||||||
RA_config_t *ra = &mac->ra;
|
long mu = (mac->scc) ?
|
||||||
|
mac->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing :
|
||||||
|
mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
|
||||||
|
int subframes_per_slot = nr_slots_per_frame[mu]/10;
|
||||||
|
|
||||||
LOG_D(MAC,"In %s: [UE %d] Frame %d, CB-RA: starting contention resolution timer\n", __FUNCTION__, mod_id, frameP);
|
// start contention resolution timer (cnt in slots)
|
||||||
|
int RA_contention_resolution_timer_subframes = (nr_rach_ConfigCommon->ra_ContentionResolutionTimer + 1) * 8;
|
||||||
|
|
||||||
|
ra->RA_contention_resolution_target_frame = frameP + (RA_contention_resolution_timer_subframes/10);
|
||||||
|
ra->RA_contention_resolution_target_slot = (slotP + (RA_contention_resolution_timer_subframes * subframes_per_slot)) % nr_slots_per_frame[mu];
|
||||||
|
|
||||||
|
LOG_D(MAC,"In %s: [UE %d] CB-RA: starting contention resolution timer set in frame.slot %d.%d and expiring in %d.%d\n",
|
||||||
|
__FUNCTION__, mod_id, frameP, slotP, ra->RA_contention_resolution_target_frame, ra->RA_contention_resolution_target_slot);
|
||||||
|
|
||||||
// start contention resolution timer
|
|
||||||
ra->RA_contention_resolution_cnt = (nr_rach_ConfigCommon->ra_ContentionResolutionTimer + 1) * 8;
|
|
||||||
ra->RA_contention_resolution_timer_active = 1;
|
ra->RA_contention_resolution_timer_active = 1;
|
||||||
ra->ra_state = WAIT_CONTENTION_RESOLUTION;
|
ra->ra_state = WAIT_CONTENTION_RESOLUTION;
|
||||||
|
|
||||||
@@ -736,20 +745,15 @@ void nr_ue_contention_resolution(module_id_t module_id, int cc_id, frame_t frame
|
|||||||
RA_config_t *ra = &mac->ra;
|
RA_config_t *ra = &mac->ra;
|
||||||
|
|
||||||
if (ra->RA_contention_resolution_timer_active == 1) {
|
if (ra->RA_contention_resolution_timer_active == 1) {
|
||||||
|
if (frame >= ra->RA_contention_resolution_target_frame &&
|
||||||
ra->RA_contention_resolution_cnt--;
|
slot >= ra->RA_contention_resolution_target_frame) {
|
||||||
|
ra->t_crnti = 0;
|
||||||
LOG_D(MAC, "In %s: [%d.%d] RA contention resolution timer %d\n", __FUNCTION__, frame, slot, ra->RA_contention_resolution_cnt);
|
ra->RA_active = 0;
|
||||||
|
ra->RA_contention_resolution_timer_active = 0;
|
||||||
if (ra->RA_contention_resolution_cnt == 0) {
|
// Signal PHY to quit RA procedure
|
||||||
ra->t_crnti = 0;
|
LOG_E(MAC, "[UE %d] CB-RA: Contention resolution timer has expired, RA procedure has failed...\n", module_id);
|
||||||
ra->RA_active = 0;
|
nr_ra_failed(module_id, cc_id, prach_resources, frame, slot);
|
||||||
ra->RA_contention_resolution_timer_active = 0;
|
}
|
||||||
// Signal PHY to quit RA procedure
|
|
||||||
LOG_E(MAC, "[UE %d] CB-RA: Contention resolution timer has expired, RA procedure has failed...\n", module_id);
|
|
||||||
nr_ra_failed(module_id, cc_id, prach_resources, frame, slot);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,7 +777,6 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot){
|
|||||||
|
|
||||||
LOG_I(MAC, "[UE %d][%d.%d][RAPROC] RA procedure succeeded. CB-RA: Contention Resolution is successful.\n", mod_id, frame, slot);
|
LOG_I(MAC, "[UE %d][%d.%d][RAPROC] RA procedure succeeded. CB-RA: Contention Resolution is successful.\n", mod_id, frame, slot);
|
||||||
|
|
||||||
ra->RA_contention_resolution_cnt = -1;
|
|
||||||
ra->RA_contention_resolution_timer_active = 0;
|
ra->RA_contention_resolution_timer_active = 0;
|
||||||
mac->crnti = ra->t_crnti;
|
mac->crnti = ra->t_crnti;
|
||||||
ra->t_crnti = 0;
|
ra->t_crnti = 0;
|
||||||
|
|||||||
@@ -1091,7 +1091,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
|||||||
|
|
||||||
if (ra->ra_state == WAIT_RAR && !ra->cfra){
|
if (ra->ra_state == WAIT_RAR && !ra->cfra){
|
||||||
LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n");
|
LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n");
|
||||||
nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->gNB_index);
|
nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->gNB_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user