[Epic-ID: ODUHIGH-406][Task-ID: ODUHIGH-450] PAGING memory fixes
[o-du/l2.git] / src / du_app / du_ue_mgr.c
index fd4052a..842e6a0 100644 (file)
@@ -29,8 +29,8 @@
 #include "du_app_mac_inf.h"
 #include "du_app_rlc_inf.h"
 #include "du_cfg.h"
-#include "du_utils.h"
 #include "du_mgr.h"
+#include "du_utils.h"
 #include "du_f1ap_msg_hdl.h"
 #include "du_ue_mgr.h"
 
@@ -81,11 +81,18 @@ DuMacUeReconfigReq packMacUeReconfigReqOpts[] =
    packDuMacUeReconfigReq      /* Light weight-loose coupling */
 };
 
+DuMacRachRsrcReq packMacRachRsrcReqOpts[] = 
+{
+   packDuMacRachRsrcReq,      /* Loose coupling */
+   MacProcRachRsrcReq,        /* Tight coupling */
+   packDuMacRachRsrcReq       /* Light weight-loose coupling */
+};
+
 DuRlcDlUserDataToRlcFunc duSendRlcDlUserDataToRlcOpts[] =
 {
-   packRlcDlUserDataToRlc,        /* Loose coupling */ 
+   packRlcDlUserDataToRlc,     /* Loose coupling */ 
    RlcProcDlUserDataTransfer,  /* Tight coupling */
-   packRlcDlUserDataToRlc         /* Light weight-loose coupling */
+   packRlcDlUserDataToRlc      /* Light weight-loose coupling */
 };
 
 DuMacUeDeleteReq packMacUeDeleteReqOpts[] =
@@ -450,7 +457,7 @@ uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg)
       {
          if(dlRrcMsg->gnbDuUeF1apId == duCb.ueCcchCtxt[ueIdx].gnbDuUeF1apId)
          {
-           ueCcchCtxtFound = true;
+            ueCcchCtxtFound = true;
             crnti  = duCb.ueCcchCtxt[ueIdx].crnti;
             cellId = duCb.ueCcchCtxt[ueIdx].cellId;
             break;
@@ -514,36 +521,6 @@ uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg)
    return ret;
 }
 
-/******************************************************************
- *
- * @brief Generates GNB DU Ue F1AP ID
- *
- * @details
- *
- *    Function : genGnbDuUeF1apId
- *
- *    Functionality: Generates GNB DU Ue F1AP ID
- *
- * @params[in] void
- * @return gnbDuF1apId
- *
- * ****************************************************************/
-int32_t genGnbDuUeF1apId(uint8_t cellId)
-{
-    uint8_t cellIdx =0;
-
-    GET_CELL_IDX(cellId, cellIdx);
-    if(duCb.actvCellLst[cellIdx])
-    {
-       return  ++duCb.gnbDuUeF1apIdGenerator;
-    }
-    else
-    {
-       DU_LOG("ERROR  --> DU_APP : genGnbDuUeF1apId(): CellId[%d] does not exist", cellId);
-    }
-    return -1;
-}
-
 /******************************************************************
  *
  * @brief Processes UL CCCH Ind recvd from MAC
@@ -565,14 +542,16 @@ uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
    uint8_t ret = ROK;
    int32_t gnbDuUeF1apId = 0;
 
-   gnbDuUeF1apId = genGnbDuUeF1apId(ulCcchIndInfo->cellId);
-   
-   if(gnbDuUeF1apId == -1)
+   if(ulCcchIndInfo->crnti)
    {
-      DU_LOG("ERROR  --> DU_APP : duProcUlCcchInd(): Received cellId[%d] does not exist", ulCcchIndInfo->cellId);
+      GET_UE_ID(ulCcchIndInfo->crnti, gnbDuUeF1apId);
+   }
+   else
+   {
+      DU_LOG("\nERROR  -->  DU_APP : Received invalid CRNTI [%d] ", ulCcchIndInfo->crnti);
       return RFAILED;
    }
-
+   
    /* Store Ue mapping */
    duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = (uint32_t)gnbDuUeF1apId;
    duCb.ueCcchCtxt[duCb.numUe].crnti         = ulCcchIndInfo->crnti;
