[Epic-ID: ODUHIGH-406][Task-ID: ODUHIGH-422]F1AP Paging Message Handling at DUAPP 75/8075/6
authorlal.harshita <Harshita.Lal@radisys.com>
Wed, 13 Apr 2022 13:45:03 +0000 (19:15 +0530)
committerbarveankit <anbarve@radisys.com>
Tue, 19 Apr 2022 12:48:11 +0000 (18:18 +0530)
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
Change-Id: Ia1d9adcb0d4eb1a05f55dfd20266e4f6b0b14df9
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
Signed-off-by: barveankit <anbarve@radisys.com>
13 files changed:
src/5gnrrlc/rlc_upr_inf_mgr.c
src/5gnrrlc/rlc_utils.h
src/5gnrsch/sch.h
src/5gnrsch/sch_utils.c
src/cm/common_def.h
src/cm/mac_sch_interface.h
src/du_app/du_cell_mgr.c
src/du_app/du_cell_mgr.h
src/du_app/du_f1ap_conversions.c
src/du_app/du_f1ap_msg_hdl.c
src/du_app/du_mgr.h
src/du_app/du_utils.c
src/du_app/du_utils.h

index 6c4d0f2..9c99b63 100755 (executable)
@@ -832,7 +832,7 @@ KwuDiscSduInfo   *discSdu
  *    -# Snssai Node
  *   
  */
-RlcTptPerSnssai* rlcHandleSnssaiTputlist(RlcCb *gCb, Snssai *snssai, RlcSnssaiActionType action, Direction dir)
+RlcTptPerSnssai* rlcHandleSnssaiTputlist(RlcCb *gCb, Snssai *snssai, ActionTypeLL action, Direction dir)
 {
    CmLListCp *snssaiList = NULLP;
    CmLList  *node = NULLP;
index edc32d8..1fd31ee 100755 (executable)
@@ -1708,13 +1708,6 @@ typedef struct rlcUlCb
 #endif /* LTE_L2_MEAS */
 }RlcUlCb;
 
-typedef enum
-{
-   SEARCH,
-   CREATE,
-   DELETE
-}RlcSnssaiActionType;
-
 typedef struct rlcThptPerUe
 {
    uint16_t ueId;
@@ -1810,7 +1803,7 @@ uint8_t  rlcUeDeleteTmrExpiry(PTR cb);
 
 void rlcSnssaiThptTmrExpiry(PTR cb);
 RlcTptPerSnssai* rlcHandleSnssaiTputlist(RlcCb *gCb, Snssai *snssai,\
-                                  RlcSnssaiActionType action, Direction dir);
+                                ActionTypeLL  action, Direction dir);
 uint8_t rlcCalculateTputPerSnssai(CmLListCp *snssaiList, Direction dir);
 uint8_t rlcDelTputSnssaiList(RlcCb *gCb, Direction dir);
 uint8_t BuildSliceReportToDu(uint8_t snssaiCnt);
index 043ca95..523ee97 100644 (file)
@@ -91,13 +91,6 @@ typedef enum
    WINDOW_EXPIRED
 }RaRspWindowStatus;
 
-typedef enum 
-{
-   SEARCH,
-   CREATE,
-   DELETE
-}ActionTypeLcLL;
-
 /**
  * @brief
  * Structure holding LTE MAC's General Configuration information.
@@ -431,7 +424,7 @@ bool schCalculateUlTbs(SchUeCb *ueCb, SlotTimingInfo puschTime, uint8_t symbLen,
 /*Generic Functions*/
 void updateGrantSizeForBoRpt(CmLListCp *lcLL, DlMsgAlloc *dlMsgAlloc, BsrInfo *bsrInfo, uint32_t *accumalatedBOSize);
 uint16_t searchLargestFreeBlock(SchCellCb *cell, SlotTimingInfo slotTime,uint16_t *startPrb, Direction dir);
-LcInfo* handleLcLList(CmLListCp *lcLL, uint8_t lcId, ActionTypeLcLL action);
+LcInfo* handleLcLList(CmLListCp *lcLL, uint8_t lcId, ActionTypeLL action);
 void prbAllocUsingRRMPolicy(CmLListCp *lcLL, bool dedicatedPRB, uint16_t mcsIdx,uint8_t numSymbols,\
                       uint16_t *sharedPRB, uint16_t *reservedPRB, bool *isTxPayloadLenAdded, bool *srRcvd);
 void updateBsrAndLcList(CmLListCp *lcLL, BsrInfo *bsrInfo, uint8_t status);
index b960586..3c3ff18 100644 (file)
@@ -1340,7 +1340,7 @@ bool fillPrbBitmap(uint64_t *prbBitMap, uint16_t startPrb, uint16_t numPrb)
  *         If NULLP, FATAL FAILURE
  *
  * ***********************************************************************/
