[JIRA ID- ODUHIGH-462] [ISSUE ID ODUHIGH-477] Adding support for drx configuration...
[o-du/l2.git] / src / du_app / du_ue_mgr.c
index b2c4344..7900c62 100644 (file)
@@ -95,6 +95,13 @@ DuRlcDlUserDataToRlcFunc duSendRlcDlUserDataToRlcOpts[] =
    packRlcDlUserDataToRlc      /* Light weight-loose coupling */
 };
 
+DuMacRachRsrcRel packMacRachRsrcRelOpts[] = 
+{
+   packDuMacRachRsrcRel,      /* Loose coupling */
+   MacProcRachRsrcRel,        /* Tight coupling */
+   packDuMacRachRsrcRel       /* Light weight-loose coupling */
+};
+
 DuMacUeDeleteReq packMacUeDeleteReqOpts[] =
 {
    packDuMacUeDeleteReq,       /* Loose coupling */
@@ -869,7 +876,7 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg)
 {
    uint8_t idx;
    MacCellGrpCfg *cellGrp = NULL;
-
+   
    if(macUeCfg)
       cellGrp = &macUeCfg->macCellGrpCfg;
 
@@ -881,12 +888,12 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg)
       cellGrp->schReqCfg.addModListCount = 1;
       if(cellGrp->schReqCfg.addModListCount <= MAX_NUM_SR_CFG_PER_CELL_GRP)
       {
-        for(idx = 0; idx < cellGrp->schReqCfg.addModListCount; idx++)
-        {
-           cellGrp->schReqCfg.addModList[idx].schedReqId    = SCH_REQ_ID;
-           cellGrp->schReqCfg.addModList[idx].srProhibitTmr = SR_PROHIBIT_MS_32;
-           cellGrp->schReqCfg.addModList[idx].srTransMax    = SR_TRANS_MAX_N_16;
-        }
+         for(idx = 0; idx < cellGrp->schReqCfg.addModListCount; idx++)
+         {
+            cellGrp->schReqCfg.addModList[idx].schedReqId    = SCH_REQ_ID;
+            cellGrp->schReqCfg.addModList[idx].srProhibitTmr = SR_PROHIBIT_MS_32;
+            cellGrp->schReqCfg.addModList[idx].srTransMax    = SR_TRANS_MAX_N_16;
+         }
       }
       cellGrp->schReqCfg.relListCount = 0;
 
@@ -894,11 +901,11 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg)
       cellGrp->tagCfg.addModListCount = 1;
       if(cellGrp->tagCfg.addModListCount <= MAC_NUM_TAGS)
       {
-        for(idx = 0; idx < cellGrp->tagCfg.addModListCount; idx++)
-        {
-           cellGrp->tagCfg.addModList[idx].tagId = TAG_ID;
-           cellGrp->tagCfg.addModList[idx].timeAlignTimer = TIME_ALIGNMENT_TIMER_INFINITY;
-        }
+         for(idx = 0; idx < cellGrp->tagCfg.addModListCount; idx++)
+         {
+            cellGrp->tagCfg.addModList[idx].tagId = TAG_ID;
+            cellGrp->tagCfg.addModList[idx].timeAlignTimer = TIME_ALIGNMENT_TIMER_INFINITY;
+         }
       }
       cellGrp->tagCfg.relListCount = 0;
 
@@ -917,6 +924,31 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg)
       cellGrp->phrCfg.phrType2OtherCell = false;
       cellGrp->phrCfg.phrOtherCG = PHR_MODE_OTHER_CG_REAL;  
 
+      /* Filling Drx Config */
+#ifdef NR_DRX
+      cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs = DRX_ONDURATION_TIMER_VALUE_PRESENT_IN_MS;
+      if(!cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs)
+         cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = \
+                                                                                   DRX_ONDURATION_TIMER_VALUE_IN_SUBMS;
+      else
+         cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds = \
+                                                                                DRX_ONDURATION_TIMER_VALUE_IN_MS;
+      cellGrp->drxCfg.drxInactivityTimer = DRX_INACTIVITY_TIMER;
+      cellGrp->drxCfg.drxHarqRttTimerDl = DRX_HARQ_RTT_TIMER_DL;
+      cellGrp->drxCfg.drxHarqRttTimerUl = DRX_HARQ_RTT_TIMER_UL;
+      cellGrp->drxCfg.drxRetransmissionTimerDl = DRX_RETRANSMISSION_TIMER_DL;
+      cellGrp->drxCfg.drxRetransmissionTimerUl = DRX_RETRANSMISSION_TIMER_UL;
+      cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetVal = DRX_LONG_CYCLE_START_OFFSET_VAL;
+      cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = DRX_LONG_CYCLE_START_OFFSET_CHOICE;
+      cellGrp->drxCfg.shortDrxPres = DRX_SHORT_CYCLE_PRESENT;
+      if(cellGrp->drxCfg.shortDrxPres)
+      {
+         cellGrp->drxCfg.shortDrx.drxShortCycle = DRX_SHORT_CYCLE;
+         cellGrp->drxCfg.shortDrx.drxShortCycleTimer = DRX_SHORT_CYCLE_TIMER;
+      }
+      cellGrp->drxCfg.drxSlotOffset = DRX_SLOT_OFFSET;
+#endif
+
    }
    else
    {
@@ -1249,6 +1281,23 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuU
          fillDefaultModulation(macUeCfg);
       }
 
