UL data path changes at Phy stub, RLC UL UM and DU APP [Issue-ID: ODUHIGH-262]
[o-du/l2.git] / src / 5gnrrlc / kw_utl_ul.c
index f11e7cc..d27d1da 100755 (executable)
@@ -34,9 +34,6 @@
      File:     kw_utl_ul.c
 
 **********************************************************************/
-static const char* RLOG_MODULE_NAME="UTL";
-static int RLOG_MODULE_ID=2048;
-static int RLOG_FILE_ID=210;
 
 /** @file kw_utl_ul.c
 @brief RLC Utility Module 
@@ -120,7 +117,7 @@ uint8_t rlcUtlRcvFrmMac(RlcCb *gCb, KwDatIndInfo  *datIndInfo)
          {
             if(datIndInfo->lchData[i].pdu.mBuf[j])
             {
-               RLC_FREE_BUF_WC(datIndInfo->lchData[i].pdu.mBuf[j]);
+               ODU_PUT_MSG_BUF(datIndInfo->lchData[i].pdu.mBuf[j]);
             }
          }
       }
@@ -155,7 +152,7 @@ uint8_t rlcUtlRcvFrmMac(RlcCb *gCb, KwDatIndInfo  *datIndInfo)
          {
             if(pduInfo->mBuf[j])
             {
-               RLC_FREE_BUF_WC(pduInfo->mBuf[j]);
+               ODU_PUT_MSG_BUF(pduInfo->mBuf[j]);
             }
          }
          continue;
@@ -164,7 +161,7 @@ uint8_t rlcUtlRcvFrmMac(RlcCb *gCb, KwDatIndInfo  *datIndInfo)
 #ifdef SS_RBUF
       SMrkUlPkt(pduInfo->mBuf[0]);
 #endif
-      if ( rbCb->mode == CM_LTE_MODE_UM )
+      if ( rbCb->mode == RLC_MODE_UM )
       {
 /* kw005.201 added support for L2 Measurement */
 #ifdef LTE_L2_MEAS
@@ -173,7 +170,7 @@ uint8_t rlcUtlRcvFrmMac(RlcCb *gCb, KwDatIndInfo  *datIndInfo)
          rlcUmmProcessPdus(gCb,rbCb,pduInfo);
 #endif
       }
