Merge "Fixes in current code for Multi-UE support [Issue-ID: ODUHIGH-354]"
[o-du/l2.git] / src / du_app / du_ue_mgr.c
index 2ef2d74..39569c9 100644 (file)
@@ -14,7 +14,7 @@
 #   See the License for the specific language governing permissions and        #
 #   limitations under the License.                                             #
 ################################################################################
- *******************************************************************************/
+*******************************************************************************/
 /* This file contains UE management handling functionality for DU APP */
 #include "common_def.h"
 #include "lrg.h"
 #include "du_f1ap_msg_hdl.h"
 #include "du_ue_mgr.h"
 
+#ifdef O1_ENABLE
+#include "AlarmInterface.h"
+#include "ConfigInterface.h"
+#endif
+
 DuMacDlCcchInd packMacDlCcchIndOpts[] =
 {
    packMacDlCcchInd,           /* Loose coupling */
@@ -97,13 +102,6 @@ DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] =
    packDuRlcUeDeleteReq        /* Light weight-loose coupling */
 };
 
-DuMacCellDeleteReq packMacCellDeleteReqOpts[] =
-{
-   packDuMacCellDeleteReq,       /* Loose coupling */
-   MacProcCellDeleteReq,         /* TIght coupling */
-   packDuMacCellDeleteReq        /* Light weight-loose coupling */
-};
-
 /*******************************************************************
  *
  * @brief Function to fillDlUserDataInfo
@@ -177,12 +175,6 @@ uint8_t duBuildAndSendDlUserDataToRlc(uint16_t msgLen, EgtpMsg *egtpMsg)
       return RFAILED;
    }
    memset(dlDataMsgInfo, 0, sizeof(RlcDlUserDataInfo));
-   if(ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &dlDataMsgInfo->dlMsg) != ROK)
-   {
-      DU_LOG("\nERROR  -->  DU_APP : Memory allocation failed for dlMsg in duHdlEgtpDlData()");
-      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlDataMsgInfo, sizeof(RlcDlUserDataInfo));
-      return RFAILED;
-   }
    dlDataMsgInfo->dlMsg = egtpMsg->msg;
    dlDataMsgInfo->msgLen = msgLen;
 
@@ -222,6 +214,11 @@ uint8_t duBuildAndSendDlUserDataToRlc(uint16_t msgLen, EgtpMsg *egtpMsg)
 uint8_t duHdlEgtpDlData(EgtpMsg  *egtpMsg)
 {
    uint16_t msgLen = 0;
+
+#ifdef CALL_FLOW_DEBUG_LOG
+    DU_LOG("\nCall Flow: ENTEGTP -> ENTDUAPP : EVENT_HDL_RECV_DL_DATA\n");
+#endif
+
    DU_LOG("\nDEBUG  --> DU_APP : Processing DL data in duHdlEgtpDlData()");
    
    if(!egtpMsg->msg)
@@ -288,7 +285,7 @@ uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \
    {
       dlCcchIndInfo->dlCcchMsg[idx2] = dlCcchMsg[idx2];
    }
-   DU_FREE(dlCcchMsg, dlCcchMsgSize);
+   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchMsg, dlCcchMsgSize);
 
    /* Fill Pst */
    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_DL_CCCH_IND);
@@ -485,11 +482,20 @@ uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg)
  * @return gnbDuF1apId
  *
  * ****************************************************************/
-uint32_t genGnbDuUeF1apId()
-{
-   static uint32_t gnbDuUeF1apId = 0;
-
-   return ++gnbDuUeF1apId;
+int32_t genGnbDuUeF1apId(uint8_t cellId)
+{
+    uint8_t cellIdx =0;
+
+    GET_CELL_IDX(cellId, cellIdx);
+    if(duCb.actvCellLst[cellIdx])
+    {
+       return  ++duCb.actvCellLst[cellIdx]->gnbDuUeF1apIdGenerator;
+    }
+    else
+    {
+       DU_LOG("ERROR  --> DU_APP : genGnbDuUeF1apId(): CellId[%d] does not exist", cellId);
+    }
+    return -1;
 }
 
 /******************************************************************
@@ -511,12 +517,18 @@ uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
 {
 
    uint8_t ret = ROK;
-   uint32_t gnbDuUeF1apId = 0;
+   int32_t gnbDuUeF1apId = 0;
 
-   gnbDuUeF1apId = genGnbDuUeF1apId();
+   gnbDuUeF1apId = genGnbDuUeF1apId(ulCcchIndInfo->cellId);
+   
+   if(gnbDuUeF1apId == -1)
+   {
+      DU_LOG("ERROR  --> DU_APP : duProcUlCcchInd(): Received cellId[%d] does not exist", ulCcchIndInfo->cellId);
+      return RFAILED;
+   }
 
    /* Store Ue mapping */
-   duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = gnbDuUeF1apId;
+   duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = (uint32_t)gnbDuUeF1apId;
    duCb.ueCcchCtxt[duCb.numUe].crnti         = ulCcchIndInfo->crnti;
    duCb.ueCcchCtxt[duCb.numUe].cellId        = ulCcchIndInfo->cellId;
 
@@ -697,17 +709,25 @@ void fillDefaultInitUlBwp(InitialUlBwp *initUlBwp)
         initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.transPrecodDisabled. \
            scramblingId0 = SCRAMBLING_ID; 
         initUlBwp->puschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
-        initUlBwp->puschCfg.numTimeDomRsrcAlloc = 1;
+        initUlBwp->puschCfg.numTimeDomRsrcAlloc = 2;
         idx = 0;
         if(initUlBwp->puschCfg.numTimeDomRsrcAlloc <= MAX_NUM_UL_ALLOC)
         {
-           initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2;
+           initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG1;
            initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType =\
               MAPPING_TYPEA;
            initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
            initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
            initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
               calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
+
+       idx++;
+       initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG2;
+       initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType = MAPPING_TYPEA;
+       initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
+       initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
+       initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
+          calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
         }
         initUlBwp->puschCfg.transformPrecoder = TRANSFORM_PRECODER_DISABLED;
       }