-LcInfo* handleLcLList(CmLListCp *lcLL, uint8_t lcId, ActionTypeLcLL action)
+LcInfo* handleLcLList(CmLListCp *lcLL, uint8_t lcId, ActionTypeLL action)
 {
    CmLList  *node = NULLP;
    LcInfo *lcNode = NULLP;
index 563cbad..ab72caa 100644 (file)
 /*Spec 38.331 Sec 6.4: Maximum number of paging occasion per paging frame*/
 #define MAX_PO_PER_PF 4
 
+#ifdef NR_TDD
+#define MAX_SLOTS 20
+#else
+#define MAX_SLOTS 10
+#endif
+
+#define MAX_SFN   1024
+
 /* Defining macros for common utility functions */
 #define ODU_GET_MSG_BUF SGetMsg
 #define ODU_PUT_MSG_BUF SPutMsg
@@ -276,6 +284,13 @@ typedef enum
    DIR_BOTH
 }Direction;
 
+typedef enum 
+{
+   SEARCH,
+   CREATE,
+   DELETE
+}ActionTypeLL;
+
 typedef struct slotTimingInfo
 {
    uint16_t cellId;
index 67d64ed..2aa4c61 100644 (file)
 #define MAX_NUMBER_OF_UCI_IND_BITS 1
 #define MAX_SR_BITS_IN_BYTES       1
 #define MAX_NUM_LOGICAL_CHANNEL_GROUPS 8
-/* can we have a common numslot numscs between mac sch */
-#ifdef NR_TDD
-#define MAX_SLOTS 20
-#else
-#define MAX_SLOTS 10
-#endif
-#define MAX_SFN   1024
 #define MAX_NUM_SR_CFG_PER_CELL_GRP 8   /* Max number of scheduling request config per cell group */
 #define MAX_NUM_TAGS 4                  /* Max number of timing advance groups */
 #define MAX_NUM_BWP  4                  /* Max number of BWP per serving cell */
index d40755b..324b556 100644 (file)
@@ -73,21 +73,27 @@ uint8_t duProcCellsToBeActivated(uint8_t *plmnStr, uint16_t nci, uint16_t nRPci)
       memset(tmpPlmn, 0, 4);
       buildPlmnId(duCb.cfgCellLst[cfgIdx]->cellInfo.nrEcgi.plmn, tmpPlmn);
       if(duCb.cfgCellLst[cfgIdx]->cellInfo.nrEcgi.cellId == nci &&
-           (strcmp((const char*)tmpPlmn, (const char*)plmnStr) == 0))
+            (strcmp((const char*)tmpPlmn, (const char*)plmnStr) == 0))
       {
-        cellCb = duCb.cfgCellLst[cfgIdx];
-        break;
+         cellCb = duCb.cfgCellLst[cfgIdx];
+         break;
       }
       else
       {
-        DU_LOG("\nERROR  -->  DU APP : No Cell found for NCI %d", nci);
-        return RFAILED;
+         DU_LOG("\nERROR  -->  DU APP : No Cell found for NCI %d", nci);
+         return RFAILED;
       }
    }
 
    cellCb->cellStatus = ACTIVATION_IN_PROGRESS; 
    cellCb->cellInfo.nrPci = nRPci;
 
+   if((cmHashListInit(&(cellCb->pagingInfoMap), MAX_SFN, sizeof(DuPagInfoList),\
+                FALSE, CM_HASH_KEYTYPE_CONID, DU_APP_MEM_REGION, DU_POOL)) != ROK)
+   {
+      DU_LOG("ERROR  --> DU APP: Failed to Initialize the Paging Hash Map");
+      return RFAILED;             
+   }
    duCb.actvCellLst[cellCb->cellId -1] = cellCb;
    duCb.numActvCells++;
 
