From c9b8dfabb1c70da51689b005778ee86ef0cbb323 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Sun, 8 Oct 2017 00:06:07 -0700
Subject: [PATCH] fixes for UE removal (update linked lists) searching of UE
 lists in schedule_SR/SRS/CSI

---
 openair2/LAYER2/MAC/eNB_scheduler.c            | 10 ++++++----
 openair2/LAYER2/MAC/eNB_scheduler_primitives.c |  5 +++++
 openair2/LAYER2/MAC/pre_processor.c            | 18 ++++++++----------
 3 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index a621c7fc55..3d8a2d6fe2 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 98c11b1996..6108845a8b 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 d536c8b337..1c7a283f84 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++;
-- 
GitLab