-      else if (rbCb->mode == CM_LTE_MODE_AM )
+      else if (rbCb->mode == RLC_MODE_AM )
       {
 /* kw005.201 added support for L2 Measurement */
 #ifdef LTE_L2_MEAS
@@ -207,7 +204,8 @@ uint8_t rlcUtlSendUlDataToDu(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *sdu)
    KwuDatIndInfo   *datIndInfo;   /* Data Indication Information */
    KwuDatIndInfo datIndInfoTmp;
 #endif
-   RlcUlRrcMsgInfo *ulRrcMsgInfo;
+   RlcUlRrcMsgInfo  *ulRrcMsgInfo;
+   RlcUlUserDatInfo *ulUserDatInfo;
    uint16_t        msgLen, copyLen;
    Pst             pst;
 
@@ -215,16 +213,13 @@ uint8_t rlcUtlSendUlDataToDu(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *sdu)
    /* Creating static memory for KwuDatIndInfo. #else will be 
     * removed once the testing is done on all platforms */
    datIndInfo = &datIndInfoTmp;
-
-#if (ERRCLASS & ERRCLS_ADD_RES )
-   if ( datIndInfo == NULLP  )
+   if (datIndInfo == NULLP)
    {
-      DU_LOG("\nRLC : rlcUtlSendUlDataToDu: Memory allocation failed UEID:%d \
+      DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed UEID:%d \
          CELLID:%d", rbCb->rlcId.ueId, rbCb->rlcId.cellId);
-      RLC_FREE_BUF(sdu);
+      ODU_PUT_MSG_BUF(sdu);
       return RFAILED;
    }
-#endif /* ERRCLASS & ERRCLS_ADD_RES */
 
    RLC_MEM_CPY(&(datIndInfo->rlcId),&(rbCb->rlcId),sizeof(CmLteRlcId));
    /* Set the "isOutofSeq" flag for each packet 
@@ -232,67 +227,102 @@ uint8_t rlcUtlSendUlDataToDu(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *sdu)
    datIndInfo->isOutOfSeq = rbCb->m.amUl.isOutOfSeq; 
 #endif /* KW_PDCP */
    
-   /* Filling UL RRC Message Info */
-   RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
-      ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
-   if (ulRrcMsgInfo)
+   if(rbCb->rlcId.rbType == RB_TYPE_SRB)
    {
-       ulRrcMsgInfo->cellId = rbCb->rlcId.cellId;
-       ulRrcMsgInfo->ueIdx = rbCb->rlcId.ueId;
-       ulRrcMsgInfo->lcId = rbCb->lch.lChId;
-       RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
-          ulRrcMsgInfo->rrcMsg, msgLen);
-       if (ulRrcMsgInfo->rrcMsg)
-       {
-          ODU_GET_MSG_LEN(sdu, (MsgLen *)&msgLen);
-          ODU_COPY_MSG_TO_FIX_BUF(sdu, 0, msgLen, ulRrcMsgInfo->rrcMsg, (MsgLen *)&copyLen);
-          ulRrcMsgInfo->msgLen = msgLen;
-
-          /* Sending UL RRC Message transfeer to DU APP */
-          memset(&pst, 0, sizeof(Pst));
-          FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_RRC_MSG_TRANS_TO_DU);
-          rlcSendUlRrcMsgToDu(&pst, ulRrcMsgInfo);
-       }
-       else
-       {
-          DU_LOG("\nRLC : rlcUtlSendUlDataToDu: Memory allocation failed for rrcMsg");
-         RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
-         return RFAILED;
-       }
-    }
-    else
-    {
-       DU_LOG("\nRLC : rlcUtlSendUlDataToDu: Memory allocation failed for ulRrcMsgInfo");
-       return RFAILED;
-    }
-
+      /* Filling UL RRC Message Info if UL msg is not received on SRBs*/
+      RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
+           ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
+      if (ulRrcMsgInfo)
+      {
+        ulRrcMsgInfo->cellId = rbCb->rlcId.cellId;
+        ulRrcMsgInfo->ueIdx = rbCb->rlcId.ueId;
+        ulRrcMsgInfo->lcId = rbCb->lch.lChId;
+        RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL,
+              ulRrcMsgInfo->rrcMsg, msgLen);
+        if (ulRrcMsgInfo->rrcMsg)
+        {
+           ODU_GET_MSG_LEN(sdu, (MsgLen *)&msgLen);
+           ODU_COPY_MSG_TO_FIX_BUF(sdu, 0, msgLen, ulRrcMsgInfo->rrcMsg, (MsgLen *)&copyLen);
+           ulRrcMsgInfo->msgLen = msgLen;
+
+           /* Sending UL RRC Message transfeer to DU APP */
+           memset(&pst, 0, sizeof(Pst));
+           FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_RRC_MSG_TRANS_TO_DU);
+           rlcSendUlRrcMsgToDu(&pst, ulRrcMsgInfo);
+        }
+        else
+        {
+           DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for rrcMsg");
+           RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
+           return RFAILED;
+        }
+      }
+      else
+      {
+        DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for ulRrcMsgInfo");
+        return RFAILED;
+      }
+   }
+   else if(rbCb->rlcId.rbType == RB_TYPE_DRB)
+   {
+      /* Filling UL User Data Info if UL msg is received on a DRB */
+      RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo, sizeof(RlcUlUserDatInfo));
+      if (ulUserDatInfo)
+      {
+        ulUserDatInfo->cellId = rbCb->rlcId.cellId;
+        ulUserDatInfo->ueIdx = rbCb->rlcId.ueId;
+         ulUserDatInfo->rbId = rbCb->rlcId.rbId;
+        RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo->userData, msgLen);
+        if (ulUserDatInfo->userData)
+        {
+           ODU_GET_MSG_LEN(sdu, (MsgLen *)&msgLen);
+           ODU_COPY_MSG_TO_FIX_BUF(sdu, 0, msgLen, ulUserDatInfo->userData, (MsgLen *)&copyLen);
+           ulUserDatInfo->msgLen = msgLen;
+
+           /* Sending UL RRC Message transfeer to DU APP */
+           memset(&pst, 0, sizeof(Pst));
+           FILL_PST_RLC_TO_DUAPP(pst, RLC_UL_INST, EVENT_UL_USER_DATA_TRANS_TO_DU);
+           rlcSendUlUserDataToDu(&pst, ulUserDatInfo);
+        }
+        else
+        {
+           DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for user data");
+           RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_UL, RLC_POOL, ulUserDatInfo, sizeof(RlcUlUserDatInfo));
+           return RFAILED;
+        }
+      }
+      else
+      {
+        DU_LOG("\nERROR  -->  RLC_UL: rlcUtlSendUlDataToDu: Memory allocation failed for ulUserDatInfo");
+        return RFAILED;
+      }
+   }
    return ROK;
 } /* rlcUtlSendUlDataToDu */
 
 