@@ -422,22 +428,358 @@ uint8_t duSendCellDeletReq(uint16_t cellId)
 }
 
 /*******************************************************************
- * @brief fill paging information of a UE belongs to a particular cell
+ * @brief Find the PageInfo List from HashMap 
+ *
+ * @details
+ *
+ *    Function : findPagingInfoFromMap
+ *
+ *    Functionality: Search for the PageInfoList for a PF from HashMap
+ *
+ * @params[in] uint16_t pf, CmHashListCp *pagingInfoMap
+ *
+ * @return DuPagInfoList 
+ *
+ * ****************************************************************/
+DuPagInfoList* findPagingInfoFromMap(uint16_t pf, CmHashListCp *pagingInfoMap)
+{
+   DuPagInfoList *pagInfoLL = NULLP;
+
+   cmHashListFind(pagingInfoMap, (uint8_t *)&(pf), sizeof(uint16_t), 0, (PTR *)&pagInfoLL);
+   if(pagInfoLL == NULLP)
+   {
+      DU_LOG("\nDEBUG  --> DU APP: PF:%d doesnt exist in Map",pf);
+   }
+   return pagInfoLL;
+}
+
+/*******************************************************************
+ * @brief Handle the PageInfo List
  *
  * @details
  *
- *    Function : FillPagingInfoInCellCb
+ *    Function : handlePageInfoLL
+ *
+ *    Functionality: Handling the (SEARCH,CREATE,DELETE) PageInfoList
+ *
+ * @params[in] uint8_t i_s, CmLListCp *pagInfoLL, ActionTypeLL action
+ *
+ * @return DuPagUeList 
  *
- *    Functionality: fill paging information of a UE in DuCellCb
+ * ****************************************************************/
+DuPagUeList* handlePageInfoLL(uint8_t i_s, CmLListCp *pagInfoLL, ActionTypeLL action)
+{
+   CmLList  *node = NULLP;
+   DuPagUeList *pagInfo = NULLP;
+   bool found = FALSE;
+
+   if(pagInfoLL == NULLP)
+   {
+      DU_LOG("\nERROR  -->  DU APP: PagInfo LL is empty");
+      return NULLP;
+   }
+   node = pagInfoLL->first;
+
+   while(node)
+   {
+      pagInfo = (DuPagUeList *)node->node;
+      if(pagInfo->i_s == i_s)
+      {
+         found = TRUE;
+         break;
+      }
+      node = node->next;
+   }
+
+   switch(action)
+   {
+      case SEARCH:
+         {
+            if(!found)
+            {
+               pagInfo = NULLP;
+            }
+            return pagInfo;
+         }
+
+      case CREATE:
+         {
+            if(node != NULLP)
+               return pagInfo;
+
+            /*Need to add a new node for this LC*/
+
+            /*List is empty; Initialize the LL ControlPointer*/
+            if(pagInfoLL->count == 0)
+            {
+               cmLListInit(pagInfoLL);
+            }
+
+            pagInfo = NULLP;
+            /*Allocate the List*/
+            DU_ALLOC(pagInfo, sizeof(DuPagUeList));
+            if(pagInfo)
+            {
+               pagInfo->i_s = i_s;
+            }
+            else
+            {
+               DU_LOG("\nERROR  -->  DU APP : Allocation of List failed,i_s:%d",i_s);
+               return NULLP;
+            }
+
+            if(duAddNodeToLList(pagInfoLL, pagInfo, NULLP) == RFAILED)
+            {
+               DU_LOG("\nERROR  -->  DU APP : failed to Add Node,i_s:%d",i_s);
+               DU_FREE(pagInfo, sizeof(DuPagUeList));
+               return NULLP;
+            }
+            return pagInfo;
+         }
+      case DELETE:
+         {
+            if(!found ||  pagInfo == NULLP)
+            {
+               DU_LOG("\nERROR  -->  DU APP: i_s:%d not found; thus Deletion unsuccessful",i_s);
+            }
+            else
+            {
+               if(duDelNodeFromLList(pagInfoLL, node) == ROK)
+                  DU_FREE(pagInfo, sizeof(DuPagUeList));
+
+               DU_LOG("\nDEBUG  -->  DU APP: i_s:%d Deleted successfully",i_s);
+            }
+            return NULLP;
+         }
+      default:
+         {
+            DU_LOG("\nERROR  -->  DU APP: Incorrect ActionType:%d on PageInfo List",action);
+         }
+   }
+   return NULLP;
+}
+
+/*******************************************************************
+ * @brief Handle the PageUe List
+ *
+ * @details
+ *
+ *    Function : handlePageUeLL
+ *
+ *    Functionality: Handling the (SEARCH,CREATE,DELETE) PageUeList
+ *
+ * @params[in] DuPagingMsg *pagingParam, CmLListCp *pageUeLL, ActionTypeLL
+ * action
+ *
+ * @return DuPagUeRecord 
+ *
+ * ****************************************************************/
+DuPagUeRecord* handlePageUeLL(DuPagingMsg *pagingParam, CmLListCp *pageUeLL, ActionTypeLL action)
+{
+   CmLList  *node = NULLP;
+   DuPagUeRecord *ueRecord = NULLP;
+   bool found = FALSE;
+
+   if(pageUeLL == NULLP)
+   {
+      DU_LOG("\nERROR  -->  DU APP: UE Page Record LL is empty");
+      return NULLP;
+   }
+   node = pageUeLL->first;
+
+   while(node)
+   {
+      ueRecord = (DuPagUeRecord *)node->node;
+      if(ueRecord && (ueRecord->pagUeId == pagingParam->pagUeId && 
+               ueRecord->sTmsi == pagingParam->sTmsi))
+      {
+         found = TRUE;
+         break;
+      }
+      node = node->next;
+   }
+
+   switch(action)
+   {
+      case SEARCH:
+         {
+            if(!found)
+            {
+               ueRecord = NULLP;
+            }
+            return ueRecord;
+         }
+
+      case CREATE:
+         {
+            if(node != NULLP)
+               return ueRecord;
+
+            /*Need to add a new node for this LC*/
+
+            /*List is empty; Initialize the LL ControlPointer*/
+            if(pageUeLL->count == 0)
+            {
+               cmLListInit(pageUeLL);
+            }
+
+            ueRecord = NULLP;
+            /*Allocate the List*/
+            DU_ALLOC(ueRecord, sizeof(DuPagUeRecord));
+            if(ueRecord)
+            {
+               ueRecord->pagUeId = pagingParam->pagUeId;
+               ueRecord->sTmsi = pagingParam->sTmsi;
+               ueRecord->pagPriority = pagingParam->pagPriority;
+            }
+            else
+            {
+               DU_LOG("\nERROR  -->  DU APP : Allocation of UE Record failed,ueId:%d",pagingParam->pagUeId);
+               return NULLP;
+            }
+
+            if(duAddNodeToLList(pageUeLL, ueRecord, NULLP) == RFAILED)
+            {
+               DU_LOG("\nERROR  -->  DU APP : failed to Add Ue Record Node,ueId:%d",pagingParam->pagUeId);
+               DU_FREE(ueRecord, sizeof(DuPagUeRecord));
+               return NULLP;
+            }
+            return ueRecord;
+         }
+      case DELETE:
+         {
+            if(!found ||  ueRecord == NULLP)
+            {
+               DU_LOG("\nERROR  -->  DU APP: UeId:%d not found; thus Deletion unsuccessful",pagingParam->pagUeId);
+            }
+            else
+            {
+               if(duDelNodeFromLList(pageUeLL, node) == ROK)
+                  DU_FREE(ueRecord, sizeof(DuPagUeRecord));
+
+               DU_LOG("\nDEBUG  -->  DU APP: UeId:%d Deleted successfully",pagingParam->pagUeId);
+            }
+            return NULLP;
+         }
+      default:
+         {
+            DU_LOG("\nERROR  -->  DU APP: Incorrect ActionType:%d on UeRecord",action);
+         }
+   }
+   return NULLP;
+}
+
+/*******************************************************************
+ * @brief Keeping the record of Paging having a particular SFN and index associated 
  *
- * @params[in] DuCellCb* cellCb, uint8_t ueId, 
+ * @details
+ *
+ *    Function : insertPagingRecord 
+ *
+ *    Functionality:  Insert record of Paging assoc with particular SFN and index associated 
+ *
+ * @params[in] DuCellCb* cellCb, uint16_t iterations
+ *             DuPagingMsg  rcvdF1apPagingParam
+ *
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t insertPagingRecord(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingParam, uint16_t iterations)
+{
+   uint16_t maxIterations = 0; 
+   DuPagInfoList *pagInfoLLFromPF = NULLP;
+   DuPagUeList  *pageUeLL = NULLP;
+   DuPagUeRecord *ueRecord = NULLP;
+
+   //printPageList(&(cellCb->pagingInfoMap));
+
+   /*MAX Iteration : A UE can be paged at every T frames thus MAX determines
+    *how many Paging Frame(s) can be considered for Paging this UE*/
+   maxIterations = MAX_SFN/rcvdF1apPagingParam->T;
+   if(iterations >= maxIterations)
+   {
+      DU_LOG("\nERROR  --> DU APP: MAX Iterations reached for UEID:%d, thus Paging is dropped!", rcvdF1apPagingParam->pagUeId);
+      return RFAILED;
+   }
+
+   /*[Step1]: Extracting the PF from the HasMap between PF and PagingInfoList*/
+   pagInfoLLFromPF = findPagingInfoFromMap(rcvdF1apPagingParam->pagingFrame, &(cellCb->pagingInfoMap));
+   if(pagInfoLLFromPF != NULLP)
+   {
+      /*[Step2]: Extracting the PageInfo List for the Paging Indices(i_s)*/
+      pageUeLL = handlePageInfoLL(rcvdF1apPagingParam->i_s, &(pagInfoLLFromPF->pagInfoList), CREATE);
+
+      if(pageUeLL != NULLP)
+      {
+         /*[Step3]: Check whether MAX UE Record against this PF and i_s has reached*/
+         if(pageUeLL->pagUeList.count < MAX_PAGING_UE_RECORDS)
+         {
+            /*[Step4]: Insert the Paging Record to the end of the UE record List*/
+            ueRecord = handlePageUeLL(rcvdF1apPagingParam, &(pageUeLL->pagUeList), CREATE);
+
+            if(ueRecord == NULLP)
+            {
+               DU_LOG("\nERROR  --> DU APP: Unable to create UE Record in PagingList");
+               return RFAILED;
+            }
+            DU_LOG("\nDEBUG  --> DU APP: UE Record created successfully in PagingList");
+            return ROK;
+         }
+         else
+         {
+            /*Since MAX Page record has reached for this PF thus calculating and
+             *moving this UE to next Paging Cycle*/
+            DU_LOG("\nINFO   --> DU APP: Max Page Record reached for PagingFrame:%d",rcvdF1apPagingParam->pagingFrame);
+            rcvdF1apPagingParam->pagingFrame = ((rcvdF1apPagingParam->pagingFrame + rcvdF1apPagingParam->T) % MAX_SFN);
+            iterations++;
+
+            return insertPagingRecord(cellCb, rcvdF1apPagingParam, iterations);
+         }
+      }
+   }
+   /*Reaching here means that PF has no entry in the PageLists,
+    *Thus creating, Updating and inseritng the Paging Map, List and UE record.*/
+
+   DU_ALLOC(pagInfoLLFromPF, sizeof(DuPagInfoList));
+
+   if(pagInfoLLFromPF == NULLP)
+   {
+      DU_LOG("\nERROR  --> DU APP: PageInfo Map allocation failed.");
+      return RFAILED;
+   }
+   pagInfoLLFromPF->pf = rcvdF1apPagingParam->pagingFrame;
+   pageUeLL = handlePageInfoLL(rcvdF1apPagingParam->i_s, &(pagInfoLLFromPF->pagInfoList), CREATE);
+   ueRecord = handlePageUeLL(rcvdF1apPagingParam, &(pageUeLL->pagUeList), CREATE);
+   if(cmHashListInsert(&(cellCb->pagingInfoMap), (PTR)pagInfoLLFromPF, (uint8_t *)&(pagInfoLLFromPF->pf), sizeof(uint16_t)) == RFAILED)
+   {
+      DU_LOG("\nERROR  --> DU APP: Hash Map Insertion Failed for PF:%d.",rcvdF1apPagingParam->pagingFrame);
+   }
+
+   //printPageList(&(cellCb->pagingInfoMap));
+   return ROK;
+
+
+}
+
+/*******************************************************************
+ * @brief Calculate and fill paging information of a UE belongs to a particular cell
+ *
+ * @details
+ *
+ *    Function : calcAndFillPagingInfoInCellCb
+ *
+ *    Functionality: Calculate PO and i_s and 
+ *                   fill paging information of a UE in DuCellCb
+ *
+ * @params[in] DuCellCb* cellCb, uint8_t pagUeId, 
  *             DuPagingMsg  rcvdF1apPagingParam
  *
  * @return ROK     - success
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t FillPagingInfoInCellCb(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingParam)
+uint8_t calcAndFillPagingInfoInCellCb(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingParam)
 {
    uint8_t ns = 0;
    uint16_t T=0, N=0, pagingFrame = 0, n = 0;
@@ -493,7 +835,7 @@ uint8_t FillPagingInfoInCellCb(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingPara
        /* 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);
+      pagingFrame = (T / N) * ((rcvdF1apPagingParam->pagUeId) % N);
 
       //LHS of above formula
       if(pagingFrame)
@@ -553,21 +895,61 @@ uint8_t FillPagingInfoInCellCb(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingPara
             sfn = newSfn;
          }
       }
-      rcvdF1apPagingParam->pagingFrame =  (sfn % 1024);
-      rcvdF1apPagingParam->i_s = ((uint32_t)(floor(rcvdF1apPagingParam->ueId / N)) % ns);
+      rcvdF1apPagingParam->pagingFrame =  (sfn % MAX_SFN);
+      rcvdF1apPagingParam->i_s = ((uint32_t)(floor(rcvdF1apPagingParam->pagUeId / 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");
+      DU_LOG("\nINFO  --> DU APP : calcAndFillPagingInfoInCellCb(): Received null pointer");
       return RFAILED;
    }
    return ROK;
 }
 
+/*******************************************************************
+ * @brief Paging Processing on a particular cell 
+ *
+ * @details
+ *
+ *    Function : processPagingMsg
+ *
+ *    Functionality: Process Paging on a particular cell 
+ *
+ * @params[in] uint16_t cellId
+ *             DuPagingMsg  rcvdF1apPagingParam
+ *
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t processPagingMsg(uint16_t cellId, DuPagingMsg *rcvdF1apPagingParam)
+{
+   uint16_t cellIdx = 0, iteration = 0;
+
+   GET_CELL_IDX(cellId, cellIdx);
 
+   if(duCb.actvCellLst[cellIdx] == NULLP || duCb.actvCellLst[cellIdx]->cellId != cellId)
+   {
+      DU_LOG("\nERROR  -->  DU APP : processPagingMsg(): CellId[%d] is not found", cellId);
+      return RFAILED;
+   }
+   
+   if(calcAndFillPagingInfoInCellCb(duCb.actvCellLst[cellIdx], rcvdF1apPagingParam) != ROK)
+   {
+      DU_LOG("\nERROR  --> DU APP : CellCb:%d not present to fill UE Paging Information",cellId);
+      return RFAILED;
+   }
+   if(insertPagingRecord(duCb.actvCellLst[cellIdx], rcvdF1apPagingParam, iteration) != ROK)
+   {
+      DU_LOG("\nERROR  --> DU APP : Insertion Failed ofUE Paging Information");
+      return RFAILED;
+   }
+   return ROK;
+
+}
 /**********************************************************************
   End of file
  **********************************************************************/
