Merge "[Epic-ID: ODUHIGH-405][Task-ID: ODUHIGH-435] Memory related Fixes in CU stub...
authorHarshita Lal <harshita.lal@radisys.com>
Thu, 7 Apr 2022 07:52:15 +0000 (07:52 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Thu, 7 Apr 2022 07:52:15 +0000 (07:52 +0000)
1  2 
src/cu_stub/cu_f1ap_msg_hdl.c
src/cu_stub/cu_stub.h
src/du_app/du_f1ap_msg_hdl.c

  #include "MeasConfigRrc.h"
  #include "AS-Config.h"
  #include "RRCReconfiguration-v1530-IEs.h"
 +#include "CNUEPagingIdentity.h"
 +#include "PagingCell-Item.h"
  
  #include "cu_stub_sctp.h"
  #include "cu_stub_egtp.h"
@@@ -2117,6 -2115,7 +2117,6 @@@ uint8_t BuildNrcgi(NRCGI_t *nrcgi, uint
     uint8_t ret;
     uint8_t unused_bits = 4;
     uint8_t byteSize = 5;
 -   uint8_t val = nrCellId << unused_bits;
  
     /* Allocate Buffer Memory */
     nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
     {
        return RFAILED;
     }
 -   fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, val);
 +   fillBitString(&nrcgi->nRCellIdentity, unused_bits, byteSize, nrCellId);
  
     return ROK;
  }
