diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 057f33501ac1c11d24d8bcd12d67457970a689fd..9aa37c988a0cb7aae37b0d6ff39f05e5c8ca8db4 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -112,7 +112,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, for (i=UE_list->head;i>0;i=UE_list->next[i]) { LOG_I(MAC,"UE %d: rnti %x (%p)\n",i,UE_RNTI(module_idP,i),mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))); if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) - mac_remove_ue(module_idP,i); + mac_remove_ue(module_idP,i,frameP); } #if defined(ENABLE_ITTI) do { @@ -206,7 +206,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, next_i = UE_list->next[i]; LOG_D(MAC,"UE %d : rnti %x, stats %p\n",i,UE_RNTI(module_idP,i),mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))); if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) { - mac_remove_ue(module_idP,i); + mac_remove_ue(module_idP,i,frameP); } i=next_i; } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index a8848ca568a277e477f82b6803317827ac5382a1..9a65a7400557513263723d12c07847011dd67a19 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -249,7 +249,7 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) { return(-1); } -int mac_remove_ue(module_id_t mod_idP, int ue_idP) { +int mac_remove_ue(module_id_t mod_idP, int ue_idP, int frameP) { int prev,i, ret=-1; @@ -273,7 +273,7 @@ int mac_remove_ue(module_id_t mod_idP, int ue_idP) { eNB_dlsch_info[mod_idP][pCC_id][ue_idP].rnti = 0; eNB_dlsch_info[mod_idP][pCC_id][ue_idP].status = S_DL_NONE; - rrc_eNB_free_UE_index(mod_idP,ue_idP); + rrc_eNB_free_UE_index(mod_idP,ue_idP,frameP); prev = UE_list->head; for (i=UE_list->head;i>=0;i=UE_list->next[i]) { diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 916c938958bf9b8dc39d4a70bc1eec1abbf749d9..dc0d1ea0b608d7250d9a4057196facb767d9ae0b 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -472,7 +472,7 @@ uint8_t *parse_ulsch_header(uint8_t *mac_header, int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active); int mac_init(void); int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti,int harq_pid); -int mac_remove_ue(module_id_t Mod_id, int UE_id); +int mac_remove_ue(module_id_t Mod_id, int UE_id,int frameP); int maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uint8_t ul_flag); diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 8bf332eeb83aa44ff15185bd843e8f3e48c9c9c7..d32e5b82fc771f6f9cfe46240ebd45ad7924687f 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -263,7 +263,7 @@ uint8_t check_trigger_meas_event(uint8_t module_idP,frame_t frameP, uint8_t eNB_ //void rrc_ue_process_ueCapabilityEnquiry(uint8_t module_idP,uint32_t frame,UECapabilityEnquiry_t *UECapabilityEnquiry,uint8_t eNB_index); //void rrc_ue_process_securityModeCommand(uint8_t module_idP,uint32_t frame,SecurityModeCommand_t *securityModeCommand,uint8_t eNB_index); -void rrc_eNB_free_UE_index (module_id_t enb_mod_idP, module_id_t ue_mod_idP); +void rrc_eNB_free_UE_index (module_id_t enb_mod_idP, module_id_t ue_mod_idP,int frameP); long binary_search_int(int elements[], long numElem, int value); diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 2f41904b7983d2e2cd7774a0c19288d3441fcf7d..b6cdce2f42a089aee3a315afbec5c49a45ea9f81 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -527,17 +527,25 @@ static module_id_t rrc_eNB_get_next_free_UE_index( } void rrc_eNB_free_UE_index( - module_id_t enb_mod_idP, - module_id_t ue_mod_idP) { - AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB inst invalid (%d/%d) for UE %d!", enb_mod_idP, NB_eNB_INST, ue_mod_idP); - AssertFatal(ue_mod_idP < NUMBER_OF_UE_MAX, "UE inst invalid (%d/%d) for eNB %d!", ue_mod_idP, NUMBER_OF_UE_MAX, - enb_mod_idP); + module_id_t enb_mod_idP, + module_id_t ue_mod_idP, + int frameP) { - LOG_W(RRC, "[eNB %d] Removing UE %d rv 0x%" PRIx64 "\n", enb_mod_idP, ue_mod_idP, - eNB_rrc_inst[enb_mod_idP].Info.UE_list[ue_mod_idP]); - eNB_rrc_inst[enb_mod_idP].Info.UE[ue_mod_idP].Status = RRC_IDLE; - eNB_rrc_inst[enb_mod_idP].Info.UE_list[ue_mod_idP] = 0; - free(eNB_rrc_inst[enb_mod_idP].SRB_configList[ue_mod_idP]); + DRB_ToAddModList_t *DRB_configList = eNB_rrc_inst[enb_mod_idP].DRB_configList[ue_mod_idP]; + SRB_ToAddModList_t *SRB_configList = eNB_rrc_inst[enb_mod_idP].SRB_configList[ue_mod_idP]; + + AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB inst invalid (%d/%d) for UE %d!", enb_mod_idP, NB_eNB_INST, ue_mod_idP); + AssertFatal(ue_mod_idP < NUMBER_OF_UE_MAX, "UE inst invalid (%d/%d) for eNB %d!", ue_mod_idP, NUMBER_OF_UE_MAX, + enb_mod_idP); + + LOG_W(RRC, "[eNB %d] Removing UE %d rv 0x%" PRIx64 "\n", enb_mod_idP, ue_mod_idP, + eNB_rrc_inst[enb_mod_idP].Info.UE_list[ue_mod_idP]); + eNB_rrc_inst[enb_mod_idP].Info.UE[ue_mod_idP].Status = RRC_IDLE; + eNB_rrc_inst[enb_mod_idP].Info.UE_list[ue_mod_idP] = 0; + + rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, frameP, ENB_FLAG_YES, SRB_FLAG_YES, MBMS_FLAG_NO, CONFIG_ACTION_REMOVE, + 1); + free(eNB_rrc_inst[enb_mod_idP].SRB_configList[ue_mod_idP]); } /*------------------------------------------------------------------------------*/