@@ -939,69 +959,73 @@ void fillMacSrb1LcCfg(LcCfg *macLcCfg)
  *
  *****************************************************************/
 
-uint8_t fillMacLcCfgToAddMod(LcCfg *lcCfg, LcCfg *ueSetReqDb)
+uint8_t fillMacLcCfgToAddMod(LcCfg *macLcCfgToSend, LcCfg *ueLcCfgDb, LcCfg *oldLcCfg, Bool toUpdate)
 {
-   uint8_t ret = ROK; 
-   lcCfg->lcId = ueSetReqDb->lcId;
-   lcCfg->configType = ueSetReqDb->configType;
-   /* Filling DRBQOS */
-   if(ueSetReqDb->drbQos)
+   if(!toUpdate)
    {
-      if(!lcCfg->drbQos)
+      if(macLcCfgToSend)
       {
-         DU_ALLOC_SHRABL_BUF(lcCfg->drbQos, sizeof(DrbQosInfo));
-         if(!lcCfg->drbQos)
-         {
-            DU_LOG("\nERROR  -->  DU APP : Memory Alloc failed at drQos at fillMacLcCfgToAddMod()");
-            return RFAILED;
-         }
-      }
-      if(ret == ROK)
-      {
-         memcpy(lcCfg->drbQos, ueSetReqDb->drbQos, sizeof(DrbQosInfo));
+         macLcCfgToSend->lcId = ueLcCfgDb->lcId;
+         macLcCfgToSend->configType = ueLcCfgDb->configType;
+
+         if(ueLcCfgDb->drbQos)
+            macLcCfgToSend->drbQos = ueLcCfgDb->drbQos;
+         else if(oldLcCfg)
+            macLcCfgToSend->drbQos = oldLcCfg->drbQos;
+         else
+            macLcCfgToSend->drbQos = NULL;
+
+         if(ueLcCfgDb->snssai)
+            macLcCfgToSend->snssai = ueLcCfgDb->snssai;
+         else if(oldLcCfg)
+            macLcCfgToSend->snssai = oldLcCfg->snssai;
+         else
+            macLcCfgToSend->snssai = NULL;
+
+         macLcCfgToSend->ulLcCfgPres = ueLcCfgDb->ulLcCfgPres;
+         memcpy(&macLcCfgToSend->ulLcCfg, &ueLcCfgDb->ulLcCfg, sizeof(UlLcCfg));
+         memcpy(&macLcCfgToSend->dlLcCfg, &ueLcCfgDb->dlLcCfg, sizeof(DlLcCfg));
       }
    }
    else
    {
-      lcCfg->drbQos = NULLP;
-   }
+      oldLcCfg->lcId = ueLcCfgDb->lcId;
+      oldLcCfg->configType = ueLcCfgDb->configType;
 
-   if(ret == ROK)
-   {
-      if(ueSetReqDb->snssai)
+      if(ueLcCfgDb->drbQos)
       {
-         if(!lcCfg->snssai)
+         if(oldLcCfg->drbQos)
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->drbQos, sizeof(DrbQosInfo));
+
+         DU_ALLOC_SHRABL_BUF(oldLcCfg->drbQos, sizeof(DrbQosInfo));
+         if(oldLcCfg->drbQos == NULL)
          {
-            DU_ALLOC_SHRABL_BUF(lcCfg->snssai, sizeof(Snssai));
-            if(!lcCfg->snssai)
-            {
-               DU_LOG("\nERROR  -->  DU APP : Memory Alloc failed at snnsai at fillMacLcCfgToAddMod()");
-               ret = RFAILED;
-            }
+            DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
+            return RFAILED;
          }
-         if(ret == ROK)
+         memcpy(oldLcCfg->drbQos, ueLcCfgDb->drbQos, sizeof(DrbQosInfo));
+      }
+
+      if(ueLcCfgDb->snssai)
+      {
+         if(oldLcCfg->snssai)
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->snssai, sizeof(Snssai));
+
+         DU_ALLOC_SHRABL_BUF(oldLcCfg->snssai, sizeof(Snssai));
+         if(oldLcCfg->snssai == NULL)
          {
-            /* Filling SNSSAI */
-            memcpy(lcCfg->snssai, ueSetReqDb->snssai, sizeof(Snssai));
+            DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->drbQos, sizeof(DrbQosInfo));
+            return RFAILED;
          }
-        else
-        {
-            lcCfg->snssai = NULLP;
-            if(lcCfg->drbQos)
-            {
-               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->drbQos, sizeof(DrbQosInfo));
-               lcCfg->drbQos = NULLP;
-            }
-           return ret;
-        }
+         memcpy(oldLcCfg->snssai, ueLcCfgDb->snssai, sizeof(Snssai));
       }
-      else
-         lcCfg->snssai = NULLP;
+
+      oldLcCfg->ulLcCfgPres = ueLcCfgDb->ulLcCfgPres;
+      memcpy(&oldLcCfg->ulLcCfg, &ueLcCfgDb->ulLcCfg, sizeof(UlLcCfg));
+      memcpy(&oldLcCfg->dlLcCfg, &ueLcCfgDb->dlLcCfg, sizeof(DlLcCfg));
    }