-PRIVATE Void dumpRLCUlRbInformation(RlcUlRbCb* ulRbCb)
+static Void dumpRLCUlRbInformation(RlcUlRbCb* ulRbCb)
 {
-   if(ulRbCb->mode == CM_LTE_MODE_UM)
+   if(ulRbCb->mode == RLC_MODE_UM)
    {
       uint32_t i;
       uint32_t pdusInReceptionBuffer = 0;
-      uint32_t windSz  = ulRbCb->m.umUl.umWinSz << 1;
+      uint32_t totalSegs = 0;
 
-      for(i = 0; i< windSz; i++)
+      for(i = 0; i< RLC_RCV_BUF_BIN_SIZE; i++)
       {
-         if(ulRbCb->m.umUl.recBuf[i] != NULLP)
+         RlcUmRecBuf *recBuf = rlcUtlGetUmRecBuf(ulRbCb->m.umUl.recBufLst, i);
+         if(recBuf != NULLP)
          {
-            pdusInReceptionBuffer++;
+            pdusInReceptionBuffer++;
+            totalSegs += (recBuf->segLst.count);
          }
       }
       
-      RLOG_ARG3(L_DEBUG,DBG_RBID,ulRbCb->rlcId.rbId,
-               "UM UL UEID:%d CELLID:%d Reception Buffer size = %d", 
-                       (int)ulRbCb->rlcId.ueId,
-                       (int)ulRbCb->rlcId.cellId,
-                       (int)pdusInReceptionBuffer);
+      DU_LOG("\nDEBUG  -->  RLC_UL: UM UL UEID:%d CELLID:%d Reception Buffer size = %d Total segs = %d", 
+         ulRbCb->rlcId.ueId, ulRbCb->rlcId.cellId, pdusInReceptionBuffer, totalSegs);
    }
-   else if(ulRbCb->mode == CM_LTE_MODE_AM)
+   else if(ulRbCb->mode == RLC_MODE_AM)
    {
       uint32_t i;
       uint32_t pdusInReceptionBuffer = 0;
@@ -309,13 +339,8 @@ PRIVATE Void dumpRLCUlRbInformation(RlcUlRbCb* ulRbCb)
          }
       }
 
-      RLOG_ARG4(L_DEBUG,DBG_RBID,ulRbCb->rlcId.rbId,
-                "AM UL UEID:%d CELLID:%d Reception Buf size = %d"
-                "total segs = %d", 
-                       (int)ulRbCb->rlcId.ueId,
-                       (int)ulRbCb->rlcId.cellId,
-                       (int)pdusInReceptionBuffer, 
-                       (int)totalSegs);
+      DU_LOG("\nDEBUG  -->  RLC_UL: AM UL UEID:%d CELLID:%d Reception Buf size = %d total segs = %d", 
+         ulRbCb->rlcId.ueId, ulRbCb->rlcId.cellId, pdusInReceptionBuffer, totalSegs);
    }
 }
 
@@ -400,21 +425,9 @@ S16 rlcUtlL2MeasUlInit(RlcCb *gCb)
  *  @return  Void
  *
  */