@@ -1102,25 +1081,28 @@ uint8_t fillAmbr(AmbrCfg **macAmbrCfgToSend, AmbrCfg *ueDbAmbr, AmbrCfg **oldMac
       {
          *macAmbrCfgToSend = ueDbAmbr;
       }
-      else
+      else if(oldMacAmbrCfg)
          *macAmbrCfgToSend = *oldMacAmbrCfg;       
    }
    else
    {
       if(ueDbAmbr)
       {
-         if(*oldMacAmbrCfg)
-         {
-            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldMacAmbrCfg, sizeof(AmbrCfg));
-         }
-         DU_ALLOC_SHRABL_BUF(*oldMacAmbrCfg, sizeof(AmbrCfg));
-         if(*oldMacAmbrCfg == NULLP)
+         if(oldMacAmbrCfg)
          {
-            DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillAmbr()");
-            return RFAILED;
+            if(*oldMacAmbrCfg)
+            {
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldMacAmbrCfg, sizeof(AmbrCfg));
+            }
+            DU_ALLOC_SHRABL_BUF(*oldMacAmbrCfg, sizeof(AmbrCfg));
+            if(*oldMacAmbrCfg == NULLP)
+            {
+               DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillAmbr()");
+               return RFAILED;
+            }
+            memset(*oldMacAmbrCfg, 0, sizeof(AmbrCfg));
+            (*oldMacAmbrCfg)->ulBr = ueDbAmbr->ulBr;
          }
-         memset(*oldMacAmbrCfg, 0, sizeof(AmbrCfg));
-         (*oldMacAmbrCfg)->ulBr = ueDbAmbr->ulBr;
       }
    }
 
@@ -1188,20 +1170,18 @@ uint8_t sendUeReCfgReqToMac(MacUeCfg *macUeCfg)
  * @return ROK/RFAILED
  *
  *****************************************************************/
-uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg)
+uint8_t fillMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg)
 {
-   uint8_t ret, dbIdx, lcIdx, cellIdx;
+   uint8_t ret = ROK, dbIdx = 0, lcIdx = 0, cellIdx = 0;
    bool lcIdFound = false;
    MacUeCfg *duMacDb = NULLP;
 
-   ret =ROK;
+   macUeCfg->cellId = cellId;
+   macUeCfg->ueId = gnbDuUef1apId;
+   macUeCfg->crnti = crnti;
 
    if(!ueCfgDb)
    {
-      macUeCfg->cellId       = cellId;
-      macUeCfg->ueId         = ueId;
-      macUeCfg->crnti        = crnti;
-
       fillDefaultMacCellGrpInfo(macUeCfg);
       fillDefaultPhyCellGrpInfo(macUeCfg);
 
@@ -1218,38 +1198,55 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueId, uint16_t crnti, DuUeCfg *ueC
    }
    else
    {
-      /* Fetching MacDb from DuUeCb */
+      if(ueCfgDb->dataTransmissionAction == STOP_TRANSMISSION)
+      {
+         macUeCfg->transmissionAction = ueCfgDb->dataTransmissionAction; 
+         return ROK;
+      }
+
       GET_CELL_IDX(cellId, cellIdx);
       if(duCb.actvCellLst[cellIdx])
-         duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg;
+         duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].macUeCfg;
       else
       {
          DU_LOG("\nERROR  -->  DU APP : Cell Id [%d] does not exist", cellId);
          return RFAILED;
       }
       duMacDb->macUeCfgState = UE_CFG_INPROGRESS;
-      /* Fetching MaUeCfg List for ADD/MOD/DEL */
-      macUeCfg->cellId       = cellId;
-      macUeCfg->ueId         = ueId;
-      macUeCfg->crnti        = crnti;
-      ret = procUeReCfgCellInfo(macUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
-      if(ret == ROK)
+      
+      if(ueCfgDb->cellGrpCfg)
       {
-         if(macUeCfg->spCellCfgPres == true)
+         ret = procUeReCfgCellInfo(macUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
+         if(ret == ROK)
          {
-            if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
+            if(macUeCfg->spCellCfgPres == true)
             {
-               fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
-                     &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
-            }
-            if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
-            {
-               fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
-                     NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
+               if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
+               {
+                  fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
+                        &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
+               }
+               if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
+               {
+                  fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
+                        NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
+               }
             }
+
+            if(duMacDb)
+               ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE);
+            else
+               ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , NULL, FALSE);
+
+            duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability);
          }
-         ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE);
-         duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability);
+      }
+      else
+      {
+         fillDefaultMacCellGrpInfo(macUeCfg);
+         fillDefaultPhyCellGrpInfo(macUeCfg);
+         fillDefaultSpCellGrpInfo(macUeCfg);
+         fillDefaultModulation(macUeCfg);
       }
 
       /* Filling LC Context */
@@ -1261,22 +1258,27 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueId, uint16_t crnti, DuUeCfg *ueC
             ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres = true;
             fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].ulLcCfg);
          }
