#include "du_mgr.h"
#include "du_utils.h"
#include "du_cell_mgr.h"
+#include "PCCH-Config.h"
#ifdef O1_ENABLE
{
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);
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
}
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
**********************************************************************/