-   lcCfg->ulLcCfgPres = ueSetReqDb->ulLcCfgPres;
-   memcpy(&lcCfg->ulLcCfg, &ueSetReqDb->ulLcCfg, sizeof(UlLcCfg));
-   memcpy(&lcCfg->dlLcCfg, &ueSetReqDb->dlLcCfg, sizeof(DlLcCfg));
-   return ret;
+   return ROK;
 }
 
 /******************************************************************
@@ -1019,26 +1043,36 @@ uint8_t fillMacLcCfgToAddMod(LcCfg *lcCfg, LcCfg *ueSetReqDb)
  *
  *****************************************************************/
 
-uint8_t fillAmbr(AmbrCfg **macAmbr, AmbrCfg *ueDbAmbr)
+uint8_t fillAmbr(AmbrCfg **macAmbrCfgToSend, AmbrCfg *ueDbAmbr, AmbrCfg **oldMacAmbrCfg, Bool toUpdate)
 {
-   if(ueDbAmbr)
+   if(!toUpdate)
    {
-      if(*macAmbr == NULLP)
+      if(ueDbAmbr)
       {
-         DU_ALLOC_SHRABL_BUF(*macAmbr, sizeof(AmbrCfg));
-         if(*macAmbr == NULLP)
+         *macAmbrCfgToSend = ueDbAmbr;
+      }
+      else
+         *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)
          {
             DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillAmbr()");
             return RFAILED;
          }
+         memset(*oldMacAmbrCfg, 0, sizeof(AmbrCfg));
+         (*oldMacAmbrCfg)->ulBr = ueDbAmbr->ulBr;
       }
-      memset(*macAmbr, 0, sizeof(AmbrCfg));
-      (*macAmbr)->ulBr = ueDbAmbr->ulBr;
-   }
-   else
-   {
-      *macAmbr = NULLP;
    }
+
    return ROK;
 }
 
@@ -1185,7 +1219,7 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \
                      NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
             }
          }
-         ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg);
+         ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE);
          duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability);
       }
 
@@ -1207,7 +1241,7 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \
                      (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD))
                {
                   ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD;
-                  ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx]);
+                  ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx], &duMacDb->lcCfgList[lcIdx], FALSE);
                }
             }
             else
@@ -1216,7 +1250,7 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \
          if(!lcIdFound)
          {
             /* ADD/DEL CONFIG */
-            ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx]);
+            ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx], NULL, FALSE);
          }
          if(ret == ROK)
          {
@@ -1621,6 +1655,7 @@ uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId)
 
         duCb.actvCellLst[cellIdx]->numActvUes++;
         memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt));
+    duCb.numUe--;
       }
    }
    return ret;
@@ -1706,6 +1741,9 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
    MacUeCfg *oldMacUeCfg;
    ret = ROK;
 
+   GET_CELL_IDX(macUeCfg->cellId, cellIdx);
+   oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueIdx-1].macUeCfg;
+
    /*Filling Cell Group Cfg*/
    ret =  procUeReCfgCellInfo(macUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
    if(ret == ROK)
@@ -1720,10 +1758,7 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
          fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
               NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
       }
-      ret = fillAmbr(&macUeCfg->ambrCfg, f1UeDb->duUeCfg.ambrCfg);
-
-      GET_CELL_IDX(macUeCfg->cellId, cellIdx);
-      oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueIdx-1].macUeCfg;
+      ret = fillAmbr(NULL, f1UeDb->duUeCfg.ambrCfg, &oldMacUeCfg->ambrCfg, true);
       duFillModulationDetails(macUeCfg, oldMacUeCfg, f1UeDb->duUeCfg.ueNrCapability);
    }
 
