Release RNTI of LTE PHY when RA does not succeed
This commit is contained in:
@@ -314,6 +314,11 @@ rx_sdu(const module_id_t enb_mod_idP,
|
||||
}
|
||||
|
||||
if (no_sig || sduP == NULL) { // we've got an error on Msg3
|
||||
|
||||
if(no_sig) {
|
||||
LOG_W(MAC,"No signal in Msg3\n");
|
||||
}
|
||||
|
||||
LOG_D(MAC, "[eNB %d] CC_id %d, RA %d ULSCH in error in round %d/%d\n",
|
||||
enb_mod_idP,
|
||||
CC_idP,
|
||||
@@ -322,6 +327,20 @@ rx_sdu(const module_id_t enb_mod_idP,
|
||||
(int) mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx);
|
||||
|
||||
if (ra->msg3_round >= mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx - 1) {
|
||||
|
||||
// Release RNTI of LTE PHY when RA does not succeed
|
||||
UE_free_list_t *free_list = NULL;
|
||||
pthread_mutex_lock(&lock_ue_freelist);
|
||||
free_list = &mac->UE_free_list;
|
||||
free_list->UE_free_ctrl[free_list->tail_freelist].rnti = current_rnti;
|
||||
free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = 1;
|
||||
free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 1;
|
||||
free_list->num_UEs++;
|
||||
mac->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[mac->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = current_rnti;
|
||||
mac->UE_release_req.ue_release_request_body.number_of_TLVs++;
|
||||
free_list->tail_freelist = (free_list->tail_freelist + 1) % (NUMBER_OF_UE_MAX+1);
|
||||
pthread_mutex_unlock(&lock_ue_freelist);
|
||||
|
||||
cancel_ra_proc(enb_mod_idP, CC_idP, frameP, current_rnti);
|
||||
nfapi_hi_dci0_request_t *hi_dci0_req = NULL;
|
||||
uint8_t sf_ahead_dl = ul_subframe2_k_phich(&mac->common_channels[CC_idP], subframeP);
|
||||
|
||||
@@ -1192,6 +1192,8 @@ typedef struct {
|
||||
rnti_t rnti;
|
||||
///remove UE context flag
|
||||
boolean_t removeContextFlg;
|
||||
///remove RA flag
|
||||
boolean_t raFlag;
|
||||
} UE_free_ctrl_t;
|
||||
/*! \brief REMOVE UE list used by eNB to order UEs/CC for deleting*/
|
||||
typedef struct {
|
||||
|
||||
@@ -997,6 +997,7 @@ void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, boolean_t removeFlag) {
|
||||
free_list = &eNB_MAC->UE_free_list;
|
||||
free_list->UE_free_ctrl[free_list->tail_freelist].rnti = rnti;
|
||||
free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = removeFlag;
|
||||
free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 0;
|
||||
free_list->num_UEs++;
|
||||
eNB_MAC->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = rnti;
|
||||
eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs++;
|
||||
@@ -1046,12 +1047,12 @@ void release_UE_in_freeList(module_id_t mod_id) {
|
||||
eNB_PHY = RC.eNB[mod_id][CC_id];
|
||||
int id;
|
||||
// clean ULSCH entries for rnti
|
||||
id = find_ulsch(rnti,eNB_PHY,SEARCH_EXIST);
|
||||
id = find_ulsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
|
||||
|
||||
if (id>=0) clean_eNb_ulsch(eNB_PHY->ulsch[id]);
|
||||
|
||||
// clean DLSCH entries for rnti
|
||||
id = find_dlsch(rnti,eNB_PHY,SEARCH_EXIST);
|
||||
id = find_dlsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
|
||||
|
||||
if (id>=0) clean_eNb_dlsch(eNB_PHY->dlsch[id][0]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user