Merge "[Epic-ID: ODUHIGH-405][Task-ID: ODUHIGH-434] EGTP connection towards multiple...
authorAnkit Barve <anbarve@radisys.com>
Tue, 5 Apr 2022 15:25:38 +0000 (15:25 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Tue, 5 Apr 2022 15:25:38 +0000 (15:25 +0000)
1  2 
src/cu_stub/cu_f1ap_msg_hdl.c
src/cu_stub/cu_stub.c
src/du_app/du_cfg.h

  #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 */
@@@ -11147,7 -11146,7 +11147,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 -11286,7 +11287,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; 
  
               }
@@@ -11481,362 -11480,6 +11481,362 @@@ void procUeContextReleaseComplete(uint3
     }
  }
  
 +/*******************************************************************
 + *
 + * @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.c
@@@ -133,7 -133,7 +133,7 @@@ uint8_t tst(
  
  void readCuCfg()
  {
-    uint8_t  *numDu;
+    uint8_t  numDu;
     uint32_t ipv4_du, ipv4_cu;
  
     DU_LOG("\nDEBUG  -->  CU_STUB : Reading CU configurations");
     cuCb.cuCfgParams.sctpParams.numDu = 1;
  #else
     cuCb.cuCfgParams.sctpParams.numDu = 0;
-    numDu = &cuCb.cuCfgParams.sctpParams.numDu;
-    while(*numDu < MAX_DU_SUPPORTED)
+    cuCb.cuCfgParams.egtpParams.numDu = 0;
+    numDu = 0;
+    while(numDu < MAX_DU_SUPPORTED)
     {
        /* DU IP Address and Port*/
        memset(&ipv4_du, 0, sizeof(uint32_t));
-       cmInetAddr((S8*)DU_IP_V4_ADDR[*numDu], &ipv4_du);
-       cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].duIpAddr.ipV4Addr = ipv4_du;
-       cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].duIpAddr.ipV6Pres = false;
-       cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].duPort = DU_SCTP_PORT[*numDu];
+       cmInetAddr((S8*)DU_IP_V4_ADDR[numDu], &ipv4_du);
+       cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].duIpAddr.ipV4Addr = ipv4_du;
+       cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].duIpAddr.ipV6Pres = false;
+       cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].duPort = DU_SCTP_PORT[numDu];
  
        /* CU IP Address and Port*/
        memset(&ipv4_du, 0, sizeof(uint32_t));
        cmInetAddr((S8*)CU_IP_V4_ADDR, &ipv4_cu);
-       cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].cuIpAddr.ipV4Addr = ipv4_cu;
-       cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].cuIpAddr.ipV6Pres = false;
-       cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].cuPort = CU_SCTP_PORT_TO_DU[*numDu];
-       (*numDu)++;
+       cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].cuIpAddr.ipV4Addr = ipv4_cu;
+       cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].cuIpAddr.ipV6Pres = false;
+       cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].cuPort = CU_SCTP_PORT_TO_DU[numDu];
+       /* EGTP Parameters */
+       memset(&ipv4_du, 0, sizeof(uint32_t));
+       cmInetAddr((S8*)DU_IP_V4_ADDR[numDu], &ipv4_du);
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].localIp.ipV4Pres = TRUE;
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].localIp.ipV4Addr = ipv4_cu;
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].localPort = CU_EGTP_PORT[numDu];
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].destIp.ipV4Pres = TRUE;
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].destIp.ipV4Addr = ipv4_du;
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].destPort = DU_EGTP_PORT[numDu];
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].minTunnelId = MIN_TEID;
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].currTunnelId = cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].minTunnelId;
+       cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].maxTunnelId = MAX_TEID;
+       
+       (numDu)++;
     }
  
+    cuCb.cuCfgParams.egtpParams.numDu = numDu;
+    cuCb.cuCfgParams.sctpParams.numDu = numDu;
  #endif
  
     /*PLMN*/
     cuCb.cuCfgParams.rrcVersion.extRrcVer = EXT_RRC_VER;
  
  
-    /* EGTP Parameters */
-    cuCb.cuCfgParams.egtpParams.localIp.ipV4Pres = TRUE;
-    cuCb.cuCfgParams.egtpParams.localIp.ipV4Addr = ipv4_cu;
-    cuCb.cuCfgParams.egtpParams.localPort = CU_EGTP_PORT;
-    cuCb.cuCfgParams.egtpParams.destIp.ipV4Pres = TRUE;
-    cuCb.cuCfgParams.egtpParams.destIp.ipV4Addr = ipv4_du;
-    cuCb.cuCfgParams.egtpParams.destPort = DU_EGTP_PORT;
-    cuCb.cuCfgParams.egtpParams.minTunnelId = MIN_TEID;
-    cuCb.cuCfgParams.egtpParams.currTunnelId = cuCb.cuCfgParams.egtpParams.minTunnelId;
-    cuCb.cuCfgParams.egtpParams.maxTunnelId = MAX_TEID;
  
  } /* End of readCuCfg */
  