@@ -1737,7 +1772,7 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
         {
            if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_MOD)
            {
-              ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[lcIdx],&f1UeDb->duUeCfg.macLcCfg[dbIdx]);
+              ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[lcIdx], true);
            }
            else if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_DEL)
            {
@@ -1747,7 +1782,7 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
               for(lcDelIdx = lcIdx; lcDelIdx < macUeCfg->numLcs; lcDelIdx++)
               {
                  /* moving all elements one index ahead */
-                 ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[lcDelIdx], &macUeCfg->lcCfgList[lcDelIdx+1]);
+                 ret = fillMacLcCfgToAddMod(NULL,  &macUeCfg->lcCfgList[lcDelIdx+1], &macUeCfg->lcCfgList[lcDelIdx], true);
                  freeMacLcCfg(&macUeCfg->lcCfgList[lcDelIdx+1]);
                  if(ret == RFAILED)
                  {
@@ -1760,7 +1795,7 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
       } 
       if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_ADD)
       {
-        ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[numLcs], &f1UeDb->duUeCfg.macLcCfg[dbIdx]);
+        ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[numLcs], true);
         if(ret == RFAILED)
         {
            DU_LOG("\nERROR  -->  DU APP : Failed to add LC at Idx %d in duUpdateMacCfg()", numLcs);
@@ -1943,6 +1978,12 @@ uint8_t duUpdateRlcLcCfg(RlcUeCfg *rlcUeCfg, F1UeContextSetupDb *f1UeDb)
  * ****************************************************************/
 uint8_t fillTnlCfgToAddMod(UpTnlCfg **ueCbTnlCfg, UpTnlCfg *f1TnlCfg)
 {
+   if(*ueCbTnlCfg)
+   {
+      DU_FREE((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg));
+      DU_FREE(*ueCbTnlCfg, sizeof(UpTnlCfg));
+   }
+
    if(*ueCbTnlCfg == NULLP)
    {
       /* copying to DuCb Tnl Cfg */
@@ -2007,40 +2048,43 @@ uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1Tnl
    {
       if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, NULLP, f1TnlCfg->tnlCfg1) == ROK)
       {
-        if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numDrb], f1TnlCfg) == ROK)
-        {
-           duCb.numDrb++;
-           ret = ROK;
-        }
+         if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numDrb], f1TnlCfg) == ROK)
+         {
+            duCb.numDrb++;
+            ret = ROK;
+         }
       }      
    }
    else if(f1TnlCfg->configType == CONFIG_MOD)
    {
       if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_MOD, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
       {
-        if(fillTnlCfgToAddMod(&duTnlCfg, f1TnlCfg) == ROK)
-        {
-           ret = ROK;
-        }
+         if(fillTnlCfgToAddMod(&duTnlCfg, f1TnlCfg) == ROK)
+         {
+            ret = ROK;
+         }
       }   
    }
    else if(f1TnlCfg->configType == CONFIG_DEL)
    {
       if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_DEL, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
       {           
-        /* Free memory at drbIdx */
-        DU_FREE(duTnlCfg->tnlCfg1, sizeof(GtpTnlCfg));
-        DU_FREE(duTnlCfg, sizeof(UpTnlCfg));
-        duCb.numDrb--;
-        for(delIdx = ueCbIdx; delIdx < duCb.numDrb; delIdx++)
-        {
-           /* moving all elements one index ahead */
-           ret = fillTnlCfgToAddMod(&duCb.upTnlCfg[delIdx], duCb.upTnlCfg[delIdx+1]);
-           if(ret != ROK)
-           {
-              return ret;
-           }
-        }
+         /* Free memory at drbIdx */
+         duCb.numDrb--;
+         for(delIdx = ueCbIdx; delIdx < duCb.numDrb; delIdx++)
+         {
+            /* moving all elements one index ahead */
+            ret = fillTnlCfgToAddMod(&duCb.upTnlCfg[delIdx], duCb.upTnlCfg[delIdx+1]);
+            if(ret != ROK)
+            {
+               return ret;
+            }
+         }
+         if(duCb.upTnlCfg[delIdx])
+         {
+            DU_FREE(duCb.upTnlCfg[delIdx]->tnlCfg1, sizeof(GtpTnlCfg));
+            DU_FREE(duCb.upTnlCfg[delIdx], sizeof(UpTnlCfg));
+         }
       }   
    }
    return ret;
@@ -2158,7 +2202,7 @@ uint8_t duUpdateDuUeCbCfg(uint8_t ueIdx, uint8_t cellId)
            if(duUpdateTunnelCfgDb(ueIdx, cellId, &ueCb->f1UeDb->duUeCfg) != ROK)
            {
                DU_LOG("\nERROR  -->  DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()");
-              return RFAILED;
+                   return RFAILED;
            }
         }
       }
@@ -2206,7 +2250,7 @@ uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp)
                macUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
             if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK)
             {
-               BuildAndSendUeCtxtRsp(cfgRsp->ueIdx, cfgRsp->cellId);
+               BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueIdx);
             }
          }
       }
@@ -2327,7 +2371,7 @@ uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp)
                rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
             if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK)
             {
-               BuildAndSendUeCtxtRsp(cfgRsp->ueIdx, cfgRsp->cellId);
+               BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueIdx);
             }   
          }
       }
@@ -2494,32 +2538,49 @@ uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, uint16_t crnti, DuUeCfg
 uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg)
 {
    uint8_t ret = ROK, ueIdx = 0;
+   uint16_t cellId, crnti;
    DuUeCb *ueCb = NULLP;
+   DlMsgState state;
+
+   state = dlRrcMsg->state;
+   cellId = dlRrcMsg->cellId;
+   crnti = dlRrcMsg->crnti;
+   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsg, sizeof(RlcDlRrcMsgRsp));
 
-   if(dlRrcMsg->state == TRANSMISSION_COMPLETE)
+   if(state == TRANSMISSION_COMPLETE)
    {
-      GET_UE_IDX(dlRrcMsg->crnti, ueIdx);
-      ueCb = &duCb.actvCellLst[dlRrcMsg->cellId -1]->ueCb[ueIdx -1];
+      GET_UE_IDX(crnti, ueIdx);
+      ueCb = &duCb.actvCellLst[cellId -1]->ueCb[ueIdx -1];
+
       if(ueCb->f1UeDb && ueCb->f1UeDb->dlRrcMsgPres)
       {
          if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
          {
-            ret = duBuildAndSendUeContextSetupReq(dlRrcMsg->cellId, dlRrcMsg->crnti, &ueCb->f1UeDb->duUeCfg);
+            ret = duBuildAndSendUeContextSetupReq(cellId, crnti, &ueCb->f1UeDb->duUeCfg);
             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(dlRrcMsg->cellId, dlRrcMsg->crnti, &ueCb->f1UeDb->duUeCfg);
+            ret = duBuildAndSendUeContextModReq(cellId, crnti, &ueCb->f1UeDb->duUeCfg);
             if(ret == RFAILED)
                DU_LOG("\nERROR  -->  DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()");
          }
+
+         if(ueCb->f1UeDb->actionType == UE_CTXT_RELEASE && ueCb->ueState == UE_ACTIVE)
+         {
+            ret = duBuildAndSendUeDeleteReq(cellId, crnti);
+            if(ret == RFAILED)
+            {
+               DU_LOG("\nERROR  -->  DU APP : Failed to process UE Context Release Request in DuProcRlcDlRrcMsgRsp()");
+            }
+         }
       }
    }
    else
       DU_LOG("\nERROR  -->  DU APP : Failed to transmit DL RRC Msg");
 
