From d7cddc28253745675a24a0c3519be07c725cee40 Mon Sep 17 00:00:00 2001
From: Louis Adrien Dufrene <swmt1841@yd-CZC6227X3N.orangeai.mey>
Date: Mon, 15 Apr 2019 10:57:39 +0200
Subject: [PATCH] Bug fix of drx_config == PrNothing is now handled. Bug fix
 for dci0_ongoing not working. To investigate

---
 openair2/LAYER2/MAC/config.c                  |   2 +-
 openair2/LAYER2/MAC/eNB_scheduler.c           |  10 +-
 .../LAYER2/MAC/eNB_scheduler_primitives.c     |   6 +-
 openair2/LAYER2/MAC/eNB_scheduler_ulsch.c     |   3 +
 openair2/RRC/LTE/MESSAGES/asn1_msg.c          | 141 +++++++++---------
 5 files changed, 85 insertions(+), 77 deletions(-)

diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index 68777544a0..36fff56f08 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -1044,7 +1044,7 @@ void eNB_Config_Local_DRX(
 
   /* Check drx_Configuration */
   if (drx_Configuration == NULL) {
-    LOG_E(MAC, "drx_Configuration parameter is NULL, cannot configure local UE parameters\n");
+    LOG_I(MAC, "drx_Configuration parameter is NULL, cannot configure local UE parameters\n");
 
     UE_scheduling_control->cdrx_configured = FALSE;
     return;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index f9a6a4b197..55007af708 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -799,11 +799,11 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
         /* END VCD */
 
         /* DCI0 ongoing timer */
-        if (UE_scheduling_control->dci0_ongoing_timer > 1) {
-            UE_scheduling_control->dci0_ongoing_timer++;
-
-            if (UE_scheduling_control->dci0_ongoing_timer > 3) {
-                UE_scheduling_control->dci0_ongoing_timer = 0;
+        if (UE_scheduling_control->dci0_ongoing_timer > 0) {
+            if (UE_scheduling_control->dci0_ongoing_timer > 7) {
+              UE_scheduling_control->dci0_ongoing_timer = 0;
+            } else {
+              UE_scheduling_control->dci0_ongoing_timer++;
             }
         }
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index d245d22486..8d59bf0ca1 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -4953,7 +4953,9 @@ SR_indication(module_id_t mod_idP,
   if (UE_id != -1) {
     UE_scheduling_ctrl = &(UE_list->UE_sched_ctrl[UE_id]);
 
-    if ((UE_scheduling_ctrl->cdrx_configured == TRUE) && (UE_scheduling_ctrl->dci0_ongoing_timer > 0)) {
+    if ((UE_scheduling_ctrl->cdrx_configured == TRUE) && 
+        (UE_scheduling_ctrl->dci0_ongoing_timer > 4)  &&
+        (UE_scheduling_ctrl->dci0_ongoing_timer < 8)) {
       LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d.  \
                   The SR is not set do to ongoing DCI0 with CDRX activated\n",
             mod_idP,
@@ -4961,7 +4963,7 @@ SR_indication(module_id_t mod_idP,
             frameP,
             subframeP,
             UE_id,
-            cc_idP);)
+            cc_idP);
     } else {
       if (mac_eNB_get_rrc_status(mod_idP, UE_RNTI(mod_idP, UE_id)) <  RRC_CONNECTED) {
         LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n",
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 141cba5a6e..b635a8cf99 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -241,6 +241,9 @@ rx_sdu(const module_id_t enb_mod_idP,
          * Note: in case of asynchronous UL HARQ process restart here relevant RTT timer.
          * Start corresponding CDRX ULRetransmission timer.
          */
+
+        unsigned long active_time_condition = 10;
+        VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DRX_ACTIVE_TIME_CONDITION, (unsigned long) active_time_condition);
       }
 
       first_rb = UE_template_ptr->first_rb_ul[harq_pid];
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
index 3ae6fbaea6..ef43b15584 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
@@ -344,6 +344,10 @@ LTE_DRX_Config_t *do_DrxConfig(uint8_t Mod_id,
     } else LOG_W(RRC,"[do_DrxConfig] No featureGroupIndicators pointer\n");
   } else LOG_W(RRC,"[do_DrxConfig] No UEcap pointer\n");
 
+  if (configuration->radioresourceconfig[CC_id].drx_Config_present == LTE_DRX_Config_PR_NOTHING) {
+    return NULL;
+  }
+
   drxConfig = (LTE_DRX_Config_t *) malloc(sizeof(LTE_DRX_Config_t));
   if (drxConfig == NULL) return NULL;
   memset(drxConfig, 0, sizeof(LTE_DRX_Config_t));
@@ -355,78 +359,77 @@ LTE_DRX_Config_t *do_DrxConfig(uint8_t Mod_id,
     drxConfig->present = configuration->radioresourceconfig[CC_id].drx_Config_present;
   }
 
-  if (drxConfig->present != LTE_DRX_Config_PR_NOTHING) {
-    if (drxConfig->present == LTE_DRX_Config_PR_release) {
-      drxConfig->choice.release = (NULL_t) 0;
-    } else {
-      drxConfig->choice.setup.onDurationTimer = configuration->radioresourceconfig[CC_id].drx_onDurationTimer;
-      drxConfig->choice.setup.drx_InactivityTimer = configuration->radioresourceconfig[CC_id].drx_InactivityTimer;
-      drxConfig->choice.setup.drx_RetransmissionTimer = configuration->radioresourceconfig[CC_id].drx_RetransmissionTimer;
-      drxConfig->choice.setup.longDRX_CycleStartOffset.present = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset_present;
-      switch (drxConfig->choice.setup.longDRX_CycleStartOffset.present) {
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf10:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf10 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf20:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf20 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf32:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf32 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf40:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf40 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf64:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf64 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf80:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf80 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf128:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf128 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf160:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf160 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf256:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf256 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf320:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf320 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf512:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf512 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf640:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf640 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1024:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf1024 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1280:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf1280 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2048:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf2048 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2560:
-          drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf2560 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
-          break;
-        default:
-          break;
-      }
+  if (drxConfig->present == LTE_DRX_Config_PR_release) {
+    drxConfig->choice.release = (NULL_t) 0;
+  } else {
+    drxConfig->choice.setup.onDurationTimer = configuration->radioresourceconfig[CC_id].drx_onDurationTimer;
+    drxConfig->choice.setup.drx_InactivityTimer = configuration->radioresourceconfig[CC_id].drx_InactivityTimer;
+    drxConfig->choice.setup.drx_RetransmissionTimer = configuration->radioresourceconfig[CC_id].drx_RetransmissionTimer;
+    drxConfig->choice.setup.longDRX_CycleStartOffset.present = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset_present;
+    switch (drxConfig->choice.setup.longDRX_CycleStartOffset.present) {
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf10:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf10 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf20:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf20 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf32:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf32 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf40:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf40 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf64:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf64 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf80:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf80 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf128:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf128 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf160:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf160 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf256:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf256 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf320:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf320 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf512:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf512 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf640:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf640 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1024:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf1024 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf1280:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf1280 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2048:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf2048 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      case 	LTE_DRX_Config__setup__longDRX_CycleStartOffset_PR_sf2560:
+        drxConfig->choice.setup.longDRX_CycleStartOffset.choice.sf2560 = configuration->radioresourceconfig[CC_id].drx_longDrx_CycleStartOffset;
+        break;
+      default:
+        break;
+    }
 
-      /* Short DRX cycle configuration */
-      if (!ueSupportCdrxShortFlag || configuration->radioresourceconfig[CC_id].drx_shortDrx_ShortCycleTimer == 0) {
-        drxConfig->choice.setup.shortDRX = NULL;
-      } else {
-        drxConfig->choice.setup.shortDRX = MALLOC(sizeof(struct LTE_DRX_Config__setup__shortDRX));
-        memset(drxConfig->choice.setup.shortDRX, 0, sizeof(struct LTE_DRX_Config__setup__shortDRX));
-        drxConfig->choice.setup.shortDRX->shortDRX_Cycle = configuration->radioresourceconfig[CC_id].drx_shortDrx_Cycle;
-        drxConfig->choice.setup.shortDRX->drxShortCycleTimer = configuration->radioresourceconfig[CC_id].drx_shortDrx_ShortCycleTimer;
-      }
+    /* Short DRX cycle configuration */
+    if (!ueSupportCdrxShortFlag || configuration->radioresourceconfig[CC_id].drx_shortDrx_ShortCycleTimer == 0) {
+      drxConfig->choice.setup.shortDRX = NULL;
+    } else {
+      drxConfig->choice.setup.shortDRX = MALLOC(sizeof(struct LTE_DRX_Config__setup__shortDRX));
+      memset(drxConfig->choice.setup.shortDRX, 0, sizeof(struct LTE_DRX_Config__setup__shortDRX));
+      drxConfig->choice.setup.shortDRX->shortDRX_Cycle = configuration->radioresourceconfig[CC_id].drx_shortDrx_Cycle;
+      drxConfig->choice.setup.shortDRX->drxShortCycleTimer = configuration->radioresourceconfig[CC_id].drx_shortDrx_ShortCycleTimer;
     }
   }
+  
   return drxConfig;
 }
 
-- 
GitLab