+#ifdef NR_DRX
+      if(ueCfgDb->drxCyclePres)
+      {
+         macUeCfg->macCellGrpCfg.drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = ueCfgDb->drxCycle.drxLongCycleLength;
+         if(ueCfgDb->drxCycle.shortDrxCyclePres)
+         {
+            macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = true;
+            macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycle = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycle;
+            macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycleTimer;
+         }
+         else
+         {
+            macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = false;
+         }
+      }
+#endif
+
       /* Filling LC Context */
       for(dbIdx = 0; (dbIdx < ueCfgDb->numMacLcs && ret == ROK); dbIdx++)
       {
@@ -1963,6 +2012,9 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
 
    /*Filling Cell Group Cfg*/
    ret =  procUeReCfgCellInfo(macUeCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
+#ifdef NR_DRX
+   memcpy(&macUeCfg->macCellGrpCfg.drxCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg.macCellGrpCfg.drxCfg, sizeof(DrxCfg));
+#endif
    if(ret == ROK)
    {
       if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
@@ -2465,13 +2517,12 @@ uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp)
          {
             DU_LOG("\nINFO   -->  DU APP : MAC UE Create Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
 
-            if(duCb.actvCellLst[cellIdx] && 
-                  (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
+            if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
             {
                duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
 
-               if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) && 
-                     (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
+              if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) && 
+                    (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
                      (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
                {
                   if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
@@ -3085,25 +3136,50 @@ uint8_t duProcUeContextModReq(DuUeCb *ueCb)
 
 /*******************************************************************
 *
-* @brief Function to delete Pdsch ServCellCfg
+* @brief Build and send dedicated RACH resource release request to MAC
 *
 * @details
 *
-*    Function : deletePdschServCellCfg
+*    Function : duBuildAndSendRachRsrcRelToMac
 *
-*    Functionality: Function to delete Pdsch ServCellCfg
+*    Functionality: Function to Build and send dedicated RACH resource 
+*    release request to MAC
 *
-* @params[in] PdschServCellCfg *pdschServCellCfg
-* @return void
+* @params[in] Cell ID
+*             UE CB
+* @return ROK - Success
+*         RFAILED - Failure
 *
 * ****************************************************************/
-
-void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg)
+uint8_t duBuildAndSendRachRsrcRelToMac(uint16_t cellId, DuUeCb *ueCb)
 {
-   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->maxMimoLayers, sizeof(uint8_t));
-   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB));
-   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->codeBlkGrpFlushInd, sizeof(bool));
-   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->xOverhead, sizeof(PdschXOverhead));
+   Pst pst;
+   MacRachRsrcRel *rachRsrcRel = NULLP;
+
+   DU_ALLOC_SHRABL_BUF(rachRsrcRel, sizeof(MacRachRsrcRel));
+   if(!rachRsrcRel)
+   {
+      DU_LOG("\nERROR  -->  DU APP : Failed to allocate memory for RACH Resource Release in \
+            duBuildAndSendRachRsrcRelToMac()");
+      return RFAILED;
+   }
+
+   rachRsrcRel->cellId = cellId;
+   rachRsrcRel->ueId = ueCb->gnbDuUeF1apId;
+   rachRsrcRel->crnti = ueCb->crnti;
+
+   /* Fill Pst */
+   FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REL);
+
+   if(((*packMacRachRsrcRelOpts[pst.selector])(&pst, rachRsrcRel)) != ROK)
+   {
+      DU_LOG("\nERROR  -->  DU_APP : Failure in sending RACH Resource Release to MAC at \
+            duBuildAndSendRachRsrcRelToMac()");
+      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRel, sizeof(MacRachRsrcRel));
+      return RFAILED;
+   }
+
+   return ROK;
 }
 
 /*******************************************************************
@@ -3224,7 +3300,7 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
    
    if(deleteRsp)
    {
-      if(deleteRsp->result == SUCCESS)
+      if(deleteRsp->result == DEL_SUCCESSFUL)
       {
          DU_LOG("\nINFO   -->  DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueId);
          GET_CELL_IDX(deleteRsp->cellId, cellIdx);