implementation of RLC UE delete req and rsp JIRA-ID : ODUHIGH-43
[o-du/l2.git] / src / du_app / du_ue_mgr.c
index 89780b0..34318ee 100644 (file)
@@ -90,6 +90,12 @@ DuMacUeDeleteReq packMacUeDeleteReqOpts[] =
    packDuMacUeDeleteReq        /* Light weight-loose coupling */
 };
 
+DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] =
+{
+   packDuRlcUeDeleteReq,       /* Loose coupling */
+   RlcProcUeDeleteReq,         /* TIght coupling */
+   packDuRlcUeDeleteReq        /* Light weight-loose coupling */
+};
 
 /*******************************************************************
  *
@@ -1152,8 +1158,10 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \
             }
          }
          ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg);
-
-         duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability);
+         if(ueCfgDb->ueNrCapability != NULLP)
+         {
+            duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability);
+         }
       }
 
       /* Filling LC Context */
@@ -1500,36 +1508,36 @@ uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t ueIdx,\
       rlcUeCfg->ueIdx        = ueIdx;
       for(dbIdx = 0; (dbIdx < ueCfgDb->numRlcLcs && ret == ROK); dbIdx++)
       {
-        ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]);
-        if(ret == RFAILED)
-        {
-           DU_LOG("\n ERROR  -->  DU APP : Failed to fill Rlc Mode at fillRlcUeCfg()");
-           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))
-              {
-                 /* MOD */ 
-                 ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */
-                 memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
-              }
-           }
-           else
-              lcIdFound = false;
-        }
-        if(!lcIdFound)
-        {
-           /* ADD/ DEL Config Type */
-           memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
-        }
-        rlcUeCfg->numLcs++;
+         ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]);
+         if(ret == RFAILED)
+         {
+            DU_LOG("\n ERROR  -->  DU APP : Failed to fill Rlc Mode at fillRlcUeCfg()");
+            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))
+               {
+                  /* MOD */ 
+                  ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */
+                  memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
+               }
+            }
+            else
+               lcIdFound = false;
+         }
+         if(!lcIdFound)
+         {
+            /* ADD/ DEL Config Type */
+            memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
+         }
+         rlcUeCfg->numLcs++;
       }
    }
    return ret;
@@ -2636,6 +2644,7 @@ uint8_t duProcUeContextModReq(DuUeCb *ueCb)
    }
    return ROK;
 }
+
 /*******************************************************************
 *
 * @brief Function to delete Pdsch ServCellCfg
@@ -2650,6 +2659,7 @@ uint8_t duProcUeContextModReq(DuUeCb *ueCb)
 * @return void
 *
 * ****************************************************************/
+
 void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg)
 {
    DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->maxMimoLayers, sizeof(uint8_t));
@@ -2673,6 +2683,7 @@ void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg)
 *         RFAILED - failure
 *
 *******************************************************************/
+
 void deleteMacUeCfg(MacUeCfg *ueCfg)
 {
    uint8_t lcCfgIdx;
@@ -2760,6 +2771,7 @@ void deleteMacUeCfg(MacUeCfg *ueCfg)
    }
    memset(ueCfg, 0, sizeof(MacUeCfg));
 }
+
 /*******************************************************************
 *
 * @brief Handle UE delete response from MAC
@@ -2775,6 +2787,7 @@ void deleteMacUeCfg(MacUeCfg *ueCfg)
 *         RFAILED - failure
 *
 * ****************************************************************/
+
 uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
 {
    uint16_t cellIdx=0;
@@ -2804,6 +2817,108 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
    }
    return ROK;
 }