-#ifdef ANSI
- Void rlcUtlCalUlIpThrPutIncTTI
-(
-RlcCb                  *gCb,
-RlcUlRbCb              *rbCb,
-uint32_t               ttiCnt
-)
-#else
-Void rlcUtlCalUlIpThrPutIncTTI(gCb, rbCb, ttiCnt)
-RlcCb                  *gCb;
-RlcUlRbCb              *rbCb;
-uint32_t               ttiCnt;
-#endif
+Void rlcUtlCalUlIpThrPutIncTTI(RlcCb *gCb,RlcUlRbCb *rbCb,uint32_t ttiCnt)
 {
-   VOLATILE uint32_t     startTime = 0;
+   volatile uint32_t     startTime = 0;
 
       /*starting Task*/
       SStartTask(&startTime, PID_RLC_IP_TPT_INCTTI);
@@ -478,24 +491,16 @@ uint32_t               ttiCnt;
  *  @return  Void
  *
  */
-#ifdef ANSI
- Void rlcUtlCalUlIpThrPut
+Void rlcUtlCalUlIpThrPut
 (
 RlcCb        *gCb,
 RlcUlRbCb    *rbCb,
 Buffer       *pdu,
 uint32_t     ttiCnt
 )
-#else
-Void rlcUtlCalUlIpThrPut(gCb, rbCb, pdu, ttiCnt)
-RlcCb        *gCb;
-RlcUlRbCb    *rbCb;
-Buffer       *pdu;
-uint32_t     ttiCnt;
-#endif
 {
    MsgLen        rlcSduSz = 0;  /*Holds length of Rlc Sdu*/
-   VOLATILE uint32_t     startTime = 0;
+   volatile uint32_t     startTime = 0;
 
    /*starting Task*/
    SStartTask(&startTime, PID_RLC_IP_TPT_INCVOL);
@@ -533,17 +538,7 @@ uint32_t     ttiCnt;
  *      -# ROK
  */
 
-#ifdef ANSI
-S16 rlcUtlHdlL2TmrExp
-(
-RlcCb          *gCb,
-RlcL2MeasEvtCb *measEvtCb
-)
-#else
-S16 rlcUtlHdlL2TmrExp(measEvtCb)
-RlcCb          *gCb;
-RlcL2MeasEvtCb *measEvtCb;
-#endif
+S16 rlcUtlHdlL2TmrExp(RlcCb *gCb,RlcL2MeasEvtCb *measEvtCb)
 {
 
 #ifdef LTE_L2_MEAS_RLC
@@ -563,7 +558,7 @@ RlcL2MeasEvtCb *measEvtCb;
          measCb->val.nonIpThMeas.measData[measCb->val.nonIpThMeas.qci[qciIdx]].actUe.sampOc++;
       }
       measEvtCb->val.nonIpThMeas.measCb.numSamples--;
-      rlcStartTmr(gCb, (PTR)measEvtCb, RLC_EVT_L2_TMR); 
+      rlcStartTmr(gCb, (PTR)measEvtCb, EVENT_RLC_L2_TMR); 
       return (ROK);
    }
 #endif
@@ -588,17 +583,7 @@ RlcL2MeasEvtCb *measEvtCb;
  *      -# ROK
  */
 
-#ifdef ANSI
-S16 rlcUtlSndUlL2MeasCfm
-(
-RlcCb                  *gCb,
-RlcL2MeasEvtCb         *measEvtCb
-)
-#else
-S16 rlcUtlSndUlL2MeasCfm(gCb, measEvtCb)
-RlcCb                  *gCb;
-RlcL2MeasEvtCb         *measEvtCb;
-#endif
+S16 rlcUtlSndUlL2MeasCfm(RlcCb *gCb,RlcL2MeasEvtCb  *measEvtCb)
 {
    uint32_t            qciIdx;
    RlcL2MeasCb         *measCb;
@@ -693,19 +678,7 @@ RlcL2MeasEvtCb         *measEvtCb;
  *      -# ROK
  */
 
-#ifdef ANSI
-S16 rlcUtlSndUlL2MeasNCfm
-(
-RlcCb           *gCb,
-RlcL2MeasReqEvt *measReqEvt,
-RlcL2MeasCfmEvt *measCfmEvt
-)
-#else
-S16 rlcUtlSndUlL2MeasNCfm(gCb, measReqEvt, measCfmEvt)
-RlcCb           *gCb;
-RlcL2MeasReqEvt *measReqEvt;
-RlcL2MeasCfmEvt *measCfmEvt;
-#endif
+S16 rlcUtlSndUlL2MeasNCfm(RlcCb *gCb,RlcL2MeasReqEvt *measReqEvt,RlcL2MeasCfmEvt *measCfmEvt)
 {
 
    RlcMiLkwL2MeasCfm(&gCb->genCfg.lmPst, measCfmEvt);
@@ -727,21 +700,13 @@ RlcL2MeasCfmEvt *measCfmEvt;
  *  @param[out] numLCh     Number of LCh in array lChId.
  **/
 
-#ifdef ANSI
 S16 rlcUtlValidateL2Meas
 (
 RlcL2MeasReqEvt *measReqEvt,
 RlcL2MeasCfmEvt *measCfmEvt,
-CmLteLcId      *lChId,
-uint8_t             *numLCh
+CmLteLcId       *lChId,
+uint8_t         *numLCh
 )
-#else
-S16 rlcUtlValidateL2Meas(measReqEvt, measCfmEvt, lChId, numLCh)
-RlcL2MeasReqEvt *measReqEvt;
-RlcL2MeasCfmEvt *measCfmEvt;
-CmLteLcId      *lChId;
-uint8_t             *numLCh;
-#endif
 {
    uint8_t    measType;
    S16        ret;
@@ -868,17 +833,7 @@ uint8_t             *numLCh;
 }/* rlcUtlValidateL2Meas */
 #endif
 
-#ifdef ANSI
-S16 rlcUtlValidateIpThL2Meas
-(
-RlcL2MeasReqEvt *measReqEvt,
-RlcL2MeasCfmEvt *measCfmEvt
-)
-#else
-S16 rlcUtlValidateIpThL2Meas(measReqEvt, measCfmEvt)
-RlcL2MeasReqEvt *measReqEvt;
-RlcL2MeasCfmEvt *measCfmEvt;
-#endif
+S16 rlcUtlValidateIpThL2Meas(RlcL2MeasReqEvt *measReqEvt,RlcL2MeasCfmEvt *measCfmEvt)
 {
    uint8_t      measType;
    uint8_t         lsbNibble = 0;
@@ -926,20 +881,8 @@ RlcL2MeasCfmEvt *measCfmEvt;
  *
  *  @return  Void
  */
-#ifdef ANSI
 
-Void rlcUtlResetUlL2MeasInRlcRb
-(
-RlcCb       *gCb,
-RlcL2MeasCb *measCb,
-uint8_t      measType
-)
-#else
-Void rlcUtlResetUlL2MeasInRlcRb(measCb, measType)
-RlcCb       *gCb;
-RlcL2MeasCb *measCb;
-uint8_t     measType;
-#endif
+Void rlcUtlResetUlL2MeasInRlcRb(RlcCb *gCb,RlcL2MeasCb *measCb,uint8_t measType)
 {
    uint32_t           rbIdx;
    uint32_t           ueIdx;
@@ -997,19 +940,7 @@ uint8_t     measType;
  *  @return  S16
  *      -# ROK
  */
-#ifdef ANSI
-Void rlcUtlPlcMeasDatInL2Sts
-(
-RlcL2Cntr       *measData, 
-RlcL2MeasRbCb   *rbL2Cb,
-uint8_t         measType
-)
-#else
-Void rlcUtlPlcMeasDatInL2Sts(measData, rbL2Cb, measType)
-RlcL2Cntr       *measData; 
-RlcL2MeasRbCb   *rbL2Cb;
-uint8_t         measType;
-#endif
+Void rlcUtlPlcMeasDatInL2Sts(RlcL2Cntr *measData,RlcL2MeasRbCb *rbL2Cb,uint8_t measType)
 {
    /* We should check the number of measType in the request. This can be done 
     * by looking at each bit in the measType. Also store the measData in the 
@@ -1104,7 +1035,7 @@ RlcAmRecBuf* rlcUtlGetRecBuf(CmLListCp *recBufLst, RlcSn sn)
       CM_LLIST_NEXT_NODE(recBufLstCp, node);
    }
    return NULLP;
-} /* rlcUtlStoreRecBuf */
+} /* rlcUtlGetRecBuf */
 /**
  *
  * @brief Delete the UL buffer from the list
@@ -1128,13 +1059,95 @@ void rlcUtlDelRecBuf(CmLListCp *recBufLst, RlcAmRecBuf *recBuf, RlcCb *gCb)
  
    recBufLstCp = &recBufLst[hashKey];
    cmLListDelFrm(recBufLstCp, &recBuf->lnk);
-   RLC_FREE_WC(gCb, recBuf, sizeof(RlcAmRecBuf));
+   RLC_FREE(gCb, recBuf, sizeof(RlcAmRecBuf));
 
    return;
 } /* rlcUtlDelRecBuf */
 
+/**
+ *
+ * @brief Store the UL buffer in hashList  
+ *
+ * @b Description
+ *
+ *  Use the SN % binSize as key and store the received UL buffer
+ *  @param[in] recBufLst       List CP array
+ *  @param[in] recBuf          received buffer
+ *  @param[in] sn              sn of the received buffer 
+ *
+ *  @return  Void
+ */
+void rlcUtlStoreUmRecBuf(CmLListCp *recBufLst, RlcUmRecBuf *recBuf, RlcSn sn)
+{
+   uint32_t    hashKey; 
+   
+   hashKey = (sn % RLC_RCV_BUF_BIN_SIZE ); 
+   recBuf->lnk.node = (PTR)recBuf;
+   cmLListAdd2Tail(&(recBufLst[hashKey]), &recBuf->lnk);
+
+   return;
+} /* rlcUtlStoreUmRecBuf */
 
+/**
+ *
+ * @brief Retrieve the UL buffer from the list
+ *
+ * @Description
+ *
+ *   Use the SN % binSize as key and retrieve the UL buffer
+ *  @param[in] recBufLst       List CP array
+ *  @param[in] sn              sn of the received buffer 
+ *
+ *  @return  Void
+ */
+RlcUmRecBuf* rlcUtlGetUmRecBuf(CmLListCp *recBufLst, RlcSn sn)
+{
+   uint32_t            hashKey; 
+   CmLListCp           *recBufLstCp;
+   RlcUmRecBuf         *recBuf;
+   CmLList             *node = NULLP;
+
+   hashKey = (sn % RLC_RCV_BUF_BIN_SIZE ); 
+   recBufLstCp = &recBufLst[hashKey];
+   CM_LLIST_FIRST_NODE(recBufLstCp, node);
+   while(node)
+   {
+      recBuf = (RlcUmRecBuf *) node->node;
+      if(recBuf->umHdr.sn == sn)
+      {
+         return recBuf;
+      }
+      CM_LLIST_NEXT_NODE(recBufLstCp, node);
+   }
+   return NULLP;
+} /* rlcUtlGetUmRecBuf */
+
+/**
+ *
+ * @brief Delete the UM Mode UL buffer from the list
+ *
+ *
+ * @details
+ *   Use the SN % binSize as key and retrieve the UL buffer
+ *
+ *  @param[in] *recBufLst       List CP array
+ *  @param[in] *recBuf          Received buffer
+ *
+ *  @return  Void
+ */
+void rlcUtlDelUmRecBuf(RlcCb *gCb, CmLListCp *recBufLst, RlcUmRecBuf  *recBuf)
+{
+   uint32_t   hashKey;
+   CmLListCp  *recBufLstCp;
 
+   hashKey = (recBuf->sn % RLC_RCV_BUF_BIN_SIZE );
+   recBufLstCp = &recBufLst[hashKey];
+   cmLListDelFrm(recBufLstCp, &recBuf->lnk);
+   RLC_FREE(gCb, recBuf, sizeof(RlcUmRecBuf));
+
+   return;
+} /* rlcUtlDelUmRecBuf */
 
 /********************************************************************30**
          End of file