-         for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++)
+
+         if(duMacDb)
          {
-            if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId)
+            for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++)
             {
-               lcIdFound = true;
-               if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) ||
-                     (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD))
+               if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId)
                {
-                  ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD;
-                  ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx],\
-                  &duMacDb->lcCfgList[lcIdx], FALSE);
+                  lcIdFound = true;
+                  if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) ||
+                        (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD))
+                  {
+                     ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD;
+                     ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx],\
+                           &duMacDb->lcCfgList[lcIdx], FALSE);
+                  }
                }
+               else
+                  lcIdFound = false;
             }
-            else
-               lcIdFound = false;
          }
+
          if(!lcIdFound)
          {
             /* ADD/DEL CONFIG */
@@ -1614,18 +1616,19 @@ uint8_t fillSnssaiInfo(Snssai *snssaiTobeSend, Snssai *snssaiDb, Snssai **oldSns
  *
  *
  *****************************************************************/
-uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t ueId, DuUeCfg *ueCfgDb, RlcUeCfg *rlcUeCfg)
+uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t duUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *rlcUeCfg)
 {
    uint8_t ret, dbIdx, lcIdx, cellIdx;
    bool lcIdFound = false;
    RlcUeCfg *duRlcDb = NULLP;
 
    ret = ROK;
+   rlcUeCfg->cellId       = cellId;
+   rlcUeCfg->ueId         = duUeF1apId;
+
    if(!ueCfgDb)
    {
       /* Initial RB being Added */ 
-      rlcUeCfg->cellId       = cellId;
-      rlcUeCfg->ueId         = ueId;
       ret = fillRlcSrb1LcCfg(&rlcUeCfg->rlcLcCfg[0]);
       if(ret == ROK)
          rlcUeCfg->numLcs++;
@@ -1636,11 +1639,9 @@ uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t ueId, DuUeCfg *ueCfgDb, RlcUeCfg *
    {
       /* Fetch RlcDb from DuUeCb */ 
       GET_CELL_IDX(cellId, cellIdx);
-      duRlcDb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg;
+      duRlcDb = &duCb.actvCellLst[cellIdx]->ueCb[rlcUeCfg->ueId-1].rlcUeCfg;
       duRlcDb->rlcUeCfgState = UE_CFG_INPROGRESS;
-      /*Filling RlcUeCfg */
-      rlcUeCfg->cellId       = cellId;
-      rlcUeCfg->ueId         = ueId;
+
       for(dbIdx = 0; (dbIdx < ueCfgDb->numRlcLcs && ret == ROK); dbIdx++)
       {
          ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]);
@@ -1650,25 +1651,30 @@ uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t ueId, DuUeCfg *ueCfgDb, RlcUeCfg *
             memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
             return ret;
          }
-         /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */
-         for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++)
-         { 
-            if(ueCfgDb->rlcLcCfg[dbIdx].lcId == duRlcDb->rlcLcCfg[lcIdx].lcId)
-            {
-               lcIdFound = true;
-               if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)||
-                     (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD))
+
+         if(duRlcDb)
+         {
+            /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */
+            for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++)
+            { 
+               if(ueCfgDb->rlcLcCfg[dbIdx].lcId == duRlcDb->rlcLcCfg[lcIdx].lcId)
                {
-                  /* MOD */ 
-                  ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */
-                  memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
-                  fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].snssai, ueCfgDb->rlcLcCfg[dbIdx].snssai,\
-                  &duRlcDb->rlcLcCfg[lcIdx].snssai,false);
+                  lcIdFound = true;
+                  if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)||
+                        (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD))
+                  {
+                     /* MOD */ 
+                     ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */
+                     memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
+                     fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].snssai, ueCfgDb->rlcLcCfg[dbIdx].snssai,\
+                           &duRlcDb->rlcLcCfg[lcIdx].snssai,false);
+                  }
                }
+               else
+                  lcIdFound = false;
             }
-            else
-               lcIdFound = false;
          }
+
          if(!lcIdFound)
          {
             /* ADD/ DEL Config Type */
@@ -1720,14 +1726,14 @@ uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId)
 
          /* Filling Mac Ue Config */ 
          memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg, 0, sizeof(MacUeCfg));
-         ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueId, ueCcchCtxt->crnti,\
+         ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, ueCcchCtxt->crnti, NULL, 
                &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg);
          if(ret == RFAILED)
             DU_LOG("\nERROR  -->  DU APP : Failed to send UE create request to MAC");
 
          /* Filling Rlc Ue Config */
          memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg, 0, sizeof(RlcUeCfg));
