Initial commit
[o-du/l2.git] / src / 5gnrrlc / kw_dbm_ul.c
diff --git a/src/5gnrrlc/kw_dbm_ul.c b/src/5gnrrlc/kw_dbm_ul.c
new file mode 100755 (executable)
index 0000000..2cbb236
--- /dev/null
@@ -0,0 +1,990 @@
+/*******************************************************************************
+################################################################################
+#   Copyright (c) [2017-2019] [Radisys]                                        #
+#                                                                              #
+#   Licensed under the Apache License, Version 2.0 (the "License");            #
+#   you may not use this file except in compliance with the License.           #
+#   You may obtain a copy of the License at                                    #
+#                                                                              #
+#       http://www.apache.org/licenses/LICENSE-2.0                             #
+#                                                                              #
+#   Unless required by applicable law or agreed to in writing, software        #
+#   distributed under the License is distributed on an "AS IS" BASIS,          #
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+#   See the License for the specific language governing permissions and        #
+#   limitations under the License.                                             #
+################################################################################
+*******************************************************************************/
+
+/********************************************************************20**
+  
+        Name:    RLC - Database module file
+    
+        Type:    C source file
+  
+        Desc:    Source code for Database Module functions such as, 
+
+        File:    kw_dbm_ul.c
+  
+*********************************************************************21*/
+static const char* RLOG_MODULE_NAME="DBM";
+static int RLOG_MODULE_ID=2048;
+static int RLOG_FILE_ID=194;
+
+\f
+/* header (.h) include files */
+#include "envopt.h"        /* environment options */
+#include "envdep.h"        /* environment dependent */
+#include "envind.h"        /* environment independent */
+
+#include "gen.h"           /* general */
+#include "ssi.h"           /* system services */
+#include "cm5.h"           /* common timer defines */
+#include "cm_tkns.h"       /* common tokens defines */
+#include "cm_mblk.h"       /* common memory allocation library defines */
+#include "cm_llist.h"      /* common link list  defines  */
+#include "cm_hash.h"       /* common hash list  defines */
+#include "cm_lte.h"        /* common LTE defines */
+#include "lkw.h"           /* LKW defines */
+#include "ckw.h"           /* CKW defines */
+#include "kwu.h"           /* KWU defines */
+#include "rgu.h"           /* RGU defines */
+#include "kw_err.h"        /* Err defines */
+#include "kw_env.h"        /* RLC environment options */
+
+#include "kw.h"            /* RLC defines */
+#include "kw_ul.h"
+
+/* extern (.x) include files */
+#include "gen.x"           /* general */
+#include "ssi.x"           /* system services */
+
+#include "cm5.x"           /* common timer library */
+#include "cm_tkns.x"       /* common tokens */
+#include "cm_mblk.x"       /* common memory allocation */
+#include "cm_llist.x"      /* common link list */
+#include "cm_hash.x"       /* common hash list */
+#include "cm_lte.x"        /* common LTE includes */
+#include "cm_lib.x"        /* common memory allocation library */
+#include "lkw.x"           /* LKW */
+#include "ckw.x"           /* CKW */
+#include "kwu.x"           /* KWU */
+#include "rgu.x"           /* RGU */
+
+#include "kw.x"
+#include "kw_ul.x"
+
+/** 
+ * @file gp_dbm_ul.c
+ * @brief RLC Uplink database module
+*/
+
+#define KW_MODULE KW_DBGMASK_DUT
+
+\f
+/**
+ * @brief Handler to initialize hash list
+ *       
+ * @details
+ *    This function initializes the UeCb, CellCb and transactions hash lists
+ *
+ * @param[in] gCb   RLC instance control block
+ * 
+ * @return  S16
+ *     -# ROK 
+ *     -# RFAILED 
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmUlInit
+(
+KwCb *gCb
+)
+#else
+PUBLIC S16 kwDbmUlInit(gCb)
+KwCb *gCb;
+#endif
+{
+   TRC3(kwUlDbmInit)
+
+   /* Initialize ueCb Hash List */
+   if(ROK != cmHashListInit(&(gCb->u.ulCb->ueLstCp), 
+                            (U16) KW_UE_LIST_BUCKET_SIZE,
+                            (U16) 0, 
+                            (Bool) FALSE, 
+                            (U16) CM_HASH_KEYTYPE_CONID,
+                            KW_GET_MEM_REGION(gCb), 
+                            KW_GET_MEM_POOL(gCb)))
+   {
+      RLOG0(L_ERROR, "UeLstCp Initialization Failed");
+      RETVALUE(RFAILED);
+   }
+
+   /* Initialize cellCb Hash List */
+   if(ROK != cmHashListInit(&(gCb->u.ulCb->cellLstCp), 
+                            (U16) KW_CELL_LIST_BUCKET_SIZE,
+                            (U16) 0, 
+                            (Bool) FALSE, 
+                            (U16) CM_HASH_KEYTYPE_CONID,
+                            KW_GET_MEM_REGION(gCb), 
+                            KW_GET_MEM_POOL(gCb)))
+   {
+      cmHashListDeinit(&gCb->u.ulCb->ueLstCp);
+      RLOG0(L_ERROR, "CellLstCp Initialization Failed");
+      RETVALUE(RFAILED);
+   }
+
+   if(ROK != cmHashListInit(&(gCb->u.ulCb->transIdLstCp), 
+                            (U16) KW_TRANS_ID_LST_BKT_SIZE,
+                            (U16) 0, 
+                            (Bool) FALSE, 
+                            (U16) CM_HASH_KEYTYPE_CONID,
+                            KW_GET_MEM_REGION(gCb), 
+                            KW_GET_MEM_POOL(gCb)))
+   {
+      cmHashListDeinit(&gCb->u.ulCb->ueLstCp);
+      cmHashListDeinit(&gCb->u.ulCb->cellLstCp);
+      RLOG0(L_ERROR, "transIdLstCp Initialization Failed");
+      RETVALUE(RFAILED);
+   }
+
+/* kw005.201 added support for L2 Measurement */         
+#ifdef LTE_L2_MEAS
+   /* Initialize qcI Hash List */
+#endif /* LTE_L2_MEAS */
+
+   RETVALUE(ROK);
+} /* kwDbmUlInit */
+
+\f
+/**
+ * @brief Handler to De initialize hash list
+ *       
+ * @param[in]    gCb      RLC Instance Control Block
+ *
+ * @return  Void
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmUlDeInit
+(
+KwCb *gCb
+)
+#else
+PUBLIC Void kwDbmUlDeInit(gCb)
+KwCb *gCb;
+#endif
+{
+   TRC3(kwDbmUlDeInit);
+
+
+   /* De Initialize ueCb Hash List */
+   cmHashListDeinit(&(gCb->u.ulCb->ueLstCp));
+
+   /* De Initialize cellCb Hash List */
+   cmHashListDeinit(&(gCb->u.ulCb->cellLstCp));
+
+   /* De Initialize transaction Hash List */
+   cmHashListDeinit(&(gCb->u.ulCb->transIdLstCp));
+/* kw005.201 added support for L2 Measurement */         
+#ifdef LTE_L2_MEAS_RLC
+   /* De Initialize qciCb Hash List */
+   cmHashListDeinit(&(kwCb.kwL2Cb.qciHlCp));
+#endif /* LTE_L2_MEAS */
+
+   RETVOID;
+} /* kwDbmDeInit */
+
+
+/**
+ * @brief Handler to fetch rbCb by the rlcId
+ *       
+ * @details
+ *    This function is invoked by CFG to fetch rbCb from the cellCb/ueCb in
+ *    the upper interface (CKW/KWU).
+ *
+ * @param[in]    gCb     RLC Instance Control Block
+ * @param[in]    rlcId   RLC Identifier 
+ * @param[out]   rbCb    RB Control Block
+ *
+ * @return  Void
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmFetchUlRbCbByRbId
+(
+KwCb         *gCb,
+CmLteRlcId   *rlcId,  
+KwUlRbCb     **rbCb  
+)
+#else
+PUBLIC Void kwDbmFetchUlRbCbByRbId(gCb, rlcId, rbCb)
+KwCb         *gCb;
+CmLteRlcId   *rlcId;    
+KwUlRbCb     **rbCb;   
+#endif
+{
+   TRC3(kwDbmFetchUlRbCbByRbId)
+
+   *rbCb= NULLP;
+
+   /* Check for UE CB or CELL CB */
+   if (rlcId->ueId == 0)
+   {
+      KwUlCellCb *cellCb;
+
+      if(rlcId->rbId >= KW_MAX_RB_PER_CELL)
+      {
+         RLOG_ARG3(L_ERROR,DBG_RBID,rlcId->rbId ,
+               "Invalid RbId, cellId:%d UEID:%d Max is [%d]",
+               rlcId->cellId, 
+               rlcId->ueId,
+               KW_MAX_RB_PER_CELL);
+         RETVOID;
+      }
+
+      kwDbmFetchUlCellCb(gCb,rlcId->cellId, &cellCb);
+      if(!cellCb)
+      {
+         RLOG_ARG2(L_ERROR,DBG_CELLID,rlcId->cellId,
+               "CellCb not found RBID:%d UEID:%d",
+               rlcId->rbId,
+               rlcId->ueId);
+         RETVOID;
+      }
+
+      *rbCb = cellCb->rbCb[rlcId->rbId];
+   }
+   else
+   {
+      KwUlUeCb *ueCb;
+
+      if (!(KW_VALIDATE_UE_RBID(rlcId->rbType, rlcId->rbId)))
+      {
+         RLOG_ARG3(L_ERROR,DBG_RBID, rlcId->rbId,
+               "Invalid RbId for RbType[%d] CELLID:%d UEID:%d", 
+               rlcId->rbType,
+               rlcId->cellId,
+               rlcId->ueId);
+         RETVOID;
+      }
+
+      if (kwDbmFetchUlUeCb(gCb,rlcId->ueId, rlcId->cellId, &ueCb) != ROK)
+      {
+         RLOG_ARG2(L_ERROR,DBG_CELLID, rlcId->cellId,
+               "UeId [%d]: UeCb not found RBID:%d",
+               rlcId->ueId,
+               rlcId->rbId);
+         RETVOID;
+      }
+
+      KW_DBM_GET_RBCB_FROM_UECB(rlcId->rbId, rlcId->rbType, ueCb, *rbCb);
+   }
+   RETVOID;
+} /* kwDbmFetchUlRbCbByRbId */
+
+\f
+/**
+ * @brief Handler to fetch rbCb from Local Channel Id 
+ *
+ * @details
+ *    This function is invoked by CFG to fetch rbCb from the cellCb/ueCb
+ *    from local Channel Id (CKW/KWU).
+ *
+ * @param[in]    gCb      -  RLC Instance Control Block
+ * @param[in]    cellId   -  CELL Identifier 
+ * @param[in]    ueId     -  UE Identifier 
+ * @param[in]    lcId     -  Logical Channel Identifier
+ * @param[out]   rbCb     -  RB Control Block
+ *
+ * @return  Void
+ *
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmFetchUlRbCbFromLchId
+(
+KwCb          *gCb,
+CmLteRnti     ueId,      
+CmLteCellId   cellId,   
+CmLteLcId     lcId,    
+KwUlRbCb      **rbCb  
+)
+#else
+PUBLIC Void kwDbmFetchUlRbCbFromLchId(gCb, ueId, cellId, lcId, rbCb)
+KwCb          *gCb;
+CmLteRnti     ueId;     
+CmLteCellId   cellId;  
+CmLteLcId     lcId;   
+KwUlRbCb      **rbCb;
+#endif
+{
+   KwUlUeCb *ueCb;
+
+   TRC3(kwDbmFetchUlRbCbFromLchId)
+
+
+   *rbCb = NULLP;
+   
+   /* Check for UE CB or CELL CB */
+   if (ueId == 0)
+   {
+      KwUlCellCb *cellCb;
+      
+      kwDbmFetchUlCellCb(gCb,cellId, &cellCb);
+      if(!cellCb)
+      {
+         RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,"CellCb not found UEID:%d",ueId);
+         RETVOID;
+      }
+
+      *rbCb = cellCb->lCh[lcId - 1].ulRbCb;
+      RETVOID;
+   }
+   
+   if (kwDbmFetchUlUeCb(gCb,ueId, cellId, &ueCb) != ROK)
+   {
+      RLOG_ARG1(L_ERROR,DBG_CELLID, cellId,"UeId [%d]: UeCb not found",ueId);
+      RETVOID;
+   }
+
+   *rbCb = ueCb->lCh[lcId - 1].ulRbCb;
+
+   RETVOID;
+} /* kwDbmFetchRbCbFromLchId */
+
+\f
+/**
+ * @brief Handler to delete RbCb
+ *       
+ * @details 
+ *    This function is invoked by CFG to remove RbCb from Ue/Cell hashlist 
+ *
+ * @param[in] gCb       - RLC Instance Control Block
+ * @param[in] rbCbLst   - Rb Cb List
+ * @param[in] numRbCb   - Number of rbCbs
+ *
+ * @return  Void
+ *
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmDelAllUlRb
+(
+KwCb       *gCb,
+KwUlRbCb   **rbCbLst,          
+U8         numRbCb            
+)
+#else
+PUBLIC Void kwDbmDelAllUlRb(gCb, rbCbLst, numRbCb)
+KwCb       *gCb;
+KwUlRbCb   **rbCbLst;        
+U8         numRbCb;         
+#endif
+{
+   U32 idx; /* Index */
+
+   TRC3(kwDbmDelAllUlRb)
+
+
+   for (idx = 0; idx < numRbCb; idx++)
+   {
+      if (rbCbLst[idx] != NULLP)
+      {
+         /* Free the Buffers of RbCb */
+         if( CM_LTE_MODE_UM == rbCbLst[idx]->mode ) 
+         {
+            kwUmmFreeUlRbCb(gCb,rbCbLst[idx]);
+         }
+         else if(CM_LTE_MODE_AM == rbCbLst[idx]->mode) 
+         {
+            kwAmmFreeUlRbCb(gCb,rbCbLst[idx]);
+         }
+     
+         KW_FREE (gCb,rbCbLst[idx], sizeof (KwUlRbCb));
+      }
+   }
+
+   RETVOID;
+} /* kwDbmDelAllRb */
+
+\f
+/**
+ * @brief  Handler to create an UeCb
+ *
+ * @details  
+ *    This function is invoked by CFG to create UeCb and insert into the 
+ *    Ue hashlist of KwCb.
+ *
+ * @param[in] gCb       RLC Instance Control Block
+ * @param[in] ueId      UE Identifier 
+ * @param[in] cellId    Cell Identifier 
+ * @param[in] ueCb      UE Control Block 
+ *
+ * @return  S16
+ *    -# ROK 
+ *    -# RFAILED 
+ *
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmAddUlUeCb
+(
+KwCb          *gCb,
+CmLteRnti     ueId,       
+CmLteCellId   cellId,    
+KwUlUeCb      *ueCb    
+)
+#else
+PUBLIC S16 kwDbmAddUlUeCb(gCb, ueId, cellId, ueCb)
+KwCb          *gCb;
+CmLteRnti     ueId;    
+CmLteCellId   cellId; 
+KwUlUeCb      *ueCb;
+#endif
+{
+   TRC3(kwDbmAddUlUeCb)
+
+
+   ueCb->ueId = ueId;
+   ueCb->cellId = cellId;
+
+   if(ROK != cmHashListInsert(&(gCb->u.ulCb->ueLstCp), 
+                              (PTR)ueCb, 
+                              (U8 *)&(ueCb->ueId),
+                              (U16) sizeof(CmLteRnti)))
+   {
+      RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,
+            "UeId[%u] HashList Insertion Failed",
+            ueId);
+      RETVALUE(RFAILED);
+   }
+   /* kw005.201 ccpu00117318, updating the statistics */
+   gCb->genSts.numUe++;
+
+
+   RETVALUE(ROK);
+} 
+
+\f
+/**
+ * @brief Handler to add a transaction 
+ *
+ * @details
+ *    This function adds a transaction. 
+ *
+ * @param[in] gCb     RLC Instance Control Block
+ * @param[in] cfg     Configuration information
+ *
+ * @return  S16
+ *    -# ROK 
+ *    -# RFAILED 
+ *
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmAddUlTransaction 
+(
+KwCb        *gCb,
+KwUlCfgTmpData   *cfg
+)
+#else
+PUBLIC S16 kwDbmAddUlTransaction(gCb, cfg)
+KwCb        *gCb;
+KwUlCfgTmpData   *cfg;
+#endif
+{
+   TRC3(kwDbmAddUlTransaction)
+
+#ifndef ALIGN_64BIT
+   RLOG1(L_DEBUG, "(transId(%ld)", cfg->transId);
+#else
+   RLOG1(L_DEBUG, "(transId(%d))", cfg->transId);
+#endif
+
+   RETVALUE(cmHashListInsert(&(gCb->u.ulCb->transIdLstCp), 
+                             (PTR)cfg, 
+                             (U8 *)&(cfg->transId), 
+                             (U16) sizeof(cfg->transId)));
+} 
+
+\f
+/**
+ * @brief Handler to find a transaction 
+ *       
+ * @details
+ *    This function find transaction using transaction Id 
+ *
+ *
+ * @param[in] gCb       RLC Instance Control Block
+ * @param[in] transId   Transaction Id 
+ * @param[out] cfg      Configuration information attached to this transaction
+ *
+ * @return  S16
+ *    -# ROK 
+ *    -# RFAILED 
+ *
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmFindUlTransaction
+(
+KwCb             *gCb,
+U32              transId,
+KwUlCfgTmpData   **cfg
+)
+#else
+PUBLIC S16 kwDbmFindUlTransaction(gCb, cfg)
+KwCb             *gCb;
+U32              transId;
+KwUlCfgTmpData   **cfg;
+#endif
+{
+   TRC3(kwDbmFindUlTransaction)
+
+   if(ROK != cmHashListFind(&(gCb->u.ulCb->transIdLstCp),
+                            (U8 *) &transId, 
+                            sizeof (transId), 
+                            KW_DEF_SEQ_NUM,(PTR *) cfg))
+   {
+      RLOG1(L_ERROR,"TransId [%ld] not found",transId);
+      RETVALUE(RFAILED);
+   }
+   RETVALUE(ROK);
+}
+
+\f
+/**
+ *
+ * @brief Handler to delete a transaction 
+ *
+ * @details
+ *    This function deletes a transaction 
+ *
+ *
+ *  @param[in] gCb     RLC Instance Control Block
+ *  @param[in] cfg     Configuration information
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED 
+ *
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmDelUlTransaction
+(
+KwCb             *gCb,
+KwUlCfgTmpData   *cfg       
+)
+#else
+PUBLIC S16 kwDbmDelUlTransaction(gCb, cfg)
+KwCb             *gCb;
+KwUlCfgTmpData   *cfg;     
+#endif
+{
+   TRC3(kwDbmDelUlTransaction)
+
+
+   if(cmHashListDelete(&(gCb->u.ulCb->transIdLstCp),(PTR) (cfg)) != ROK) 
+   {
+      RLOG0(L_ERROR,"HashList Deletion failed");
+      RETVALUE(RFAILED);
+   }
+
+   RETVALUE(ROK);
+}
+
+\f
+/**
+ * @brief Handler to delete all transaction 
+ *
+ * @details
+ *    This function deletes all transaction 
+ *
+ * @param[in] gCb     RLC Instance Control Block
+ *
+ * @return  S16
+ *    -# ROK 
+ *    -# RFAILED 
+ *
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmDelAllUlTransactions
+(
+KwCb *gCb
+)
+#else
+PUBLIC S16 kwDbmDelAllUlTransactions(gCb)
+KwCb *gCb;
+#endif
+{
+   KwUlCfgTmpData *cfg = NULL;
+
+   TRC3(kwDbmDelAllUlTransctions)
+
+   /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
+   while (ROK == cmHashListGetNext(&(gCb->u.ulCb->transIdLstCp), 
+                                   (PTR) cfg, 
+                                   (PTR *)&cfg))
+   {
+      if(kwDbmDelUlTransaction(gCb, cfg) != ROK)
+      {
+         RETVALUE(RFAILED);
+      }
+      
+      cfg = NULLP;
+   }
+
+   RETVALUE(ROK);
+}
+
+\f
+/**
+ * @brief Handler to Fetch an UeCb
+ *
+ * @details
+ *    This function is invoked by CFG to fetch UeCb from the Ue hashlist 
+ *    of KwCb.
+ *
+ * @param[in]    gCb       RLC Instance Control Block 
+ * @param[in]    ueId      UE Identifier 
+ * @param[in]    cellId    Cell Identifier 
+ * @param[out]   ueCb      UE Control Block
+ *
+ * @return  S16
+ *    -# ROK 
+ *    -# RFAILED 
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmFetchUlUeCb
+(
+KwCb          *gCb,
+CmLteRnti     ueId,  
+CmLteCellId   cellId, 
+KwUlUeCb      **ueCb   
+)
+#else
+PUBLIC S16 kwDbmFetchUlUeCb(gCb,ueId, cellId, ueCb)
+KwCb          *gCb;
+CmLteRnti     ueId;     
+CmLteCellId   cellId;    
+KwUlUeCb      **ueCb;     
+#endif
+{
+   TRC3(kwDbmFetchUlUeCb)
+
+
+   RETVALUE(cmHashListFind(&(gCb->u.ulCb->ueLstCp), 
+                           (U8 *)&(ueId), sizeof(CmLteRnti),
+                           KW_DEF_SEQ_NUM, 
+                           (PTR *) ueCb));
+}
+
+\f
+/**
+ * @brief Handler to delete an UeCb
+ *
+ * @details
+ *    This function is invoked by CFG to delete UeCb from the Ue hashlist 
+ *    of KwCb.
+ *
+ *
+ * @param[in] gCb      RLC Instance Control Block
+ * @param[in] ueCb     UE Control Block
+ * @param[in] abrtFlag Abort Flag
+ *
+ * @return Void
+ *
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmDelUlUeCb
+(
+KwCb       *gCb,
+KwUlUeCb   *ueCb,       
+Bool       abortFlag   
+)
+#else
+PUBLIC Void kwDbmDelUlUeCb(gCb,eCb, abortFlag)
+KwCb       *gCb;
+KwUlUeCb   *ueCb;      
+Bool       abortFlag; 
+#endif
+{
+   TRC3(kwDbmDelUlUeCb)
+
+
+#if  (!defined(KW_PDCP) || !(defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))
+   UNUSED(abortFlag);
+#endif /* (!defined(KW_PDCP) || ! (defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))*/
+
+   /* Delete all logical channels */
+   KW_MEM_ZERO(ueCb->lCh,sizeof(KwUlLch) * KW_MAX_LCH_PER_UE);
+
+   /* Delete all SRB RbCbs in UeCb */
+   kwDbmDelAllUlRb(gCb,ueCb->srbCb, KW_MAX_SRB_PER_UE);
+
+   /* Delete all DRB RbCbs in UeCb */
+   kwDbmDelAllUlRb(gCb,ueCb->drbCb, KW_MAX_DRB_PER_UE);
+
+   /* Delete ueCb entry from ueLstCp */
+   if(ROK != cmHashListDelete(&(gCb->u.ulCb->ueLstCp), (PTR) ueCb))
+   {
+      RLOG_ARG1(L_ERROR,DBG_UEID,ueCb->ueId,
+            "HashList Deletion Failed cellId(%d)",
+            ueCb->cellId);
+   }
+   /* kw005.201 ccpu00117318, updating the statistics */
+   gCb->genSts.numUe--;
+   /* Deallocate ueCb */
+   KW_FREE(gCb,ueCb, sizeof(KwUlUeCb));
+
+   RETVOID;
+}
+\f
+/**
+ * @brief Handler to delete all UeCbs
+ *
+ * @details
+ *    This function is invoked by CFG to delete all UeCbs from the Ue 
+ *    hashlist of KwCb.
+ *
+ * @param[in] gCb      RLC Instance Control Block
+ *
+ * @return  Void
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmDelAllUlUe
+(
+KwCb *gCb
+)
+#else
+PUBLIC Void kwDbmDelAllUlUe(gCb)
+KwCb *gCb;
+#endif
+{
+   KwUlUeCb *ueCb = NULLP;  /* UE Control Block */
+
+   TRC3(kwDbmDelAllUlUe)
+
+
+   /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
+   while (ROK == cmHashListGetNext(&(gCb->u.ulCb->ueLstCp), 
+                                   (PTR) ueCb, 
+                                   (PTR *)&ueCb))
+   {
+      kwDbmDelUlUeCb(gCb,ueCb, TRUE);
+
+      ueCb = NULLP;
+   }
+
+   RETVOID;
+}
+
+
+/**
+ * @brief Handler to create CellCb
+ *
+ * @details
+ *    This function is invoked by CFG to create CellCb and insert into
+ *    the Cell hashlist of KwCb.
+ *
+ *  @param[in] gCb      RLC Instance Control Block
+ *  @param[in] cellId   Cell Identifier 
+ *  @param[in] cellCb   Cell Control Block 
+ *
+ *  @return  S16
+ *     -# ROK 
+ *     -# RFAILED 
+*/
+#ifdef ANSI
+PUBLIC S16 kwDbmAddUlCellCb
+(
+KwCb          *gCb,
+CmLteCellId   cellId,    
+KwUlCellCb    *cellCb  
+)
+#else
+PUBLIC S16 kwDbmAddUlCellCb(gCb, cellId, cellCb)
+KwCb          *gCb;
+CmLteCellId   cellId;    
+KwUlCellCb    *cellCb;  
+#endif
+{
+   KwUlCellCb *tCellCb; 
+
+   TRC3(kwDbmAddUlCellCb)
+
+
+
+   tCellCb = cellCb;
+   tCellCb->cellId = cellId;
+
+   if(ROK != cmHashListInsert(&(gCb->u.ulCb->cellLstCp), 
+                              (PTR) tCellCb,
+                              (U8 *)&(tCellCb->cellId), 
+                              (U16) sizeof(CmLteCellId)))
+   {
+      RLOG_ARG0(L_ERROR,DBG_CELLID,tCellCb->cellId,
+            "HashList Insertion Failed");
+      RETVALUE(RFAILED);
+   }
+
+   RETVALUE(ROK);
+} 
+
+\f
+/**
+ * @brief Handler to Fetch an CellCb
+ *       
+ * @details
+ *    This function is invoked by CFG to fetch UeCb from the Ue hashlist 
+ *    of KwCb.
+ *
+ * @param[in]    gCb      RLC Instance Control Block
+ * @param[in]    cellId   Cell Identifier 
+ * @param[out]   cellCb   UE Control Block
+ *
+ * @return  S16
+ *    -# ROK 
+ *    -# RFAILED 
+ *
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmFetchUlCellCb
+(
+KwCb          *gCb,
+CmLteCellId   cellId,     
+KwUlCellCb    **cellCb   
+)
+#else
+PUBLIC Void kwDbmFetchUlCellCb(gCb, cellId, cellCb)
+KwCb          *gCb;
+CmLteCellId   cellId;    
+KwUlCellCb    **cellCb;  
+#endif
+{
+   TRC3(kwDbmFetchUlCellCb)
+
+
+   *cellCb = NULLP;
+   if(ROK != cmHashListFind(&(gCb->u.ulCb->cellLstCp), 
+                            (U8 *)&(cellId),sizeof(CmLteCellId), 
+                            KW_DEF_SEQ_NUM, (PTR*) cellCb))
+   {
+      RLOG_ARG0(L_ERROR,DBG_CELLID, cellId,"CellCb not found");
+   }
+
+   RETVOID;
+}
+
+\f
+/**
+ * @brief Handler to delete CellCb
+ *
+ * @details
+ *    This function is invoked by CFG to delete CellCb from the Cell hashlist 
+ *    of KwCb.
+ *
+ *  @param[in] gCb      RLC Instance Control Block
+ *  @param[in] cellCb   Cell Control Block
+ *
+ *  @return  Void
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmDelUlCellCb
+(
+KwCb         *gCb,
+KwUlCellCb   *cellCb     
+)
+#else
+PUBLIC Void kwDbmDelUlCellCb(gCb, cellCb)
+KwCb         *gCb;
+KwUlCellCb   *cellCb;     
+#endif
+{
+   TRC3(kwDbmDelUlCellCb)
+
+
+   /* Delete all rbCbs in cellCb */
+   kwDbmDelAllUlRb(gCb,cellCb->rbCb, KW_MAX_RB_PER_CELL);
+
+   /* Delete cellCb entry in hash list cellLstCp */
+   if(ROK != cmHashListDelete(&(gCb->u.ulCb->cellLstCp), (PTR) cellCb))
+   {
+      RLOG_ARG0(L_ERROR,DBG_CELLID,cellCb->cellId,
+            "HashList Deletion Failed");
+   }
+   /* Deallocate cellCb */
+   KW_FREE(gCb, cellCb, sizeof(KwUlCellCb));
+
+   RETVOID;
+} /* kwDbmDelCellCb */
+
+\f
+/**
+ * @brief Handler to delete all UeCbs
+ *       
+ * @details
+ *    This function is invoked by CFG to delete all UeCbs from the Ue
+ *    hashlist of KwCb.
+ * @param[in] gCb      RLC Instance Control Block
+ *
+ * @return  Void
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmDelAllUlCell
+(
+KwCb *gCb
+)
+#else
+PUBLIC Void kwDbmDelAllUlCell(gCb)
+KwCb *gCb;
+#endif
+{
+   KwUlCellCb *cellCb = NULLP; /* Cell Control Block */
+
+   TRC3(kwDbmDelAllUlCell)
+
+
+   /* Until no more cellCb is ueLstCp hash list get and delete cellCb */
+   while (ROK == cmHashListGetNext(&(gCb->u.ulCb->cellLstCp), 
+                                   (PTR) cellCb, 
+                                   (PTR *)&cellCb))
+   {
+      kwDbmDelUlCellCb(gCb,cellCb);
+
+      cellCb = NULLP;
+   }
+
+   RETVOID;
+} 
+
+\f
+/**
+ * @brief Handler to delete all UeCbs and CellCbs
+ *       
+ * @details
+ *    This function is invoked by LMM to delete all UeCbs from the Ue
+ *    hashlist of KwCb and cellCbs from the Cell hashlist of kwCb.
+ * 
+ * @param[in] gCb      RLC Instance Control Block
+ *
+*/
+#ifdef ANSI
+PUBLIC Void kwDbmUlShutdown
+(
+KwCb *gCb
+)
+#else
+PUBLIC Void kwDbmUlShutdown(gCb)
+KwCb *gCb;
+#endif
+{
+   TRC3(kwDbmUlShutdown)
+
+   kwDbmDelAllUlCell(gCb);
+
+   kwDbmDelAllUlUe(gCb);
+
+   kwDbmUlDeInit(gCb);
+
+   RETVOID;
+}
+
+
+/********************************************************************30**
+  
+         End of file
+**********************************************************************/