@@@ -2550,7 -2549,7 +2550,7 @@@ uint8_t BuildFlowsMap(DrbInfo *drbInfo
   *         RFAILED - failure
   *
   * ****************************************************************/
 -uint8_t BuildULTnlInfo(TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
 +uint8_t BuildULTnlInfo(uint8_t duId, TnlInfo *ulUpTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, bool hoInProgress)
  {
     uint8_t idx;
     uint8_t ulCnt;
        ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0] = 0;
        ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1] = 0;
        ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[2] = 0;
 -      ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
 +      ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.egtpAssoc[duId-1].currTunnelId++;
  
        ulUpTnlInfo->teId[0] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
        ulUpTnlInfo->teId[1] = ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[1];
   *         RFAILED - failure
   *
   * ****************************************************************/
 -uint8_t BuildDRBSetup(CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
 +uint8_t BuildDRBSetup(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetup_List_t *drbSet)
  {
     uint8_t idx = 0, extIeIdx = 0;
     uint8_t elementCnt = 0, drbCnt = 0;
  
        /*ULUPTNLInformation To Be Setup List*/
        if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
 -         BuildULTnlInforet = BuildULTnlInfo(&ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
 +         BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
                 FALSE);
        else
 -         BuildULTnlInforet = BuildULTnlInfo(&ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
 +         BuildULTnlInforet = BuildULTnlInfo(duId, &ueCb->drbList[idx].ulUpTnlInfo, &drbSetItem->uLUPTNLInformation_ToBeSetup_List,\
                 TRUE);
        if(BuildULTnlInforet != ROK)
        {
@@@ -7403,7 -7402,7 +7403,7 @@@ void freeMeasIdToAddModList(MeasIdToAdd
   * @return void
   *
   * ****************************************************************/
 -uint8_t freeQuantityConfig(QuantityConfig_t *quantityCfg)
 +void freeQuantityConfig(QuantityConfig_t *quantityCfg)
  {
     uint8_t quanCfgIdx;
     QuantityConfigNR_t *quantityCfgNr;
@@@ -9035,7 -9034,7 +9035,7 @@@ uint8_t BuildAndSendUeContextSetupReq(u
        ueSetReq->protocolIEs.list.array[idx]->id       = ProtocolIE_ID_id_DRBs_ToBeSetup_List;
        ueSetReq->protocolIEs.list.array[idx]->criticality      =       Criticality_reject;
        ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
 -      ret1 = BuildDRBSetup(ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
 +      ret1 = BuildDRBSetup(duId, ueCb, &ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
        if(ret1 != ROK)
        {       
           break;
@@@ -9182,7 -9181,7 +9182,7 @@@ uint8_t extractTeId(DLUPTNLInformation_
   *         RFAILED - failure
   *
   * ****************************************************************/
 -uint8_t addDrbTunnels(uint8_t teId)
 +uint8_t addDrbTunnels(uint32_t duId, uint8_t teId)
  {
     uint8_t ret = ROK;
     EgtpTnlEvt tnlEvt;
     tnlEvt.action = EGTP_TNL_MGMT_ADD;
     tnlEvt.lclTeid = teId;
     tnlEvt.remTeid = teId;
 -   ret = cuEgtpTnlMgmtReq(tnlEvt);
 +   ret = cuEgtpTnlMgmtReq(duId, tnlEvt);
     if(ret != ROK)
     {
        DU_LOG("\nERROR  -->  EGTP : Tunnel management request failed for teId %x", teId);
   *         RFAILED - failure
   *
   * ****************************************************************/
 -uint8_t procDrbSetupList(DRBs_Setup_List_t *drbSetupList)
 +uint8_t procDrbSetupList(uint32_t duId, DRBs_Setup_List_t *drbSetupList)
  {
     uint8_t arrIdx = 0;
     uint32_t teId = 0;
              teId  = extractTeId(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
              if(teId > 0)
              {
 -              if(addDrbTunnels(teId)== ROK)
 +              if(addDrbTunnels(duId, teId)== ROK)
                {
                  DU_LOG("\nDEBUG  --> EGTP: Tunnel Added for TeId %d", teId);
                }
@@@ -9286,7 -9285,7 +9286,7 @@@ uint8_t procUeContextSetupResponse(uint
            case ProtocolIE_ID_id_DRBs_Setup_List:
               {
                  /* Adding Tunnels for successful DRB */
 -                procDrbSetupList(&ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
 +                procDrbSetupList(duId, &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
                  break; 
               }
           case ProtocolIE_ID_id_DUtoCURRCInformation:
@@@ -9622,7 -9621,7 +9622,7 @@@ void FreeUlTnlInfoforDrb2(ULUPTNLInform
  *         RFAILED - failure
  *
  * ****************************************************************/
 -uint8_t deleteEgtpTunnel(uint8_t *buf)
 +uint8_t deleteEgtpTunnel(uint32_t duId, uint8_t *buf)
  {
     uint32_t teId = 0;
     EgtpTnlEvt tnlEvt;
     tnlEvt.action = EGTP_TNL_MGMT_DEL;
     tnlEvt.lclTeid = teId;
     tnlEvt.remTeid = teId;
 -   if((cuEgtpTnlMgmtReq(tnlEvt)) != ROK)
 +   if((cuEgtpTnlMgmtReq(duId, tnlEvt)) != ROK)
     {
        DU_LOG("\nERROR  -->  EGTP : Failed to delete tunnel Id %d", teId);
     }
  *         RFAILED - failure
  *
  * ****************************************************************/
 -uint8_t BuildUlTnlInfoforSetupMod(uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
 +uint8_t BuildUlTnlInfoforSetupMod(uint32_t duId, uint8_t ueId, uint8_t drbId, TnlInfo *ulTnlInfo, ULUPTNLInformation_ToBeSetup_List_t *ulInfo, uint8_t actionType)
  {
     uint8_t arrIdx;
     uint8_t ulCnt;
     else
     {
        ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
 -        gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.currTunnelId++;
 +        gTP_TEID.buf[3] = cuCb.cuCfgParams.egtpParams.egtpAssoc[duId-1].currTunnelId++;
     }
  
     ulTnlInfo->teId[0] = ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf[0];
@@@ -9865,7 -9864,7 +9865,7 @@@ void FreeDrbItem(DRBs_ToBeSetupMod_Item
  *
  * ****************************************************************/
  
 -uint8_t FillDrbItemToSetupMod(CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
 +uint8_t FillDrbItemToSetupMod(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeSetupMod_Item_t *drbItem)
  {
     uint8_t ret = ROK;
  
     }
     
     /*ULUPTNLInformation To Be Setup List*/
 -   ret = BuildUlTnlInfoforSetupMod(ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
 +   ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &ueCb->drbList[ueCb->numDrb].ulUpTnlInfo, \
        &drbItem->uLUPTNLInformation_ToBeSetup_List, ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item);
     if(ret != ROK)
     {
  *
  * ****************************************************************/
  
 -uint8_t FillDrbItemList(CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
 +uint8_t FillDrbItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe)
  {
     drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
     drbItemIe->criticality = Criticality_reject;
     drbItemIe->value.present = DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
  
 -   if(FillDrbItemToSetupMod(ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
 +   if(FillDrbItemToSetupMod(duId, ueCb, arrIdx, (&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item))) != ROK)
     {
        DU_LOG("\nERROR  -->  F1AP : FillDrbItemToSetupMod failed"); 
        return RFAILED;
@@@ -10048,7 -10047,7 +10048,7 @@@ void FreeDrbToBeSetupModList(DRBs_ToBeS
  *
  * ****************************************************************/
  
 -uint8_t BuildDrbToBeSetupList(CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
 +uint8_t BuildDrbToBeSetupList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeSetupMod_List_t *drbSet)
  {
     uint8_t ret = ROK;
     uint8_t arrIdx =0;
           return  RFAILED;
        }
  
 -      ret = FillDrbItemList(ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
 +      ret = FillDrbItemList(duId, ueCb, arrIdx, (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx]);
        if(ret != ROK)
        {
           DU_LOG("\nERROR  -->  F1AP : FillDrbItemList failed");
  *
  * ****************************************************************/
  
 -uint8_t FillDrbToBeModItem(CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
 +uint8_t FillDrbToBeModItem(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, DRBs_ToBeModified_Item_t *drbItem)
  {
     uint8_t ret = ROK;
     uint drbIdx=0;
     }/* End of QoS */
  
     /*ULUPTNLInformation To Be Setup List*/
 -   ret = BuildUlTnlInfoforSetupMod(ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
 +   ret = BuildUlTnlInfoforSetupMod(duId, ueCb->gnbCuUeF1apId, drbItem->dRBID, &drbToBeMod->ulUpTnlInfo, &drbItem->uLUPTNLInformation_ToBeSetup_List,\
              ProtocolIE_ID_id_DRBs_ToBeModified_Item);
     if(ret != ROK)
     {
  *
  * ****************************************************************/
  
 -uint8_t FillDrbToBeModItemList(CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
 +uint8_t FillDrbToBeModItemList(uint32_t duId, CuUeCb *ueCb, uint8_t arrIdx, struct DRBs_ToBeModified_ItemIEs *drbItemIe)
  {
     drbItemIe->id = ProtocolIE_ID_id_DRBs_ToBeModified_Item;
     drbItemIe->criticality = Criticality_reject;
     drbItemIe->value.present = DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
 -   if(FillDrbToBeModItem(ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
 +   if(FillDrbToBeModItem(duId, ueCb, arrIdx, &(drbItemIe->value.choice.DRBs_ToBeModified_Item)) != ROK)
     {
        DU_LOG("\nERROR  -->  F1AP : FillDrbToBeModItem failed"); 
        return RFAILED;
  *
  * ****************************************************************/
  
 -uint8_t BuildDrbToBeModifiedList(CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
 +uint8_t BuildDrbToBeModifiedList(uint32_t duId, CuUeCb *ueCb, DRBs_ToBeModified_List_t *drbSet)
  {
     uint8_t ret = ROK;
     uint8_t arrIdx =0;
           return  RFAILED;
        }
  
 -      ret = FillDrbToBeModItemList(ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
 +      ret = FillDrbToBeModItemList(duId, ueCb, arrIdx, (DRBs_ToBeModified_ItemIEs_t *)drbSet->list.array[arrIdx]);
        if(ret != ROK)
        {
           DU_LOG("\nERROR  -->  F1AP : FillDrbToBeModItemList failed");
@@@ -10582,7 -10581,7 +10582,7 @@@ uint8_t BuildAndSendUeContextModificati
           ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
           ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
                                                                             UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
 -         ret = BuildDrbToBeSetupList(ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
 +         ret = BuildDrbToBeSetupList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
                    value.choice.DRBs_ToBeSetupMod_List));
  
           /* DRB to be modified list */
           ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
           ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present =\
                                                                             UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
 -         ret = BuildDrbToBeModifiedList(ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
 +         ret = BuildDrbToBeModifiedList(duId, ueCb, &(ueContextModifyReq->protocolIEs.list.array[ieIdx]->\
                    value.choice.DRBs_ToBeModified_List));
  
           /* TODO: DRB to be release list */
@@@ -11026,13 -11025,14 +11026,14 @@@ uint8_t procGnbDuUpdate(uint32_t duId, 
     {
        SEARCH_DU_DB(duIdx, duId, duDb);
        SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb);
-       for(ueIdx = 0; ueIdx < cellCb->numUe; ueIdx++)
+       if(cellCb->numUe == 0)
        {
-          CU_FREE(cellCb->ueCb[ueIdx]->f1apMsgDb.duToCuContainer.buf, cellCb->ueCb[ueIdx]->f1apMsgDb.duToCuContainer.size);
-          memset(cellCb->ueCb[ueIdx], 0, sizeof(CuUeCb));
+          memset(cellCb, 0, sizeof(CuCellCb));
+          duDb->numCells--;
        }
+       else
+          cellCb->cellStatus = CELL_DELETION_IN_PROGRESS;
     }
     return ROK;
  }
  
@@@ -11147,7 -11147,7 +11148,7 @@@ uint8_t procSrbSetupModList(CuUeCb *ueC
   *         RFAILED - failure
   *
   * ****************************************************************/
 -uint8_t procDrbSetupModList(CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
 +uint8_t procDrbSetupModList(uint32_t duId, CuUeCb *ueCb, DRBs_SetupMod_List_t *drbSetupList)
  {
     uint8_t arrIdx = 0, drbIdx;
     uint32_t teId = 0;
              teId  = extractTeId(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
              if(teId > 0)
              {
 -              if(addDrbTunnels(teId)== ROK)
 +              if(addDrbTunnels(duId, teId)== ROK)
                {
                  DU_LOG("\nDEBUG  --> EGTP: Tunnel Added for TeId %d", teId);
                }
@@@ -11287,7 -11287,7 +11288,7 @@@ uint8_t procUeContextModificationRespon
            case ProtocolIE_ID_id_DRBs_SetupMod_List:
               {
                  /* Adding Tunnels for successful DRB */
 -                procDrbSetupModList(ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
 +                procDrbSetupModList(duId, ueCb, &ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.DRBs_SetupMod_List);
                  break; 
  
               }
@@@ -11396,6 -11396,7 +11397,7 @@@ void procF1SetupReq(uint32_t *destDuId
                                   cellCb = &duDb->cellCb[duDb->numCells];
                                   memset(cellCb, 0, sizeof(CuCellCb));
                                   cellCb->nrCellId = nrCellId;
+                                  cellCb->cellStatus = CELL_ACTIVE;
                                   duDb->numCells++;
                                }
                             }
@@@ -11461,16 -11462,22 +11463,22 @@@ void procUeContextReleaseComplete(uint3
              {
                 gnbDuUeF1apId = ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
                 ueCb = &duDb->ueCb[gnbDuUeF1apId-1];
-                
-                for(ueIdx = 0; ueIdx < ueCb->cellCb->numUe; ueIdx++)
+                for(ueIdx = 0; ueIdx <MAX_NUM_UE; ueIdx++)
                 {
-                   if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
-                         (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
+                   if(ueCb->cellCb && ueCb->cellCb->ueCb[ueIdx])
                    {
-                      ueCb->cellCb->ueCb[ueIdx] = NULLP;
-                      ueCb->cellCb->numUe--;
-                      break;
+                      if((ueCb->cellCb->ueCb[ueIdx]->gnbCuUeF1apId == gnbCuUeF1apId) &&
+                            (ueCb->cellCb->ueCb[ueIdx]->gnbDuUeF1apId == gnbDuUeF1apId))
+                      {
+                         ueCb->cellCb->ueCb[ueIdx] = NULLP;
+                         ueCb->cellCb->numUe--;
+                         if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus = CELL_DELETION_IN_PROGRESS))
+                         {
+                            memset(ueCb->cellCb, 0, sizeof(CuCellCb));
+                            duDb->numCells--;
+                         }
+                         break;
+                      }
                    }
                 }
                 memset(ueCb, 0, sizeof(CuUeCb));
     }
  }
  
 +/*******************************************************************
 + *
 + * @brief Builds the Paging cell list 
 + *
 + * @details
 + *
 + *    Function : BuildPagingCellList
 + *
 + *    Functionality: Build the paging cell list 
 + *
 + * @params[in] PagingCell_list_t  *pagingCelllist,  
 + *
 + * @return ROK     - success
 + *         RFAILED - failure
 + *
 + * ****************************************************************/
 +uint8_t BuildPagingCellList(PagingCell_list_t *pagingCelllist, uint8_t numCells, CuCellCb *cellCb)
 +{
 +   uint8_t cellIdx =0;
 +   PagingCell_ItemIEs_t *pagingCellItemIes; 
 +   PagingCell_Item_t *pagingCellItem;
 +
 +   pagingCelllist->list.count = numCells;
 +   pagingCelllist->list.size = pagingCelllist->list.count * (sizeof(PagingCell_ItemIEs_t*));
 +   CU_ALLOC(pagingCelllist->list.array, pagingCelllist->list.size);
 +   if(pagingCelllist->list.array == NULLP)
 +   {
 +      DU_LOG("\nERROR  -->  F1AP : BuildPagingCellList(): Memory allocation failed ");
 +      return RFAILED;
 +   }
 +
 +   for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
 +   {
 +      CU_ALLOC(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
 +      if(pagingCelllist->list.array[cellIdx] == NULLP)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildPagingCellList(): Memory allocation failed ");
 +         return RFAILED;
 +      }
 +   }
 +   
 +   for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
 +   {
 +      pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
 +      pagingCellItemIes->id =  ProtocolIE_ID_id_PagingCell_Item;
 +      pagingCellItemIes->criticality = Criticality_ignore;
 +      pagingCellItemIes->value.present = PagingCell_ItemIEs__value_PR_PagingCell_Item; 
 +      pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
 +   
 +      /* Fill NrCgi Information */
 +      BuildNrcgi(&pagingCellItem->nRCGI, cellCb[cellIdx].nrCellId);
 +   }
 +   
 +   return ROK;
 +}
 +
 +/*******************************************************************
 + *
 + * @brief Deallocation of memory allocated in paging msg
 + *
 + * @details
 + *
 + *    Function :FreePagingMsg 
 + *
 + *    Functionality: Deallocation of memory allocated in paging msg
 + *
 + * @params[in] F1AP_PDU_t *f1apMsg
 + *
 + * @return void 
 + *
 + * ****************************************************************/
 +void FreePagingMsg(F1AP_PDU_t *f1apMsg)
 +{
 +   uint8_t ieIdx, cellIdx;
 +   Paging_t   *paging;
 +   PagingCell_ItemIEs_t *pagingCellItemIes;
 +   PagingCell_Item_t *pagingCellItem;
 +   PagingCell_list_t  *pagingCelllist;
 +
 +   if(f1apMsg)
 +   {
 +      if(f1apMsg->choice.initiatingMessage)
 +      {
 +         paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
 +         if(paging->protocolIEs.list.array)
 +         {
 +            for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
 +            {
 +               if(paging->protocolIEs.list.array[ieIdx])
 +               {
 +                  switch(paging->protocolIEs.list.array[ieIdx]->id)
 +                  {
 +                     case ProtocolIE_ID_id_UEIdentityIndexValue:
 +                     {
 +                        CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
 +                        paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
 +                        break;
 +                     }
 +                     
 +                     case ProtocolIE_ID_id_PagingIdentity:
 +                     {
 +                        if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
 +                        {
 +                           if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
 +                           {  
 +                              if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == CNUEPagingIdentity_PR_fiveG_S_TMSI)
 +                              {
 +                                 CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
 +                                 paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
 +                              }
 +                                CU_FREE(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity,\
 +                                sizeof(struct CNUEPagingIdentity));
 +                           }
 +                        }
 +                        break;
 +                     }
 +                     
 +                     case ProtocolIE_ID_id_PagingCell_List:
 +                     {
 +                        pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
 +                        if(pagingCelllist->list.array)
 +                        {
 +                           for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
 +                           {
 +                              if(pagingCelllist->list.array[cellIdx])
 +                              {
 +                                  pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
 +                                  if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
 +                                  {
 +                                     pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
 +                                     CU_FREE(pagingCellItem->nRCGI.pLMN_Identity.buf, pagingCellItem->nRCGI.pLMN_Identity.size);
 +                                     CU_FREE(pagingCellItem->nRCGI.nRCellIdentity.buf, pagingCellItem->nRCGI.nRCellIdentity.size);
 +                                  }
 +                                  CU_FREE(pagingCelllist->list.array[cellIdx], sizeof(PagingCell_ItemIEs_t));
 +                              }
 +                           }
 +                           CU_FREE(pagingCelllist->list.array, pagingCelllist->list.size);
 +                        }
 +                        break;
 +                     }
 +                  }
 +                  CU_FREE(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
 +               }
 +            }
 +            CU_FREE(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
 +         }
 +         CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
 +      }
 +      CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
 +   }
 +}
 +/*******************************************************************
 + *
 + * @brief Builds and sends the paging message if UE is in idle mode
 + *
 + * @details
 + *
 + *    Function : BuildAndSendPagingMsg
 + *
 + *    Functionality: Builds and sends the paging message
 + *
 + * @params[in] uint32_t duId, uint8_t gsTmsi
 + *
 + * @return ROK     - success
 + *         RFAILED - failure
 + *
 + * ****************************************************************/
 +uint8_t BuildAndSendPagingMsg(uint64_t gsTmsi, uint8_t duId)
 +{
 +   bool       memAllocFailed = false;
 +   uint8_t    ieIdx = 0, elementCnt = 0, ret = RFAILED;
 +   uint16_t   ueId = 0, duIdx = 0;
 +
 +   /*As per 38.473 Sec 9.3.1.39, UE Identity Index Value (10bits) > 2 Bytes + 6 Unused Bits
 +    *5G-S-TMSI :48 Bits  >> 6 Bytes and 0 UnusedBits */
 +   uint8_t    totalByteInUeId = 2, totalByteInTmsi = 6;
 +   uint8_t    unusedBitsInUeId = 6, unusedBitsInTmsi = 0;
 +
 +   F1AP_PDU_t *f1apMsg = NULLP;
 +   Paging_t   *paging = NULLP;
 +   DuDb       *duDb;
 +   asn_enc_rval_t         encRetVal;
 +
 +   DU_LOG("\nINFO  -->  F1AP : Building PAGING Message command\n");
 +
 +   SEARCH_DU_DB(duIdx, duId, duDb);
 +   if(duDb == NULLP)
 +   {
 +      DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): DuDb is empty");
 +      return ret; 
 +   }
 +
 +   while(true)
 +   {
 +      CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
 +      if(f1apMsg == NULLP)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU");
 +         break;
 +      }
 +
 +      f1apMsg->present =  F1AP_PDU_PR_initiatingMessage;
 +
 +      CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
 +      if(f1apMsg->choice.initiatingMessage == NULLP)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): Memory allocation for F1AP-PDU failed ");
 +         break;
 +      }
 +      f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Paging;
 +      f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
 +      f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Paging;
 +
 +      paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
 +
 +      elementCnt = 5;
 +      paging->protocolIEs.list.count = elementCnt;
 +      paging->protocolIEs.list.size = elementCnt * sizeof(Paging_t*);
 +
 +      /* Initialize the Paging Message members */
 +      CU_ALLOC(paging->protocolIEs.list.array, paging->protocolIEs.list.size);
 +      if(paging->protocolIEs.list.array == NULLP)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg():Memory allocation failed");
 +         break;
 +      }
 +
 +      for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
 +      {
 +         CU_ALLOC(paging->protocolIEs.list.array[ieIdx], sizeof(Paging_t));
 +         if(paging->protocolIEs.list.array[ieIdx] == NULLP)
 +         {
 +            DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
 +            memAllocFailed = true;  
 +            break;
 +         }
 +      }
 +
 +      if(memAllocFailed == true)
 +      {
 +         break;
 +      }
 +
 +      /* UE Identity Index Value */
 +      ieIdx=0;
 +      paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_UEIdentityIndexValue;
 +      paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
 +      paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_UEIdentityIndexValue;
 +      paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.present = UEIdentityIndexValue_PR_indexLength10;
 +      paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size = totalByteInUeId*sizeof(uint8_t);
 +      CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf,\
 +            paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.size);
 +      if(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf == NULLP)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
 +         break;
 +      }
 +
 +      /*As per 3gpp Spec 38.304 Sec 7.1: UE_ID: 5G-S-TMSI mod 1024*/
 +      ueId = gsTmsi % 1024;
 +      fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10, unusedBitsInUeId, totalByteInUeId, ueId);
 +
 +      /* Paging Identity */
 +      ieIdx++;
 +      paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingIdentity;
 +      paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
 +      paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingIdentity;
 +      paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present = \
 +                                                                                   PagingIdentity_PR_cNUEPagingIdentity;
 +      CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity, \
 +            sizeof(struct CNUEPagingIdentity));
 +      if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
 +         break;
 +      }
 +
 +      paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present = \
 +                                                                                                              CNUEPagingIdentity_PR_fiveG_S_TMSI;
 +
 +      paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size = totalByteInTmsi*sizeof(uint8_t);
 +      CU_ALLOC(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf,\
 +            paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.size);
 +      if(!paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): Memory allocation failed ");
 +         break;
 +      }
 +
 +      fillBitString(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI,\
 +            unusedBitsInTmsi, totalByteInTmsi, gsTmsi);
 +
 +      /* Paging Drx */
 +      ieIdx++;
 +      paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingDRX;
 +      paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
 +      paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingDRX;
 +      paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX = PagingDRX_v32;
 +
 +      /* Paging Priority */
 +      ieIdx++;
 +      paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingPriority;
 +      paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
 +      paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingPriority;
 +      paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority = PagingPriority_priolevel2;
 +
 +      /* Paging Cell List */
 +      ieIdx++;
 +      paging->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_PagingCell_List;
 +      paging->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
 +      paging->protocolIEs.list.array[ieIdx]->value.present = PagingIEs__value_PR_PagingCell_list;
 +      if(BuildPagingCellList(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list, duDb->numCells, duDb->cellCb) != ROK)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : BuildAndSendPagingMsg(): Failed to build Paging cell list "); 
 +         break;
 +      }
 +
 +      xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
 +
 +      /* Encode the UE Context Release Command type as APER */
 +      memset(encBuf, 0, ENC_BUF_MAX_LEN);
 +      encBufSize = 0;
 +      encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
 +            encBuf);
 +
 +      /* Encode results */
 +      if(encRetVal.encoded == ENCODE_FAIL)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : Could not encode Release Command structure (at %s)\n",\
 +               encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
 +         break;
 +      }
 +      else
 +      {
 +         DU_LOG("\nDEBUG  -->  F1AP : Created APER encoded buffer for Paging\n");
 +         for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
 +         {
 +            DU_LOG("%x",encBuf[ieIdx]);
 +         }
 +      }
 +
 +      if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL, duId) != ROK)
 +      {
 +         DU_LOG("\nERROR  -->  F1AP : Sending Ue context Release Command failed");
 +         break;
 +      }
 +
 +      ret = ROK;
 +      break;
 +
 +   }
 +
 +   FreePagingMsg(f1apMsg); 
 +   return ret;
 +}
 +
  /*******************************************************************
   *
   * @brief Handles received F1AP message and sends back response  
diff --combined src/cu_stub/cu_stub.h
@@@ -33,8 -33,8 +33,8 @@@
  #define CU_SCTP_PORT_TO_DU (int[]){38472, 38473}
  #endif
  
 -#define DU_EGTP_PORT 39001
 -#define CU_EGTP_PORT 39002
 +#define DU_EGTP_PORT  (int[]){39001, 39002}
 +#define CU_EGTP_PORT (int[]){39003, 39004}
  #define RRC_VER 0
  #define EXT_RRC_VER 5
  #define PLMN_MCC0 3
     }\
  }
  
+ typedef enum
+ {
+    CELL_INACTIVE,
+    CELL_ACTIVE,
+    CELL_DELETION_IN_PROGRESS
+ }CellStatusInfo;
  
  typedef enum
  {
@@@ -116,7 -122,7 +122,7 @@@ typedef struct cuCfgParam
     char             cuName[CU_DU_NAME_LEN_MAX];
     CuSctpParams     sctpParams;
     Plmn             plmn;
 -   EgtpParams       egtpParams;
 +   CuEgtpParams     egtpParams;
     RrcVersion       rrcVersion;
  }CuCfgParams;
  
@@@ -266,6 -272,7 +272,7 @@@ struct cuCellC
     uint32_t nrCellId;
     uint8_t  numUe;
     CuUeCb   *ueCb[MAX_NUM_UE];
+    CellStatusInfo cellStatus;
  };
  
  typedef struct duDb
  #include "du_sys_info_hdl.h"
  #include "du_e2ap_msg_hdl.h"
  #include "du_f1ap_conversions.h"
 +#include "CNUEPagingIdentity.h"
 +#include "PCCH-Config.h"
  
  #ifdef O1_ENABLE
  #include "CmInterface.h"
@@@ -5340,7 -5338,7 +5340,7 @@@ uint8_t BuildBWPUlDedPucchCfg(PucchCfg 
     /* Multi CSI */
     if(multiCsiDb && (multiCsiDb->multiCsiResrcListCount != 0))
     {
 -      pucchCfg->multi_CSI_PUCCH_ResourceList == NULLP;
 +      pucchCfg->multi_CSI_PUCCH_ResourceList = NULLP;
        DU_ALLOC(pucchCfg->multi_CSI_PUCCH_ResourceList, sizeof(struct PUCCH_Config__multi_CSI_PUCCH_ResourceList));
        if(pucchCfg->multi_CSI_PUCCH_ResourceList == NULLP)
        {
@@@ -11920,9 -11918,9 +11920,9 @@@ void freeAperDecodeF1UeContextSetupReq(
  uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
  {
     int8_t ueIdx = -1;
-    uint8_t  ret=0, ieIdx=0, ieExtIdx = 0, cellIdx=0, servCellIdx = 0;
+    uint8_t  ret=0, ieIdx=0, ieExtIdx = 0, servCellIdx = 0;
     bool ueCbFound = false, hoInProgress = false;
-    uint16_t nrCellId = 0;
+    uint16_t nrCellId = 0,  cellIdx=0;
     uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0;
     DuUeCb   *duUeCb = NULL;
     UEContextSetupRequest_t   *ueSetReq = NULL;
@@@ -15310,236 -15308,6 +15310,236 @@@ uint8_t procF1UeContextReleaseCommand(F
     freeAperDecodeUeContextReleaseCommand(f1apMsg);
     return ret;
  }
 +
 +/**************************************************************
 + *
 + * @brief free the memory allocated by aper decoder for paging
 + *
 + * @details
 + *
 + *    Function : freeAperDecodePagingMsg
 + *
 + *    Functionality:
 + *         - free the memory allocated by aper decoder for
 + *         the paging f1ap msg
 + *
 + * @params[in] Paging_t   *paging
 + * @return ROK     - success
 + *         RFAILED - failure
 + *
 + ****************************************************************/
 +void freeAperDecodePagingMsg(Paging_t   *paging)
 +{
 +   uint8_t ieIdx, cellIdx;
 +   PagingCell_ItemIEs_t *pagingCellItemIes;
 +   PagingCell_Item_t *pagingCellItem;
 +   PagingCell_list_t  *pagingCelllist;
 +
 +   if(paging)
 +   {
 +      if(paging->protocolIEs.list.array)
 +      {
 +         for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
 +         {
 +            if(paging->protocolIEs.list.array[ieIdx])
 +            {
 +               switch(paging->protocolIEs.list.array[ieIdx]->id)
 +               {
 +                  case ProtocolIE_ID_id_UEIdentityIndexValue:
 +                     {
 +                        free(paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10.buf);
 +                        break;
 +                     }
 +                  case ProtocolIE_ID_id_PagingIdentity:
 +                     {
 +                        if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present == PagingIdentity_PR_cNUEPagingIdentity)
 +                        {
 +                           if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)
 +                           {
 +                              if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->present == \
 +                                    CNUEPagingIdentity_PR_fiveG_S_TMSI)
 +                              {
 +                                 free(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity->choice.fiveG_S_TMSI.buf);
 +                              }
 +                              free(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity);
 +                           }
 +                        }
 +                        break;
 +                     }
 +                  case ProtocolIE_ID_id_PagingCell_List:
 +                     {
 +                        pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list;
 +                        if(pagingCelllist->list.array)
 +                        {
 +                           for(cellIdx = 0; cellIdx < pagingCelllist->list.count; cellIdx++)
 +                           {
 +                              if(pagingCelllist->list.array[cellIdx])
 +                              {
 +                                 pagingCellItemIes = (PagingCell_ItemIEs_t *)pagingCelllist->list.array[cellIdx];
 +                                 if(pagingCellItemIes->id == ProtocolIE_ID_id_PagingCell_Item)
 +                                 {
 +                                    pagingCellItem = &pagingCellItemIes->value.choice.PagingCell_Item;
 +                                    free(pagingCellItem->nRCGI.pLMN_Identity.buf);
 +                                    free(pagingCellItem->nRCGI.nRCellIdentity.buf);
 +                                 }
 +                                 free(pagingCelllist->list.array[cellIdx]);
 +                              }
 +                           }
 +                           free(pagingCelllist->list.array);
 +                        }
 +                        break;
 +                     }
 +               }
 +               free(paging->protocolIEs.list.array[ieIdx]);
 +            }
 +         }
 +         free(paging->protocolIEs.list.array);
 +
 +      }
 +   }
 +}
 +
 +/**************************************************************
 + *
 + * @brief processing the paging f1ap msg received from CU 
 + *
 + * @details
 + *
 + *    Function : procPagingMsg
 + *
 + *    Functionality:
 + *         - processing the paging f1ap msg received from CU
 + *
 + * @params[in] F1AP_PDU_t *f1apMsg
 + * @return ROK     - success
 + *         RFAILED - failure
 + *
 + *
 + ****************************************************************/
 +uint8_t procPagingMsg(F1AP_PDU_t *f1apMsg) 
 +{
 +   uint8_t ieIdx = 0, cellListIdx = 0;
 +   uint16_t cellId = 0, cellIdx = 0;
 +   Paging_t   *paging = NULLP;
 +   PagingCell_list_t  *pagingCelllist = NULLP;
 +   PagingCell_ItemIEs_t *pagingCellItemIes = NULLP;
 +   PagingCell_Item_t *pagingCellItem = NULLP;
 +   DuPagingMsg *tmpPagingParam = NULLP;
 +
 +   DU_LOG("\nINFO  --> DU APP : Processing the Paging Message");
 +   paging = &f1apMsg->choice.initiatingMessage->value.choice.Paging;
 +   if(paging)
 +   {
 +      if(paging->protocolIEs.list.array)
 +      {
 +         DU_ALLOC(tmpPagingParam, sizeof(DuPagingMsg));
 +         if(tmpPagingParam == NULLP)
 +         {
 +            DU_LOG("\nERROR  --> DU APP : Memory Allocation Failure in procPagingMsg");
 +            freeAperDecodePagingMsg(paging);
 +            return RFAILED;
 +         }
 +         for(ieIdx=0 ; ieIdx<paging->protocolIEs.list.count; ieIdx++)
 +         {
 +            if(paging->protocolIEs.list.array[ieIdx])
 +            {
 +               switch(paging->protocolIEs.list.array[ieIdx]->id)
 +               {
 +                  case ProtocolIE_ID_id_UEIdentityIndexValue:
 +                     {
 +                        bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.UEIdentityIndexValue.choice.indexLength10,\
 +                                         &tmpPagingParam->ueId);
 +                        break;
 +                     }
 +
 +                  case ProtocolIE_ID_id_PagingIdentity:
 +                     {
 +                        switch(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.present)
 +                        {
 +                           case PagingIdentity_PR_cNUEPagingIdentity: 
 +                              {
 +                                 if(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.cNUEPagingIdentity)  
 +                                 {
 +                                    bitStringToInt(&paging->protocolIEs.list.array[ieIdx]->value.choice.PagingIdentity.choice.\
 +                                          cNUEPagingIdentity->choice.fiveG_S_TMSI, &tmpPagingParam->sTmsi);
 +
 +                                 }
 +                                 break;
 +                              }
 +                            case PagingIdentity_PR_rANUEPagingIdentity:
 +                               {
 +                                  /*TODO: This Identifier is specific to RAN Initiated Paging – Connected Mode Paging*/
 +                                  break;
 +                               }
 +                            default:
 +                               {
 +                                  DU_LOG("ERROR  -->  DU APP: Invalid UE Paging Identity, Skipping this Paging Message:");
 +                                  continue;
 +                               }
 +                        }
 +                     }
 +
 +                  case ProtocolIE_ID_id_PagingDRX:
 +                     {
 +                        tmpPagingParam->pagingDrxPres = TRUE;
 +                        tmpPagingParam->pagingDrx = convertPagingCycleEnumToValue(paging->protocolIEs.list.array[ieIdx]->value.choice.PagingDRX);
 +                        break;
 +                     }
 +
 +                  case ProtocolIE_ID_id_PagingPriority:
 +                     {
 +                        tmpPagingParam->pagPriority = paging->protocolIEs.list.array[ieIdx]->value.choice.PagingPriority;
 +                        break;
 +                     }
 +
 +                  case ProtocolIE_ID_id_PagingCell_List:
 +                     {
 +                        pagingCelllist = &paging->protocolIEs.list.array[ieIdx]->value.choice.PagingCell_list; 
 +                        if(pagingCelllist->list.array)
 +                        {
 +                           for(cellListIdx = 0; cellListIdx < pagingCelllist->list.count; cellListIdx++)
 +                           {
 +                              if(pagingCelllist->list.array[cellListIdx])
 +                              {
 +                                 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])
 +                                 {
 +                                    /* 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);
 +                                    continue;
 +                                 }
 +                              }
 +                           }
 +                        }
 +                        break;
 +                     }
 +                   default:
 +                     {
 +                         DU_LOG("\nERROR  --> F1AP : Incorrect Paging IE option");
 +                         break;
 +                     }
 +               }
 +            }
 +         }
 +      }
 +   }
 +   DU_FREE(tmpPagingParam, sizeof(DuPagingMsg));
 +   freeAperDecodePagingMsg(paging);
 +  
 +   return ROK;
 +}
 +
  /**************************************************************
   *
   * @brief Handles received F1AP message and sends back response  
@@@ -15668,11 -15436,6 +15668,11 @@@ void F1APMsgHdlr(Buffer *mBuf
                        procF1UeContextReleaseCommand(f1apMsg);
                        break;
                    }
 +               case InitiatingMessage__value_PR_Paging:
 +                  {
 +                     procPagingMsg(f1apMsg);
 +                     break;
 +                  }
                 default:
                    {
                       DU_LOG("\nERROR  -->  F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",