-         ret = duBuildAndSendUeCreateReqToRlc(ueCcchCtxt->cellId, ueId, \
+         ret = duBuildAndSendUeCreateReqToRlc(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, NULL,
                &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg);
          if(ret == RFAILED)
             DU_LOG("\nERROR  -->  DU APP : Failed to send UE create request to RLC");
@@ -1753,13 +1759,14 @@ uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId)
  * @Params[in]  cellId,
  *              ueId,
  *              crnti,
- *              UE config
+ *              UE config extracted from F1AP msg
+ *              MAC UE config struct to be filled
  * @return ROK     - success
  *         RFAILED - failure
  *
  * ****************************************************************/
 
-uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueId, uint16_t crnti, MacUeCfg *duMacUeCfg)
+uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg)
 {
    uint8_t  ret = ROK;
    MacUeCfg *macUeCfg = NULLP;
@@ -1767,12 +1774,13 @@ uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueId, uint16_t c
    memset(&pst, 0, sizeof(Pst));
 
 
-   ret = fillMacUeCfg(cellId, ueId, crnti, NULL, duMacUeCfg);
+   ret = fillMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg);
    if(ret == RFAILED)
    {
       DU_LOG("\nERROR  -->  DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()");
       return RFAILED;
    }
+
    /* Fill Pst */
    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_CREATE_REQ);
 
@@ -1788,8 +1796,8 @@ uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueId, uint16_t c
       ret = (*packMacUeCreateReqOpts[pst.selector])(&pst, macUeCfg);
       if(ret == RFAILED)
       {
-        DU_LOG("\nERROR  -->  DU_APP : Failure in sending Ue Create Req to MAC at duBuildAndSendUeCreateReqToMac()");
-        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg));
+         DU_LOG("\nERROR  -->  DU_APP : Failure in sending Ue Create Req to MAC at duBuildAndSendUeCreateReqToMac()");
+         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg));
       }
    }
    else
@@ -1800,6 +1808,130 @@ uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueId, uint16_t c
    return ret;
 }
 