@@@ -276,7 -283,7 +283,7 @@@ void *cuConsoleHandler(void *args
      * NUM_TUNNEL_TO_PUMP_DATA = 9, NUM_DL_PACKETS = 1.
      * totalDataPacket = totalNumOfTestFlow * NUM_TUNNEL_TO_PUMP_DATA * NUM_DL_PACKETS 
      * totalDataPacket = [500*9*1] */
-    int32_t totalNumOfTestFlow = 500
+    int32_t totalNumOfTestFlow = 5; 
  
     while(true) 
     {
        if(ch == 'd')
        {
  
 -      /* Change #if 0 to #if 1 to take input from user */
 +         /* Change #if 0 to #if 1 to take input from user */
  #if 0
           DU_LOG("\n EGTP --> : Enter TEID id(1..10) where DL Data to be sent\n");
           scanf("%d",&teId);
 -         
 +
           if(teId > MAX_TEID || teId < MIN_TEID)
           {
              DU_LOG("\nERROR  -->  EGTP : TEID(%x) OUT Of Range",teId);
  
           initiateInterDuHandover(sourceDuId, targetDuId, ueId);
        }
 +      /* Start Idle mode paging when 'p' is received from console input */
 +      else if(ch == 'p')
 +      {
 +         uint64_t sTmsi = 0;
 +         uint8_t duId = 0;
 +
 +         DU_LOG("\nEnter DU ID on which this UE to be pagged");
 +         scanf("%d", &duId);
 +         DU_LOG("\nEnter 5g-S-TMSI");
 +         scanf("%lu", &sTmsi);
 +
 +         if(BuildAndSendPagingMsg(sTmsi, duId) != ROK)
 +         {
 +            DU_LOG("\nERROR --> EGTP: Failed to build and send paging message for 5gsTmsi[%lu]\n", sTmsi);   
 +         }
 +         continue;
 +      }
     }
  }
  /**********************************************************************
diff --combined src/du_app/du_cfg.h
@@@ -38,7 -38,7 +38,7 @@@
  #endif
  
  #define DU_EGTP_PORT  39001
- #define CU_EGTP_PORT  39002
+ #define CU_EGTP_PORT  39003
  #define NR_PCI 1
  #define NR_CELL_ID 1
  
@@@ -1109,7 -1109,7 +1109,7 @@@ typedef struct bcchCf
  
  typedef struct pcchCfg
  {
 -   uint8_t  dfltPagingCycle;                        /* Default paging cycle */
 +   uint16_t  dfltPagingCycle;                       /* Default paging cycle */
     uint8_t  nAndPagingFrmOffsetType;                /*Number of PagingFrames in PagingCycle defined in terms of T.*/
     uint8_t  pageFrameOffset;                        /* Paging Frame offset */
     uint8_t  ns;                                     /* Number of paging occassions in paging frame */
@@@ -1274,39 -1274,6 +1274,39 @@@ typedef struct f1SetupMs
     char    *f1MsgRspBuf;
  }F1SetupMsg;
  
 +
 +#ifndef O1_ENABLE
 +//RRM POLICY STRUCT
 +
 +typedef struct rRMPolicyMemberList
 +{
 +   uint8_t mcc[3];
 +   uint8_t mnc[3];
 +   uint8_t sd[3];
 +   uint8_t sst;
 +}RRMPolicyMemberList;
 +
 +typedef enum
 +{
 +  PRB,
 +  PRB_UL,
 +  PRB_DL,
 +  RRC,
 +  DRB
 +}RrmResourceType;
 +
 +typedef struct rrmPolicyList
 +{
 +   char id[1];
 +   RrmResourceType resourceType;
 +   uint8_t rRMMemberNum;
 +   RRMPolicyMemberList rRMPolicyMemberList[2];
 +   uint8_t rRMPolicyMaxRatio;
 +   uint8_t rRMPolicyMinRatio;
 +   uint8_t rRMPolicyDedicatedRatio;
 +}RrmPolicyList;
 +#endif
 +
  DuCfgParams duCfgParam;
  
  /*function declarations */
@@@ -1315,7 -1282,10 +1315,7 @@@ uint8_t readClCfg()
  uint8_t readCfg();
  uint8_t duReadCfg(); 
  uint16_t calcSliv(uint8_t startSymbol, uint8_t lengthSymbol);
 -
 -#ifdef O1_ENABLE
  uint8_t cpyRrmPolicyInDuCfgParams(RrmPolicyList rrmPolicy[], uint8_t policyNum, CopyOfRecvdSliceCfg *tempSliceCfg);
 -#endif
  
  #endif /* __DU_CONFIG_H__ */