index 5cd9c0d..f3ff662 100644 (file)
@@ -26,7 +26,7 @@ void duProcF1SetupRsp();
 uint8_t duGetCellCb(uint16_t cellId, DuCellCb **cellCb);
 uint8_t BuildAndSendSliceConfigReq(RrmPolicy *rrmPolicy[], uint8_t totalRrrmPolicy, uint8_t totalSliceCfgReq);
 uint8_t BuildAndSendSliceReCfgReq(RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t totalSliceReCfg);
-uint8_t FillPagingInfoInCellCb(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingParam);
+uint8_t processPagingMsg(uint16_t cellId, DuPagingMsg *rcvdF1apPagingParam);
 #endif
 /**********************************************************************
   End of file
index 50fff85..0086be2 100644 (file)
@@ -1218,7 +1218,7 @@ e_PagingDRX convertPagingCycleValueToEnum(uint16_t pagingDrxCycle)
  * @params[in] Enum value of PagingDRX
  * @return Actual value of DRX cycle
  *    Note: Returning the MAX value in case of Incorrect Enum Value as DRX
- *    cycle is MIN of Various DRX cycle
+ *    cycle is MIN of Various DRX cycles(Mentioned in Spec38.304)
  *
  * **********************************************************************/
 uint16_t convertPagingCycleEnumToValue(e_PagingDRX pagingDrx)
