From 04ac036d193d4f4807cfaae96ce74dfd1c3e7966 Mon Sep 17 00:00:00 2001 From: "lal.harshita" Date: Wed, 13 Apr 2022 19:15:03 +0530 Subject: [PATCH] [Epic-ID: ODUHIGH-406][Task-ID: ODUHIGH-422]F1AP Paging Message Handling at DUAPP Signed-off-by: lal.harshita Change-Id: Ia1d9adcb0d4eb1a05f55dfd20266e4f6b0b14df9 Signed-off-by: lal.harshita Signed-off-by: barveankit --- src/5gnrrlc/rlc_upr_inf_mgr.c | 2 +- src/5gnrrlc/rlc_utils.h | 9 +- src/5gnrsch/sch.h | 9 +- src/5gnrsch/sch_utils.c | 2 +- src/cm/common_def.h | 15 ++ src/cm/mac_sch_interface.h | 7 - src/du_app/du_cell_mgr.c | 410 +++++++++++++++++++++++++++++++++++++-- src/du_app/du_cell_mgr.h | 2 +- src/du_app/du_f1ap_conversions.c | 4 +- src/du_app/du_f1ap_msg_hdl.c | 18 +- src/du_app/du_mgr.h | 24 ++- src/du_app/du_utils.c | 180 +++++++++++++++++ src/du_app/du_utils.h | 9 + 13 files changed, 634 insertions(+), 57 deletions(-) diff --git a/src/5gnrrlc/rlc_upr_inf_mgr.c b/src/5gnrrlc/rlc_upr_inf_mgr.c index 6c4d0f2fb..9c99b63a3 100755 --- a/src/5gnrrlc/rlc_upr_inf_mgr.c +++ b/src/5gnrrlc/rlc_upr_inf_mgr.c @@ -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; diff --git a/src/5gnrrlc/rlc_utils.h b/src/5gnrrlc/rlc_utils.h index edc32d8fa..1fd31eeb4 100755 --- a/src/5gnrrlc/rlc_utils.h +++ b/src/5gnrrlc/rlc_utils.h @@ -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); diff --git a/src/5gnrsch/sch.h b/src/5gnrsch/sch.h index 043ca9546..523ee9757 100644 --- a/src/5gnrsch/sch.h +++ b/src/5gnrsch/sch.h @@ -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); diff --git a/src/5gnrsch/sch_utils.c b/src/5gnrsch/sch_utils.c index b960586ea..3c3ff18b9 100644 --- a/src/5gnrsch/sch_utils.c +++ b/src/5gnrsch/sch_utils.c @@ -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; diff --git a/src/cm/common_def.h b/src/cm/common_def.h index 563cbad33..ab72caac6 100644 --- a/src/cm/common_def.h +++ b/src/cm/common_def.h @@ -110,6 +110,14 @@ /*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; diff --git a/src/cm/mac_sch_interface.h b/src/cm/mac_sch_interface.h index 67d64edc7..2aa4c61e5 100644 --- a/src/cm/mac_sch_interface.h +++ b/src/cm/mac_sch_interface.h @@ -63,13 +63,6 @@ #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 */ diff --git a/src/du_app/du_cell_mgr.c b/src/du_app/du_cell_mgr.c index d40755b36..324b556b8 100644 --- a/src/du_app/du_cell_mgr.c +++ b/src/du_app/du_cell_mgr.c @@ -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 **********************************************************************/ diff --git a/src/du_app/du_cell_mgr.h b/src/du_app/du_cell_mgr.h index 5cd9c0d6a..f3ff66276 100644 --- a/src/du_app/du_cell_mgr.h +++ b/src/du_app/du_cell_mgr.h @@ -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 diff --git a/src/du_app/du_f1ap_conversions.c b/src/du_app/du_f1ap_conversions.c index 50fff853d..0086be2d3 100644 --- a/src/du_app/du_f1ap_conversions.c +++ b/src/du_app/du_f1ap_conversions.c @@ -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; } } diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index 5c907be92..a375dbc79 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -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; } } diff --git a/src/du_app/du_mgr.h b/src/du_app/du_mgr.h index 8678e1099..a46a3709f 100644 --- a/src/du_app/du_mgr.h +++ b/src/du_app/du_mgr.h @@ -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 diff --git a/src/du_app/du_utils.c b/src/du_app/du_utils.c index 319ef9457..342f31c41 100644 --- a/src/du_app/du_utils.c +++ b/src/du_app/du_utils.c @@ -17,8 +17,14 @@ *******************************************************************************/ /* 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 **********************************************************************/ diff --git a/src/du_app/du_utils.h b/src/du_app/du_utils.h index 1a87ed7ed..d8fe65620 100644 --- a/src/du_app/du_utils.h +++ b/src/du_app/du_utils.h @@ -145,6 +145,15 @@ 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 **********************************************************************/ -- 2.16.6