/******************************************************************************* ################################################################################ # 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 kwDlUeCb KwDlUeCb; /** * @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 kwPduMap { KwSn sn; /*!< Mapped PDU's SN */ }KwPduMap; /** * @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 kwSdu { 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 KwSduSnMap *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 */ KwLchInfo lch; /*!< Logical Channel Info */ CmLteRlcMode mode; /*!< Entity Mode */ U8 dir; /*!< Direction for UL/DL */ Inst inst; /*!< Tapa Instance where rb created */ SpId kwuSapId; /*!< 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 { KwTm tm; /*!< TM mode specific elements */ KwUmDl umDl; /*!< UM downlink elements */ KwAmDl 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 */ }KwDlRbCb; /** * @brief Structure to hold mapping between logical channel and Radio Bearer * * @details * - dlRbCb : Pointer to the downlink Radio Bearer */ typedef struct kwDlLch { KwDlRbCb *dlRbCb; /*!< Pointer to Downlink RbCb */ }KwDlLch; /** * @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 kwDlCellCb { CmHashListEnt cellHlEnt; /*!< Hash list entry for CellCb */ CmLteCellId cellId; /*!< Cell Id */ KwDlRbCb *rbCb[KW_MAX_RB_PER_CELL]; /*!< RbCbs within a Cell */ KwDlLch lCh[KW_MAX_LCH_PER_CELL]; /*!< Array of Logical channels */ }KwDlCellCb; #ifdef LTE_L2_MEAS /** @struct KwContSduLst * Structure contains list of rbId and index to KwOutStngSduLst */ typedef struct kwContSduLst { CmLteLcId lcId; /*!< Holds the lcId of rbCb */ U8 numSdus; /*!< Number sdus in sduIdx array */ U8 sduIdx[KW_L2MEAS_MAX_OUTSTNGSDU]; /*!< Hold the index to KwOutStngSduLst */ }KwContSduLst; typedef struct kwSduInfo { Bool isRetxPdu; Ticks arvlTime; /* stores the the arrival time of each PDCP PDU */ }KwSduInfo; typedef struct kwlchInfo { CmLteLcId lcId; /*!< Holds the lcId of rbCb */ U8 numSdus; /*!< Number sdus belonged to the this LC */ KwSduInfo sduInfo[KW_L2MEAS_SDUIDX]; }KwlchInfo; /** @struct KwL2MeasTb * Structure containes list of rbId and index to KwOutStngSduLst */ typedef struct kwL2MeasTb { U8 numLcId; /* number of logical channels in this TbCb */ KwContSduLst sduInfo[KW_MAX_ACTV_DRB]; /*!< Contained sduLst for outstanding sdu */ U8 numLchInfo; KwlchInfo lchInfo[KW_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*/ }KwL2MeasTb; #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 kwDlUeCb { CmHashListEnt ueHlEnt; /*!< Hash list entry for UeCb */ CmLteRnti ueId; /*!< UE Id */ CmLteCellId cellId; /*!< Cell Id */ KwDlRbCb *srbCb[KW_MAX_SRB_PER_UE]; /*!< SRB RbCbs within a UE */ KwDlRbCb *drbCb[KW_MAX_DRB_PER_UE]; /*!< DRB RbCbs within a UE */ KwDlLch lCh[KW_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 */ KwL2MeasTb *l2MeasTbCb[KW_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 kwCfgAddDlRb ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, CkwEntCfgInfo *entCfg, CkwEntCfgCfmInfo *entCfm)); EXTERN S16 kwCfgReCfgDlRb ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, CkwEntCfgInfo *entCfg, CkwEntCfgCfmInfo *entCfm)); EXTERN S16 kwCfgDelDlRb ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, CkwEntCfgInfo *entCfg, CkwEntCfgCfmInfo *entCfm)); EXTERN S16 kwCfgDelDlUe ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, CkwEntCfgInfo *entCfg, CkwEntCfgCfmInfo *entCfm)); EXTERN S16 kwCfgReEstDlRb ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, Bool sndReEst, CkwEntCfgInfo *entCfg, CkwEntCfgCfmInfo *entCfm)); EXTERN S16 kwCfgDelDlCell ARGS ((KwCb *gCb, CmLteCellId cellId, CkwEntCfgInfo *entCfg, CkwEntCfgCfmInfo *entCfm)); EXTERN S16 kwCfgDlUeIdChng ARGS ((KwCb *gCb, CkwUeInfo *ueInfo, CkwUeInfo *newUeInfo, CmStatus *status)); /**************************************************************************** * DBM module Functions ***************************************************************************/ EXTERN S16 kwDbmDlInit ARGS ((KwCb *gCb)); EXTERN Void kwDbmDlDeInit ARGS ((KwCb *gCb)); EXTERN S16 kwDbmCreateDlUeCb ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, KwDlUeCb **ueCb)); EXTERN S16 kwDbmFetchDlUeCb ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, KwDlUeCb **ueCb)); EXTERN Void kwDbmDelDlUeCb ARGS ((KwCb *gCb, KwDlUeCb *ueCb, Bool abortFlag)); EXTERN Void kwDbmDelAllDlUe ARGS ((KwCb *gCb)); EXTERN S16 kwDbmCreateDlCellCb ARGS ((KwCb *gCb, CmLteCellId cellId, KwDlCellCb **cellCb)); EXTERN S16 kwDbmFetchDlCellCb ARGS ((KwCb *gCb, CmLteCellId cellId, KwDlCellCb **cellCb)); EXTERN Void kwDbmDelDlCellCb ARGS ((KwCb *gCb, KwDlCellCb *cellCb)); EXTERN Void kwDbmDelAllDlCell ARGS ((KwCb *gCb)); EXTERN Void kwDbmFetchDlRbCbByRbId ARGS ((KwCb *gCb, CmLteRlcId *rlcId, KwDlRbCb **rbCb)); EXTERN Void kwDbmFetchDlRbCbFromLchId ARGS ((KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId, CmLteLcId lcId, KwDlRbCb **rbCb)); EXTERN Void kwDbmDelAllDlRb ARGS ((KwCb *gCb, KwDlRbCb **rbCbLst, U8 numRbCb)); EXTERN S16 kwDbmDlShutdown ARGS ((KwCb *gCb)); EXTERN Void kwUtlGetCurrTime ARGS((U32 *time)); EXTERN PUBLIC Void kwUtlTrigPdbFlowCntrl ARGS((KwCb *gCb, KwDlRbCb *rbCb, U32 pktAdmitCnt )); #ifdef LTE_L2_MEAS EXTERN Void kwDbmDelAllDlL2MeasTbFrmUe ARGS ((KwCb *gCb, KwDlUeCb *ueCb)); #endif /**************************************************************************** * Transparent Mode Functions ***************************************************************************/ EXTERN Void kwTmmQSdu ARGS ((KwCb *gCb, KwDlRbCb *rbCb, KwuDatReqInfo *datReqInfo, Buffer *mBuf)); EXTERN Void kwTmmSndToLi ARGS ((KwCb *gCb, SuId suId, KwDlRbCb *rbCb, RguCStaIndInfo *staInd)); EXTERN Void kwDlTmmReEstablish ARGS ((KwCb *gCb, KwDlRbCb *rbCb)); /**************************************************************************** * Unacknowledged Mode Functions ***************************************************************************/ EXTERN Void kwUmmQSdu ARGS ((KwCb *gCb, KwDlRbCb *rbCb, KwuDatReqInfo *datReq, Buffer *mBuf)); EXTERN Void kwUmmDiscSdu ARGS ((KwCb *gCb, KwDlRbCb *rbCb, U32 sduId)); EXTERN Void kwDlUmmReEstablish ARGS ((KwCb *gCb, CmLteRlcId rlcId, Bool sndReEst, KwDlRbCb *rbCb)); EXTERN Void kwUmmProcessSdus ARGS ((KwCb *gCb,KwDlRbCb *rbCb,KwDatReq *datReq)); EXTERN Void kwUmmFreeDlRbCb ARGS ((KwCb *gCb, KwDlRbCb *rbCb)); /**************************************************************************** * Acknowledged Mode Functions ***************************************************************************/ EXTERN S32 kwAmmCalculateBo ARGS ((KwAmDl *amDl)); EXTERN Void kwAmmSendDStaRsp ARGS ((KwCb *gCb, KwDlRbCb *rbCb, KwAmDl *amDl)); EXTERN Void kwAmmQSdu ARGS((KwCb *gCb, KwDlRbCb *rbCb, Buffer *mBuf, KwuDatReqInfo *datReq)); EXTERN Void kwAmmProcessSdus ARGS((KwCb *gCb, KwDlRbCb *rbCb, KwDatReq *kwDatReq, Bool staPduPres)); EXTERN Void kwAmmDlReEstablish ARGS((KwCb *gCb, CmLteRlcId rlcId, KwDlRbCb *rbCb)); EXTERN Void kwAmmDlHndlStatusPdu ARGS ((KwCb *gCb, KwDlRbCb *rbCb, KwUdxStaPdu *pStaPdu)); EXTERN S16 kwAmmDiscSdu ARGS((KwCb *gCb, KwDlRbCb *rbCb, U32 sduId)); EXTERN Void kwAmmPollRetxTmrExp ARGS((KwCb *gCB, KwDlRbCb *rbCb)); EXTERN Void kwAmmFreeDlRbCb ARGS ((KwCb *gCb, KwDlRbCb *rbCb)); /**************************************************************************** * Utility Functions ***************************************************************************/ EXTERN Void kwUtlStoreTxBuf ARGS ((CmLListCp *txBufLst, KwTx *txBuf, KwSn sn )); EXTERN KwTx* kwUtlGetTxBuf ARGS ((CmLListCp *txBufLst, KwSn sn )); EXTERN Void kwUtlDelTxBuf ARGS ((CmLListCp *txBufLst, KwTx *txBuf, KwCb *gCb )); EXTERN Void kwUtlRemovTxBuf ARGS ((CmLListCp *txBufLst, KwTx *txBuf, KwCb *gCb )); EXTERN S16 kwUtlSndDStaRsp ARGS ((KwCb *gCb, KwDlRbCb *rbCb, S32 bo, S32 estHdrSz, Bool staPduPrsnt, U32 staPduBo)); #ifdef LTE_L2_MEAS_RLC EXTERN Void kwUtlEmptySduQ ARGS ((KwCb *gCb, KwDlRbCb *rbCb, CmLListCp *sduQ)); #else /* LTE_L2_MEAS */ EXTERN Void kwUtlEmptySduQ ARGS ((KwCb *gCb,CmLListCp *sduQ)); #endif /* LTE_L2_MEAS */ EXTERN Void kwUtlCalcLiForSdu ARGS ((KwCb *gCb, U16 numLi, MsgLen msgLen, S16 *pduSz)); EXTERN S16 kwUtlSndToLi ARGS ((KwCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo)); EXTERN Void kwUtlIncrementKwuStsSduTx ARGS((KwKwuSapCb *kwuSap)); EXTERN Void kwUtlIncrementGenStsBytesAndPdusSent ARGS((KwGenSts *genSts, Buffer *pdu)); EXTERN Void kwUtlFreeDlMemory ARGS ((KwCb *gCb)); EXTERN Void kwUtlInitToBeFreed ARGS ((KwCb *gCb, KwDlDataToBeFreed *toBeFreed)); EXTERN Void kwUtlInitializeSelfPst ARGS((KwCb *gCb)); EXTERN Void kwUtlRaiseDlCleanupEvent ARGS((KwCb *gCb)); EXTERN Void kwUtlAddSduToBeFreedQueue ARGS((KwCb *gCb, KwSdu *sdu)); EXTERN Void kwUtlAddReTxPduToBeFreedQueue ARGS((KwCb *gCb, KwRetx *retx)); EXTERN Void kwUtlAddTxPduToBeFreedQueue ARGS((KwCb *gCb, KwTx *pdu)); #ifdef LTE_L2_MEAS EXTERN S16 kwUtlL2MeasDlInit ARGS((KwCb *gCb)); #endif /**************************************************************************** * Debug Functions ***************************************************************************/ EXTERN Void ResetRLCStats ARGS((Void)); EXTERN Void PrintRLCStats ARGS((Void)); EXTERN Void DumpRLCDlDebugInformation ARGS((Void)); /**************************************************************************** * Activation Functions ***************************************************************************/ EXTERN S16 kwDlActvInit ARGS ((Ent ent,Inst inst,Region region,Reason reason)); EXTERN S16 kwDlActvTsk ARGS ((Pst *pst, Buffer *mBuf)); EXTERN Bool kwDlUtlIsReestInProgress ARGS ((KwDlRbCb *rbCb)); EXTERN Void kwDlUtlResetReestInProgress ARGS ((KwDlRbCb *rbCb)); EXTERN Void kwDlUtlResetReestInProgress ARGS (( KwDlRbCb *rbCb)); EXTERN Void kwDlUtlSetReestInProgressForAllRBs ARGS ((KwCb *gCb, KwDlUeCb *ueCb)); EXTERN Void kwDlUtlSetReestInProgressForRB ARGS (( KwCb *gCb, KwDlRbCb *rbCb)); #ifdef LTE_L2_MEAS EXTERN Void kwUtlUpdateContainedSduLst ARGS (( U8 sduIdx, KwContSduLst *contSduLst )); EXTERN Void kwUtlUpdateOutStandingSduLst ARGS (( KwL2MeasDlIpTh *dlIpThPut, U8 sduIdx, MsgLen sduLen, U32 sduId, Bool newIdx )); EXTERN Void kwUtlUpdateBurstSdus ARGS(( KwCb *gCb, KwDlRbCb *rbCb, KwContSduLst *contSduLst, S32 dataVol, U32 schPduSz )); EXTERN KwL2MeasTb * kwUtlGetCurMeasTb ARGS(( KwCb *gCb, KwDlRbCb *rbCb )); EXTERN S16 kwUtlSndDlL2MeasNCfm ARGS((KwCb *gCb, KwL2MeasReqEvt *measReqEvt, KwL2MeasCfmEvt *measCfmEvt)); EXTERN S16 kwUtlSndDlL2MeasCfm ARGS ((KwCb *gCb, KwL2MeasEvtCb *measEvtCb)); EXTERN S16 kwUtlProcHarqInd ARGS (( KwCb *gCb, RguHarqStatusInd *staInd, KwDlUeCb *ueCb, U8 tbIdx)); EXTERN Void kwUtlResetDlL2MeasInKwRb ARGS ((KwCb *gCb, KwL2MeasCb *measCb, U8 measType)); EXTERN S16 KwMiLkwL2MeasStopCfm ARGS((Pst *pst, U8 measType,U8 status)); EXTERN S16 kwUtlValidateIpThL2Meas ARGS((KwL2MeasReqEvt *measReqEvt, KwL2MeasCfmEvt *measCfmEvt)); EXTERN S16 kwFetchLchInfo ARGS ((KwL2MeasReqEvt *measReqEvt, KwL2MeasCfmEvt *measCfmEvt, U16 ueId, CmLteLcId *lChId, U8 *numLch)); EXTERN S16 kwUtlNotifyMacUlIp ARGS ((KwL2MeasCb *measCb,U16 ueIdx, Bool enable, CmLteLcId *lChId, U8 *numLCh)); #endif EXTERN Void kwUtlFreeDlMem ARGS(( Void)); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __KW_DLX__ */ /********************************************************************30** End of file **********************************************************************/