diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index a621c7fc55efd545096232889880712bc136da7c..3d8a2d6fe2fc49e309b04c0d40d93f50090c41a4 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -108,8 +108,8 @@ void schedule_SRS(module_id_t module_idP,frame_t frameP,sub_frame_t subframeP) if((1<<tmp) & deltaTSFC) { // This is an SRS subframe, loop over UEs - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - + for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { + if (RC.mac[module_idP]->UE_list.active[UE_id]!=TRUE) continue; ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body; @@ -161,7 +161,8 @@ void schedule_CSI(module_id_t module_idP,frame_t frameP,sub_frame_t subframeP) for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { cc = &eNB->common_channels[CC_id]; - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + for (UE_id=0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) continue; ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body; @@ -231,7 +232,8 @@ void schedule_SR(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { RC.mac[module_idP]->UL_req[CC_id].sfn_sf = (frameP << 4) + subframeP; - for (UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) { + for (UE_id = 0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { + if (RC.mac[module_idP]->UE_list.active[UE_id]!=TRUE) continue; ul_req = &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index 98c11b1996cf6dc30fb6602bda93b5404011f86e..6108845a8bf56c08cff0b6dcaf5245d087f22857 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1766,6 +1766,11 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) UE_list->active[UE_id] = FALSE; UE_list->num_UEs--; + if (UE_list->head == UE_id) UE_list->head=UE_list->next[UE_id]; + else UE_list->next[prev(UE_list,UE_id,0)]=UE_list->next[UE_id]; + if (UE_list->head_ul == UE_id) UE_list->head_ul=UE_list->next_ul[UE_id]; + else UE_list->next_ul[prev(UE_list,UE_id,0)]=UE_list->next_ul[UE_id]; + // clear all remaining pending transmissions UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID0] = 0; UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID1] = 0; diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c index d536c8b3378e976f39333f05cc2da89de1d6b269..1c7a283f84ec99dfb93c5843a6ae630ed9b56154 100644 --- a/openair2/LAYER2/MAC/pre_processor.c +++ b/openair2/LAYER2/MAC/pre_processor.c @@ -398,11 +398,11 @@ void sort_UEs (module_id_t Mod_idP, UE_list_t *UE_list = &RC.mac[Mod_idP]->UE_list; for (i = 0; i < NUMBER_OF_UE_MAX; i++) { - rnti = UE_RNTI(Mod_idP, i); - if (rnti == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; + + if (UE_list->active[i]==FALSE) continue; + if ((rnti = UE_RNTI(Mod_idP, i)) == NOT_A_RNTI) continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; + list[list_size] = i; list_size++; } @@ -1453,11 +1453,9 @@ void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP) UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; for (i = 0; i < NUMBER_OF_UE_MAX; i++) { - rnti = UE_RNTI(module_idP, i); - if (rnti == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; + if (UE_list->active[i] == FALSE) continue; + if ((rnti = UE_RNTI(module_idP, i)) == NOT_A_RNTI) continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) continue; list[list_size] = i; list_size++;