-   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsg, sizeof(RlcDlRrcMsgRsp));
    return ret;
 }
 /*******************************************************************
@@ -2714,88 +2775,16 @@ void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg)
 
 void deleteMacUeCfg(MacUeCfg *ueCfg)
 {
-   uint8_t lcCfgIdx;
-   uint8_t resrcIdx;
-   ServCellCfgInfo *servCellCfg;
-   PucchResrcInfo *resrcToAddModList;
-
-   if(ueCfg)
+   uint8_t lcCfgIdx=0;
+   
+   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg));
+   if(ueCfg->spCellCfgPres)
    {
-      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg));
-      if(ueCfg->spCellCfgPres)
-      {
-         servCellCfg = &ueCfg->spCellCfg.servCellCfg;
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->bwpInactivityTmr, sizeof(uint8_t));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.resrcSet,\
-         sizeof(PucchResrcSetCfg));
-         if(servCellCfg->initUlBwp.pucchCfg.resrc)
-         {
-            /*freeing the PucchResrcCfg*/
-            for(resrcIdx= 0; resrcIdx< servCellCfg->initUlBwp.pucchCfg.resrc->resrcToAddModListCount; resrcIdx++)
-            {
-               resrcToAddModList=&servCellCfg->initUlBwp.pucchCfg.resrc->resrcToAddModList[resrcIdx];
-               switch(resrcToAddModList->pucchFormat)
-               {
-                  case PUCCH_FORMAT_0:
-                     {
-                        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format0 ,\
-                        sizeof(PucchFormat0));
-                        break;
-                     }
-                  case PUCCH_FORMAT_1:
-                     {
-                        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format1 ,\
-                        sizeof(PucchFormat1));
-                        break;
-                     }
-                  case PUCCH_FORMAT_2:
-                     {
-                        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format2 ,\
-                        sizeof(PucchFormat2_3));
-                        break;
-                     }
-                  case PUCCH_FORMAT_3:
-                     {
-                        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format3 ,\
-                        sizeof(PucchFormat2_3));
-                        break;
-                     }
-                  case PUCCH_FORMAT_4:
-                     {
-                        DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format4 ,\
-                        sizeof(PucchFormat4));
-                        break;
-                     }
-               }
-            }
-            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.resrc,\
-            sizeof(PucchResrcCfg));
-         }
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format1,\
-         sizeof(PucchFormatCfg));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format2,\
-         sizeof(PucchFormatCfg));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format3,\
-         sizeof(PucchFormatCfg));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format4,\
-         sizeof(PucchFormatCfg));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.schedReq,\
-         sizeof(PucchSchedReqCfg));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.multiCsiCfg,\
-         sizeof(PucchMultiCsiCfg));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.spatialInfo,\
-         sizeof(PucchSpatialCfg));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.dlDataToUlAck ,\
-         sizeof(PucchDlDataToUlAck));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.powerControl,\
-         sizeof(PucchPowerControl));
-         deletePdschServCellCfg(&servCellCfg->pdschServCellCfg);
-      }
-      for(lcCfgIdx=0; lcCfgIdx< ueCfg->numLcs; lcCfgIdx++)
-      {
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->lcCfgList[lcCfgIdx].drbQos, sizeof(DrbQosInfo));
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->lcCfgList[lcCfgIdx].snssai, sizeof(Snssai));
-      }
+      freeUeReCfgCellGrpInfo(ueCfg);
+   }
+   for(lcCfgIdx=0; lcCfgIdx< ueCfg->numLcs; lcCfgIdx++)
+   {
+      freeMacLcCfg(&ueCfg->lcCfgList[lcCfgIdx]);
    }
    memset(ueCfg, 0, sizeof(MacUeCfg));
 }
