<[Epic-ID: ODUHIGH-406][Task-ID: ODUHIGH-421]Paging Message: CU_STUB Trigger and...
[o-du/l2.git] / src / du_app / du_cell_mgr.c
index 635cda7..d40755b 100644 (file)
@@ -30,6 +30,7 @@
 #include "du_mgr.h"
 #include "du_utils.h"
 #include "du_cell_mgr.h"
+#include "PCCH-Config.h"
 
 #ifdef O1_ENABLE
 
@@ -226,26 +227,6 @@ uint8_t duHandleCellUpInd(Pst *pst, OduCellId *cellId)
 {
    DuCellCb *cellCb = NULLP; 
 
-#ifndef O1_ENABLE
-
-   /*Note: Static Configuration, when O1 is not configuring the RRM policy*/
-   RrmPolicy *rrmPolicy;
-   DU_ALLOC(rrmPolicy, sizeof(RrmPolicy));
-   rrmPolicy->rsrcType = RSRC_PRB;
-   rrmPolicy->numMemberList = 1;
-   DU_ALLOC(rrmPolicy->memberList, sizeof(PolicyMemberList *));
-   DU_ALLOC(rrmPolicy->memberList[0], sizeof(PolicyMemberList));
-   
-   memset(&rrmPolicy->memberList[0]->plmn, 0, sizeof(Plmn)); 
-   rrmPolicy->memberList[0]->snssai.sst = 1;
-   rrmPolicy->memberList[0]->snssai.sd[0] = 2;
-   rrmPolicy->memberList[0]->snssai.sd[1] = 3;
-   rrmPolicy->memberList[0]->snssai.sd[2] = 4;
-   rrmPolicy->policyMinRatio = 30;
-   rrmPolicy->policyMaxRatio = 90;
-   rrmPolicy->policyDedicatedRatio = 10;
-#endif
-
    if(cellId->cellId <=0 || cellId->cellId > MAX_NUM_CELL)
    {
       DU_LOG("\nERROR  -->  DU APP : Invalid Cell Id %d in duHandleCellUpInd()", cellId->cellId);
@@ -261,14 +242,12 @@ uint8_t duHandleCellUpInd(Pst *pst, OduCellId *cellId)
       cellCb->cellStatus = ACTIVATED;
       gCellStatus = CELL_UP;
 
-#ifdef O1_ENABLE
       if(duCfgParam.tempSliceCfg.rrmPolicy)
          BuildAndSendSliceConfigReq(duCfgParam.tempSliceCfg.rrmPolicy, duCfgParam.tempSliceCfg.totalRrmPolicy, duCfgParam.tempSliceCfg.totalSliceCount);
+#ifdef O1_ENABLE
       DU_LOG("\nINFO   -->  DU APP : Raise cell UP alarm for cell id=%d", cellId->cellId);
       raiseCellAlrm(CELL_UP_ALARM_ID, cellId->cellId);
       setCellOpState(cellId->cellId, ENABLED, ACTIVE);
-#else
-      BuildAndSendSliceConfigReq(&rrmPolicy,1, rrmPolicy->numMemberList);
 #endif
 
    }
@@ -442,6 +421,153 @@ uint8_t duSendCellDeletReq(uint16_t cellId)
    return ROK;
 }
 