+/*******************************************************************
+ *
+ * @brief Build and send RACH Resource request to MAC
+ *
+ * @details
+ *
+ *    Function : duBuildAndSendRachRsrcReqToMac
+ *    Functionality:
+ *        Build and send RACH Resource request to MAC
+ *
+ * @params[in] Cell Id
+ *             UE Id
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t duBuildAndSendRachRsrcReqToMac(uint16_t cellId, uint16_t ueId)
+{
+   uint16_t cellIdx = 0, ssbIdx = 0;
+   Pst pst;
+   MacRachRsrcReq *rachRsrcReq = NULLP;
+
+   GET_CELL_IDX(cellId, cellIdx);
+   if(duCb.actvCellLst[cellIdx] == NULLP)
+   {
+      DU_LOG("\nERROR  -->  DU APP : Cell Id [%d] not found in duBuildAndSendRachRsrcReqToMac()", cellId);
+      return RFAILED;
+   }
+
+   DU_ALLOC_SHRABL_BUF(rachRsrcReq, sizeof(MacRachRsrcReq));
+   if(!rachRsrcReq)
+   {
+      DU_LOG("\nERROR  -->  DU APP : Failed to allocate memory for RACH Resource Request in \
+            duBuildAndSendRachRsrcReqToMac()");
+      return RFAILED;
+   }
+
+   rachRsrcReq->cellId = cellId;
+   rachRsrcReq->ueId = ueId;
+   rachRsrcReq->numSsb = duCfgParam.macCellCfg.prachCfg.ssbPerRach;
+   for(ssbIdx = 0; ssbIdx < rachRsrcReq->numSsb; ssbIdx++)
+   {
+      rachRsrcReq->ssbIdx[ssbIdx] = ssbIdx;
+   }
+
+   /* Fill Pst */
+   FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REQ);
+   
+   if(((*packMacRachRsrcReqOpts[pst.selector])(&pst, rachRsrcReq)) != ROK)
+   {
+      DU_LOG("\nERROR  -->  DU_APP : Failure in sending RACH Resource Request to MAC at \
+            duBuildAndSendRachRsrcReqToMac()");
+      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcReq, sizeof(MacRachRsrcReq));
+      return RFAILED;
+   }
+
+   return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Process RACH resource response from MAC
+ *
+ * @details
+ *
+ *    Function : DuProcMacRachRsrcRsp
+ *    Functionality:
+ *        Process RACH resource response from MAC
+ *
+ * @params[in] Post structure
+ *             RACH resource response
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t DuProcMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp)
+{
+   uint8_t  ret = RFAILED;
+   uint16_t cellIdx = 0;
+   DuCellCb *cellCb = NULLP;
+   DuUeCb   *ueCb = NULLP;
+
+   DU_LOG("\nINFO  -->  DU APP : Received RACH Resource Response from MAC. Cell ID [%d] UE ID [%d]",
+         rachRsrcRsp->cellId, rachRsrcRsp->ueId);
+
+   if(rachRsrcRsp->result == MAC_DU_APP_RSP_OK)
+   {
+      DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [SUCCESS]");
+
+      /* Fetch Cell Cb */
+      GET_CELL_IDX(rachRsrcRsp->cellId, cellIdx);
+      if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == rachRsrcRsp->cellId))
+      {
+         cellCb = duCb.actvCellLst[cellIdx];
+
+         /* Fetch UE CB */
+         if(cellCb->ueCb[rachRsrcRsp->ueId-1].gnbDuUeF1apId == rachRsrcRsp->ueId)
+         {
+            ueCb = &cellCb->ueCb[rachRsrcRsp->ueId-1];
+
+            /* Store CRNTI alloted to this UE by MAC */
+            ueCb->crnti = rachRsrcRsp->newCrnti;
+
+            /* Store the assigned CF-RA resources */
+            memcpy(&ueCb->cfraResource, &rachRsrcRsp->cfraResource, sizeof(MacCfraResource));
+
+            /* RACH resources allocated to UE is sent to CU in UE Context Setup Response
+             * along with the result of UE Context setup requested by CU */
+            if((ret = BuildAndSendUeCtxtRsp(rachRsrcRsp->cellId, rachRsrcRsp->ueId)) != ROK)
+               DU_LOG("\nERROR  ->  DU APP : Failure in BuildAndSendUeCtxtRsp()");
+         }
+         else
+            DU_LOG("\nERROR  -->  DU APP : UE ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->ueId);
+      }
+      else
+         DU_LOG("\nERROR  -->  DU APP : Cell ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->cellId);
+   }
+   else
+      DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [FAILURE]");
+
+   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRsp, sizeof(MacRachRsrcRsp));
+   return ret;
+}
+
 /*******************************************************************
  *
  * @brief To update DuUeCb Mac Cfg
@@ -2274,40 +2406,33 @@ uint8_t duUpdateDuUeCbCfg(uint8_t ueId, uint8_t cellId)
    DuUeCb *ueCb = NULLP;
 
    GET_CELL_IDX(cellId, cellIdx);
-   
-   if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
-      (duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
-   {
-      ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
+   ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
 
-      /*Filling RLC Ue Cfg */
-      ueCb->rlcUeCfg.cellId = cellId;
-      ueCb->rlcUeCfg.ueId   = ueId;
-      ret = duUpdateRlcLcCfg(&ueCb->rlcUeCfg, ueCb->f1UeDb);
-      if(ret == ROK)
+   /*Filling RLC Ue Cfg */
+   ueCb->rlcUeCfg.cellId = cellId;
+   ueCb->rlcUeCfg.ueId   = ueId;
+   ret = duUpdateRlcLcCfg(&ueCb->rlcUeCfg, ueCb->f1UeDb);
+   if(ret == ROK)
+   {
+      /*Filling MAC Ue Cfg */
+      GET_CRNTI(crnti, ueId);
+      ueCb->macUeCfg.cellId = cellId;
+      ueCb->macUeCfg.ueId  = ueId;
+      ueCb->macUeCfg.crnti  = crnti;
+      ret = duUpdateMacCfg(&ueCb->macUeCfg, ueCb->f1UeDb);
+      if(ret == RFAILED)
+         DU_LOG("\nERROR  -->  DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()");
+      else
       {
-         /*Filling MAC Ue Cfg */
-         GET_CRNTI(crnti, ueId);
-         ueCb->macUeCfg.cellId = cellId;
-         ueCb->macUeCfg.ueId  = ueId;
-         ueCb->macUeCfg.crnti  = crnti;
-         ret = duUpdateMacCfg(&ueCb->macUeCfg, ueCb->f1UeDb);
-         if(ret == RFAILED)
-            DU_LOG("\nERROR  -->  DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()");
-         else
-        {
-           if(duUpdateTunnelCfgDb(ueId, cellId, &ueCb->f1UeDb->duUeCfg) != ROK)
-           {
-               DU_LOG("\nERROR  -->  DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()");
-                   return RFAILED;
-           }
-        }
+         if(duUpdateTunnelCfgDb(ueId, cellId, &ueCb->f1UeDb->duUeCfg) != ROK)
+         {
+            DU_LOG("\nERROR  -->  DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()");
+            return RFAILED;
+         }
       }
-      else
-         DU_LOG("\nERROR  -->  DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()");
    }
    else