@@ -2817,7 +2806,9 @@ void deleteMacUeCfg(MacUeCfg *ueCfg)
 * ****************************************************************/
 uint8_t  deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx)
 {
+   uint8_t tnlIdx = 0;
    DuUeCb *ueCb = NULLP;
+   
    if(duCb.actvCellLst[cellIdx] != NULLP)
    {
       if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\
@@ -2830,18 +2821,27 @@ uint8_t  deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx)
          {
             freeF1UeDb(ueCb->f1UeDb);
          }
+         for(tnlIdx = 0; tnlIdx < duCb.numDrb; )
+         {
+            if(duCb.upTnlCfg[tnlIdx]->ueIdx == ueIdx)
+            {
+               duCb.upTnlCfg[tnlIdx]->configType = CONFIG_DEL;
+               duProcEgtpTunnelCfg(tnlIdx, duCb.upTnlCfg[tnlIdx], duCb.upTnlCfg[tnlIdx]);
+            }
+            else
+               tnlIdx++;
+         }
          duCb.actvCellLst[cellIdx]->numActvUes--;
          memset(ueCb, 0, sizeof(DuUeCb));
       }
       else
       {
-         DU_LOG("INFO  --> DU APP : deleteUeCfg(): MAC or RLC UE configuration state not UE_DELETE_COMPLETE");
          return RFAILED;
       }
    }
    else
    {
-      DU_LOG("ERROR  --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx);
+      DU_LOG("\nERROR  --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx);
       return RFAILED;
    }
    return ROK;
@@ -2866,36 +2866,37 @@ uint8_t  deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx)
 
 uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
 {
-   uint8_t  ueIdx = 0,ret =ROK;
+   uint8_t  ret =ROK,ueId=0;
    uint16_t cellIdx=0;
-   uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId =0;
-
+   uint32_t gnbCuUeF1apId =0 , gnbDuUeF1apId =0;
+   
    if(deleteRsp)
    {
       if(deleteRsp->result == SUCCESS)
       {
-         DU_LOG("\nINFO   -->  DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueIdx);
+         DU_LOG("\nINFO   -->  DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueId);
          GET_CELL_IDX(deleteRsp->cellId, cellIdx);
-         ueIdx = deleteRsp->ueIdx;
          if(duCb.actvCellLst[cellIdx])
          {
-            duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueIdx -1].macUeCfg.macUeCfgState = UE_DELETE_COMPLETE;
-            gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
-            gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
-            if(deleteUeCfg(cellIdx, ueIdx) == ROK)
+            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)
             {
-                 ret = BuildAndSendUeContextReleaseComplete(gnbCuUeF1apId, gnbDuUeF1apId);
-                 if(ret !=ROK)
-                 {   
-                    DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete");
-                 }
+               ret = BuildAndSendUeContextReleaseComplete(deleteRsp->cellId, gnbCuUeF1apId, gnbDuUeF1apId);
+               if(ret != ROK)
+               {
+                  DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete");
+               }
             }
+
          }
       }
       else
       {
          DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\
-         deleteRsp->ueIdx);
+         deleteRsp->ueId);
          ret =  RFAILED;
       }
       DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacUeDeleteRsp));
@@ -2928,36 +2929,32 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
 
 uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp)
 {
-   uint8_t  ueIdx = 0, ret = ROK;
-   uint16_t cellIdx = 0;
-   uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId =0;   
+   uint8_t  ueId = 0, ret = ROK;
+   uint16_t cellIdx = 0,crnti=0;
 
    if(delRsp)
    {
-      ueIdx = delRsp->ueIdx;
+      ueId = delRsp->ueId;
       GET_CELL_IDX(delRsp->cellId, cellIdx);
 
       if(delRsp->result == SUCCESSFUL)
       {
-         DU_LOG("\nINFO   -->  DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueIdx);
+         DU_LOG("\nINFO   -->  DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueId);
          if(duCb.actvCellLst[cellIdx]!=NULLP)
          {
-            duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg.rlcUeCfgState = UE_DELETE_COMPLETE;
-            gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
-            gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
-            if(deleteUeCfg(cellIdx, ueIdx) == ROK)
+            duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState = UE_DELETE_COMPLETE;
+            GET_CRNTI(crnti, ueId);
+            if(sendUeDeleteReqToMac(delRsp->cellId, ueId, crnti) == RFAILED)
             {
-                ret = BuildAndSendUeContextReleaseComplete(gnbCuUeF1apId, gnbDuUeF1apId);
-                if(ret != ROK)
-                {
-                   DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete");
-                }
+               DU_LOG("\nERROR  -->  DU APP : duBuildAndSendUeDeleteReq(): Failed to build UE  delete req for MAC ");
+               return RFAILED;
             }
+
          }
       }
       else
       {
-         DU_LOG("\nERROR   -->  DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueIdx);
+         DU_LOG("\nERROR   -->  DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueId);
          ret = RFAILED;
       }
       DU_FREE_SHRABL_BUF(pst->region, pst->pool, delRsp, sizeof(RlcUeDeleteRsp));
@@ -2977,13 +2974,13 @@ uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp)
 *    Functionality:
 *     sending UE Delete Req To Mac
 *
-*  @params[in]    cellId, ueIdx, crnti 
+*  @params[in]    cellId, ueId, crnti 
 *  @return ROK     - success
 *          RFAILED - failure
 *
 *****************************************************************/
 
-uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueIdx, uint16_t crnti)
+uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueId, uint16_t crnti)
 {
    Pst pst;
    uint8_t ret=ROK;
@@ -2993,11 +2990,10 @@ uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueIdx, uint16_t crnti)
    if(ueDelete)
    {
       ueDelete->cellId = cellId;
-      ueDelete->ueIdx  = ueIdx;
+      ueDelete->ueId   = ueId;
       ueDelete->crnti  = crnti;
       FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_DELETE_REQ);
 
-      /* Processing one Ue at a time to MAC */
       DU_LOG("\nDEBUG  -->  DU_APP: Sending UE delete Request to MAC ");
       ret = (*packMacUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
       if(ret == RFAILED)
@@ -3025,13 +3021,13 @@ uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueIdx, uint16_t crnti)
  *    Functionality:
  *     Sending UE Delete Req To Rlc
  *
- *  @params[in]  cellId, ueIdx 
+ *  @params[in]  cellId, ueId 
  *  @return ROK     - success
  *          RFAILED - failure
  *
  *****************************************************************/
 
-uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueIdx)
+uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueId)
 {
    uint8_t ret;
    Pst pst;
@@ -3041,7 +3037,7 @@ uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueIdx)
    if(ueDelete !=NULLP)
    {
       ueDelete->cellId = cellId;
-      ueDelete->ueIdx = ueIdx;
+      ueDelete->ueId = ueId;
       FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_DELETE_REQ);
 
       ret = (*packRlcUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
@@ -3065,7 +3061,7 @@ uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueIdx)
  *
  * @details
  *
- *    Function : duProcUeDeleteReq
+ *    Function : duBuildAndSendUeDeleteReq
  *
  *    Functionality: DU processes UE delete req from CU and sends to MAC 
  *                   and RLC 
@@ -3076,37 +3072,33 @@ uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueIdx)
  *
  * ****************************************************************/
 