@@ -1264,7 +1264,7 @@ uint8_t convertNsEnumToValue(e_PCCH_Config__ns Ns)
       case PCCH_Config__ns_one:
             return 1;
       default:
-            return 0;
+            return 1;
    }
 }
 
index 5c907be..a375dbc 100644 (file)
@@ -15419,7 +15419,7 @@ void freeAperDecodePagingMsg(Paging_t   *paging)
 uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg) 
 {
    uint8_t ieIdx = 0, cellListIdx = 0;
-   uint16_t cellId = 0, cellIdx = 0;
+   uint16_t cellId = 0;
    Paging_t   *paging = NULLP;
    PagingCell_list_t  *pagingCelllist = NULLP;
    PagingCell_ItemIEs_t *pagingCellItemIes = NULLP;
@@ -15448,7 +15448,7 @@ uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg)
                   case ProtocolIE_ID_id_UEIdentityIndexValue:
                      {
                         bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10,\
-                                         &tmpPagingParam->ueId);
+                                         &tmpPagingParam->pagUeId);
                         break;
                      }
 
@@ -15504,19 +15504,9 @@ uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg)
                                  pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellListIdx];
                                  pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
                                  bitStringToInt(&pagingCellItem->nRCGI.nRCellIdentity, &cellId);
-                                 GET_CELL_IDX(cellId, cellIdx);
-                                 if(duCb.actvCellLst[cellIdx])
+                                 if(processPagingMsg(cellId, tmpPagingParam) != ROK)
                                  {
-                                    /* fill Ue Paging information*/
-                                    if(FillPagingInfoInCellCb(duCb.actvCellLst[cellIdx], tmpPagingParam)!= ROK)
-                                    {
-                                       DU_LOG("\nERROR  --> DU APP : CellCb:%d not present to fill UE Paging Information",cellIdx);
-                                       continue;
-                                    }
-                                 }
-                                 else
-                                 {
-                                    DU_LOG("\nERROR  --> F1AP : CellId:%d Not in Activelist",cellId);
+                                    DU_LOG("\nERROR  --> DU APP : Paging Processing Failed at CellId:%d",cellId);
                                     continue;
                                  }
                               }
