/******************************************************************************* ################################################################################ # 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: NR RLC file for downlink and non real time tasks Type: C include file Desc: This file contains helper macros for RLC downlink and non real time task File: rlc_dl.h *********************************************************************21*/ /** @file rlc_dl.h @brief RLC Downlink helper macros */ #ifndef __RLC_DLH__ #define __RLC_DLH__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifdef TENB_STATS #ifndef L2_l3_SPLIT #include "pj_tenb_stats.x" #else #include "l2_tenb_stats.x" #endif #endif #define RLC_DL_INST 1 #define RLC_MAX_RNG_DEQ_INDX 8 /* Below are the status used within RLC */ #define RLC_SDU_OPAT_NOUPDATE 0 #define RLC_SDU_OPAT_UPD_TX 1 #define RLC_SDU_OPAT_UPD_RETX 2 /* Below are the status which needs to be updated to MAC */ #define RLC_RGU_SDU_OPAT_NOUPDATE 0 #define RLC_RGU_SDU_OPAT_UPDATE 1 #define RLC_RGU_SDU_OPAT_BREACH 2 /* PDB Values for various QCI bearers : This value is considered after taking into account a 20ms delay at the network */ #define RLC_PDB_VALUE_FOR_QCI1 80 #define RLC_PDB_VALUE_FOR_QCI2 130 #define RLC_PDB_VALUE_FOR_QCI3 30 #define RLC_PDB_VALUE_FOR_QCI4 280 #define RLC_PDB_VALUE_FOR_QCI5 80 #define RLC_PDB_VALUE_FOR_QCI6 280 #define RLC_PDB_VALUE_FOR_QCI7 80 #define RLC_PDB_VALUE_FOR_QCI8 280 #define RLC_PDB_VALUE_FOR_QCI9 280 #define RLC_DATA_BITMASK 0x80 /* Data bitmask is used to fill D/C bit for data*/ /** * @def RLC_MEAS_IS_DL_IP_MEAS_ON_FOR_RB * * This macro is used to check if DL IP throughput measurement is ON * or off for the passed rb * * Returns TRUE (non-zero) if measurement is ON else FALSE (zero) * * @param[in] _gCb RLC DL Cb * @param[in] _rbCb RLC downlink control block * */ #ifdef LTE_L2_MEAS #define RLC_MEAS_IS_DL_ANY_MEAS_ON_FOR_RB(_gCb, _rbCb) \ ((_rbCb->rlcId.rbType == CM_LTE_DRB) && \ (_gCb->u.dlCb->rlcL2Cb.measOn[_rbCb->qci])) #define RLC_MEAS_IS_DL_IP_MEAS_ON_FOR_RB(_gCb, _rbCb) \ ((_rbCb->rlcId.rbType == CM_LTE_DRB) && \ (_gCb->u.dlCb->rlcL2Cb.measOn[_rbCb->qci] & LKW_L2MEAS_DL_IP) && \ (_rbCb->rbL2Cb.measOn & LKW_L2MEAS_DL_IP)) #define RLC_MEAS_IS_DL_DELAY_MEAS_ON_FOR_RB(_gCb, _rbCb) \ ((_rbCb->rlcId.rbType == CM_LTE_DRB) && \ (_gCb->u.dlCb->rlcL2Cb.measOn[_rbCb->qci] & LKW_L2MEAS_DL_DELAY)) #define RLC_MEAS_IS_DL_UU_LOSS_MEAS_ON_FOR_RB(_gCb, _rbCb) \ ((_rbCb->rlcId.rbType == CM_LTE_DRB) && \ (_gCb->u.dlCb->rlcL2Cb.measOn[_rbCb->qci] & LKW_L2MEAS_UU_LOSS)) #define RLC_UPD_PDCP_L2_DLDELAY_STS(_rlcCb, _rlcRbCb, _delay) \ { \ if(((_rlcRbCb)->rlcId.rbType == CM_LTE_DRB) && \ ((_rlcCb)->u.dlCb->rlcL2Cb.measOn[_rlcRbCb->qci] & LKW_L2MEAS_DL_DELAY)) \ { \ (_rlcRbCb)->rbL2Cb.l2Sts[RLC_L2MEAS_DL_DELAY]->dlPjSduDelay.sduDelay += _delay; \ (_rlcRbCb)->rbL2Cb.l2Sts[RLC_L2MEAS_DL_DELAY]->dlPjSduDelay.numSdus++; \ } \ } #define RLC_UPD_L2_UU_LOSS_PKTS(_rlcCb, _rlcRbCb, _val) \ { \ if(((_rlcRbCb)->rlcId.rbType == CM_LTE_DRB) && \ ((_rlcCb)->u.dlCb->rlcL2Cb.measOn[_rlcRbCb->qci] & LKW_L2MEAS_UU_LOSS)) \ { \ (_rlcRbCb)->rbL2Cb.l2Sts[RLC_L2MEAS_UU_LOSS]->uuLoss.dLoss += _val; \ } \ } #define RLC_UPD_L2_UU_LOSS_POS_PKTS(_rlcCb,_rlcRbCb,_val) \ { \ if(((_rlcRbCb)->rlcId.rbType == CM_LTE_DRB) && \ ((_rlcCb)->u.dlCb->rlcL2Cb.measOn[_rlcRbCb->qci] & LKW_L2MEAS_UU_LOSS)) \ { \ (_rlcRbCb)->rbL2Cb.l2Sts[RLC_L2MEAS_UU_LOSS]->uuLoss.posPkts += _val; \ } \ } /* Discard new changes starts */ #define RLC_UPD_L2_DL_DISC_SDU_STS(_rlcCb,_rlcRbCb) \ { \ if(((_rlcRbCb)->rlcId.rbType == CM_LTE_DRB) && \ ((_rlcCb)->u.dlCb->rlcL2Cb.measOn[_rlcRbCb->qci] & LKW_L2MEAS_DL_DISC)) \ { \ (_rlcRbCb)->rbL2Cb.l2Sts[RLC_L2MEAS_DL_DISC]->dlDisc.discSdus++; \ } \ } #define RLC_UPD_L2_DL_TOT_SDU_STS(_rlcCb,_rlcRbCb) \ { \ if(((_rlcRbCb)->rlcId.rbType == CM_LTE_DRB) && \ ((_rlcCb)->u.dlCb->rlcL2Cb.measOn[_rlcRbCb->qci] & LKW_L2MEAS_DL_DISC)) \ { \ (_rlcRbCb)->rbL2Cb.l2Sts[RLC_L2MEAS_DL_DISC]->dlDisc.totSdus++; \ } \ } #define RLC_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(_rlcCb, _rlcRbCb) \ { \ if(((_rlcRbCb)->rlcId.rbType == CM_LTE_DRB) && \ ((_rlcCb)->u.dlCb->rlcL2Cb.measOn[_rlcRbCb->qci] & LKW_L2MEAS_DL_DISC)) \ { \ uint32_t idx1; \ for (idx1 = 0; idx1 < LKW_MAX_L2MEAS; idx1++) \ { \ if(_rlcCb->u.dlCb->rlcL2Cb.rlcL2EvtCb[idx1].measCb.measType & LKW_L2MEAS_DL_DISC) \ { \ if(_rlcCb->u.dlCb->rlcL2Cb.rlcL2EvtCb[idx1].measCb.val.nonIpThMeas.measData[(_rlcRbCb)->qci].totDrbsPerQci > 0) \ { \ _rlcCb->u.dlCb->rlcL2Cb.rlcL2EvtCb[idx1].measCb.val.nonIpThMeas.measData[(_rlcRbCb)->qci].totDrbsPerQci--; \ if (_rlcCb->u.dlCb->rlcL2Cb.rlcL2EvtCb[idx1].measCb.val.nonIpThMeas.measData[(_rlcRbCb)->qci].totDrbsPerQci == 0) \ { \ _rlcCb->u.dlCb->rlcL2Cb.rlcL2EvtCb[idx1].measCb.val.nonIpThMeas.qci[(_rlcRbCb)->qci] = 0; \ memset(&_rlcCb->u.dlCb->rlcL2Cb.rlcL2EvtCb[idx1].measCb.val.nonIpThMeas.measData[(_rlcRbCb)->qci], 0, \ sizeof(_rlcCb->u.dlCb->rlcL2Cb.rlcL2EvtCb[idx1].measCb.val.nonIpThMeas.measData[(_rlcRbCb)->qci])); \ } \ } \ } \ } \ } \ } #else #define RLC_UPD_PDCP_L2_DLDELAY_STS(_rlcCb, _rlcRbCb, _delay) #define RLC_MEAS_IS_DL_IP_MEAS_ON_FOR_RB(_gCb, _rbCb) #define RLC_MEAS_IS_DL_DELAY_MEAS_ON_FOR_RB(_gCb, _rbCb) #define RLC_UPD_L2_DL_DISC_SDU_STS(_rlcCb,_rlcRbCb) #define RLC_UPD_L2_DL_TOT_SDU_STS(_rlcCb, _rlcRbCb) #define RLC_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(_rlcCb, _rlcRbCb) #endif typedef struct rlcDlUeCb RlcDlUeCb; /** * @brief Structure to hold the SN of the PDU onto which a SDU is mapped * * @details * - sn : Sequence number of the AM pdu */ typedef struct rlcPduMap { RlcSn sn; /*!< Mapped PDU's SN */ }RlcPduMap; /** * @brief Structure to hold information regarding a SDU received from PDCP * * @details * - lstEnt : Used for linking ( we have linked list of SDUs) which forms * the SDU queue * - mBuf : Pointer to the SDU data * - sduSz : Size of the mBuf above * - actSz : Length of the SDU when received from PDCP, this might be * different from sduSz, in case when the SDU is split * - mode : Depending on the type, holds AM, UM or TM mode information * - tm * - sfn : System Frame number for BCCH/PCCH * - subframe : Subframe number * - rnti : RNTI for CCCH * - um * - sduId : Unique identity for the SDU * - isSegmented : Whether this SDU is segmented into multiple PDUs * - am * - sduId : Unique identity for the SDU * - rcvdSz : Length of this SDU which is received by the peer * - isSegmented : Whether this SDU is segmented into multiple PDUs */ typedef struct rlcSdu { CmLList lstEnt; /*!< List entry for SDU */ Buffer *mBuf; /*!< SDU buffer */ MsgLen sduSz; /*!< Buffer Size */ MsgLen actSz; /*!< Actual buffer Size */ /* kw005.201 added support for L2 Measurement */ #ifdef LTE_L2_MEAS RlcSduSnMap *snMap; /*!< Sdu and the list of SN it maps to */ #endif /* LTE_L2_MEAS */ union { struct _t { uint16_t sfn; /*!< Sub frame number for BCCH/PCCH */ uint16_t slot; /*!< Subframe number */ CmLteRnti rnti; /*!< RNTI for CCCH */ #ifdef EMTC_ENABLE uint8_t emtcDiReason; /*!< DI reason */ uint8_t pnb; /*!*/ #endif /* Discard new changes starts */ S16 discTmrInt; /*!< The discard time in milli seconds for an PDCP SDU for this RB */ /* Discard new changes ends */ CmLteRlcId rlcId; /*!< RLC Identifier */ RlcLchInfo lch; /*!< Logical Channel Info */ Snssai *snssai; CmLteRlcMode mode; /*!< Entity Mode */ uint8_t dir; /*!< Direction for UL/DL */ Inst inst; /*!< Tapa Instance where rb created */ SpId k1wuSapId; /*!< KWU sap Id, to get the KwuSapCb */ SpId udxSapId; /*!< UDX sap Id, to get the UdxSapCb */ uint32_t transId; /*!< Transaction Id for RLC */ Bool reestInProgress; /*!< Is reestablishment in progress */ SpId rguSapId; /*!< RGU Instance SAP corresponding to this RB */ union { RlcTm tm; /*!< TM mode specific elements */ RlcUmDl umDl; /*!< UM downlink elements */ RlcAmDl amDl; /*!< AM downlink elements */ }m; /*!< RLC mode specific Info */ CmLList rlsLnk; /*!< Link to add to release list */ Bool cleanupStarted; /*!< Whether cleanup of RB is in progress or not */ uint32_t lastRprtdBoToMac; /*!< Last Reported BO to MAC Layer */ uint32_t boUnRprtdCnt; /*!< Count to keep track of periodic BO Update */ }RlcDlRbCb; /** * @brief Structure to hold mapping between logical channel and Radio Bearer * * @details * - dlRbCb : Pointer to the downlink Radio Bearer */ typedef struct rlcDlLch { RlcDlRbCb *dlRbCb; /*!< Pointer to Downlink RbCb */ }RlcDlLch; /** * @brief Structure to hold information about the Cells * * @details * - cellHlEnt : Information about cells are stored in a hash table. This is * required for that. * - cellId : Identity of the cell * - rbCb : Radio Bearers in the cell * - lCh : Logical Channels in the cell */ typedef struct rlcDlCellCb { CmHashListEnt cellHlEnt; /*!< Hash list entry for CellCb */ CmLteCellId cellId; /*!< Cell Id */ RlcDlRbCb *rbCb[RLC_MAX_RB_PER_CELL]; /*!< RbCbs within a Cell */ RlcDlLch lCh[RLC_MAX_LCH_PER_CELL]; /*!< Array of Logical channels */ }RlcDlCellCb; #ifdef LTE_L2_MEAS /** @struct RlcContSduLst * Structure contains list of rbId and index to KwOutStngSduLst */ typedef struct rlcContSduLst { CmLteLcId lcId; /*!< Holds the lcId of rbCb */ uint8_t numSdus; /*!< Number sdus in sduIdx array */ uint8_t sduIdx[RLC_L2MEAS_MAX_OUTSTNGSDU]; /*!< Hold the index to KwOutStngSduLst */ }RlcContSduLst; typedef struct rlcSduInfo { Bool isRetxPdu; Ticks arvlTime; /* stores the the arrival time of each PDCP PDU */ }RlcSduInfo; typedef struct rlclchInfo { CmLteLcId lcId; /*!< Holds the lcId of rbCb */ uint8_t numSdus; /*!< Number sdus belonged to the this LC */ RlcSduInfo sduInfo[RLC_L2MEAS_SDUIDX]; }RlclchInfo; /** @struct RlcL2MeasTb * Structure containes list of rbId and index to KwOutStngSduLst */ typedef struct rlcL2MeasTb { uint8_t numLcId; /* number of logical channels in this TbCb */ RlcContSduLst sduInfo[RLC_MAX_ACTV_DRB]; /*!< Contained sduLst for outstanding sdu */ uint8_t numLchInfo; RlclchInfo lchInfo[RLC_MAX_ACTV_DRB]; /* Holds the LC info details used for DL delay L2 Meas*/ uint32_t txSegSduCnt; /*!< This holds the no.of partially transmitted SDU per TB which can be used for UU loss Meas*/ }RlcL2MeasTb; #endif /** * @brief Structure to hold information about the UEs * * @details * - ueHlEnt : Information about cells are stored in a hash table. This is * required for that. * - key : Key to store/find the UE in the hashtable * - srbCb : Signaling Radio Bearers configured for the UE * - drbCb : Data Radio Bearers configured for the UE * - lCh : Logical Channels in the UE */ struct rlcDlUeCb { CmHashListEnt ueHlEnt; /*!< Hash list entry for UeCb */ CmLteRnti ueId; /*!< UE Id */ CmLteCellId cellId; /*!< Cell Id */ RlcDlRbCb *srbCb[RLC_MAX_SRB_PER_UE]; /*!< SRB RbCbs within a UE */ RlcDlRbCb *drbCb[RLC_MAX_DRB_PER_UE]; /*!< DRB RbCbs within a UE */ RlcDlLch lCh[RLC_MAX_LCH_PER_UE]; /*!< Array of Logical channels */ /* kw005.201 added support for L2 Measurement */ #ifdef LTE_L2_MEAS uint16_t numActRb[LKW_MAX_QCI]; /*!< number of RBs Active */ uint8_t tbIdx; /*!< TBIDx for measTbCb */ RlcL2MeasTb *l2MeasTbCb[RLC_MAX_TB_PER_UE]; /*!< Array of Measurement tbCb */ #endif /* LTE_L2_MEAS */ #ifdef TENB_STATS TSL2UeStatsCb *tenbStats; /*!< UE Stats Holder */ #endif }; /**************************************************************************** * Declarations ***************************************************************************/ /**************************************************************************** * Configuration Functions ***************************************************************************/ S16 rlcCfgAddDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); S16 rlcCfgReCfgDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); S16 rlcCfgDelDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); S16 rlcCfgDelDlUe ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); S16 rlcCfgReEstDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, Bool sndReEst, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); S16 rlcCfgDelDlCell ARGS ((RlcCb *gCb, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); S16 rlcCfgDlUeIdChng ARGS ((RlcCb *gCb, CkwUeInfo *ueInfo, CkwUeInfo *newUeInfo, CmStatus *status)); /**************************************************************************** * DBM module Functions ***************************************************************************/ S16 rlcDbmDlInit ARGS ((RlcCb *gCb)); Void rlcDbmDlDeInit ARGS ((RlcCb *gCb)); S16 rlcDbmCreateDlUeCb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcDlUeCb **ueCb)); uint8_t rlcDbmFetchDlUeCb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcDlUeCb **ueCb)); Void rlcDbmDelDlUeCb ARGS ((RlcCb *gCb, RlcDlUeCb *ueCb, Bool abortFlag)); Void rlcDbmDelAllDlUe ARGS ((RlcCb *gCb)); S16 rlcDbmCreateDlCellCb ARGS ((RlcCb *gCb, CmLteCellId cellId, RlcDlCellCb **cellCb)); uint8_t rlcDbmFetchDlCellCb ARGS ((RlcCb *gCb, CmLteCellId cellId, RlcDlCellCb **cellCb)); Void rlcDbmDelDlCellCb ARGS ((RlcCb *gCb, RlcDlCellCb *cellCb)); Void rlcDbmDelAllDlCell ARGS ((RlcCb *gCb)); Void rlcDbmFetchDlRbCbByRbId ARGS ((RlcCb *gCb, CmLteRlcId *rlcId, RlcDlRbCb **rbCb)); Void rlcDbmFetchDlRbCbFromLchId ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, CmLteLcId lcId, RlcDlRbCb **rbCb)); Void rlcDbmDelAllDlRb ARGS ((RlcCb *gCb, RlcDlRbCb **rbCbLst, uint8_t numRbCb)); S16 rlcDbmDlShutdown ARGS ((RlcCb *gCb)); Void rlcUtlGetCurrTime ARGS((uint32_t *time)); Void rlcUtlTrigPdbFlowCntrl ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, uint32_t pktAdmitCnt )); #ifdef LTE_L2_MEAS Void rlcDbmDelAllDlL2MeasTbFrmUe ARGS ((RlcCb *gCb, RlcDlUeCb *ueCb)); #endif /**************************************************************************** * Transparent Mode Functions ***************************************************************************/ Void rlcTmmQSdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReqInfo *datReqInfo, Buffer *mBuf)); Void rlcTmmSendToMac ARGS ((RlcCb *gCb, SuId suId, RlcDlRbCb *rbCb, RguCStaIndInfo *staInd)); Void rlcDlTmmReEstablish ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb)); /**************************************************************************** * Unacknowledged Mode Functions ***************************************************************************/ Void rlcUmmQSdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReqInfo *datReq, Buffer *mBuf)); Void rlcUmmDiscSdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, uint32_t sduId)); Void rlcDlUmmReEstablish ARGS ((RlcCb *gCb, CmLteRlcId rlcId, Bool sndReEst, RlcDlRbCb *rbCb)); Void rlcUmmProcessSdus ARGS ((RlcCb *gCb,RlcDlRbCb *rbCb,RlcDatReq *datReq)); Void rlcUmmFreeDlRbCb ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb)); /**************************************************************************** * Acknowledged Mode Functions ***************************************************************************/ S32 rlcAmmCalculateBo ARGS ((RlcAmDl *amDl)); Void rlcAmmSendDedLcBoStatus ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, RlcAmDl *amDl)); Void rlcAmmQSdu ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, Buffer *mBuf, RlcDatReqInfo *datReq)); void rlcAmmProcessSdus ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq, bool staPduPres)); Void rlcAmmDlReEstablish ARGS((RlcCb *gCb, CmLteRlcId rlcId, RlcDlRbCb *rbCb)); Void rlcAmmDlHndlStatusPdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, RlcUdxStaPdu *pStaPdu)); S16 rlcAmmDiscSdu ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, uint32_t sduId)); Void rlcAmmPollRetxTmrExp ARGS((RlcCb *gCB, RlcDlRbCb *rbCb)); Void rlcAmmFreeDlRbCb ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb)); /**************************************************************************** * Utility Functions ***************************************************************************/ Void rlcUtlStoreTxBuf ARGS ((CmLListCp *txBufLst, RlcTx *txBuf, RlcSn sn )); RlcTx* rlcUtlGetTxBuf ARGS ((CmLListCp *txBufLst, RlcSn sn )); Void rlcUtlDelTxBuf ARGS ((CmLListCp *txBufLst, RlcTx *txBuf, RlcCb *gCb )); Void rlcUtlRemovTxBuf ARGS ((CmLListCp *txBufLst, RlcTx *txBuf, RlcCb *gCb )); uint8_t rlcUtlSendDedLcBoStatus ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, int32_t bo, int32_t estHdrSz, bool staPduPrsnt, uint32_t staPduBo)); #ifdef LTE_L2_MEAS_RLC Void rlcUtlEmptySduQ ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, CmLListCp *sduQ)); #else /* LTE_L2_MEAS */ Void rlcUtlEmptySduQ ARGS ((RlcCb *gCb,CmLListCp *sduQ)); #endif /* LTE_L2_MEAS */ uint8_t rlcUtlSendToMac ARGS ((RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo)); Void rlcUtlIncrementKwuStsSduTx ARGS((RlcKwuSapCb *rlckwuSap)); Void rlcUtlIncrementGenStsBytesAndPdusSent ARGS((RlcGenSts *genSts, Buffer *pdu)); Void rlcUtlFreeDlMemory ARGS ((RlcCb *gCb)); Void rlcUtlInitToBeFreed ARGS ((RlcCb *gCb, RlcDlDataToBeFreed *toBeFreed)); Void rlcUtlInitializeSelfPst ARGS((RlcCb *gCb)); Void rlcUtlRaiseDlCleanupEvent ARGS((RlcCb *gCb)); Void rlcUtlAddSduToBeFreedQueue ARGS((RlcCb *gCb, RlcSdu *sdu)); Void rlcUtlAddReTxPduToBeFreedQueue ARGS((RlcCb *gCb, RlcRetx *retx)); Void rlcUtlAddTxPduToBeFreedQueue ARGS((RlcCb *gCb, RlcTx *pdu)); #ifdef LTE_L2_MEAS S16 rlcUtlL2MeasDlInit ARGS((RlcCb *gCb)); #endif /**************************************************************************** * Debug Functions ***************************************************************************/ Void ResetRLCStats ARGS((Void)); Void PrintRLCStats ARGS((Void)); Void DumpRLCDlDebugInformation ARGS((Void)); /**************************************************************************** * Activation Functions ***************************************************************************/ S16 rlcDlActvInit ARGS ((Ent ent,Inst inst,Region region,Reason reason)); S16 rlcDlActvTsk ARGS ((Pst *pst, Buffer *mBuf)); bool rlcDlUtlIsReestInProgress ARGS ((RlcDlRbCb *rbCb)); Void rlcDlUtlResetReestInProgress ARGS ((RlcDlRbCb *rbCb)); Void rlcDlUtlResetReestInProgress ARGS (( RlcDlRbCb *rbCb)); Void rlcDlUtlSetReestInProgressForAllRBs ARGS ((RlcCb *gCb, RlcDlUeCb *ueCb)); Void rlcDlUtlSetReestInProgressForRB ARGS (( RlcCb *gCb, RlcDlRbCb *rbCb)); #ifdef LTE_L2_MEAS Void rlcUtlUpdateContainedSduLst ARGS (( uint8_t sduIdx, RlcContSduLst *contSduLst )); Void rlcUtlUpdateOutStandingSduLst ARGS (( RlcL2MeasDlIpTh *dlIpThPut, uint8_t sduIdx, MsgLen sduLen, uint32_t sduId, Bool newIdx )); Void rlcUtlUpdateBurstSdus ARGS(( RlcCb *gCb, RlcDlRbCb *rbCb, RlcContSduLst *contSduLst, S32 dataVol, uint32_t schPduSz )); RlcL2MeasTb * rlcUtlGetCurMeasTb ARGS(( RlcCb *gCb, RlcDlRbCb *rbCb )); S16 rlcUtlSndDlL2MeasNCfm ARGS((RlcCb *gCb, RlcL2MeasReqEvt *measReqEvt, RlcL2MeasCfmEvt *measCfmEvt)); S16 rlcUtlSndDlL2MeasCfm ARGS ((RlcCb *gCb, RlcL2MeasEvtCb *measEvtCb)); S16 rlcUtlProcHarqInd ARGS (( RlcCb *gCb, RguHarqStatusInd *staInd, RlcDlUeCb *ueCb, uint8_t tbIdx)); Void rlcUtlResetDlL2MeasInRlcRb ARGS ((RlcCb *gCb, RlcL2MeasCb *measCb, uint8_t measType)); S16 RlcMiLkwL2MeasStopCfm ARGS((Pst *pst, uint8_t measType,uint8_t status)); S16 rlcUtlValidateIpThL2Meas ARGS((RlcL2MeasReqEvt *measReqEvt, RlcL2MeasCfmEvt *measCfmEvt)); S16 rlcFetchLchInfo ARGS ((RlcL2MeasReqEvt *measReqEvt, RlcL2MeasCfmEvt *measCfmEvt, uint16_t ueId, CmLteLcId *lChId, uint8_t *numLch)); S16 rlcUtlNotifyMacUlIp ARGS ((RlcL2MeasCb *measCb,uint16_t ueIdx, Bool enable, CmLteLcId *lChId, uint8_t *numLCh)); #endif uint8_t rlcProcDlData(Pst *pst, RlcDatReqInfo* datReq, Buffer *buf); uint8_t rlcProcCommLcSchedRpt(Pst *pst, SuId suId, RguCStaIndInfo *staInd); uint8_t rlcProcDedLcSchedRpt(Pst *pst, SuId suId, RguDStaIndInfo *staInd); Void rlcUtlFreeDlMem ARGS(( Void)); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __RLC_DLH__ */ /********************************************************************30** End of file **********************************************************************/