+/*******************************************************************
+ * @brief fill paging information of a UE belongs to a particular cell
+ *
+ * @details
+ *
+ *    Function : FillPagingInfoInCellCb
+ *
+ *    Functionality: fill paging information of a UE in DuCellCb
+ *
+ * @params[in] DuCellCb* cellCb, uint8_t ueId, 
+ *             DuPagingMsg  rcvdF1apPagingParam
+ *
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t FillPagingInfoInCellCb(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingParam)
+{
+   uint8_t ns = 0;
+   uint16_t T=0, N=0, pagingFrame = 0, n = 0;
+   uint16_t currentSfn = 0, sfn = 0, newSfn = 0;
+   PcchCfg   duPcchCfg;
+
+   DU_LOG("\nINFO   --> DU APP : Start filling paging parameters in DuCellCb");
+   if(cellCb)
+   {
+      /* calculate paging frame and paging offset */
+      duPcchCfg = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg.pcchCfg;
+      rcvdF1apPagingParam->pagingFrameOffset = duPcchCfg.pageFrameOffset;
+      ns = duPcchCfg.ns;      
+
+      /*
+       * Fill the Value of T (DRX cycle of the UE)
+       * T = min(UE Specific DRX value allocated by upper layers, default DRX
+       * broadcast in System Information) */
+      if((rcvdF1apPagingParam->pagingDrxPres) && (duPcchCfg.dfltPagingCycle > rcvdF1apPagingParam->pagingDrx))
+      {
+         T = rcvdF1apPagingParam->pagingDrx;
+      } 
+      else
+      {
+         T = duPcchCfg.dfltPagingCycle;
+      }
+      rcvdF1apPagingParam->T = T;
+
+       /* N= number of total paging frames in T */
+
+      switch(duPcchCfg.nAndPagingFrmOffsetType)
+      {
+         case PCCH_Config__nAndPagingFrameOffset_PR_oneT:
+            N = T;
+            break;
+         case PCCH_Config__nAndPagingFrameOffset_PR_halfT:
+            N = T/2;
+            break;
+         case PCCH_Config__nAndPagingFrameOffset_PR_quarterT:
+            N = T/4;
+            break;
+         case PCCH_Config__nAndPagingFrameOffset_PR_oneEighthT:
+            N = T/8;
+            break;
+         case PCCH_Config__nAndPagingFrameOffset_PR_oneSixteenthT:
+            N = T/16;
+            break;
+         default:
+            N = T;
+            break;
+      }
+
+       /* calculate the Value of pagingFrame */
+      /*Refer: 38.304 Sec 7.1: (SFN + PF_offset) mod T = (T div N)*(UE_ID mod N)*/
+      //RHS of above formula
+      pagingFrame = (T / N) * ((rcvdF1apPagingParam->ueId) % N);
+
+      //LHS of above formula
+      if(pagingFrame)
+      {
+         pagingFrame = (pagingFrame - rcvdF1apPagingParam->pagingFrameOffset)%T;
+      }
+      else /*Paging Frame = 0 so thus PF will be calculated on Paging Cycle*/
+      {
+         pagingFrame = (T - rcvdF1apPagingParam->pagingFrameOffset)%T;
+      }
+
+      /*Paging Frame(SFN for Paging) has to be determined from current SFN. */
+      /*For eg: If T =128, PF(Calculated above) = 20; SFN can be 20,148,276,...
+       * If currSFN is running as 200 then (newSFN % T) == (T/N)*(UE_ID%N)
+       *Thus SFN at which paging has to be sent needs to be delayed and newSFN = 276*/
+
+      currentSfn = cellCb->currSlotInfo.sfn;
+
+      /*Multiplication Factor(x) to find the next best SFN to process paging*/
+
+      /*Below calculation will determine in which nth cycle of T (DRX cycle),new PF
+       * may fall(Delayed one)*/
+      if(currentSfn > pagingFrame)
+      {
+         n  = ((currentSfn - pagingFrame) / T) + 1;
+      }
+      else
+      {
+         n  = ((pagingFrame - currentSfn) / T) + 1;
+      }
+
+      newSfn = pagingFrame + T * n;
+
+      /*When pagingFrame is future from currSFN then pagingFrame will be used 
+       * else pagingFrame is delayed thus newSFN will be used.*/
+      if(currentSfn <= pagingFrame)
+      {
+         if(pagingFrame > currentSfn + PAGING_SCHED_DELTA)
+         {
+            sfn = pagingFrame;
+         }
+         else
+         {
+            sfn = newSfn;
+         }
+      }
+      else
+      {
+         
+         if(newSfn > currentSfn + PAGING_SCHED_DELTA)
+         {
+            sfn = newSfn;
+         }
+         else /*If newSFN is near to currSFN then delay it more by T*/
+         {
+            newSfn = newSfn + T;
+            sfn = newSfn;
+         }
+      }
+      rcvdF1apPagingParam->pagingFrame =  (sfn % 1024);
+      rcvdF1apPagingParam->i_s = ((uint32_t)(floor(rcvdF1apPagingParam->ueId / N)) % ns);
+
+      DU_LOG("\nINFO  --> DU APP : Successfully filled paging parameter in DuCellCb");
+      memcpy(&cellCb->tmpPagingInfoOfUe, rcvdF1apPagingParam, sizeof(DuPagingMsg));
+   }
+   else
+   {
+      DU_LOG("\nINFO  --> DU APP : FillPagingInfoInCellCb(): Received null pointer");
+      return RFAILED;
+   }
+   return ROK;
+}
+
+
 /**********************************************************************
   End of file
  **********************************************************************/