-uint8_t duProcUeDeleteReq(uint16_t cellId)
+uint8_t duBuildAndSendUeDeleteReq(uint16_t cellId, uint16_t crnti)
 {
-   uint8_t  ueIdx = 0, ueId =0;
-   uint16_t cellIdx = 0, crnti   = 0;
+   uint8_t  ueId =0;
+   uint16_t cellIdx = 0;
 
-   DU_LOG("\nDEBUG   -->  DU_APP: Processing UE Delete Request ");
+   DU_LOG("\nDEBUG  -->  DU_APP: Processing UE Delete Request ");
    GET_CELL_IDX(cellId, cellIdx);
-   GET_CRNTI(crnti,ueIdx);
+   GET_UE_IDX(crnti, ueId);
 
    if(duCb.actvCellLst[cellIdx] != NULLP)
    {
-      for(ueIdx =0;ueIdx< duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++)
+      if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
       {
-         ueId = ueIdx+1;
-         if(sendUeDeleteReqToRlc(cellId, ueId) == RFAILED)
-         {
-            DU_LOG("\nERROR  -->  DU APP : duProcUeDeleteReq():Failed to build UE  delete req for RLC ");
-            return RFAILED;
-         }
+         DU_LOG("\nERROR  -->  DU APP : duBuildAndSendUeDeleteReq(): CRNTI [%d] not found", crnti);
+         return RFAILED;
+      }
 
-         GET_CRNTI(crnti,ueId);
-         if(sendUeDeleteReqToMac(cellId, ueId, crnti) == RFAILED)
-         {
-            DU_LOG("\nERROR  -->  DU APP : duProcUeDeleteReq(): Failed to build UE  delete req for MAC ");
-            return RFAILED;
-         }
+      duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].ueState = UE_DELETION_IN_PROGRESS; 
+      if(sendUeDeleteReqToRlc(cellId, ueId) == RFAILED)
+      {
+         DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp():Failed to build UE  delete req for RLC ");
+         return RFAILED;
       }
    }
    else
    {
-      DU_LOG("\nERROR  -->  DU APP : duProcUeDeleteReq(): Cell Id is not found");
+      DU_LOG("\nERROR  -->  DU APP : duBuildAndSendUeDeleteReq(): Cell Id is not found");
       return RFAILED;
    }
 
@@ -3169,194 +3161,63 @@ void deleteRlcUeCfg(RlcUeCfg *ueCfg)
 }
 
 /*******************************************************************
- *
- * @brief Delete DU CellCb information 
- *
- * @details
- *
- *    Function : deleteDuCellCb
- *
- *    Functionality: Delete DU CellCb information
- *
- * @params[in] DuCellCb *cellCb
- * @return ROK     - success
- *         RFAILED - failure
- *
- * ****************************************************************/
-
-void deleteDuCellCb(DuCellCb *cellCb)
-{
-
-   if(cellCb->duMacCellCfg)
-   {
-      if(cellCb->duMacCellCfg->prachCfg.fdm[0].unsuedRootSeq)
-      {
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellCb->duMacCellCfg->prachCfg.fdm[0].unsuedRootSeq,\
-               cellCb->duMacCellCfg->prachCfg.fdm[0].numUnusedRootSeq);
-      }
-      if(cellCb->duMacCellCfg->sib1Cfg.sib1Pdu)
-      {
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,cellCb->duMacCellCfg->sib1Cfg.sib1Pdu,\
-               cellCb->duMacCellCfg->sib1Cfg.sib1PduLen);
-      }
-      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellCb->duMacCellCfg, sizeof(MacCellCfg));
-   }
-   memset(cellCb, 0, sizeof(DuCellCb));
-
-}
-
-/*******************************************************************
- *
- * @brief Handle Cell delete response from MAC
- *
- * @details
- *
- *    Function : DuProcMacCellDeleteRsp
- *
- *    Functionality: Handle Cell delete response from MAC
- *
- * @params[in] Pointer to MacCellDeleteRsp and Pst
- * @return ROK     - success
- *         RFAILED - failure
- *
- * ****************************************************************/
-
-uint8_t DuProcMacCellDeleteRsp(Pst *pst, MacCellDeleteRsp *deleteRsp)
+*
+* @brief Du process Ue Context Release Command
+*
+* @details
+*
+*    Function : duProcUeContextReleaseCommand 
+*
+*    Functionality: Du process Ue Context Release Command 
+*
+* @params[in] DuUeCb *duUeCb 
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t duProcUeContextReleaseCommand(DuUeCb *duUeCb)
 {
-   uint8_t ret = ROK;
-   uint16_t cellIdx=0;
-   if(deleteRsp)
+   uint8_t ret =ROK, ueIdx=0;
+   uint16_t cellId=0,crnti =0;
+   if(duUeCb == NULLP)
    {
-      if(deleteRsp->result == SUCCESSFUL_RSP)
-      {
-         GET_CELL_IDX(deleteRsp->cellId, cellIdx);
-         DU_LOG("\nINFO   -->  DU APP : MAC CELL Delete Response : SUCCESS [CELL IDX : %d]", deleteRsp->cellId);
-         if(duCb.actvCellLst[cellIdx]->cellId == deleteRsp->cellId)
-         {
-            deleteDuCellCb(duCb.actvCellLst[cellIdx]);
-            duCb.numActvCells--;
-            DU_FREE(duCb.actvCellLst[cellIdx], sizeof(DuCellCb));
-         }
-         else
-         {
-            DU_LOG("\nERROR  -->  DU APP : DuProcMacCellDeleteRsp(): CellId [%d] doesnot exist", deleteRsp->cellId);
-            ret = RFAILED;
-         }
-      }
-      else
-      {
-         DU_LOG("\nERROR  -->  DU APP : DuProcMacCellDeleteRsp(): MAC CELL Delete Response : FAILED\
-         [CELL IDX : %d]", deleteRsp->cellId);
-         ret = RFAILED;
-      }
-      DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacUeDeleteRsp));
+      DU_LOG("\nERROR  -->  DU APP : duProcUeContextReleaseCommand() : duUeCb is null");
+      return RFAILED;
    }
