From 3b4ec2c82b44b2c7ebbbc81171bdad519813833c Mon Sep 17 00:00:00 2001
From: ChiehChun <chiehchun80348@gmail.com>
Date: Thu, 5 Nov 2020 17:47:31 +0100
Subject: [PATCH] Change vrb_map to rballoc_mask

---
 .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c   | 29 ++++++++++++++-----
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 777650d1c79..9f01742fd84 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -348,6 +348,20 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
 
   NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
 
+  /* Calculate num of RBG and RBG size from UE_id=0 */
+  const uint16_t bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+  int rbStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
+  uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
+  uint8_t rballoc_mask[bwpSize];
+  int n_rb_sched = 0;
+  for (int i = 0; i < bwpSize; i++) {
+    // calculate mask: init with "NOT" vrb_map:
+    // if any RB in vrb_map is blocked (1), the current RBG will be 0
+    rballoc_mask[i] = !vrb_map[i];
+    n_rb_sched += rballoc_mask[i];
+  }
+
   /* Retrieve amount of data to send for this UE */
   sched_ctrl->num_total_bytes = 0;
   const int lcid = DL_SCH_LCID_DTCH;
@@ -417,11 +431,8 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
     return;
   }
 
-  uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
   /* get the PID of a HARQ process awaiting retransmission, or -1 otherwise */
   sched_ctrl->dl_harq_pid = sched_ctrl->retrans_dl_harq.head;
-  const uint16_t bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
-  int rbStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
 
   if (sched_ctrl->dl_harq_pid >= 0) { /* retransmission */
     NR_UE_ret_info_t *retInfo = &sched_ctrl->retInfo[sched_ctrl->dl_harq_pid];
@@ -431,7 +442,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
     while (rbSize < retInfo->rbSize) {
       rbStart += rbSize; /* last iteration rbSize was not enough, skip it */
       rbSize = 0;
-      while (rbStart < bwpSize && vrb_map[rbStart]) rbStart++;
+      while (rbStart < bwpSize && !rballoc_mask[rbStart]) rbStart++;
       if (rbStart >= bwpSize) {
         LOG_D(MAC,
               "%4d.%2d cannot allocate retransmission for UE %d/RNTI %04x: no resources\n",
@@ -445,7 +456,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
         break;
       }
       while (rbStart + rbSize < bwpSize
-             && !vrb_map[rbStart + rbSize]
+             && rballoc_mask[rbStart + rbSize]
              && rbSize < retInfo->rbSize)
         rbSize++;
     }
@@ -472,7 +483,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
     sched_ctrl->numDmrsCdmGrpsNoData = 1;
 
     // Freq-demain allocation
-    while (rbStart < bwpSize && vrb_map[rbStart]) rbStart++;
+    while (rbStart < bwpSize && !rballoc_mask[rbStart]) rbStart++;
 
     uint8_t N_PRB_DMRS =
         getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData);
@@ -497,14 +508,16 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
                            0 /* tb_scaling */,
                            1 /* nrOfLayers */)
             >> 3;
-    } while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && TBS < sched_ctrl->num_total_bytes + oh);
+    } while (rbStart + rbSize < bwpSize && rballoc_mask[rbStart + rbSize] && TBS < sched_ctrl->num_total_bytes + oh);
     sched_ctrl->rbSize = rbSize;
     sched_ctrl->rbStart = rbStart;
   }
 
   /* mark the corresponding RBs as used */
-  for (int rb = 0; rb < sched_ctrl->rbSize; rb++)
+  for (int rb = 0; rb < sched_ctrl->rbSize; rb++) {
     vrb_map[rb + sched_ctrl->rbStart] = 1;
+    rballoc_mask[rb + sched_ctrl->rbStart] = 0;
+  }
 }
 
 void nr_schedule_ue_spec(module_id_t module_id,
-- 
GitLab