+
+/*******************************************************************
+*
+* @brief delete RlcUeCfg from duCb
+*
+* @details
+*
+*    Function : deleteDuRlcUeCfg 
+*
+*    Functionality:
+*       delete  RlcUeCfg from duCb    
+*
+*  @params[in]  Post structure
+*               Pointer to RlcUeCfg 
+*  @return ROK     - success
+*          RFAILED - failure
+*
+*****************************************************************/
+
+void deleteDuRlcUeCfg(RlcUeCfg *ueCfg)
+{
+   uint8_t lcIdx = 0;
+   RlcBearerCfg *lcCfg= NULLP;
+   if(ueCfg)
+   {
+      for(lcIdx =0 ; lcIdx < ueCfg->numLcs ; lcIdx++)
+      {
+         lcCfg = &ueCfg->rlcLcCfg[lcIdx];
+         switch(lcCfg->rlcMode)
+         {
+            case RLC_AM :
+            {
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
+               break;
+            }
+            case RLC_UM_BI_DIRECTIONAL :
+            {
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
+               break;
+            }
+            case RLC_UM_UNI_DIRECTIONAL_UL :
+            {
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
+               break;
+            }
+            case RLC_UM_UNI_DIRECTIONAL_DL :
+            {
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
+               break;
+            }
+         }
+      }
+      memset(ueCfg, 0, sizeof(RlcUeCfg));
+   }
+}
+
+/*******************************************************************
+*
+* @brief Processes UE Delete Rsp received from RLC 
+*
+* @details
+*
+*    Function : DuProcRlcUeDeleteRsp
+*
+*    Functionality:
+*     Processes UE Delete Rsp received from RLC 
+*
+*  @params[in]  Post structure
+*               Pointer to RlcUeDeleteRsp
+*  @return ROK     - success
+*          RFAILED - failure
+*
+*****************************************************************/
+
+uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp)
+{
+   uint8_t ueIdx = 0, ret = ROK;
+   uint16_t cellIdx = 0;
+   if(delRsp)
+   {
+      ueIdx = delRsp->ueIdx;
+      GET_CELL_IDX(delRsp->cellId, cellIdx);
+      
+      if(delRsp->result == SUCCESSFUL)
+      {
+         DU_LOG("\nINFO   -->  DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueIdx);
+         if(duCb.actvCellLst[cellIdx]!=NULLP)
+         {
+            deleteDuRlcUeCfg(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg);
+         }
+      }
+      else
+      {
+         DU_LOG("\nERROR   -->  DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueIdx);
+         ret = RFAILED;
+      }
+      DU_FREE_SHRABL_BUF(pst->region, pst->pool, delRsp, sizeof(RlcUeDeleteRsp));
+
+   }
+   return ret;
+}
+
 /*******************************************************************
 *
 * @brief Sending UE Delete Req To Mac
@@ -2815,7 +2930,7 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
 *    Functionality:
 *     sending UE Delete Req To Mac
 *
-*  @params[in]    uint8_t cellId, uint8_t ueId 
+*  @params[in]    cellId, ueIdx, crnti 
 *  @return ROK     - success
 *          RFAILED - failure
 *
@@ -2826,7 +2941,7 @@ uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueIdx, uint16_t crnti)
    Pst pst;
    uint8_t ret=ROK;
    MacUeDelete *ueDelete = NULLP;
-   
+
    DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(MacUeDelete));
    if(ueDelete)
    {
@@ -2853,20 +2968,67 @@ uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueIdx, uint16_t crnti)
 }
 
 /*******************************************************************
-*
-* @brief Du preocess Ue Delete Req to MAC and RLC
-*
-* @details
-*
-*    Function : duProcUeDeleteReq
-*
-*    Functionality: Du process Ue Delete Req to MAC and RLC
-*
-* @params[in] cellId, crnti 
-* @return ROK     - success
-*         RFAILED - failure
-*
-* ****************************************************************/
+ *
+ * @brief Sending UE Delete Req To Rlc
+ *
+ * @details
+ *
+ *    Function : sendUeDeleteReqToRlc
+ *
+ *    Functionality:
+ *     Sending UE Delete Req To Rlc
+ *
+ *  @params[in]  cellId, ueIdx 
+ *  @return ROK     - success
+ *          RFAILED - failure
+ *
+ *****************************************************************/
+
+uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueIdx)
+{
+   uint8_t ret;
+   Pst pst;
+   RlcUeDelete *ueDelete;
+
+   DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(RlcUeDelete));
+   if(ueDelete !=NULLP)
+   {
+      ueDelete->cellId = cellId;
+      ueDelete->ueIdx = ueIdx;
+      FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_DELETE_REQ);
+
+      ret = (*packRlcUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
+      if(ret == RFAILED)
+      {
+         DU_LOG("\nERROR  -->  DU_APP : sendUeDeleteReqToRlc():Failed to send UE Delete  Req to RLC"); 
+         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(RlcUeDelete));
+      }
+   }
+   else
+   {
+      DU_LOG("\nERROR  -->   DU_APP: sendUeDeleteReqToRlc():Memory allocation failed");
+      ret = RFAILED;
+   }
+   return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief DU processes UE delete req from CU and sends to MAC and RLC 
+ *
+ * @details
+ *
+ *    Function : duProcUeDeleteReq
+ *
+ *    Functionality: DU processes UE delete req from CU and sends to MAC 
+ *                   and RLC 
+ *
+ * @params[in] cellId, crnti 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+
 uint8_t duProcUeDeleteReq(uint16_t cellId, uint16_t crnti)
 {
    uint16_t cellIdx = 0;
@@ -2880,6 +3042,11 @@ uint8_t duProcUeDeleteReq(uint16_t cellId, uint16_t crnti)
    {
       if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti == crnti)
       {
+         if(sendUeDeleteReqToRlc(cellId, ueIdx) == RFAILED)
+         {
+            DU_LOG("\nERROR  -->  DU APP : duProcUeDeleteReq():Failed to build UE  delete req for RLC ");
+            return RFAILED;
+         }
          if(sendUeDeleteReqToMac(cellId, ueIdx, crnti) == RFAILED)
          {
             DU_LOG("\nERROR  -->  DU APP : duProcUeDeleteReq(): Failed to build UE  delete req for MAC ");
@@ -2904,4 +3071,4 @@ uint8_t duProcUeDeleteReq(uint16_t cellId, uint16_t crnti)
 
 /**********************************************************************
   End of file
- ***********************************************************************/
+***********************************************************************/