/******************************************************************************* ################################################################################ # 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: LTE RLC file Type: C include file Desc: This file contains all the data structures and prototypes for LTE RLC. File: kw_dl.x *********************************************************************21*/ /** * @file kw_dl.x * @brief RLC downlink structures, prototypes */ #ifndef __KW_DLX__ #define __KW_DLX__ #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 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 { U16 sfn; /*!< Sub frame number for BCCH/PCCH */ U16 slot; /*!< Subframe number */ CmLteRnti rnti; /*!< RNTI for CCCH */ #ifdef EMTC_ENABLE U8 emtcDiReason; /*!< DI reason */ U8 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 */ CmLteRlcMode mode; /*!< Entity Mode */ U8 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 */ U32 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 */ U32 lastRprtdBoToMac; /*!< Last Reported BO to MAC Layer */ U32 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 */ U8 numSdus; /*!< Number sdus in sduIdx array */ U8 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 */ U8 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 { U8 numLcId; /* number of logical channels in this TbCb */ RlcContSduLst sduInfo[RLC_MAX_ACTV_DRB]; /*!< Contained sduLst for outstanding sdu */ U8 numLchInfo; RlclchInfo lchInfo[RLC_MAX_ACTV_DRB]; /* Holds the LC info details used for DL delay L2 Meas*/ U32 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 U16 numActRb[LKW_MAX_QCI]; /*!< number of RBs Active */ U8 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 }; /**************************************************************************** * EXTERN Declarations ***************************************************************************/ /**************************************************************************** * Configuration Functions ***************************************************************************/ EXTERN S16 rlcCfgAddDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); EXTERN S16 rlcCfgReCfgDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); EXTERN S16 rlcCfgDelDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); EXTERN S16 rlcCfgDelDlUe ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); EXTERN S16 rlcCfgReEstDlRb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, Bool sndReEst, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); EXTERN S16 rlcCfgDelDlCell ARGS ((RlcCb *gCb, CmLteCellId cellId, RlcEntCfgInfo *entCfg, RlcEntCfgCfmInfo *entCfm)); EXTERN S16 rlcCfgDlUeIdChng ARGS ((RlcCb *gCb, CkwUeInfo *ueInfo, CkwUeInfo *newUeInfo, CmStatus *status)); /**************************************************************************** * DBM module Functions ***************************************************************************/ EXTERN S16 rlcDbmDlInit ARGS ((RlcCb *gCb)); EXTERN Void rlcDbmDlDeInit ARGS ((RlcCb *gCb)); EXTERN S16 rlcDbmCreateDlUeCb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcDlUeCb **ueCb)); EXTERN S16 rlcDbmFetchDlUeCb ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcDlUeCb **ueCb)); EXTERN Void rlcDbmDelDlUeCb ARGS ((RlcCb *gCb, RlcDlUeCb *ueCb, Bool abortFlag)); EXTERN Void rlcDbmDelAllDlUe ARGS ((RlcCb *gCb)); EXTERN S16 rlcDbmCreateDlCellCb ARGS ((RlcCb *gCb, CmLteCellId cellId, RlcDlCellCb **cellCb)); EXTERN S16 rlcDbmFetchDlCellCb ARGS ((RlcCb *gCb, CmLteCellId cellId, RlcDlCellCb **cellCb)); EXTERN Void rlcDbmDelDlCellCb ARGS ((RlcCb *gCb, RlcDlCellCb *cellCb)); EXTERN Void rlcDbmDelAllDlCell ARGS ((RlcCb *gCb)); EXTERN Void rlcDbmFetchDlRbCbByRbId ARGS ((RlcCb *gCb, CmLteRlcId *rlcId, RlcDlRbCb **rbCb)); EXTERN Void rlcDbmFetchDlRbCbFromLchId ARGS ((RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, CmLteLcId lcId, RlcDlRbCb **rbCb)); EXTERN Void rlcDbmDelAllDlRb ARGS ((RlcCb *gCb, RlcDlRbCb **rbCbLst, U8 numRbCb)); EXTERN S16 rlcDbmDlShutdown ARGS ((RlcCb *gCb)); EXTERN Void rlcUtlGetCurrTime ARGS((U32 *time)); EXTERN Void rlcUtlTrigPdbFlowCntrl ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, U32 pktAdmitCnt )); #ifdef LTE_L2_MEAS EXTERN Void rlcDbmDelAllDlL2MeasTbFrmUe ARGS ((RlcCb *gCb, RlcDlUeCb *ueCb)); #endif /**************************************************************************** * Transparent Mode Functions ***************************************************************************/ EXTERN Void rlcTmmQSdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, KwuDatReqInfo *datReqInfo, Buffer *mBuf)); EXTERN Void rlcTmmSndToLi ARGS ((RlcCb *gCb, SuId suId, RlcDlRbCb *rbCb, RguCStaIndInfo *staInd)); EXTERN Void rlcDlTmmReEstablish ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb)); /**************************************************************************** * Unacknowledged Mode Functions ***************************************************************************/ EXTERN Void rlcUmmQSdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, KwuDatReqInfo *datReq, Buffer *mBuf)); EXTERN Void rlcUmmDiscSdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, U32 sduId)); EXTERN Void rlcDlUmmReEstablish ARGS ((RlcCb *gCb, CmLteRlcId rlcId, Bool sndReEst, RlcDlRbCb *rbCb)); EXTERN Void rlcUmmProcessSdus ARGS ((RlcCb *gCb,RlcDlRbCb *rbCb,RlcDatReq *datReq)); EXTERN Void rlcUmmFreeDlRbCb ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb)); /**************************************************************************** * Acknowledged Mode Functions ***************************************************************************/ EXTERN S32 rlcAmmCalculateBo ARGS ((RlcAmDl *amDl)); EXTERN Void rlcAmmSendDStaRsp ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, RlcAmDl *amDl)); EXTERN Void rlcAmmQSdu ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, Buffer *mBuf, KwuDatReqInfo *datReq)); EXTERN Void rlcAmmProcessSdus ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq, Bool staPduPres)); EXTERN Void rlcAmmDlReEstablish ARGS((RlcCb *gCb, CmLteRlcId rlcId, RlcDlRbCb *rbCb)); EXTERN Void rlcAmmDlHndlStatusPdu ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, RlcUdxStaPdu *pStaPdu)); EXTERN S16 rlcAmmDiscSdu ARGS((RlcCb *gCb, RlcDlRbCb *rbCb, U32 sduId)); EXTERN Void rlcAmmPollRetxTmrExp ARGS((RlcCb *gCB, RlcDlRbCb *rbCb)); EXTERN Void rlcAmmFreeDlRbCb ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb)); /**************************************************************************** * Utility Functions ***************************************************************************/ EXTERN Void rlcUtlStoreTxBuf ARGS ((CmLListCp *txBufLst, RlcTx *txBuf, RlcSn sn )); EXTERN RlcTx* rlcUtlGetTxBuf ARGS ((CmLListCp *txBufLst, RlcSn sn )); EXTERN Void rlcUtlDelTxBuf ARGS ((CmLListCp *txBufLst, RlcTx *txBuf, RlcCb *gCb )); EXTERN Void rlcUtlRemovTxBuf ARGS ((CmLListCp *txBufLst, RlcTx *txBuf, RlcCb *gCb )); EXTERN S16 rlcUtlSndDStaRsp ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, S32 bo, S32 estHdrSz, Bool staPduPrsnt, U32 staPduBo)); #ifdef LTE_L2_MEAS_RLC EXTERN Void rlcUtlEmptySduQ ARGS ((RlcCb *gCb, RlcDlRbCb *rbCb, CmLListCp *sduQ)); #else /* LTE_L2_MEAS */ EXTERN Void rlcUtlEmptySduQ ARGS ((RlcCb *gCb,CmLListCp *sduQ)); #endif /* LTE_L2_MEAS */ EXTERN Void rlcUtlCalcLiForSdu ARGS ((RlcCb *gCb, U16 numLi, MsgLen msgLen, S16 *pduSz)); EXTERN S16 rlcUtlSndToLi ARGS ((RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo)); EXTERN Void rlcUtlIncrementKwuStsSduTx ARGS((RlcKwuSapCb *rlckwuSap)); EXTERN Void rlcUtlIncrementGenStsBytesAndPdusSent ARGS((RlcGenSts *genSts, Buffer *pdu)); EXTERN Void rlcUtlFreeDlMemory ARGS ((RlcCb *gCb)); EXTERN Void rlcUtlInitToBeFreed ARGS ((RlcCb *gCb, RlcDlDataToBeFreed *toBeFreed)); EXTERN Void rlcUtlInitializeSelfPst ARGS((RlcCb *gCb)); EXTERN Void rlcUtlRaiseDlCleanupEvent ARGS((RlcCb *gCb)); EXTERN Void rlcUtlAddSduToBeFreedQueue ARGS((RlcCb *gCb, RlcSdu *sdu)); EXTERN Void rlcUtlAddReTxPduToBeFreedQueue ARGS((RlcCb *gCb, RlcRetx *retx)); EXTERN Void rlcUtlAddTxPduToBeFreedQueue ARGS((RlcCb *gCb, RlcTx *pdu)); #ifdef LTE_L2_MEAS EXTERN S16 rlcUtlL2MeasDlInit ARGS((RlcCb *gCb)); #endif /**************************************************************************** * Debug Functions ***************************************************************************/ EXTERN Void ResetRLCStats ARGS((Void)); EXTERN Void PrintRLCStats ARGS((Void)); EXTERN Void DumpRLCDlDebugInformation ARGS((Void)); /**************************************************************************** * Activation Functions ***************************************************************************/ EXTERN S16 rlcDlActvInit ARGS ((Ent ent,Inst inst,Region region,Reason reason)); EXTERN S16 rlcDlActvTsk ARGS ((Pst *pst, Buffer *mBuf)); EXTERN Bool rlcDlUtlIsReestInProgress ARGS ((RlcDlRbCb *rbCb)); EXTERN Void rlcDlUtlResetReestInProgress ARGS ((RlcDlRbCb *rbCb)); EXTERN Void rlcDlUtlResetReestInProgress ARGS (( RlcDlRbCb *rbCb)); EXTERN Void rlcDlUtlSetReestInProgressForAllRBs ARGS ((RlcCb *gCb, RlcDlUeCb *ueCb)); EXTERN Void rlcDlUtlSetReestInProgressForRB ARGS (( RlcCb *gCb, RlcDlRbCb *rbCb)); #ifdef LTE_L2_MEAS EXTERN Void rlcUtlUpdateContainedSduLst ARGS (( U8 sduIdx, RlcContSduLst *contSduLst )); EXTERN Void rlcUtlUpdateOutStandingSduLst ARGS (( RlcL2MeasDlIpTh *dlIpThPut, U8 sduIdx, MsgLen sduLen, U32 sduId, Bool newIdx )); EXTERN Void rlcUtlUpdateBurstSdus ARGS(( RlcCb *gCb, RlcDlRbCb *rbCb, RlcContSduLst *contSduLst, S32 dataVol, U32 schPduSz )); EXTERN RlcL2MeasTb * rlcUtlGetCurMeasTb ARGS(( RlcCb *gCb, RlcDlRbCb *rbCb )); EXTERN S16 rlcUtlSndDlL2MeasNCfm ARGS((RlcCb *gCb, RlcL2MeasReqEvt *measReqEvt, RlcL2MeasCfmEvt *measCfmEvt)); EXTERN S16 rlcUtlSndDlL2MeasCfm ARGS ((RlcCb *gCb, RlcL2MeasEvtCb *measEvtCb)); EXTERN S16 rlcUtlProcHarqInd ARGS (( RlcCb *gCb, RguHarqStatusInd *staInd, RlcDlUeCb *ueCb, U8 tbIdx)); EXTERN Void rlcUtlResetDlL2MeasInRlcRb ARGS ((RlcCb *gCb, RlcL2MeasCb *measCb, U8 measType)); EXTERN S16 RlcMiLkwL2MeasStopCfm ARGS((Pst *pst, U8 measType,U8 status)); EXTERN S16 rlcUtlValidateIpThL2Meas ARGS((RlcL2MeasReqEvt *measReqEvt, RlcL2MeasCfmEvt *measCfmEvt)); EXTERN S16 rlcFetchLchInfo ARGS ((RlcL2MeasReqEvt *measReqEvt, RlcL2MeasCfmEvt *measCfmEvt, U16 ueId, CmLteLcId *lChId, U8 *numLch)); EXTERN S16 rlcUtlNotifyMacUlIp ARGS ((RlcL2MeasCb *measCb,U16 ueIdx, Bool enable, CmLteLcId *lChId, U8 *numLCh)); #endif EXTERN Void rlcUtlFreeDlMem ARGS(( Void)); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __KW_DLX__ */ /********************************************************************30** End of file **********************************************************************/