-   else
+   if(duUeCb->f1UeDb == NULLP)
    {
-      DU_LOG("\nERROR  -->  DU APP : DuProcMacCellDeleteRsp(): Received MAC cell delete response is NULL");
-      ret = RFAILED;
+      DU_LOG("\nERROR  -->  DU APP : duProcUeContextReleaseCommand() : f1UeDb is null");
+      return RFAILED;
    }
-   return ret;
-}
-
-/*******************************************************************
- *
- * @brief Sending Cell Delete Req To Mac
- *
- * @details
- *
- *    Function : sendCellDeleteReqToMac
- *
- *    Functionality:
- *     sending Cell Delete Req To Mac
- *
- *  @params[in]    uint16_t cellId
- *  @return ROK     - success
- *          RFAILED - failure
- *
- *
- *****************************************************************/
-
-uint8_t sendCellDeleteReqToMac(uint16_t cellId)
-{
-   Pst pst;
-   uint8_t ret=ROK;
-   MacCellDelete *cellDelete = NULLP;
    
-   DU_ALLOC(cellDelete, sizeof(MacCellDelete));
-   if(cellDelete)
+   cellId = duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->cellId;
+   crnti = duUeCb->crnti;
+   /* Send DL RRC msg for RRC release */
+   if(duUeCb->f1UeDb->dlRrcMsg)
    {
-      cellDelete->cellId = cellId;
-      FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_DELETE_REQ);
-
-      DU_LOG("\nINFO   -->  DU APP : Sending Cell Delete Request to MAC");  
-      /* Processing one Cell at a time to MAC */
-      ret = (*packMacCellDeleteReqOpts[pst.selector])(&pst, cellDelete);
-      if(ret == RFAILED)
+      if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu != NULLP)
       {
-         DU_LOG("\nERROR  -->  DU APP : sendCellDeleteReqToMac(): Failed to send Cell delete Req to MAC");
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellDelete, sizeof(MacCellDelete));
+         ret = duBuildAndSendDlRrcMsgToRlc(cellId, duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->ueCb[ueIdx].rlcUeCfg,\
+               duUeCb->f1UeDb->dlRrcMsg);
+         if(ret == RFAILED)
+         {
+            DU_LOG("\nERROR  -->  DU APP : duProcUeContextReleaseCommand() : Failed to send DL RRC msg");
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
+                  duUeCb->f1UeDb->dlRrcMsg->rrcMsgSize);
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
+         }
       }
    }
    else
    {
-      DU_LOG("\nERROR  -->   DU APP : sendCellDeleteReqToMac(): Failed to allocate memory"); 
-      ret = RFAILED;
-   }
-   return ret;
-}
-
-/*******************************************************************
- *
- * @brief DU preocess Cell Delete Req to MAC 
- *
- * @details
- *
- *    Function : duProcCellDeleteReq 
- *
- *    Functionality: DU process Cell Delete Req to MAC 
- *
- * @params[in] uint16_t cellId
- * @return ROK     - success
- *         RFAILED - failure
- *
- * ****************************************************************/
-
-uint8_t duProcCellDeleteReq(uint16_t cellId)
-{
-   uint16_t cellIdx = 0;
-   
-   DU_LOG("\nINFO   -->  DU APP : Processing Cell Delete Request ");
-   GET_CELL_IDX(cellId, cellIdx);
-
-   if(duCb.actvCellLst[cellIdx] != NULLP)
-   {
-      if(duBuildAndSendMacCellStop() == RFAILED)
-      {
-         DU_LOG("\nERROR  -->  DU APP : duProcCellDeleteReq(): Failed to process Cell delete req for cellId[%d]",cellId);
-         return RFAILED;
-      }
-      
-      if(duCb.actvCellLst[cellIdx]->numActvUes)
-      {
-         DU_LOG("\nERROR  -->  DU APP : duProcCellDeleteReq(): Active UEs present Failed to process cell Delete\
-         Req for cellID[%d]", cellId);
-         return RFAILED;
-      }
-      if(sendCellDeleteReqToMac(cellId) == RFAILED)
+      ret = duBuildAndSendUeDeleteReq(cellId,crnti);
+      if(ret == RFAILED)
       {
-         DU_LOG("\nERROR  -->  DU APP : duProcCellDeleteReq(): Failed to build and send Cell delete req for MAC for\
-         cellId[%d]",cellId);
-         return RFAILED;
+         DU_LOG("\nERROR  -->  DU APP : duProcUeContextReleaseCommand(): Failed to build and send Ue Delete request");
       }
    }
-   else
-   {
-      DU_LOG("\nERROR  -->  DU APP : duProcCellDeleteReq(): CellId[%d] is not found", cellId);
-      return RFAILED;
-   }
 
-   return ROK;
+   return ret;
 }
 
 /**********************************************************************