-      ret = RFAILED;
+      DU_LOG("\nERROR  -->  DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()");
    return ret;
 }
 
@@ -2329,30 +2454,77 @@ uint8_t duUpdateDuUeCbCfg(uint8_t ueId, uint8_t cellId)
 uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp)
 {
    uint8_t ret = ROK;
+   uint16_t cellIdx;
 
    if(cfgRsp)
    {
+      GET_CELL_IDX(cfgRsp->cellId, cellIdx);
       if(cfgRsp->result == MAC_DU_APP_RSP_OK)
       {
          if(pst->event == EVENT_MAC_UE_CREATE_RSP)
          {
-            DU_LOG("\nINFO   -->  DU APP : MAC UE Create Response : SUCCESS [UE IDX : %d]", cfgRsp->ueId);
-            duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].\
-               macUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
+            DU_LOG("\nINFO   -->  DU APP : MAC UE Create Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
+
+            if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
+            {
+               duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
+
+              if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) && 
+                    (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
+                     (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
+               {
+                  if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+                  {
+                     /* If UE is in handover, RACH resource needs to be requested
+                      * from MAC for CFRA */
+                     if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+                     {
+                        DU_LOG("\nERROR  --> DU APP : Failed to send RACH Resource Request to MAC");
+                        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+                        return RFAILED;
+                     }
+                  }
+                  else
+                  {
+                     DU_LOG("\nERROR  ->  DU APP : Failure in updating DU UE CB");
+                     DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+                     return RFAILED;
+                  }
+               }
+            }
          }
          else if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
          {
-            DU_LOG("\nINFO   -->  DU APP : MAC UE Reconfig Response : SUCCESS [UE IDX : %d]", cfgRsp->ueId);
-            duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
-            if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+            DU_LOG("\nINFO   -->  DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
+            if(duCb.actvCellLst[cellIdx] && 
+                  (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
             {
-               BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId);
+               duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
+               if((duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
+                     (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
+               {
+                  if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+                  {  
+                     if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+                     {
+                        DU_LOG("\nERROR  ->  DU APP : Failure in BuildAndSendUeCtxtRsp()");
+                        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+                        return RFAILED;
+                     }
+                  }
+                  else
+                  {
+                     DU_LOG("\nERROR  ->  DU APP : Failure in updating DU UE CB");
+                     DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+                     return RFAILED;
+                  }
+               }
             }
          }
       }
       else
       {
-         DU_LOG("\nERROR  -->  DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [UE IDX : %d]", pst->event, cfgRsp->ueId);
+         DU_LOG("\nERROR  -->  DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId);
          if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
          {
             //TODO: Send the failure case in Ue Context Setup Response
@@ -2389,13 +2561,13 @@ uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp)
  * 
  *****************************************************************/
 
-uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t ueId, RlcUeCfg *duRlcUeCfg)
+uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t gnbDuUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *duRlcUeCfg)
 {
    uint8_t  ret = ROK;
    RlcUeCfg *rlcUeCfg = NULLP;
    Pst       pst;
   
-   ret = fillRlcUeCfg(cellId, ueId, NULL, duRlcUeCfg);
+   ret = fillRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
    if(ret == RFAILED)
    {
       DU_LOG("\nERROR  -->  DU APP : Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()");
@@ -2456,18 +2628,56 @@ uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp)
          if(pst->event == EVENT_RLC_UE_CREATE_RSP)
          {
             DU_LOG("\nINFO   -->  DU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
-            duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].\
-               rlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE;
+            duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE;
+
+            if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
+                  (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
+                  (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
+            {
+               if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+               {
+                  /* If UE is in handover, RACH resource needs to be requested
+                   * from MAC for CFRA */
+                  if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+                  {
+                     DU_LOG("\nERROR  --> DU APP : Failed to send RACH Resource Request to MAC");
+                     DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+                     DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+                     return RFAILED;
+                  }
+               }
+               else
+               {
+                  DU_LOG("\nERROR  -->  DU APP : Failure in updating DU UE CB");
+                  DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+                  return RFAILED;
+               }
+            }
          }
          else if(pst->event == EVENT_RLC_UE_RECONFIG_RSP)
          {
             DU_LOG("\nINFO   -->  DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
-            duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].\
-               rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
-            if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+
+            duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
+            if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
+                  (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
             {
-               BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId);
-            }   
+               if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+               {
+                  if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+                  {
+                     DU_LOG("\nERROR  -->  DU APP : Failure in BuildAndSendUeCtxtRsp");
+                     DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+                     return RFAILED;
+                  }
+               }
+               else
+               {
+                  DU_LOG("\nERROR  -->  DU APP : Failure in updating DU UE CB");
+                  DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+                  return RFAILED;
+               }
+            }
          }
       }
       else
@@ -2508,17 +2718,16 @@ uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp)
  *
  * ****************************************************************/
 
-uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t crnti, DuUeCfg *ueCfgDb)
+uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t gnbDuUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
 {
-   uint8_t ret = ROK, ueId = 0;
+   uint8_t ret = ROK;
    RlcUeCfg *rlcUeCfg = NULLP;
 
-   GET_UE_ID(crnti, ueId);
    DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCfg));
    if(rlcUeCfg)
    {
       memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
-      ret = fillRlcUeCfg(cellId, ueId, ueCfgDb, rlcUeCfg);
+      ret = fillRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, rlcUeCfg);
       if(ret == RFAILED)
          DU_LOG("\nERROR  -->  DU APP : Failed at duBuildAndSendUeReCfgReqToRlc()");
       else
@@ -2550,19 +2759,16 @@ uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t crnti, DuUeCfg *ue
  *
  * ****************************************************************/
 
-uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t crnti, DuUeCfg *ueCfgDb)
+uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t duUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
 {
-   uint8_t ret, ueId = 0;
+   uint8_t ret = ROK;
    MacUeCfg *macUeCfg = NULLP;
 
-   ret = ROK;
-   GET_UE_ID(crnti, ueId);
-
    DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg));
    if(macUeCfg)
    {
       memset(macUeCfg, 0, sizeof(MacUeCfg));
-      ret = fillMacUeCfg(cellId, ueId, crnti, ueCfgDb, macUeCfg);
+      ret = fillMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, macUeCfg);
       if(ret == RFAILED)
          DU_LOG("\nERROR  -->  DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeReCfgReqToMac()");
       else
@@ -2594,20 +2800,55 @@ uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t crnti, DuUeCfg *ue
  * 
  *****************************************************************/
 
-uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, uint16_t crnti, DuUeCfg *duUeCfg)
+uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, DuUeCb *ueCb)
 {
    uint8_t ret = ROK;
+   uint16_t crnti; 
+   DuUeCfg *duUeCfg = NULLP;
 
    DU_LOG("\nDEBUG   -->  DU_APP: Processing Ue Context Setup Request for cellId [%d]", cellId);
-   /* Filling RLC Ue Reconfig */ 
-   ret = duBuildAndSendUeReCfgReqToRlc(cellId, crnti, duUeCfg);
-   if(ret == RFAILED)
-      DU_LOG("\nERROR  -->  DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()");
-   
-   /* Filling MAC Ue Reconfig */
-   ret = duBuildAndSendUeReCfgReqToMac(cellId, crnti, duUeCfg);
-   if(ret == RFAILED)
-      DU_LOG("\nERROR  -->  DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()");
+
+   if(!ueCb)
+   {
+      DU_LOG("\nERROR  -->  DU APP : UE Cb is NULL");
+      return RFAILED;
+   }
+
+   crnti = ueCb->crnti;
+   duUeCfg = &ueCb->f1UeDb->duUeCfg;
+
+   /* If UE is being handed-in to this DU, UE context setup request will create
+    * new UE context at MAC/SCH and RLC.
+    * If UE is in active state, UE contex setup request will lead to
+    * reconfiguration of UE at MAC/SCH and RLC
+    */
+   if(ueCb->ueState == UE_HANDIN_IN_PROGRESS)
+   {
+      /* Filling MAC UE Config */
+      memset(&ueCb->macUeCfg, 0, sizeof(MacUeCfg));
+
+      /* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */
+      ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->macUeCfg);
+      if(ret == RFAILED)
+         DU_LOG("\nERROR  -->  DU APP : Failed to send UE create request to MAC");
+
+      ret = duBuildAndSendUeCreateReqToRlc(cellId, ueCb->gnbDuUeF1apId, duUeCfg, &ueCb->rlcUeCfg);
+      if(ret == RFAILED)
+         DU_LOG("\nERROR  --> DU APP : Failed to send UE create request to RLC");
+
+   }
+   else
+   {
+      /* Filling RLC UE Reconfig */ 
+      ret = duBuildAndSendUeReCfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
+      if(ret == RFAILED)
+         DU_LOG("\nERROR  -->  DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()");
+
+      /* Filling MAC UE Reconfig */
+      ret = duBuildAndSendUeReCfgReqToMac(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
+      if(ret == RFAILED)
+         DU_LOG("\nERROR  -->  DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()");
+   }
 
    return ret;
 }
@@ -2651,14 +2892,14 @@ uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg)
       {
          if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
          {
-            ret = duBuildAndSendUeContextSetupReq(cellId, crnti, &ueCb->f1UeDb->duUeCfg);
+            ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
             if(ret == RFAILED)
                DU_LOG("\nERROR  -->  DU APP : Failed to process UE Context Setup Request in DuProcRlcDlRrcMsgRsp()");
          }
          
          if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
          {
-            ret = duBuildAndSendUeContextModReq(cellId, crnti, &ueCb->f1UeDb->duUeCfg);
+            ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, crnti, &ueCb->f1UeDb->duUeCfg);
             if(ret == RFAILED)
                DU_LOG("\nERROR  -->  DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()");
          }
@@ -2702,6 +2943,7 @@ uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb)
    if(ueCb)
    {
       cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
+
       /* Send DL RRC msg for security Mode */
       if(ueCb->f1UeDb->dlRrcMsg)
       {
@@ -2720,7 +2962,7 @@ uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb)
       }
       else if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
       {
-         ret = duBuildAndSendUeContextSetupReq(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg);
+         ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
          if(ret == RFAILED)
          {
             DU_LOG("\nERROR  -->  DU APP : Failed to build ue context setup Req in duProcUeContextSetupRequest()");
@@ -2753,18 +2995,18 @@ uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb)
  * 
  *****************************************************************/
 
-uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint16_t crnti, DuUeCfg *duUeCfg)
+uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *duUeCfg)
 {
    uint8_t ret = ROK;
 
    DU_LOG("\nDEBUG   -->  DU_APP: Processing Ue Context Mod Request for cellId [%d]", cellId);
    /* Filling RLC Ue Reconfig */ 
-   ret = duBuildAndSendUeReCfgReqToRlc(cellId, crnti, duUeCfg);
+   ret = duBuildAndSendUeReCfgReqToRlc(cellId, gnbDuUeF1apId, crnti, duUeCfg);
    if(ret == RFAILED)
       DU_LOG("\nERROR  -->  DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextModReq()");
    
    /* Filling MAC Ue Reconfig */
-   ret = duBuildAndSendUeReCfgReqToMac(cellId, crnti, duUeCfg);
+   ret = duBuildAndSendUeReCfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg);
    if(ret == RFAILED)
       DU_LOG("\nERROR  -->  DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()");
 