index 8678e10..a46a370 100644 (file)
@@ -57,6 +57,8 @@
 #define DU_SET_ZERO(_buf, _size)   \
    memset((_buf), 0, _size);
 
+#define MAX_PAGING_UE_RECORDS 32
+
 typedef enum
 {
    SLICE_INFO_NOT_AVAILABLE,
@@ -182,7 +184,7 @@ typedef struct pagingMsg
 {
    /*Note: Paging UEID is extracted from 5gSTMSI as per Spec 38.304, Sec 7.1.
     *This is not same as DU-UE_F1AP_ID or CU_UE_F1AP_ID*/
-   uint16_t  ueId;              /* UE Identifier from CU*/
+   uint16_t  pagUeId;              /* UE Identifier from CU*/
 
    /*TODO: When RAN Inititated Paging will be supported then I-RNTI will be
     * added as a choice for UE Identity along with S-TMSI*/
@@ -196,6 +198,25 @@ typedef struct pagingMsg
    uint16_t  T;                 /* T is DRX cycle of the UE */
 }DuPagingMsg;
 
+typedef struct duPagUeRecord
+{
+   uint16_t  pagUeId;              /*UEID calculated from 5gsTMSI as per Spec 38.304*/
+   uint64_t  sTmsi;             /*UE Paging Identity: 5GS-TMSI*/
+   uint8_t   pagPriority;       /* Paging priority */
+}DuPagUeRecord;
+
+typedef struct duPagInfo
+{
+   uint8_t      i_s;          /*Index of PO*/
+   CmLListCp    pagUeList;    /*List of UEs to be paged in this Paging Frame/Paging Occ*/
+}DuPagUeList;
+
+typedef struct duPagInfoMap
+{
+   uint16_t    pf;             /* Paging Frame*/
+   CmLListCp   pagInfoList;    /* Master List of Paging Identified by PF and i_s*/
+}DuPagInfoList;
+
 typedef struct duCellCb
 {
    uint16_t       cellId;                 /* Internal cell Id */
@@ -207,6 +228,7 @@ typedef struct duCellCb
    DuUeCb         ueCb[MAX_NUM_UE];       /* Stores UE context */
    SlotInfo       currSlotInfo;
    DuPagingMsg    tmpPagingInfoOfUe;      /* UE paging information */
+   CmHashListCp   pagingInfoMap;          /*Paging Map between PF and PagingInfoList*/
 }DuCellCb;
 
 typedef struct duLSapCb
index 319ef94..342f31c 100644 (file)
  *******************************************************************************/
 /* Utility definitions to be used in du app */
 #include "common_def.h"
+#include "lrg.h"
+#include "lrg.x"
+#include "lkw.x"
 #include "du_app_mac_inf.h"
 #include "du_utils.h"
+#include "du_app_rlc_inf.h"
+#include "du_cfg.h"
+#include "du_mgr.h"
 
 /* Spec Ref-38.214-Table 5.1.2.1-1 */
 uint8_t slivCfgIdxTable[MAX_SLIV_CONFIG_IDX][3] = {
@@ -181,6 +187,180 @@ void fillStartSymbolAndLen(uint8_t numRsrcAlloc, PdschConfig *pdschCfg, PuschCfg
    }
 }
 
+/*******************************************************************
+ * @brief Function to add a node to a linked list
+ *
+ * @details
+ *
+ *     Function: duAddNodeToLList
+ *
+ *     This function adds a new node to the linked list
+ *
+ *  @param[in]  Pointer to the list
+ *              Pointer to node to be added
+ *              Pointer to current node
+ *  @return     ROK
+ *              RFAILED
+*******************************************************************/
+uint8_t duAddNodeToLList(CmLListCp *llist, void *blockToAdd, CmLList *currNode)
+{
+   CmLList  *newNode = NULLP;
+
+   DU_ALLOC(newNode, sizeof(CmLList));
+   if(newNode)
+   {
+      newNode->node = (PTR)blockToAdd;
+      
+      if(currNode == NULLP)
+         cmLListAdd2Tail(llist, newNode);
+      else
+      {
+         llist->crnt = currNode;
+         cmLListInsAfterCrnt(llist, newNode);
+      }
+      return ROK;
+   } 
+   return RFAILED;
+}
+
+/*******************************************************************
+ * @brief Function to delete a node from linked list
+ *
+ * @details
+ *
+ *     Function: duDelNodeFromLList
+ *
+ *     This function deletes a node from the linked list
+ *
+ *  @param[in]  Pointer to the list
+ *              Pointer to node to be deleted
+ *  @return     Pointer to the deleted node
+*******************************************************************/
+
+uint8_t duDelNodeFromLList(CmLListCp *llist, CmLList *node)
+{
+   node = cmLListDelFrm(llist, node);
+   DU_FREE(node, sizeof(CmLList));
+
+   return ROK;
+}
+
+/*Below function for printing will be used in future so disabling it for now*/
+#if 0 
+/****************************************************************************
+ *
+ * @brief Print the LC in list for debugging purpose 
+ *
+ * @details
+ *
+ *    Function : printLcLL
+ *
+ *    Functionality:
+ *            For debugging purpose, for printing the LC in the order and
+ *            parameters
+ *
+ * @params[in] LcList pointer 
+ *       
+ * @return void 
+ *        
+ *************************************************************************/
+void printPageInfoLL(CmLListCp *pageInfoLL)
+{
+   CmLList *node = NULLP;
+   DuPagUeList *pageInfoNode = NULLP;
+
+   if(pageInfoLL == NULLP)
+   {
+      DU_LOG("\nINFO   -->  DU APP: PageInfo List doesnt exist");
+      return;
+   }
+   node = pageInfoLL->first;
+   while(node)
+   {
+      pageInfoNode = (DuPagUeList *)node->node;
+      if(pageInfoNode)
+      {
+         DU_LOG("\nINFO   -->  DU APP i_s:%d",pageInfoNode->i_s);
+         printPageUeRecordLL(&(pageInfoNode->pagUeList));
+      }
+
+      node = node->next;
+   }
+}
+
+/****************************************************************************
+ *
+ * @brief Print the Ue Record against Paging Frame for debugging purpose 
+ *
+ * @details
+ *
+ *    Function : printLcLL
+ *
+ *    Functionality:
+ *            For debugging purpose, for printing the UE Record in the order and
+ *            parameters
+ *
+ * @params[in] ueList pointer 
+ *       
+ * @return void 
+ *        
+ *************************************************************************/
+void printPageUeRecordLL(CmLListCp *ueList)
+{
+   CmLList *node = NULLP;
+   DuPagUeRecord *ueRecord = NULLP;
+
+   if(ueList == NULLP)
+   {
+      DU_LOG("\nINFO   -->  DU APP: PageUe List doesnt exist");
+      return;
+   }
+   node = ueList->first;
+   while(node)
+   {
+      ueRecord = (DuPagUeRecord *)node->node;
+      if(ueRecord)
+      {
+         DU_LOG("\nINFO   -->  DU APP ueId:%d, sTmsi:%lu, prio:%d",ueRecord->pagUeId, ueRecord->sTmsi, ueRecord->pagPriority);
+      }
+
+      node = node->next;
+   }
+
+}
+
+/*******************************************************************
+ * @brief Print the Page Info List and UE Records
+ *
+ * @details
+ *
+ *    Function : printPageList
+ *
+ *    Functionality: Print the Page Info List and UE Records
+ *
+ * @params[in] CmHashListCp *pagingInfoMap
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void printPageList(CmHashListCp *pagingInfoMap)
+{
+   uint8_t ret = ROK;
+   DuPagInfoList *pagInfoLLFromPF = NULLP, *prevPageInfoLL = NULLP;
+
+   do
+   {
+      ret = cmHashListGetNext(pagingInfoMap, (PTR)prevPageInfoLL, (PTR *)&pagInfoLLFromPF);
+      if(ret == ROK)
+      {
+         DU_LOG("\nDEBUG  --> DUAPP Page List for PF:%d",pagInfoLLFromPF->pf);
+         printPageInfoLL(&(pagInfoLLFromPF->pagInfoList));
+         prevPageInfoLL = pagInfoLLFromPF;
+      }
+   }while(ret == ROK);
+   
+}
+#endif
 /**********************************************************************
 End of file
 **********************************************************************/
index 1a87ed7..d8fe656 100644 (file)
 
 
 void fillStartSymbolAndLen(uint8_t numRsrcAlloc, PdschConfig *pdschCfg, PuschCfg *puschCfg);
+uint8_t duAddNodeToLList(CmLListCp *llist, void *blockToAdd, CmLList *currNode);
+uint8_t duDelNodeFromLList(CmLListCp *llist, CmLList *node);
+
+#if 0
+void printPageInfoLL(CmLListCp *pageInfoLL);
+void printPageUeRecordLL(CmLListCp *pageUeLL);
+void printPageList(CmHashListCp *pagingInfoMap);
+#endif
+
 /**********************************************************************
          End of file
 **********************************************************************/