@@ -2814,7 +3056,7 @@ uint8_t duProcUeContextModReq(DuUeCb *ueCb)
       }
       else if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
       {
-         ret = duBuildAndSendUeContextModReq(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg);
+         ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg);
          if(ret == RFAILED)
          {
             DU_LOG("\nERROR  -->  DU APP : Failed to build ue context setup Req in duProcUeContextModReq()");
@@ -2910,11 +3152,13 @@ void deleteMacUeCfg(MacUeCfg *ueCfg)
 *         RFAILED - failure
 *
 * ****************************************************************/
-uint8_t  deleteUeCfg(uint16_t cellIdx, uint8_t ueId)
+uint8_t  deleteUeCfg(uint16_t cellId, uint8_t ueId)
 {
    uint8_t tnlIdx = 0;
+   uint16_t cellIdx = 0;
    DuUeCb *ueCb = NULLP;
    
+   GET_CELL_IDX(cellId, cellIdx);
    if(duCb.actvCellLst[cellIdx] != NULLP)
    {
       if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\
@@ -2937,6 +3181,7 @@ uint8_t  deleteUeCfg(uint16_t cellIdx, uint8_t ueId)
             else
                tnlIdx++;
          }
+         unsetBitInUeBitMap(cellId, ueId-1);
          duCb.actvCellLst[cellIdx]->numActvUes--;
          memset(ueCb, 0, sizeof(DuUeCb));
       }
@@ -2986,9 +3231,9 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
          {
             duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].macUeCfg.macUeCfgState = UE_DELETE_COMPLETE;
             ueId = deleteRsp->ueId;
-            gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
-            gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
-            if(deleteUeCfg(cellIdx, ueId) == ROK)
+            gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
+            gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
+            if(deleteUeCfg(deleteRsp->cellId, ueId) == ROK)
             {
                ret = BuildAndSendUeContextReleaseComplete(deleteRsp->cellId, gnbCuUeF1apId, gnbDuUeF1apId);
                if(ret != ROK)