From 28f46cc35608de7bddea133457cff5fb330fd86d Mon Sep 17 00:00:00 2001 From: sphoorthi Date: Wed, 13 Jan 2021 21:38:14 +0530 Subject: [PATCH] JIRA ID:[ODUHIGH-282]:UL REASSEMBLE SDU Change-Id: I9c783ad28fa093444f577dfad8c42f089a29a959 Signed-off-by: sphoorthi --- build/odu/makefile | 2 +- src/5gnrrlc/kw.h | 63 +++--- src/5gnrrlc/kw.x | 5 + src/5gnrrlc/kw_amm_dl.c | 178 ++++++++--------- src/5gnrrlc/kw_amm_ul.c | 150 +++++++------- src/5gnrrlc/kw_cfg_ul.c | 15 +- src/5gnrrlc/kw_ptli.c | 2 +- src/5gnrrlc/kw_tmm_dl.c | 4 +- src/5gnrrlc/kw_udx_dl.c | 10 +- src/5gnrrlc/kw_udx_ul.c | 2 +- src/5gnrrlc/kw_uim.c | 4 +- src/5gnrrlc/kw_ul.x | 55 +++++- src/5gnrrlc/kw_umm_dl.c | 4 +- src/5gnrrlc/kw_umm_ul.c | 513 +++++++++++++++++++++++++++++++++--------------- src/5gnrrlc/kw_utl_dl.c | 78 ++++---- src/5gnrrlc/kw_utl_ul.c | 72 ++++++- 16 files changed, 732 insertions(+), 425 deletions(-) diff --git a/build/odu/makefile b/build/odu/makefile index 1874e6c3e..02efd5a5b 100644 --- a/build/odu/makefile +++ b/build/odu/makefile @@ -70,7 +70,7 @@ endif # macro for output file name and makefile name # -PLTFRM_FLAGS= -UMSPD -DODU -DINTEL_FAPI #-DODU_SLOT_IND_DEBUG_LOG -DEGTP_TEST +PLTFRM_FLAGS= -UMSPD -DODU -DINTEL_FAPI #-DNR_RLC_UL -DODU_SLOT_IND_DEBUG_LOG -DEGTP_TEST ifeq ($(MODE),TDD) PLTFRM_FLAGS += -DMODE=TDD diff --git a/src/5gnrrlc/kw.h b/src/5gnrrlc/kw.h index 73775d7c8..5fcd396a6 100755 --- a/src/5gnrrlc/kw.h +++ b/src/5gnrrlc/kw.h @@ -113,7 +113,7 @@ { \ SPutMsg(_sdu->mBuf); \ cmLListDelFrm(_sduQ,&_sdu->lstEnt); \ - RLC_FREE_WC(_cb,_sdu, sizeof(RlcSdu)); \ + RLC_FREE(_cb,_sdu, sizeof(RlcSdu)); \ } #define RLC_FREE(_cb,_buf, _size) \ @@ -123,12 +123,6 @@ _buf = NULLP; \ } -#define RLC_FREE_BUF(_buf) \ -{ \ - SPutMsg(_buf); \ - _buf = NULLP; \ -} - #else #define RLC_FREE_SHRABL_BUF(_region, _pool,_buf, _size) \ @@ -203,26 +197,8 @@ } \ } -#define RLC_FREE_BUF(_buf) \ -{ \ - if (_buf != NULLP) \ - { \ - SPutMsg(_buf); \ - } \ - _buf = NULLP; \ -} #endif - - - -#define RLC_FREE_WC(_cb,_buf, _size) \ -{ \ - (Void) SPutSBuf(_cb->init.region, _cb->init.pool, \ - (Data *) _buf, (Size) _size); \ - _buf = NULLP; /*assigning NULLP after free*/ \ -} - /* kw002.201 Freeing from region of pst */ #define RLC_PST_FREE(_region, _pool, _buf, _size) \ { \ @@ -290,8 +266,6 @@ } #endif -#define RLC_FREE_BUF_WC(_buf) SPutMsg((_buf)); - #define RLC_MEM_CPY(_dst, _src, _size) memcpy(_dst, _src, _size); #define RLC_MEM_ZERO(_buf, _size) memset((_buf), 0, _size); @@ -551,8 +525,8 @@ /******************************************************************************* * AMM Defines ******************************************************************************/ -#define AMDL rbCb->m.amDl -#define AMUL rbCb->m.amUl +#define RLC_AMDL rbCb->m.amDl +#define RLC_AMUL rbCb->m.amUl /* PDU Types */ #define RLC_DATA_PDU 1 @@ -620,10 +594,8 @@ #define RLC_SN_POS_12BIT 0x0F #define RLC_SN_POS_18BIT 0x03 #define RLC_AM_GET_WIN_SZ(_snLen) ((RLC_AM_CFG_12BIT_SN_LEN == (_snLen)) ? (2048) : (131072)) /* 5GNR */ -#define RLC_RCV_BUF_BIN_SIZE 512 /* Could be increased to avoid the search time. - with the memory trade-off */ -#define RLC_TX_BUF_BIN_SIZE 512 /* Could be increased to avoid the search time. - with the memory trade-off */ +#define RLC_RCV_BUF_BIN_SIZE 512 /* receive buffer size */ +#define RLC_TX_BUF_BIN_SIZE 512 /* receive buffer size */ #define RLC_SDU_LST 1 #define RLC_SEG_LST 2 @@ -655,7 +627,6 @@ nod = NULLP; \ } - #define RLC_LLIST_FIRST_RETX(lstCp, nod) \ { \ CmLList *tmpNode; \ @@ -763,6 +734,28 @@ } \ } +#ifdef NR_RLC_UL +#define RLC_UMM_LLIST_FIRST_SEG(lstCp, nod) \ +{ \ + CmLList *tmpNode; \ + if((tmpNode=cmLListFirst(&lstCp))) \ + nod = (RlcUmSeg *)tmpNode->node; \ + else \ + nod = NULLP; \ +} /*!< um mode first segment of linked list*/ + +#define RLC_UMM_LLIST_NEXT_SEG(lstCp, nod) \ +{ \ + CmLList *tmpNode; \ + (lstCp).crnt = &((nod)->lstEnt); \ + if((tmpNode = cmLListNext(&lstCp))) \ + nod = (RlcUmSeg *)tmpNode->node; \ + else \ + nod = NULLP; \ +}/*!< next segment in um mode linked list*/ + +#endif + #define MODAMT(x, y, z,_snModMask) \ { \ y = (x - z) & _snModMask; \ @@ -794,7 +787,7 @@ #endif #define RLC_AM_IS_POLL_BIT_SET(_amDl) \ - (AMDL.pollSn == ((AMDL.txNext - 1) & AMDL.snModMask)) + (RLC_AMDL.pollSn == ((RLC_AMDL.txNext - 1) & RLC_AMDL.snModMask)) #define RLC_FILL_CNTRL_INFO(cntrlInfo, _val, _len, _idx, _eb)\ { \ diff --git a/src/5gnrrlc/kw.x b/src/5gnrrlc/kw.x index 927bbbaec..00c3797ec 100755 --- a/src/5gnrrlc/kw.x +++ b/src/5gnrrlc/kw.x @@ -110,12 +110,17 @@ typedef RguLchMapInfo KwLchMapInfo; */ typedef struct rlcUmHdr { +#ifdef NR_RLC_UL + uint8_t si; /*!< Segmentation Info */ + uint16_t so; /*!< Segment offset 5G NR */ +#endif uint8_t fi; /*!< Framing Info */ RlcSn sn; /*!< Sequence number */ uint16_t numLi; /*!< Number of LIs */ uint16_t li[RLC_MAX_UL_LI]; /*!< Array of LIs */ }RlcUmHdr; + /** * @brief Structure to hold an Acknowledged Mode header * diff --git a/src/5gnrrlc/kw_amm_dl.c b/src/5gnrrlc/kw_amm_dl.c index 8d642d401..279a9ca08 100755 --- a/src/5gnrrlc/kw_amm_dl.c +++ b/src/5gnrrlc/kw_amm_dl.c @@ -96,7 +96,7 @@ Void rlcAmmDlHndlStatusPdu ARGS ((RlcCb *gCb, {\ Buffer *_pduInfo; \ SSegMsg((_retx)->seg, (_retx)->hdrSz, &_pduInfo); \ - RLC_FREE_BUF((_retx)->seg); \ + ODU_PUT_MSG_BUF((_retx)->seg); \ (_retx)->seg = _pduInfo; \ }\ (_rbCb)->m.amDl.estHdrSz -= retx->hdrSz;\ @@ -429,7 +429,7 @@ KwuDatCfmInfo ** datCfm CmLList *lnk; CmLList *nextLnk; - txBuf = rlcUtlGetTxBuf(AMDL.txBufLst, nackSnInfo->sn); + txBuf = rlcUtlGetTxBuf(RLC_AMDL.txBufLst, nackSnInfo->sn); if (txBuf == NULLP) { return; @@ -466,13 +466,13 @@ KwuDatCfmInfo ** datCfm nextLnk = lnk->next; /* Delete node from the txBuf Pdu lst */ cmLListDelFrm(&txBuf->pduLst, lnk); - RLC_FREE_WC(gCb, pduInfo, sizeof(RlcDlPduInfo)); + RLC_FREE(gCb, pduInfo, sizeof(RlcDlPduInfo)); lnk = nextLnk; } if(!txBuf->pduLst.count) { /*No more Sdu byte segment are left. Hence delete txBuf*/ - rlcUtlDelTxBuf(AMDL.txBufLst, txBuf,gCb); + rlcUtlDelTxBuf(RLC_AMDL.txBufLst, txBuf,gCb); } return; @@ -512,7 +512,7 @@ KwuDatCfmInfo **datCfm /* if the NACK_SN is in the transmit buffer, move it to the re- transmit buffer */ - txBuf = rlcUtlGetTxBuf(AMDL.txBufLst, nackSnInfo->sn); + txBuf = rlcUtlGetTxBuf(RLC_AMDL.txBufLst, nackSnInfo->sn); if (txBuf != NULLP) { if(nackSnInfo->isSegment) @@ -717,7 +717,7 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) rlckwuSap = gCb->u.dlCb->rlcKwuDlSap + RLC_UI_PDCP; /* store the re-transmission bo, to check if it changes due to the processing of the status pdu */ - oldRetxBo = AMDL.retxBo; + oldRetxBo = RLC_AMDL.retxBo; /* Allocate memory for datCfm Info */ RLC_SHRABL_STATIC_BUF_ALLOC(rlckwuSap->pst.region, rlckwuSap->pst.pool, datCfm, sizeof(KwuDatCfmInfo)); @@ -737,8 +737,8 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) datCfm->numSduIds = 0; datCfm->rlcId = rbCb->rlcId; - MODAMT(pStaPdu->ackSn, mAckSn, AMDL.txNextAck,AMDL.snModMask); - MODAMT(AMDL.txNext,mTxNext, AMDL.txNextAck,AMDL.snModMask); + MODAMT(pStaPdu->ackSn, mAckSn, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); + MODAMT(RLC_AMDL.txNext,mTxNext, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); if(mAckSn > mTxNext) { @@ -746,7 +746,7 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) "Invalid ACK SN = %d received. Current Vta =%d" "UEID:%d CELLID:%d", pStaPdu->ackSn, - AMDL.txNextAck, + RLC_AMDL.txNextAck, rbCb->rlcId.ueId, rbCb->rlcId.cellId); /* RLC_SHRABL_STATIC_BUF_ALLOC(rlckwuSap->pst.region, rlckwuSap->pst.pool, datCfm, sizeof(KwuDatCfmInfo)); */ @@ -759,7 +759,7 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) rlcAmmDlCheckAndStopPollTmr(gCb, rbCb, mAckSn); /* Set the first node in retx list to retxNode */ - retxNode = AMDL.retxLst.first; + retxNode = RLC_AMDL.retxLst.first; /* If NACK exists in control PDU */ if (pStaPdu->nackCnt) @@ -768,7 +768,7 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) RlcNackInfo nackSnInfo; RlcSn mNackSn; RlcSn txNextAck; - RlcSn transWinStartSn = AMDL.txNextAck; /*used to track the SN from which + RlcSn transWinStartSn = RLC_AMDL.txNextAck; /*used to track the SN from which to start processing the transmission buffer */ uint32_t idx = 0; @@ -801,10 +801,10 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) /* move transWinStartSn to nackSnInfo.sn + 1, as the pdu's before that will be removed from the buffer */ transWinStartSn = (nackSnInfo.sn + (nackSnInfo.nackRange ?\ - (nackSnInfo.nackRange - 1) : 0) + 1) & AMDL.snModMask; + (nackSnInfo.nackRange - 1) : 0) + 1) & RLC_AMDL.snModMask; /* Clear the acked SNs from the retx list */ - MODAMT(nackSnInfo.sn, mNackSn, AMDL.txNextAck,AMDL.snModMask); + MODAMT(nackSnInfo.sn, mNackSn, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); if ((mNackSn > mAckSn) || (mNackSn >= mTxNext)) { @@ -833,12 +833,12 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) * nack sn*/ do { - RlcDlAmmGetNackSnInfoFrmNackRangeIdx(&AMDL, &pStaPdu->nackInfo[idx], + RlcDlAmmGetNackSnInfoFrmNackRangeIdx(&RLC_AMDL, &pStaPdu->nackInfo[idx], retxNode, &nackSnInfo, idx1); rlcAmmDlUpdateTxAndReTxBufForNackSn(gCb, rbCb, &nackSnInfo, &retxNode, &datCfm); - nackSnInfo.sn = ((nackSnInfo.sn + 1) & (AMDL.snModMask)); + nackSnInfo.sn = ((nackSnInfo.sn + 1) & (RLC_AMDL.snModMask)); gRlcStats.amRlcStats.numRlcAmCellNackRx++; }while((++idx1) < (nackSnInfo.nackRange)); @@ -852,7 +852,7 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) rlcAmmDlUpdateTxAndReTxBufForAckSn(gCb,rbCb, mAckSn, retxNode, &datCfm); /* Update txNextAck */ - rlcAmmDlSetTxNextAck(&AMDL,txNextAck); + rlcAmmDlSetTxNextAck(&RLC_AMDL,txNextAck); } else { @@ -867,7 +867,7 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) rlcAmmDlUpdateTxAndReTxBufForAckSn(gCb,rbCb, mAckSn, retxNode, &datCfm); /* update txNextAck */ - rlcAmmDlSetTxNextAck(&AMDL, pStaPdu->ackSn); + rlcAmmDlSetTxNextAck(&RLC_AMDL, pStaPdu->ackSn); } if(datCfm->numSduIds != 0) @@ -893,12 +893,12 @@ Void rlcAmmDlHndlStatusPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcUdxStaPdu *pStaPdu) } /* Fix for memory corruption */ - RLC_LLIST_FIRST_RETX(AMDL.retxLst, AMDL.nxtRetx); - /* BO update, if retransmission BO has changed. AMDL.retxBo would have + RLC_LLIST_FIRST_RETX(RLC_AMDL.retxLst, RLC_AMDL.nxtRetx); + /* BO update, if retransmission BO has changed. RLC_AMDL.retxBo would have canged inside the above called functions */ - if (oldRetxBo != AMDL.retxBo) + if (oldRetxBo != RLC_AMDL.retxBo) { - rlcAmmSendDedLcBoStatus(gCb, rbCb, &AMDL); + rlcAmmSendDedLcBoStatus(gCb, rbCb, &RLC_AMDL); } return; @@ -1018,26 +1018,26 @@ dlrate_kwu += sdu->sduSz; #endif /* Update nxtTx to point to the added sdu if this is the first SDU in the * queue */ - if (AMDL.nxtTx == NULLP) + if (RLC_AMDL.nxtTx == NULLP) { DU_LOG("\nRLC : rlcAmmQSdu: Received SDU will be transmitted next \ UEID:%d CELLID:%d", rbCb->rlcId.ueId, rbCb->rlcId.cellId); - AMDL.nxtTx = sdu; + RLC_AMDL.nxtTx = sdu; } /* Add sdu to the sdu list */ - cmLListAdd2Tail(&AMDL.sduQ, &sdu->lstEnt); + cmLListAdd2Tail(&RLC_AMDL.sduQ, &sdu->lstEnt); sdu->lstEnt.node = (PTR)sdu; #ifdef LTE_L2_MEAS #ifndef L2_L3_SPLIT #ifdef TENB_STATS if (rbCb->ueCb->tenbStats) { - if (AMDL.sduQ.count > rbCb->ueCb->tenbStats->stats.nonPersistent.rlc.dlMaxPktsInSduQ) + if (RLC_AMDL.sduQ.count > rbCb->ueCb->tenbStats->stats.nonPersistent.rlc.dlMaxPktsInSduQ) { - rbCb->ueCb->tenbStats->stats.nonPersistent.rlc.dlMaxPktsInSduQ = AMDL.sduQ.count; + rbCb->ueCb->tenbStats->stats.nonPersistent.rlc.dlMaxPktsInSduQ = RLC_AMDL.sduQ.count; } - rlcWinSz = RLC_AM_TRANS_WIN_SIZE(&AMDL); + rlcWinSz = RLC_AM_TRANS_WIN_SIZE(&RLC_AMDL); if (rlcWinSz > rbCb->ueCb->tenbStats->stats.nonPersistent.rlc.dlMaxWindowSz) { rbCb->ueCb->tenbStats->stats.nonPersistent.rlc.dlMaxWindowSz = rlcWinSz; @@ -1047,14 +1047,14 @@ dlrate_kwu += sdu->sduSz; #endif #endif /* Update BO and estimate header size for the current BO */ - AMDL.bo = AMDL.bo + sdu->sduSz; - if(AMDL.snLen == RLC_AM_CFG_12BIT_SN_LEN) + RLC_AMDL.bo = RLC_AMDL.bo + sdu->sduSz; + if(RLC_AMDL.snLen == RLC_AM_CFG_12BIT_SN_LEN) { - AMDL.estHdrSz += 2; + RLC_AMDL.estHdrSz += 2; } else { - AMDL.estHdrSz += 3; + RLC_AMDL.estHdrSz += 3; } #ifdef LTE_L2_MEAS_RLC /* Update numActUe if it is not active */ @@ -1068,7 +1068,7 @@ dlrate_kwu += sdu->sduSz; if(!rlcDlUtlIsReestInProgress(rbCb)) { - rlcAmmSendDedLcBoStatus(gCb, rbCb, &AMDL); + rlcAmmSendDedLcBoStatus(gCb, rbCb, &RLC_AMDL); } return; @@ -1114,17 +1114,17 @@ static void rlcAmmDlAssembleCntrlInfo(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rl sapCb->suId, &(rbCb->rlcId)); /* Update number of pdus in pduInfo */ - rlcDatReq->pduInfo.mBuf[rlcDatReq->pduInfo.numPdu] = AMDL.mBuf; + rlcDatReq->pduInfo.mBuf[rlcDatReq->pduInfo.numPdu] = RLC_AMDL.mBuf; rlcDatReq->pduInfo.numPdu++; gRlcStats.amRlcStats.numDLStaPduSent++; RLC_FREE_SHRABL_BUF(gCb->u.dlCb->udxDlSap->pst.region, gCb->u.dlCb->udxDlSap->pst.pool, - AMDL.pStaPdu, + RLC_AMDL.pStaPdu, sizeof(RlcUdxDlStaPdu)); - AMDL.pStaPdu = NULLP; - AMDL.mBuf = NULLP; + RLC_AMDL.pStaPdu = NULLP; + RLC_AMDL.mBuf = NULLP; gRlcStats.amRlcStats.numDLStaPduSent++; } @@ -1165,16 +1165,16 @@ void rlcAmmProcessSdus(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq, bool f * flag will always be TRUE. In CA case, for PCELL it is TRUE and for SCEll * it is FALSE */ - if ((AMDL.cntrlBo != 0) + if ((RLC_AMDL.cntrlBo != 0) #ifdef LTE_ADV && (fillCtrlPdu) #endif ) { rlcDatReq->boRep.staPduPrsnt = TRUE; - rlcDatReq->boRep.staPduBo = AMDL.cntrlBo; + rlcDatReq->boRep.staPduBo = RLC_AMDL.cntrlBo; - if (AMDL.pStaPdu != NULLP) + if (RLC_AMDL.pStaPdu != NULLP) { rlcAmmDlAssembleCntrlInfo (gCb, rbCb, rlcDatReq); } @@ -1183,35 +1183,35 @@ void rlcAmmProcessSdus(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq, bool f DU_LOG("\nRLC: rlcAmmProcessSdus: Miscomputation of control Bo. \ UEID:%d CELLID:%d", rbCb->rlcId.ueId, rbCb->rlcId.cellId); } - AMDL.cntrlBo = 0; + RLC_AMDL.cntrlBo = 0; } /* Retransmit PDUs /portions of PDUs available in retxLst */ - if ((rlcDatReq->pduSz > 0) && (AMDL.nxtRetx != NULLP)) + if ((rlcDatReq->pduSz > 0) && (RLC_AMDL.nxtRetx != NULLP)) { rlcResegRetxPdus (gCb,rbCb, rlcDatReq); } /* Assemble SDUs to form new PDUs */ - if ((rlcDatReq->pduSz > 0) && (AMDL.nxtTx != 0)) + if ((rlcDatReq->pduSz > 0) && (RLC_AMDL.nxtTx != 0)) { rlcAssembleSdus(gCb,rbCb, rlcDatReq); } - if (AMDL.nxtRetx != NULLP) + if (RLC_AMDL.nxtRetx != NULLP) { - rlcDatReq->boRep.oldestSduArrTime = AMDL.nxtRetx->sduMap.sdu->arrTime; + rlcDatReq->boRep.oldestSduArrTime = RLC_AMDL.nxtRetx->sduMap.sdu->arrTime; } - else if (AMDL.nxtTx != NULLP) + else if (RLC_AMDL.nxtTx != NULLP) { - rlcDatReq->boRep.oldestSduArrTime = AMDL.nxtTx->arrTime; + rlcDatReq->boRep.oldestSduArrTime = RLC_AMDL.nxtTx->arrTime; } /* Accumulate bo */ - rlcDatReq->boRep.bo = rlcAmmCalculateBo(&AMDL); - rlcDatReq->boRep.staPduBo = AMDL.cntrlBo; + rlcDatReq->boRep.bo = rlcAmmCalculateBo(&RLC_AMDL); + rlcDatReq->boRep.staPduBo = RLC_AMDL.cntrlBo; /* Hdr estimation is moved to kwAmmCreatePDu */ - rlcDatReq->boRep.estHdrSz = AMDL.estHdrSz; + rlcDatReq->boRep.estHdrSz = RLC_AMDL.estHdrSz; if(rlcDatReq->pduSz > 0) { @@ -1241,7 +1241,7 @@ void rlcAmmProcessSdus(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq, bool f static void rlcSplitPdu(RlcCb *gCb, RlcDlRbCb *rbCb, RlcRetx *crnt, RlcRetx *next, uint16_t size) { uint8_t si; - RlcAmDl *amDl = &AMDL; + RlcAmDl *amDl = &RLC_AMDL; /* Set the SN for the new segment */ next->amHdr.sn = crnt->amHdr.sn; @@ -1310,9 +1310,9 @@ static void rlcSplitPdu(RlcCb *gCb, RlcDlRbCb *rbCb, RlcRetx *crnt, RlcRetx *nex } /* Add the next to the retx list */ - AMDL.retxLst.crnt = &crnt->lstEnt; - CM_LLIST_INS_AFT_CRNT(AMDL.retxLst, next); - AMDL.nxtRetx = next; + RLC_AMDL.retxLst.crnt = &crnt->lstEnt; + CM_LLIST_INS_AFT_CRNT(RLC_AMDL.retxLst, next); + RLC_AMDL.nxtRetx = next; amDl->estHdrSz += next->hdrSz; return; @@ -1358,7 +1358,7 @@ static void rlcResegRetxPdus(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq) uint8_t numSdus; #endif - amDl = &AMDL; + amDl = &RLC_AMDL; #ifdef LTE_L2_MEAS /* TODO : This shoould be taken care in new Trasmissions */ /* This lchInfo should be retrieved there */ @@ -1423,7 +1423,7 @@ static void rlcResegRetxPdus(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq) RLC_UPD_POLL_BIT(gCb, retx, pollBit); rlcDatReq->pduSz -= pduSz; - AMDL.estHdrSz -= retx->hdrSz; + RLC_AMDL.estHdrSz -= retx->hdrSz; #ifdef LTE_L2_MEAS if (rbCb->rlcId.rbType == CM_LTE_DRB) @@ -1578,7 +1578,7 @@ static void rlcAssembleSdus(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDatReq) { Buffer *pdu = NULLP; MsgLen macGrntSz = rlcDatReq->pduSz; - RlcAmDl *amDl = &AMDL; + RlcAmDl *amDl = &RLC_AMDL; RlcSdu *sdu = amDl->nxtTx; RlcSduMap sduMap; bool nxtTxUpd = FALSE; @@ -2199,17 +2199,17 @@ RlcDlPduInfo *pduInfo, Buffer *pdu) */ static Void rlcRemRetxPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcRetx *retx) { - cmLListDelFrm(&AMDL.retxLst, &retx->lstEnt); + cmLListDelFrm(&RLC_AMDL.retxLst, &retx->lstEnt); - if( AMDL.retxLst.count == 0) + if( RLC_AMDL.retxLst.count == 0) { - AMDL.nxtRetx = NULLP; + RLC_AMDL.nxtRetx = NULLP; } if(retx->pendingReTrans == TRUE) { - AMDL.retxBo -= retx->segSz; - AMDL.estHdrSz -= retx->hdrSz; + RLC_AMDL.retxBo -= retx->segSz; + RLC_AMDL.estHdrSz -= retx->hdrSz; } rlcUtlAddReTxPduToBeFreedQueue(gCb, retx); @@ -2236,7 +2236,7 @@ static Void rlcRemRetxPdu(RlcCb *gCb,RlcDlRbCb *rbCb,RlcRetx *retx) */ static Void rlcAmmDlMarkPduForReTx(RlcCb *gCb,RlcDlRbCb *rbCb,RlcRetx *retx) { - if (AMDL.maxReTxReached == TRUE) + if (RLC_AMDL.maxReTxReached == TRUE) { return; } @@ -2246,10 +2246,10 @@ static Void rlcAmmDlMarkPduForReTx(RlcCb *gCb,RlcDlRbCb *rbCb,RlcRetx *retx) retx->pendingReTrans = TRUE; ++retx->retxCnt; - AMDL.retxBo += retx->segSz; - AMDL.estHdrSz += retx->hdrSz; + RLC_AMDL.retxBo += retx->segSz; + RLC_AMDL.estHdrSz += retx->hdrSz; - if (retx->retxCnt > AMDL.maxRetx) + if (retx->retxCnt > RLC_AMDL.maxRetx) { /* RLC_DL_MAX_RETX fix */ /* Marking the RB stalled for DL scheduling. This is to avoid unnecessary */ @@ -2273,9 +2273,9 @@ static Void rlcAmmDlMarkPduForReTx(RlcCb *gCb,RlcDlRbCb *rbCb,RlcRetx *retx) } - if (AMDL.nxtRetx == NULLP) + if (RLC_AMDL.nxtRetx == NULLP) { - AMDL.nxtRetx = retx; + RLC_AMDL.nxtRetx = retx; } gRlcStats.amRlcStats.numDLRetransPdus++; @@ -2355,7 +2355,7 @@ KwuDatCfmInfo **datCfm } /* Remove SDU from the sduQ */ - cmLListDelFrm(&AMDL.sduQ, &sdu->lstEnt); + cmLListDelFrm(&RLC_AMDL.sduQ, &sdu->lstEnt); rlcUtlAddSduToBeFreedQueue(gCb, sdu); rlcUtlRaiseDlCleanupEvent(gCb); } @@ -2388,7 +2388,7 @@ KwuDatCfmInfo **datCfm { CmLList *pduNode; - RlcTx *txBuf = rlcUtlGetTxBuf(AMDL.txBufLst, sn); + RlcTx *txBuf = rlcUtlGetTxBuf(RLC_AMDL.txBufLst, sn); if (txBuf == NULLP) { @@ -2408,7 +2408,7 @@ KwuDatCfmInfo **datCfm rlcUtlAddTxPduToBeFreedQueue(gCb, txBuf); rlcUtlRaiseDlCleanupEvent(gCb); /* so that it is not processed again */ - rlcUtlRemovTxBuf(AMDL.txBufLst, txBuf, gCb); + rlcUtlRemovTxBuf(RLC_AMDL.txBufLst, txBuf, gCb); return; } @@ -2683,12 +2683,12 @@ Void rlcAmmPollRetxTmrExp(RlcCb *gCb,RlcDlRbCb *rbCb) { rlcAmmDlMoveFrmTxtoRetxBuffer(gCb,amDl, &retx, sn); - if (AMDL.nxtRetx == NULLP) + if (RLC_AMDL.nxtRetx == NULLP) { - AMDL.nxtRetx = retx; + RLC_AMDL.nxtRetx = retx; } - rlcAmmSendDedLcBoStatus(gCb, rbCb, &AMDL); + rlcAmmSendDedLcBoStatus(gCb, rbCb, &RLC_AMDL); return; } /* Get the last node in retxLst */ @@ -2698,7 +2698,7 @@ Void rlcAmmPollRetxTmrExp(RlcCb *gCb,RlcDlRbCb *rbCb) if (retx != NULLP) { rlcAmmDlMarkPduForReTx(gCb, rbCb, retx); - rlcAmmSendDedLcBoStatus(gCb, rbCb, &AMDL); + rlcAmmSendDedLcBoStatus(gCb, rbCb, &RLC_AMDL); } } @@ -2742,7 +2742,7 @@ KwuDatCfmInfo **datCfm { retx = (RlcRetx *)(retxNode->node); retxNode = retxNode->next; - MODAMT(retx->amHdr.sn, mSn, AMDL.txNextAck,AMDL.snModMask); + MODAMT(retx->amHdr.sn, mSn, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); if (mSn < mAckSn) { rlcAmmDlProcessSuccessfulReTx(gCb,rbCb, retx, datCfm); @@ -2753,11 +2753,11 @@ KwuDatCfmInfo **datCfm acknowledged by the ACK_SN*/ /* start from the starting of the transmission window and remove till just before ACK_SN*/ - mSn = 0; /* same as MODAMT(AMDL.txNextAck, mSn, AMDL.txNextAck);*/ - sn = AMDL.txNextAck; + mSn = 0; /* same as MODAMT(RLC_AMDL.txNextAck, mSn, RLC_AMDL.txNextAck);*/ + sn = RLC_AMDL.txNextAck; while(mSn < mAckSn) { - txBuf = rlcUtlGetTxBuf(AMDL.txBufLst, sn); + txBuf = rlcUtlGetTxBuf(RLC_AMDL.txBufLst, sn); if (txBuf != NULLP) { RLOG_ARG3(L_UNUSED,DBG_RBID,rbCb->rlcId.rbId, @@ -2770,8 +2770,8 @@ KwuDatCfmInfo **datCfm rlcAmmDlProcessSuccessfulTxPdu(gCb,rbCb, sn, datCfm); } - sn = (sn + 1) & AMDL.snModMask; - MODAMT(sn, mSn, AMDL.txNextAck,AMDL.snModMask); + sn = (sn + 1) & RLC_AMDL.snModMask; + MODAMT(sn, mSn, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); } return; @@ -2811,7 +2811,7 @@ KwuDatCfmInfo **datCfm while (*retxNode) { retx = (RlcRetx *)((*retxNode)->node); - MODAMT(retx->amHdr.sn, mSn, AMDL.txNextAck,AMDL.snModMask); + MODAMT(retx->amHdr.sn, mSn, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); if (mSn < mNackSn) { (*retxNode) = (*retxNode)->next; @@ -2824,12 +2824,12 @@ KwuDatCfmInfo **datCfm } /* Remove all pdus with SN < NACK_SN from the transmission buffer */ - MODAMT(sn, mSn, AMDL.txNextAck,AMDL.snModMask); + MODAMT(sn, mSn, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); while (mSn < mNackSn) { /* this if check seems redundant,why should mSn ever be mTxSn (which actually is VT(A) */ - txBuf = rlcUtlGetTxBuf(AMDL.txBufLst, sn); + txBuf = rlcUtlGetTxBuf(RLC_AMDL.txBufLst, sn); if ((txBuf != NULLP)) { RLOG_ARG3(L_DEBUG,DBG_RBID, rbCb->rlcId.rbId, @@ -2842,8 +2842,8 @@ KwuDatCfmInfo **datCfm rlcAmmDlProcessSuccessfulTxPdu(gCb,rbCb, sn, datCfm); } - sn = (sn + 1) & AMDL.snModMask; - MODAMT(sn, mSn, AMDL.txNextAck,AMDL.snModMask); + sn = (sn + 1) & RLC_AMDL.snModMask; + MODAMT(sn, mSn, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); } return; @@ -3007,7 +3007,7 @@ RlcSn sn /* Delete node from the txBuf Pdu lst */ cmLListDelFrm(&txBuf->pduLst, txBuf->pduLst.first); - RLC_FREE_WC(gCb, pduInfo, sizeof(RlcDlPduInfo)); + RLC_FREE(gCb, pduInfo, sizeof(RlcDlPduInfo)); } /* Remove PDU from txBuf */ rlcUtlDelTxBuf(amDl->txBufLst, txBuf,gCb); @@ -3077,7 +3077,7 @@ static void rlcAmmCreateStatusPdu(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDat RlcNackInfo *rlcNackInfo; uint16_t nkCnt = 0; - pStaPdu = AMDL.pStaPdu; + pStaPdu = RLC_AMDL.pStaPdu; /* D/C| CPT| */ @@ -3346,8 +3346,8 @@ static void rlcAmmCreateStatusPdu(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *rlcDat ODU_ADD_POST_MSG_MULT(cntrlPdu, cntrlPduSz, mBuf); rlcDatReq->pduSz -= cntrlPduSz; - /* Add mBuf to AMDL.mBuf */ - AMDL.mBuf = mBuf; + /* Add mBuf to RLC_AMDL.mBuf */ + RLC_AMDL.mBuf = mBuf; return; } diff --git a/src/5gnrrlc/kw_amm_ul.c b/src/5gnrrlc/kw_amm_ul.c index f76fda69a..a2b6742ed 100755 --- a/src/5gnrrlc/kw_amm_ul.c +++ b/src/5gnrrlc/kw_amm_ul.c @@ -172,7 +172,7 @@ static uint8_t rlcAmmUlSetNackInfo(RlcUlRbCb *rbCb, RlcSn sn, bool isSegment, \ * 4) NACK_SN is continuous with previous but previous NACK_SN segments * are not missing in sequence till end */ - if((*prevNackSn == 0xffffffff) || ((((*prevNackSn) + 1) & AMUL.snModMask) != sn) || + if((*prevNackSn == 0xffffffff) || ((((*prevNackSn) + 1) & RLC_AMUL.snModMask) != sn) || (((*prevNackSn) == sn) && (((nackInfo->soEnd + 1) != soStart))) || ((nackInfo->isSegment) && (((*prevNackSn) + 1) == sn) && (nackInfo->soEnd != RLC_ALL_BYTES_MISSING))) { @@ -205,11 +205,11 @@ static uint8_t rlcAmmUlSetNackInfo(RlcUlRbCb *rbCb, RlcSn sn, bool isSegment, \ if(isSegment) { - sizeToBeEncd += ((AMUL.snLen == RLC_AM_CFG_12BIT_SN_LEN)?6:7); /* NACK,E1,E2,Sostart,SoEnd */ + sizeToBeEncd += ((RLC_AMUL.snLen == RLC_AM_CFG_12BIT_SN_LEN)?6:7); /* NACK,E1,E2,Sostart,SoEnd */ } else { - sizeToBeEncd += ((AMUL.snLen == RLC_AM_CFG_12BIT_SN_LEN)?2:3); /* NACK,E1,E2 */ + sizeToBeEncd += ((RLC_AMUL.snLen == RLC_AM_CFG_12BIT_SN_LEN)?2:3); /* NACK,E1,E2 */ } } else @@ -221,7 +221,7 @@ static uint8_t rlcAmmUlSetNackInfo(RlcUlRbCb *rbCb, RlcSn sn, bool isSegment, \ /* This case means there are continuous SNs/Segments. If it is the next * Sn then increment nackRnage. if same SN but different segment then * dont increment nackRange */ - if((((*prevNackSn) + 1) & AMUL.snModMask) == sn) + if((((*prevNackSn) + 1) & RLC_AMUL.snModMask) == sn) { nackInfo->nackRange++; } @@ -310,11 +310,11 @@ static void rlcAmmUlAssembleCntrlInfo(RlcCb *gCb, RlcUlRbCb *rbCb) } #endif - sn = AMUL.rxNext; - MODAMR(sn, mSn, AMUL.rxNext, AMUL.snModMask); - MODAMR(AMUL.rxHighestStatus, rxHighestStatus, AMUL.rxNext, AMUL.snModMask); + sn = RLC_AMUL.rxNext; + MODAMR(sn, mSn, RLC_AMUL.rxNext, RLC_AMUL.snModMask); + MODAMR(RLC_AMUL.rxHighestStatus, rxHighestStatus, RLC_AMUL.rxNext, RLC_AMUL.snModMask); - recBuf = rlcUtlGetRecBuf(AMUL.recBufLst, sn); + recBuf = rlcUtlGetRecBuf(RLC_AMUL.recBufLst, sn); while (mSn < rxHighestStatus ) { @@ -386,11 +386,11 @@ static void rlcAmmUlAssembleCntrlInfo(RlcCb *gCb, RlcUlRbCb *rbCb) } - sn = (sn + 1) & (AMUL.snModMask); /* MOD 1024 */ - MODAMR(sn, mSn, AMUL.rxNext, AMUL.snModMask); + sn = (sn + 1) & (RLC_AMUL.snModMask); /* MOD 1024 */ + MODAMR(sn, mSn, RLC_AMUL.rxNext, RLC_AMUL.snModMask); /* Get the received Buffer the updated/next SN */ - recBuf = rlcUtlGetRecBuf(AMUL.recBufLst, sn); + recBuf = rlcUtlGetRecBuf(RLC_AMUL.recBufLst, sn); /* Find the next missing sequence number if nackCnt reaches maximum and still Reordering window has some missing AMDPDUs / AMDPDU segments. The @@ -430,7 +430,7 @@ static void rlcAmmUlAssembleCntrlInfo(RlcCb *gCb, RlcUlRbCb *rbCb) /* Update ACK SN with the last sn for which feedback is not assembled */ if ( mSn == rxHighestStatus) { - pStatusPdu->ackSn = AMUL.rxHighestStatus; + pStatusPdu->ackSn = RLC_AMUL.rxHighestStatus; } else { @@ -443,8 +443,8 @@ static void rlcAmmUlAssembleCntrlInfo(RlcCb *gCb, RlcUlRbCb *rbCb) pStatusPdu->controlBo = staPduEncSize; /*Its already in bytes */ - AMUL.staTrg = FALSE; - AMUL.gatherStaPduInfo = FALSE; + RLC_AMUL.staTrg = FALSE; + RLC_AMUL.gatherStaPduInfo = FALSE; if (rlcUlUdxStaPduReq(&sapCb->pst, @@ -506,7 +506,7 @@ void rlcAmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) MsgLen rlcSduSz; /*Holds length of Rlc Sdu*/ #endif /* LTE_L2_MEAS */ - amUl = &AMUL; + amUl = &RLC_AMUL; numPduToProcess = RLC_MIN(pduInfo->numPdu, RGU_MAX_PDU); DU_LOG("\nRLC : rlcAmmProcessPdus: numPdu[%d],numPduToProcess[%d] UEID:%d CELLID:%d", @@ -542,7 +542,7 @@ void rlcAmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) { DU_LOG("\nRLC : rlcAmmProcessPdus: Header Extraction Failed UEID:%d CELLID:%d", rbCb->rlcId.ueId, rbCb->rlcId.cellId); - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); gCb->genSts.errorPdusRecv++; continue; } @@ -550,7 +550,7 @@ void rlcAmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) if (amHdr.dc == 0) { rlcAmmUlHndlStatusPdu(gCb, rbCb, pdu, &fByte); - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); continue; } if((amHdr.si == RLC_SI_LAST_SEG) && (!amHdr.so)) @@ -558,7 +558,7 @@ void rlcAmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) DU_LOG("\nRLC: rlcAmmProcessPdus: Dropping PDU because SO can't be zero\ for last segment sn:%u UEID:%d CELLID:%d", amHdr.sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId); - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); continue; } #ifndef RGL_SPECIFIC_CHANGES @@ -571,7 +571,7 @@ void rlcAmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) { uint32_t rlculdrop; rlculdrop++; - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); continue; } #endif @@ -582,7 +582,7 @@ void rlcAmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) { uint32_t rlculdrop; rlculdrop++; - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); continue; } #endif @@ -596,7 +596,7 @@ void rlcAmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) { if(rbCb->rlcId.rbType == CM_LTE_DRB) { - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); continue; } } @@ -1134,9 +1134,9 @@ static void rlcAmmUlRlsAllSegs(RlcCb *gCb, RlcAmRecBuf *recBuf) RLC_LLIST_FIRST_SEG(recBuf->segLst, seg); while (seg != NULLP) { - RLC_FREE_BUF_WC(seg->seg); + ODU_PUT_MSG_BUF(seg->seg); cmLListDelFrm(&(recBuf->segLst),&(seg->lstEnt)); - RLC_FREE_WC(gCb,seg, sizeof(RlcSeg)); + RLC_FREE(gCb,seg, sizeof(RlcSeg)); RLC_LLIST_FIRST_SEG(recBuf->segLst, seg); } @@ -1172,7 +1172,7 @@ static bool rlcAmmAddRcvdSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmHdr *amHdr, Buffe uint16_t expSo = 0; /* Expected SO */ soEnd = amHdr->so + pduSz - 1; - recBuf = rlcUtlGetRecBuf(AMUL.recBufLst, amHdr->sn); + recBuf = rlcUtlGetRecBuf(RLC_AMUL.recBufLst, amHdr->sn); if (NULLP == recBuf) { @@ -1183,17 +1183,17 @@ static bool rlcAmmAddRcvdSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmHdr *amHdr, Buffe DU_LOG("\nRLC: rlcAmmAddRcvdSeg: Memory allocation failed UEID:%d CELLID:%d", rbCb->rlcId.ueId, rbCb->rlcId.cellId); - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } #endif /* ERRCLASS & ERRCLS_RES */ - rlcUtlStoreRecBuf(AMUL.recBufLst, recBuf, amHdr->sn); + rlcUtlStoreRecBuf(RLC_AMUL.recBufLst, recBuf, amHdr->sn); } else { if (recBuf->allRcvd == TRUE) { - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } } @@ -1213,7 +1213,7 @@ static bool rlcAmmAddRcvdSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmHdr *amHdr, Buffe { /* This is a duplicate segment */ gRlcStats.amRlcStats.numRlcAmCellDupPduRx++; - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } @@ -1221,7 +1221,7 @@ static bool rlcAmmAddRcvdSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmHdr *amHdr, Buffe { /* This is a duplicate segment */ gRlcStats.amRlcStats.numRlcAmCellDupPduRx++; - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } @@ -1234,7 +1234,7 @@ static bool rlcAmmAddRcvdSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmHdr *amHdr, Buffe { DU_LOG("\nRLC: rlcAmmAddRcvdSeg: Memory allocation failed UEID:%d CELLID:%d", rbCb->rlcId.ueId, rbCb->rlcId.cellId); - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } #endif /* ERRCLASS & ERRCLS_RES */ @@ -1255,7 +1255,7 @@ static bool rlcAmmAddRcvdSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmHdr *amHdr, Buffe cmLListInsCrnt(&recBuf->segLst, &tseg->lstEnt); } tseg->lstEnt.node = (PTR)tseg; - rlcAmmUpdExpByteSeg(gCb,&AMUL,tseg); + rlcAmmUpdExpByteSeg(gCb,&RLC_AMUL,tseg); return TRUE; } @@ -1296,7 +1296,7 @@ static bool rlcAmmUlPlacePduInRecBuf(RlcCb *gCb, Buffer *pdu, RlcUlRbCb *rbCb, R "UEID:%d CELLID:%d", sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId); gCb->genSts.unexpPdusRecv++; - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } @@ -1315,11 +1315,11 @@ static bool rlcAmmUlPlacePduInRecBuf(RlcCb *gCb, Buffer *pdu, RlcUlRbCb *rbCb, R { DU_LOG("\nRLC: rlcAmmUlPlacePduInRecBuf: Memory allocation failed \ UEID:%d CELLID:%d", rbCb->rlcId.ueId, rbCb->rlcId.cellId); - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } #endif /* ERRCLASS & ERRCLS_RES */ - rlcUtlStoreRecBuf(AMUL.recBufLst, recBuf, sn); + rlcUtlStoreRecBuf(RLC_AMUL.recBufLst, recBuf, sn); } else if (recBuf->allRcvd != TRUE) { @@ -1329,7 +1329,7 @@ static bool rlcAmmUlPlacePduInRecBuf(RlcCb *gCb, Buffer *pdu, RlcUlRbCb *rbCb, R { gRlcStats.amRlcStats.numRlcAmCellDupPduRx++; gCb->genSts.unexpPdusRecv++; - RLC_FREE_BUF(pdu); + ODU_PUT_MSG_BUF(pdu); return FALSE; } recBuf->isDelvUpperLayer = FALSE; @@ -1426,39 +1426,39 @@ static void rlcAmmTriggerStatus(RlcCb *gCb, RlcUlRbCb *rbCb, RlcSn sn, bool disc static void rlcAmmProcPduOrSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmHdr *amHdr, Buffer *pdu) { - if ((AMUL.expSn != amHdr->sn) || (AMUL.expSo != amHdr->so)) + if ((RLC_AMUL.expSn != amHdr->sn) || (RLC_AMUL.expSo != amHdr->so)) { /* Release the existing partial SDU as we have PDUs or */ /* segments that are out of sequence */ rbCb->m.amUl.isOutOfSeq = TRUE; - RLC_FREE_BUF(AMUL.partialSdu); + ODU_PUT_MSG_BUF(RLC_AMUL.partialSdu); } //if (amHdr->fi & RLC_FI_FIRST_SEG) if (amHdr->si == 0x01) {/* first Segment of the SDU */ - if (AMUL.partialSdu != NULLP) + if (RLC_AMUL.partialSdu != NULLP) { /* Some old SDU may be present */ - RLC_FREE_BUF_WC(AMUL.partialSdu); + ODU_PUT_MSG_BUF(RLC_AMUL.partialSdu); } - AMUL.partialSdu = pdu; + RLC_AMUL.partialSdu = pdu; pdu = NULLP; } else if(amHdr->si == 0x03) {/* Middle or last segment of the SUD */ - ODU_CAT_MSG(AMUL.partialSdu,pdu, M1M2); - RLC_FREE_BUF_WC(pdu); + ODU_CAT_MSG(RLC_AMUL.partialSdu,pdu, M1M2); + ODU_PUT_MSG_BUF(pdu); pdu = NULLP; } else if (amHdr->si == 0x02) { - ODU_CAT_MSG(pdu,AMUL.partialSdu,M2M1); - RLC_FREE_BUF_WC(AMUL.partialSdu); + ODU_CAT_MSG(pdu,RLC_AMUL.partialSdu,M2M1); + ODU_PUT_MSG_BUF(RLC_AMUL.partialSdu); } if (pdu != NULLP) { - AMUL.partialSdu = NULLP; + RLC_AMUL.partialSdu = NULLP; rlcUtlSendUlDataToDu(gCb,rbCb, pdu); } @@ -1496,27 +1496,27 @@ static uint8_t rlcAmmUlReassembleSdus(RlcCb *gCb, RlcUlRbCb *rbCb, RlcAmRecBuf * rlcAmmProcPduOrSeg(gCb,rbCb, &recBuf->amHdr, recBuf->pdu); /* Assign NULLP to recBuf->pdu as this PDU is sent to PDCP */ recBuf->pdu = NULLP; - AMUL.expSn = (recBuf->amHdr.sn + 1) & (AMUL.snModMask); /* MOD 1024 */ - AMUL.expSo = 0; + RLC_AMUL.expSn = (recBuf->amHdr.sn + 1) & (RLC_AMUL.snModMask); /* MOD 1024 */ + RLC_AMUL.expSo = 0; } else { /* This is a set of segments */ RLC_LLIST_FIRST_SEG(recBuf->segLst, seg); - AMUL.expSn = recBuf->amHdr.sn; - AMUL.expSo = 0; + RLC_AMUL.expSn = recBuf->amHdr.sn; + RLC_AMUL.expSo = 0; while(seg) { rlcAmmProcPduOrSeg(gCb,rbCb, &seg->amHdr, seg->seg); - AMUL.expSo = seg->soEnd + 1; + RLC_AMUL.expSo = seg->soEnd + 1; cmLListDelFrm(&(recBuf->segLst),&(seg->lstEnt)); - RLC_FREE_WC(gCb, seg, sizeof(RlcSeg)); + RLC_FREE(gCb, seg, sizeof(RlcSeg)); RLC_LLIST_FIRST_SEG(recBuf->segLst, seg); } - AMUL.expSn = (recBuf->amHdr.sn + 1) & (AMUL.snModMask); /* MOD 1024 */ - AMUL.expSo = 0; + RLC_AMUL.expSn = (recBuf->amHdr.sn + 1) & (RLC_AMUL.snModMask); /* MOD 1024 */ + RLC_AMUL.expSo = 0; } return ROK; @@ -1544,15 +1544,15 @@ Void rlcAmmUlReEstablish(RlcCb *gCb,CmLteRlcId rlcId,Bool sendReEst,RlcUlRbCb * #endif RlcAmRecBuf *recBuf = NULLP; - sn = AMUL.rxNext; + sn = RLC_AMUL.rxNext; - MODAMR(AMUL.vrMr, mVrMr, AMUL.rxNext, AMUL.snModMask); - MODAMR(sn, mSn, AMUL.rxNext, AMUL.snModMask); + MODAMR(RLC_AMUL.vrMr, mVrMr, RLC_AMUL.rxNext, RLC_AMUL.snModMask); + MODAMR(sn, mSn, RLC_AMUL.rxNext, RLC_AMUL.snModMask); /* Reassemble SDUs from PDUs with SN less than upper edge of the window */ while (mSn < mVrMr) { - recBuf = rlcUtlGetRecBuf(AMUL.recBufLst, sn); + recBuf = rlcUtlGetRecBuf(RLC_AMUL.recBufLst, sn); if (NULLP != recBuf) { if (recBuf->allRcvd == TRUE) @@ -1564,15 +1564,15 @@ Void rlcAmmUlReEstablish(RlcCb *gCb,CmLteRlcId rlcId,Bool sendReEst,RlcUlRbCb * /* Remove PDU and segments */ if(recBuf->pdu) { - RLC_FREE_BUF_WC(recBuf->pdu); + ODU_PUT_MSG_BUF(recBuf->pdu); } /* Release all the segments*/ rlcAmmUlRlsAllSegs(gCb,recBuf); } - rlcUtlDelRecBuf(AMUL.recBufLst, recBuf, gCb); + rlcUtlDelRecBuf(RLC_AMUL.recBufLst, recBuf, gCb); } - sn = (sn + 1) & (AMUL.snModMask); /* MOD 1024 */ - MODAMR(sn, mSn, AMUL.rxNext, AMUL.snModMask); + sn = (sn + 1) & (RLC_AMUL.snModMask); /* MOD 1024 */ + MODAMR(sn, mSn, RLC_AMUL.rxNext, RLC_AMUL.snModMask); } /* Discard remaining PDUs and bytesegments in recBuf */ @@ -1586,18 +1586,18 @@ Void rlcAmmUlReEstablish(RlcCb *gCb,CmLteRlcId rlcId,Bool sendReEst,RlcUlRbCb * rlcStopTmr(gCb,(PTR)rbCb, RLC_EVT_AMUL_STA_PROH_TMR); } - AMUL.rxNext = 0; - AMUL.rxNextHighestRcvd = 0; - AMUL.rxNextStatusTrig = 0; + RLC_AMUL.rxNext = 0; + RLC_AMUL.rxNextHighestRcvd = 0; + RLC_AMUL.rxNextStatusTrig = 0; rbCb->m.amUl.vrMr = (rbCb->m.amUl.rxNext + RLC_AM_GET_WIN_SZ(rbCb->m.amUl.snLen)) & (rbCb->m.amUl.snModMask); - AMUL.rxHighestStatus = 0; - AMUL.staTrg = FALSE; - AMUL.gatherStaPduInfo = FALSE; - AMUL.expSn = 0; - AMUL.expSo = 0; - if (AMUL.partialSdu != NULLP) + RLC_AMUL.rxHighestStatus = 0; + RLC_AMUL.staTrg = FALSE; + RLC_AMUL.gatherStaPduInfo = FALSE; + RLC_AMUL.expSn = 0; + RLC_AMUL.expSo = 0; + if (RLC_AMUL.partialSdu != NULLP) { - RLC_FREE_BUF(AMUL.partialSdu); + ODU_PUT_MSG_BUF(RLC_AMUL.partialSdu); } rlcKwuSap = gCb->u.ulCb->rlcKwuUlSap + RLC_UI_PDCP; @@ -1639,7 +1639,7 @@ Void rlcAmmReOrdTmrExp(RlcCb *gCb,RlcUlRbCb *rbCb) MODAMR(sn, mSn, amUl->rxNext, amUl->snModMask); MODAMR(amUl->vrMr, mVrMr, amUl->rxNext, amUl->snModMask); - recBuf = rlcUtlGetRecBuf(AMUL.recBufLst, sn); + recBuf = rlcUtlGetRecBuf(RLC_AMUL.recBufLst, sn); while (mSn < mVrMr) { @@ -1896,7 +1896,7 @@ Void rlcAmmFreeUlRbCb(RlcCb *gCb,RlcUlRbCb *rbCb) { if (recBuf->pdu != NULLP) { - RLC_FREE_BUF_WC(recBuf->pdu); + ODU_PUT_MSG_BUF(recBuf->pdu); } /* Release all the segments */ rlcAmmUlRlsAllSegs(gCb,recBuf); @@ -1906,13 +1906,13 @@ Void rlcAmmFreeUlRbCb(RlcCb *gCb,RlcUlRbCb *rbCb) }while ( curSn < windSz ); #ifndef LTE_TDD - RLC_FREE_WC(gCb,rbCb->m.amUl.recBufLst, (RLC_RCV_BUF_BIN_SIZE * sizeof(CmLListCp))); + RLC_FREE(gCb,rbCb->m.amUl.recBufLst, (RLC_RCV_BUF_BIN_SIZE * sizeof(CmLListCp))); rbCb->m.amUl.recBufLst = NULLP; #endif if(rbCb->m.amUl.partialSdu != NULLP) { - RLC_FREE_BUF_WC(rbCb->m.amUl.partialSdu); + ODU_PUT_MSG_BUF(rbCb->m.amUl.partialSdu); } return; } /* rlcAmmFreeUlRbCb */ diff --git a/src/5gnrrlc/kw_cfg_ul.c b/src/5gnrrlc/kw_cfg_ul.c index 9372c21ba..6e2c39e1d 100755 --- a/src/5gnrrlc/kw_cfg_ul.c +++ b/src/5gnrrlc/kw_cfg_ul.c @@ -673,15 +673,18 @@ RlcUlCfgTmpData *cfgTmpData /*Allocating the memory for receive buffer */ if(CM_LTE_MODE_UM == cfgToValidate->entMode) { - uint16_t winLen; - - + uint32_t hashIndex; cfgEntData->rbCb->m.umUl.umWinSz = RLC_POWER(2, ((cfgToValidate->m.umInfo.ul.snLen *5)-1)); - winLen = cfgEntData->rbCb->m.umUl.umWinSz << 1; +#ifdef NR_RLC_UL RLC_ALLOC(gCb, - cfgEntData->rbCb->m.umUl.recBuf, - (winLen * sizeof(RlcUmRecBuf*))); + cfgEntData->rbCb->m.umUl.recBufLst, + (RLC_RCV_BUF_BIN_SIZE * sizeof(CmLListCp ))); + for(hashIndex = 0; hashIndex < RLC_RCV_BUF_BIN_SIZE; hashIndex++) + { + cmLListInit(&(cfgEntData->rbCb->m.umUl.recBufLst[hashIndex])); + } +#endif } else if(CM_LTE_MODE_AM == cfgToValidate->entMode) { diff --git a/src/5gnrrlc/kw_ptli.c b/src/5gnrrlc/kw_ptli.c index 59da209a8..532aea359 100755 --- a/src/5gnrrlc/kw_ptli.c +++ b/src/5gnrrlc/kw_ptli.c @@ -339,7 +339,7 @@ Void rlcUtlFreeUlRBuf(void) { if(datInd->lchData[numLch].pdu.mBuf[numPdu]) { - RLC_FREE_BUF_WC(datInd->lchData[numLch].pdu.mBuf[numPdu]); + ODU_PUT_MSG_BUF(datInd->lchData[numLch].pdu.mBuf[numPdu]); } } } diff --git a/src/5gnrrlc/kw_tmm_dl.c b/src/5gnrrlc/kw_tmm_dl.c index 0b29d6480..a67e8ac9c 100755 --- a/src/5gnrrlc/kw_tmm_dl.c +++ b/src/5gnrrlc/kw_tmm_dl.c @@ -223,7 +223,7 @@ void rlcTmmSendToMac(RlcCb *gCb, SuId suId, RlcDlRbCb *rbCb, RguCStaIndInfo *sta DU_LOG("\nRLC: rlcTmmSendToMac: sfn %d slot %d UEID:%d CELLID:%d", sfn, slot, rbCb->rlcId.ueId, rbCb->rlcId.cellId); cmLListDelFrm(&(rbCb->m.tm.sduQ), &sdu->lstEnt); - RLC_FREE_BUF(sdu->mBuf); + ODU_PUT_MSG_BUF(sdu->mBuf); RLC_FREE(gCb, sdu, sizeof(RlcSdu)); } else @@ -256,7 +256,7 @@ void rlcTmmSendToMac(RlcCb *gCb, SuId suId, RlcDlRbCb *rbCb, RguCStaIndInfo *sta the Sdu %u UEID:%d CELLID:%d", sdu->mode.tm.rnti, rbCb->rlcId.ueId, rbCb->rlcId.cellId); cmLListDelFrm(&(rbCb->m.tm.sduQ), &sdu->lstEnt); - RLC_FREE_BUF(sdu->mBuf); + ODU_PUT_MSG_BUF(sdu->mBuf); RLC_FREE(gCb, sdu, sizeof(RlcSdu)); continue; } diff --git a/src/5gnrrlc/kw_udx_dl.c b/src/5gnrrlc/kw_udx_dl.c index d01382bbe..fb2a464d0 100755 --- a/src/5gnrrlc/kw_udx_dl.c +++ b/src/5gnrrlc/kw_udx_dl.c @@ -488,19 +488,19 @@ RlcUdxDlStaPdu *pStaPdu return RFAILED; } - AMDL.cntrlBo = pStaPdu->controlBo; + RLC_AMDL.cntrlBo = pStaPdu->controlBo; /* If there already exists a STAUS PDU, free it and take the new one into account */ - if(AMDL.pStaPdu) + if(RLC_AMDL.pStaPdu) { RLC_FREE_SHRABL_BUF(pst->region, pst->pool, - AMDL.pStaPdu, + RLC_AMDL.pStaPdu, sizeof(RlcUdxDlStaPdu)); } - AMDL.pStaPdu = pStaPdu; - rlcAmmSendDedLcBoStatus(tRlcCb, rbCb, &AMDL); + RLC_AMDL.pStaPdu = pStaPdu; + rlcAmmSendDedLcBoStatus(tRlcCb, rbCb, &RLC_AMDL); return (ROK); } diff --git a/src/5gnrrlc/kw_udx_ul.c b/src/5gnrrlc/kw_udx_ul.c index 2750aef62..5a4438918 100755 --- a/src/5gnrrlc/kw_udx_ul.c +++ b/src/5gnrrlc/kw_udx_ul.c @@ -360,7 +360,7 @@ CmStatus status /* only newUeInfo needs to be freed here, ueInfo would be freed at the interface or by he receipient in case of tight coupling */ RLC_PST_FREE(pst->region, pst->pool, cfgTmpData->newUeInfo, sizeof(CkwUeInfo)); - RLC_FREE_WC(tRlcCb, cfgTmpData, sizeof (RlcUlCfgTmpData)); + RLC_FREE(tRlcCb, cfgTmpData, sizeof (RlcUlCfgTmpData)); return ROK; } diff --git a/src/5gnrrlc/kw_uim.c b/src/5gnrrlc/kw_uim.c index 484ec8448..f3295c2e0 100755 --- a/src/5gnrrlc/kw_uim.c +++ b/src/5gnrrlc/kw_uim.c @@ -745,7 +745,7 @@ uint8_t rlcProcDlData(Pst *pst, KwuDatReqInfo *datReq, Buffer *mBuf) { DU_LOG("\nRLC : CellId[%u]:DL RbId [%d] not found", datReq->rlcId.cellId,datReq->rlcId.rbId); - RLC_FREE_BUF(mBuf); + ODU_PUT_MSG_BUF(mBuf); return RFAILED; } @@ -761,7 +761,7 @@ uint8_t rlcProcDlData(Pst *pst, KwuDatReqInfo *datReq, Buffer *mBuf) /* kw002.201 Freeing from proper region */ RLC_SHRABL_STATIC_BUF_FREE(pst->region, pst->pool, datReq, sizeof(KwuDatReqInfo)); - RLC_FREE_BUF(mBuf); + ODU_PUT_MSG_BUF(mBuf); return RFAILED; } diff --git a/src/5gnrrlc/kw_ul.x b/src/5gnrrlc/kw_ul.x index 833bb84b1..e57dae2e4 100755 --- a/src/5gnrrlc/kw_ul.x +++ b/src/5gnrrlc/kw_ul.x @@ -42,6 +42,29 @@ extern "C" { typedef struct rlcUlUeCb RlcUlUeCb; +#ifdef NR_RLC_UL +/** + * @brief Structure to hold a RLC UM PDU segment + * + * @details + * - lstEnt : This is required for the linked list in which the segments + * are stored + * - seg : Holds the segment data + * - segSz : The length of the segment in bytes + * - soEnd : SOEnd + * - umHdr : The UM Header for the PDU segment + * +*/ +typedef struct rlcUmSeg +{ + CmLList lstEnt; /*!< List entry for PDU segment */ + Buffer *seg; /*!< PDU segment */ + MsgLen segSz; /*!< Buffer Size */ + uint16_t soEnd; /*!< Segment Offset End */ + RlcUmHdr umHdr; /*!mBuf, M1M2); - RLC_FREE_BUF_WC(sdu->mBuf); + ODU_PUT_MSG_BUF(sdu->mBuf); } sdu->sduSz -= pduSz; @@ -537,7 +537,7 @@ void rlcUmmProcessSdus(RlcCb *gCb, RlcDlRbCb *rbCb, RlcDatReq *datReq) } else { - RLC_FREE_BUF_WC(pdu); + ODU_PUT_MSG_BUF(pdu); } } diff --git a/src/5gnrrlc/kw_umm_ul.c b/src/5gnrrlc/kw_umm_ul.c index 5926729e9..14ecb0d0b 100755 --- a/src/5gnrrlc/kw_umm_ul.c +++ b/src/5gnrrlc/kw_umm_ul.c @@ -70,9 +70,20 @@ static uint8_t rlcUmmExtractHdr ARGS ((RlcCb *gCb, Buffer *pdu, RlcUmHdr *umHdr)); -static void rlcUmmReAssembleSdus ARGS ((RlcCb *gCb, - RlcUlRbCb *rbCb, - RlcUmRecBuf *umRecBuf)); +uint8_t rlcUmmReAssembleSdus ARGS ((RlcCb *gCb, + RlcUlRbCb *rbCb, + RlcUmRecBuf *umRecBuf)); + +#ifdef NR_RLC_UL +bool rlcUmmAddRcvdSeg ARGS ((RlcCb *gCb, + RlcUlRbCb *rbCb, + RlcUmHdr *umHdr, + Buffer *pdu, + uint16_t pduSz)); + +void rlcUmmRelAllSegs(RlcCb *gCb, RlcUmRecBuf *recBuf); + +#endif #ifndef TENB_ACC #ifndef LTE_PAL_ENB @@ -128,6 +139,319 @@ static int16_t rlcUmmCheckSnInReordWindow (RlcSn sn, const RlcUmUl* const umUl) return (RLC_UM_GET_VALUE(sn, *umUl) < RLC_UM_GET_VALUE(umUl->vrUh, *umUl)); } +#ifdef NR_RLC_UL + +/** + * @brief Handler to updated expected byte seg + * + * @details + * This function is used to update expected byte segment. The next segment + * expected is indicated by the SO of the segment which is expected. Intially + * the segment with SO 0 is expected and then in order. When all the segments + * are received (which would happen when an expected SO is encountered + * with LSF set) the allRcvd flag is set to TRUE + * + * @param[in] gCb RLC instance control block + * @param[in] umUl AM Uplink Control Block + * @param[in] seg Newly received segment + * + * @return void + * + */ + +void rlcUmmUpdExpByteSeg(RlcCb *gCb, RlcUmUl *umUl, RlcUmSeg *seg) +{ + uint16_t newExpSo; /* The new expected SO */ + RlcSn sn = seg->umHdr.sn; + bool lstRcvd=FALSE; + RlcUmRecBuf *recBuf = NULLP; + + recBuf = rlcUtlGetUmRecBuf(umUl->recBufLst, sn); + if ((recBuf == NULLP) || (recBuf && (seg->umHdr.so != recBuf->expSo))) + { + return; + } + recBuf->noMissingSeg = FALSE; + newExpSo = seg->soEnd + 1; + recBuf->expSo = newExpSo; + if(seg->umHdr.si == RLC_SI_LAST_SEG) + { + lstRcvd = TRUE; + } + RLC_UMM_LLIST_NEXT_SEG(recBuf->segLst, seg); + while(seg) + { + /* keep going ahead as long as the expectedSo match with the header so + else store the expSo for later checking again */ + if(seg->umHdr.si == RLC_SI_LAST_SEG) + { + lstRcvd = TRUE; + } + if (seg->umHdr.so == newExpSo) + { + newExpSo = seg->soEnd + 1; + recBuf->expSo = newExpSo; + RLC_UMM_LLIST_NEXT_SEG(recBuf->segLst, seg); + } + else + { + recBuf->expSo = newExpSo; + return; + } + } + if (lstRcvd == TRUE) + { + recBuf->allSegRcvd = TRUE; + } + recBuf->noMissingSeg = TRUE; + + return; +} +/** + * @brief Private handler to store the received segment + * + * @details + * Private handler invokded by rlcUmmUlPlacePduInRecBuf to add a received + * segment in reception buffer of a RBCB. + * - It is responsible for detecting duplicate segments + * - Adding it at appropriate position in the received buffer + * - Calling ExpByteSeg to set expSo field in the receiver buffer + * + * @param[in] gCb RLC instance control block + * @param[in] rbCb Radio Bearer Contro Block + * @param[in] umHdr UM Header received + * @param[in] pdu Buffer received other than the headers + * @param[in] pduSz size of the PDU buffer received + * + * @return bool + * -#TRUE Successful insertion into the receiver buffer + * -#FALSE Possibly a duplicate segment + */ + +bool rlcUmmAddRcvdSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcUmHdr *umHdr, Buffer *pdu, uint16_t pduSz) +{ + RlcUmRecBuf *recBuf = NULLP; + RlcUmSeg *seg; + RlcUmSeg *tseg; + uint16_t soEnd; /* Holds the SoEnd of received segment */ + uint16_t expSo = 0; /* Expected SO */ + + soEnd = umHdr->so + pduSz - 1; + recBuf = rlcUtlGetUmRecBuf(RLC_UMUL.recBufLst, umHdr->sn); + + if (NULLP == recBuf) + { + RLC_ALLOC(gCb,recBuf, sizeof(RlcUmRecBuf)); + if (recBuf == NULLP) + { + DU_LOG("\nERROR --> RLC_UL : Failed to allocate memory to recv buf for UEID:%d CELLID:%d in rlcUmmAddRcvdSeg()", + rbCb->rlcId.ueId, rbCb->rlcId.cellId); + + ODU_PUT_MSG_BUF(pdu); + return FALSE; + } + rlcUtlStoreUmRecBuf(RLC_UMUL.recBufLst, recBuf, umHdr->sn); + } + else + { + if (recBuf->allSegRcvd == TRUE) + { + ODU_PUT_MSG_BUF(pdu); + return FALSE; + } + } + + RLC_UMM_LLIST_FIRST_SEG(recBuf->segLst, seg); + while ((seg != NULLP) && (seg->umHdr.so < umHdr->so)) + { + expSo = seg->umHdr.so + seg->segSz; + RLC_UMM_LLIST_NEXT_SEG(recBuf->segLst, seg); + } + + if (expSo > umHdr->so) + { + DU_LOG("\nDEBUG --> RLC_UL : Received duplicate segment in rlcUmmAddRcvdSeg()"); + /* This is a duplicate segment */ + ODU_PUT_MSG_BUF(pdu); + return FALSE; + } + + if ((seg) && (seg->umHdr.so <= soEnd)) + { + DU_LOG("\nDEBUG --> RLC_UL : Received duplicate segment in rlcUmmAddRcvdSeg()"); + /* This is a duplicate segment */ + ODU_PUT_MSG_BUF(pdu); + return FALSE; + } + + /* If we have come this far, we have to add this segment to the */ + /* reception buffer as we either have eliminated duplicates or */ + /* have found none. */ + RLC_ALLOC_WC(gCb, tseg, sizeof(RlcUmSeg)); + if (tseg == NULLP) + { + DU_LOG("\nERROR --> RLC_UL : Failed to allocate memory to segment for UEID:%d CELLID:%d in rlcUmmAddRcvdSeg()", + rbCb->rlcId.ueId, rbCb->rlcId.cellId); + ODU_PUT_MSG_BUF(pdu); + return FALSE; + } + + tseg->seg = pdu; + tseg->segSz = pduSz; + RLC_MEM_CPY(&tseg->umHdr, umHdr, sizeof(RlcUmHdr)); + RLC_MEM_CPY(&recBuf->umHdr, umHdr, sizeof(RlcUmHdr)); + recBuf->sn = umHdr->sn; + tseg->soEnd = soEnd; + if (seg == NULLP) + { + cmLListAdd2Tail(&recBuf->segLst, &tseg->lstEnt); + } + else + { + recBuf->segLst.crnt = &seg->lstEnt; + cmLListInsCrnt(&recBuf->segLst, &tseg->lstEnt); + } + tseg->lstEnt.node = (PTR)tseg; + rlcUmmUpdExpByteSeg(gCb, &RLC_UMUL, tseg); + return TRUE; +} + +/** + * @brief Private handler to release all stored segments + * + * @details + * Private handler invokded by rlcUmmRelAllSegs to release the + * stored segements in case a complete PDU is received later. + * + * @param[in] gCb RLC instance control block + * @param[in] recBuf Buffer that stores a received PDU or segments + * + * @return void + * + */ +void rlcUmmRelAllSegs(RlcCb *gCb, RlcUmRecBuf *recBuf) +{ + RlcUmSeg *seg; + + RLC_UMM_LLIST_FIRST_SEG(recBuf->segLst, seg); + while (seg != NULLP) + { + ODU_PUT_MSG_BUF(seg->seg); + cmLListDelFrm(&(recBuf->segLst), &(seg->lstEnt)); + RLC_FREE(gCb, seg, sizeof(RlcUmSeg)); + RLC_UMM_LLIST_FIRST_SEG(recBuf->segLst, seg); + } + + return; +} + +/** + * @brief Private handler to reassemble from a segment or a PDU + * + * @details + * Private handler invokded by rlcUmmReAssembleSdus with either a + * PDU or a segment of a PDU. This is also called in the case of + * reestablishment and hence out of sequence joining is also to + * be supported + * + * + * @param[in] gCb RLC instance control block + * @param[in] rbCb Uplink RB control block + * @param[in] umHdr UM header received for this segment/PDU + * @param[in] pdu PDU to be reassembled + * + * @return ROK/RFILED + * + */ + +uint8_t rlcUmmProcSeg(RlcCb *gCb, RlcUlRbCb *rbCb, RlcUmHdr *umHdr, Buffer *pdu) +{ + + if ((RLC_UMUL.expSn != umHdr->sn) || (RLC_UMUL.expSo != umHdr->so)) + { + /* Release the existing SDU as we have PDUs or */ + /* segments that are out of sequence */ + DU_LOG("\nDEBUG --> RLC_UL : Received Segments are out of sequence in rlcUmmProcSeg()"); + ODU_PUT_MSG_BUF(RLC_UMUL.assembleSdu); + return RFAILED; + } + + if (umHdr->si == RLC_SI_FIRST_SEG) + {/* first Segment of the SDU */ + if (RLC_UMUL.assembleSdu != NULLP) + { /* Some old SDU may be present */ + ODU_PUT_MSG_BUF(RLC_UMUL.assembleSdu); + } + RLC_UMUL.assembleSdu = pdu; + pdu = NULLP; + } + else if(umHdr->si == RLC_SI_MID_SEG) + {/* Middle Segment of the SDU */ + ODU_CAT_MSG(RLC_UMUL.assembleSdu,pdu, M1M2); + ODU_PUT_MSG_BUF(pdu); + pdu = NULLP; + } + else if(umHdr->si == RLC_SI_LAST_SEG) + { + ODU_CAT_MSG(pdu, RLC_UMUL.assembleSdu, M2M1); + ODU_PUT_MSG_BUF(RLC_UMUL.assembleSdu); + } + + if (pdu != NULLP) + { + RLC_UMUL.assembleSdu = NULLP; + rlcUtlSendUlDataToDu(gCb,rbCb, pdu); + } + + return ROK; +} +/** + * + * @brief Private handler to reassemble SDUs + * + * @details + * Private handler invokded by rlcUmmProcessPdus with the PDU + * from the reception buffer in sequence to reassemble SDUs and + * send it to PDCP. + * + * - With the stored header info, FI and LSF segment / concatenate + * PDUs or byte segments of PDUs to get the associated SDU. + * + * @param[in] rbCb RB control block + * @param[in] pdu PDU to be reassembled + * + * @return uint8_t + * -# ROK + * -# RFAILED + * + */ +uint8_t rlcUmmReAssembleSdus(RlcCb *gCb, RlcUlRbCb *rbCb, RlcUmRecBuf *recBuf) +{ + RlcUmSeg *seg; + + /* This is a set of segments */ + RLC_UMM_LLIST_FIRST_SEG(recBuf->segLst, seg); + RLC_UMUL.expSn = recBuf->sn; + RLC_UMUL.expSo = 0; + while(seg) + { + if(rlcUmmProcSeg(gCb, rbCb, &seg->umHdr, seg->seg) == RFAILED) + { + rlcUmmRelAllSegs(gCb, recBuf); + break; + } + RLC_UMUL.expSo = seg->soEnd + 1; + cmLListDelFrm(&(recBuf->segLst),&(seg->lstEnt)); + RLC_FREE(gCb, seg, sizeof(RlcSeg)); + RLC_UMM_LLIST_FIRST_SEG(recBuf->segLst, seg); + } + RLC_UMUL.expSn = (recBuf->umHdr.sn + 1) & (RLC_UMUL.modBitMask); + RLC_UMUL.expSo = 0; + return ROK; +} + +#endif + /** * @brief Handler to process the Data Indication from the lower layer * and send the PDUs to re-assembly unit. @@ -209,8 +533,8 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) { uint32_t rlculdrop; rlculdrop++; - RLC_FREE_BUF(pdu); - RLC_FREE_WC(gCb, tmpRecBuf, sizeof(RlcUmRecBuf)); + ODU_PUT_MSG_BUF(pdu); + RLC_FREE(gCb, tmpRecBuf, sizeof(RlcUmRecBuf)); /*Fix for CR ccpu00144030: If threshhold is hit then also count *should be incrmented */ count++; @@ -229,13 +553,20 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) /* Header extraction is a problem. * log an error and free the allocated memory */ /* ccpu00136940 */ - RLC_FREE_WC(gCb, tmpRecBuf, sizeof(RlcUmRecBuf)); + RLC_FREE(gCb, tmpRecBuf, sizeof(RlcUmRecBuf)); ODU_PUT_MSG_BUF(pdu); count++; /* kw005.201 ccpu00117318, updating the statistics */ gCb->genSts.errorPdusRecv++; continue; } +#ifdef NR_RLC_UL + + /*TODO 1.Extract Hdr */ + /* 2.Add Seg into Reception Buffer */ + /* 3.If All Seg Recvd in Reception buffer list */ + /* 4.Step 3 is true call Assemble Sdus */ +#endif curSn = tmpRecBuf->umHdr.sn; /* Check if the PDU should be discarded or not */ @@ -250,8 +581,8 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) DU_LOG("\nRLC : rlcUmmProcessPdus: Received a duplicate pdu with sn %d \ UEID:%d CELLID:%d", curSn, rbCb->rlcId.ueId, rbCb->rlcId.cellId); - RLC_FREE_BUF(pdu); - RLC_FREE_WC(gCb, tmpRecBuf, sizeof(RlcUmRecBuf)); + ODU_PUT_MSG_BUF(pdu); + RLC_FREE(gCb, tmpRecBuf, sizeof(RlcUmRecBuf)); count++; /* kw005.201 ccpu00117318, updating the statistics */ gCb->genSts.unexpPdusRecv++; @@ -296,8 +627,10 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) { if (recBuf[sn]) { +#ifdef NR_RLC_UL rlcUmmReAssembleSdus(gCb,rbCb,recBuf[sn]); - RLC_FREE_WC(gCb,recBuf[sn],sizeof(RlcUmRecBuf)); +#endif + RLC_FREE(gCb,recBuf[sn],sizeof(RlcUmRecBuf)); recBuf[sn] = NULLP; } sn = (sn + 1) & RLC_UMUL.modBitMask; @@ -318,8 +651,10 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) tVrUr = RLC_UM_GET_VALUE(*vrUr,RLC_UMUL); while (recBuf[sn] && tSn < tVrUr) { +#ifdef NR_RLC_UL rlcUmmReAssembleSdus(gCb,rbCb,recBuf[sn]); - RLC_FREE_WC(gCb,recBuf[sn],sizeof(RlcUmRecBuf)); +#endif + RLC_FREE(gCb,recBuf[sn],sizeof(RlcUmRecBuf)); recBuf[sn] = NULLP; sn = (sn + 1) & RLC_UMUL.modBitMask; tSn = RLC_UM_GET_VALUE(sn, RLC_UMUL); @@ -360,148 +695,6 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo) return; } -/** - * @brief Handler to reassemble the SDUs and send them to the upper layer. - * - * @details - * This function processes the received in-sequence PDU and - * re-assembles the SDUs and sends them to the upper layer. - * - * @param[in] gCb RLC Instance control block - * @param[in] rbCb RB control block - * @param[in] umRecBuf Reception Buffer to be Re-Assembled - * - * @return Void -*/ -static void rlcUmmReAssembleSdus(RlcCb *gCb, RlcUlRbCb *rbCb, RlcUmRecBuf *umRecBuf) -{ - uint32_t liCount; /* LI count */ - uint32_t count; /* Loop counter */ - uint8_t fi; /* Framing Info */ - uint16_t sn; /* Sequence Number of current PDU */ - MsgLen len; /* PDU Length */ - Buffer *sdu; /* SDU to be sent to upper layer */ - Buffer *remPdu; /* Remaining PDU */ - Buffer **partialSdu; /* Partial SDU */ - - liCount = umRecBuf->umHdr.numLi; - fi = umRecBuf->umHdr.fi; - sn = umRecBuf->umHdr.sn; - - for (count = 0; (count <= liCount);count++) - { - if (count < liCount ) - len = umRecBuf->umHdr.li[count]; - else - { - if (!(umRecBuf->pdu)) - { - return; - } - ODU_GET_MSG_LEN(umRecBuf->pdu,&len); - } - - /* get the sdu out of the pdu */ - ODU_SEGMENT_MSG(umRecBuf->pdu,len,&remPdu); - sdu = umRecBuf->pdu; - umRecBuf->pdu = remPdu; - - partialSdu = &(rbCb->m.umUl.partialSdu); - /* While re-assembling the SDUs, consider the first LI and perform - * the following steps. - -# If the first bit of FI(Framing Info of 2 bits) is set => - -# The current Data field in the PDU is a segment. - So form a SDU only if the - rbCb->m.um.umUl.partialSdu exists and the SNs are - in-sequence. - -# If there are no LIs and the second bit of LI is 1 - then a partial SDU is formed which would not be sent - to the upper layer. - -# else - -# If rbCb->partialSdu is not NULL then flush it off. - -# If LI count > 0 or LI count is 0 and second bit - of FI is not 1 - The SDU is complete.So send it to upper layer. - -# else - The SDU is partial and is placed - in rbCb->m.um.umUl.partialSdu; - */ - - if (0 == count ) - { - if (fi & 2) - { - if ((*partialSdu) && - (sn == ((rbCb->m.umUl.sn + 1) & rbCb->m.umUl.modBitMask))) - { - ODU_CAT_MSG(*partialSdu,sdu,M1M2); - RLC_FREE_BUF(sdu); - if (liCount > 0 || !(fi & 1)) - { - rlcUtlSendUlDataToDu(gCb,rbCb,*partialSdu); - *partialSdu = NULLP; - } - } - else - { - /* Partial Sdu stored is not valid now.So free it */ - if (*partialSdu) - { - RLC_FREE_BUF(*partialSdu); - *partialSdu = NULLP; - } - - RLC_FREE_BUF(sdu); - sdu = NULLP; - } - } - else - { - if (*partialSdu) - { - RLC_FREE_BUF(*partialSdu); /* RLC mem leak fix */ - *partialSdu = NULLP; - } - - if (liCount > 0 || !( fi & 1)) - { - rlcUtlSendUlDataToDu(gCb,rbCb,sdu); - } - else - { - *partialSdu = sdu; - } - } - } - /* - If the SDU pointer has the last Data field of the PDU - -# If FI is 1,place the SDU in rbCb->m.um.umDl.partialSdu - -# else send the SDU to upper layer. - */ - else if (count == liCount) - { - if (fi & 1) - { - *partialSdu = sdu; - } - else - { - rlcUtlSendUlDataToDu(gCb, rbCb, sdu); - } - } - /* - If the LI is something other than the first one, - just send the SDU to the upper layer */ - else - { - rlcUtlSendUlDataToDu(gCb, rbCb, sdu); - } - } - rbCb->m.umUl.sn = sn; - - return; -} - /** * @brief Handler to process the re-establishment request received * from the upper layer. @@ -546,8 +739,10 @@ RlcUlRbCb *rbCb { if ( recBuf[curSn] != NULLP ) { +#ifdef NR_RLC_UL rlcUmmReAssembleSdus(gCb,rbCb,recBuf[curSn]); - RLC_FREE_WC(gCb,recBuf[curSn],sizeof(RlcUmRecBuf)); +#endif + RLC_FREE(gCb,recBuf[curSn],sizeof(RlcUmRecBuf)); recBuf[curSn] = NULLP; } curSn = (curSn + 1) & rbCb->m.umUl.modBitMask; @@ -750,12 +945,14 @@ RlcUlRbCb *rbCb { if (RLC_UMUL.recBuf[prevVrUr]) { +#ifdef NR_RLC_UL rlcUmmReAssembleSdus(gCb, rbCb, RLC_UMUL.recBuf[prevVrUr]); +#endif if(RLC_UMUL.recBuf[prevVrUr]->pdu != NULLP) /* RLC mem leak fix */ { - RLC_FREE_BUF(RLC_UMUL.recBuf[prevVrUr]->pdu); + ODU_PUT_MSG_BUF(RLC_UMUL.recBuf[prevVrUr]->pdu); } - RLC_FREE_WC(gCb, RLC_UMUL.recBuf[prevVrUr], sizeof(RlcUmRecBuf)); + RLC_FREE(gCb, RLC_UMUL.recBuf[prevVrUr], sizeof(RlcUmRecBuf)); RLC_UMUL.recBuf[prevVrUr] = NULLP; } @@ -806,15 +1003,15 @@ RlcUlRbCb *rbCb { if (umRecBuf[curSn] != NULLP) { - RLC_FREE_BUF_WC(umRecBuf[curSn]->pdu); + ODU_PUT_MSG_BUF(umRecBuf[curSn]->pdu); umRecBuf[curSn]->pdu = NULLP; - RLC_FREE_WC(gCb, umRecBuf[curSn], sizeof(RlcUmRecBuf)); + RLC_FREE(gCb, umRecBuf[curSn], sizeof(RlcUmRecBuf)); umRecBuf[curSn] = NULLP; } curSn++; } - RLC_FREE_WC(gCb,rbCb->m.umUl.recBuf, (windSz ) * sizeof(RlcUmRecBuf*)); + RLC_FREE(gCb,rbCb->m.umUl.recBuf, (windSz ) * sizeof(RlcUmRecBuf*)); rbCb->m.umUl.recBuf = NULLP; return; } diff --git a/src/5gnrrlc/kw_utl_dl.c b/src/5gnrrlc/kw_utl_dl.c index 2d1938cb8..daeb948ff 100755 --- a/src/5gnrrlc/kw_utl_dl.c +++ b/src/5gnrrlc/kw_utl_dl.c @@ -113,15 +113,15 @@ Void PrintRLCStats(Void) ulInst->genSts.pdusRecv, ulInst->genSts.unexpPdusRecv, ulInst->genSts.errorPdusRecv); - RLOG4(L_ALWAYS,"RLC Stats: AMDL: " + RLOG4(L_ALWAYS,"RLC Stats: RLC_AMDL: " "StaPduSent:%lu NacksInStaPdu:%lu BytesUnused:%lu PollTimerExpires SRB:%lu ", gRlcStats.amRlcStats.numDLStaPduSent, gRlcStats.amRlcStats.numDLNacksInStaPdu, gRlcStats.amRlcStats.numDLBytesUnused, gRlcStats.amRlcStats.numDLPollTimerExpiresSrb); - RLOG3(L_ALWAYS,"RLC Stats: AMDL: " + RLOG3(L_ALWAYS,"RLC Stats: RLC_AMDL: " "DRB:%lu MaxRetx:%lu RetransPdus:%lu", gRlcStats.amRlcStats.numDLPollTimerExpiresDrb, gRlcStats.amRlcStats.numDLMaxRetx, gRlcStats.amRlcStats.numDLRetransPdus); - RLOG4(L_ALWAYS,"RLC Stats: AMUL: " + RLOG4(L_ALWAYS,"RLC Stats: RLC_AMUL: " " PdusDiscarded:%lu ReOrdTimerExpires:%lu StaPduRcvd:%lu NackInStaPduRcvd:%lu ", gRlcStats.amRlcStats.numULPdusDiscarded, gRlcStats.amRlcStats.numULReOrdTimerExpires, gRlcStats.amRlcStats.numULStaPduRcvd, gRlcStats.amRlcStats.numULNackInStaPduRcvd); @@ -136,8 +136,8 @@ Void PrintRLCStats(Void) ulInst->genSts.unexpPdusRecv, ulInst->genSts.errorPdusRecv); RTLIN_DUMP_DEBUG("RLC Stats:" - "AMDL: StaPduSent:%lu NacksInStaPdu:%lu BytesUnused:%lu PollTimerExpires SRB:%lu DRB:%lu MaxRetx:%lu RetransPdus:%lu \n" - "AMUL: PdusDiscarded:%lu ReOrdTimerExpires:%lu StaPduRcvd:%lu NackInStaPduRcvd:%lu \n", + "RLC_AMDL: StaPduSent:%lu NacksInStaPdu:%lu BytesUnused:%lu PollTimerExpires SRB:%lu DRB:%lu MaxRetx:%lu RetransPdus:%lu \n" + "RLC_AMUL: PdusDiscarded:%lu ReOrdTimerExpires:%lu StaPduRcvd:%lu NackInStaPduRcvd:%lu \n", gRlcStats.amRlcStats.numDLStaPduSent, gRlcStats.amRlcStats.numDLNacksInStaPdu, gRlcStats.amRlcStats.numDLBytesUnused, gRlcStats.amRlcStats.numDLPollTimerExpiresSrb, gRlcStats.amRlcStats.numDLPollTimerExpiresDrb, gRlcStats.amRlcStats.numDLMaxRetx, gRlcStats.amRlcStats.numDLRetransPdus, gRlcStats.amRlcStats.numULPdusDiscarded, gRlcStats.amRlcStats.numULReOrdTimerExpires, @@ -159,21 +159,21 @@ Void PrintRLCStats(Void) ulInst->genSts.pdusRecv, ulInst->genSts.unexpPdusRecv, ulInst->genSts.errorPdusRecv); - RLOG4(L_ALWAYS,"RLC Stats: AMDL: " + RLOG4(L_ALWAYS,"RLC Stats: RLC_AMDL: " "StaPduSent:%lu NacksInStaPdu:%lu BytesUnused:%lu PollTimerExpires SRB:%lu ", gRlcStats.amRlcStats.numDLStaPduSent, gRlcStats.amRlcStats.numDLNacksInStaPdu, gRlcStats.amRlcStats.numDLBytesUnused, gRlcStats.amRlcStats.numDLPollTimerExpiresSrb); - RLOG3(L_ALWAYS,"RLC Stats: AMDL: " + RLOG3(L_ALWAYS,"RLC Stats: RLC_AMDL: " "DRB:%lu MaxRetx:%lu RetransPdus:%lu", gRlcStats.amRlcStats.numDLPollTimerExpiresDrb, gRlcStats.amRlcStats.numDLMaxRetx, gRlcStats.amRlcStats.numDLRetransPdus); - RLOG4(L_ALWAYS,"RLC Stats: AMUL: " + RLOG4(L_ALWAYS,"RLC Stats: RLC_AMUL: " " PdusDiscarded:%lu ReOrdTimerExpires:%lu StaPduRcvd:%lu NackInStaPduRcvd:%lu ", gRlcStats.amRlcStats.numULPdusDiscarded, gRlcStats.amRlcStats.numULReOrdTimerExpires, gRlcStats.amRlcStats.numULStaPduRcvd, gRlcStats.amRlcStats.numULNackInStaPduRcvd); /* RTLIN_DUMP_DEBUG("AM RLC Stats:" - "AMDL: SDUs Tx :(%u) SDU Bytes Tx :(%u) SDUs Retx :(%u) MaxRetx:(%u) WindowStalls: (%u) \n" - "AMUL: DropOutWinRx :(%u) SDUs Rx :(%u) SDU Bytes Rx :(%u) SDUNack Rx :(%u) Duplicate Pdu Rx :(%u) \n", + "RLC_AMDL: SDUs Tx :(%u) SDU Bytes Tx :(%u) SDUs Retx :(%u) MaxRetx:(%u) WindowStalls: (%u) \n" + "RLC_AMUL: DropOutWinRx :(%u) SDUs Rx :(%u) SDU Bytes Rx :(%u) SDUNack Rx :(%u) Duplicate Pdu Rx :(%u) \n", gRlcStats.amRlcStats.numRlcAmCellSduTx, gRlcStats.amRlcStats.numRlcAmCellSduBytesTx, gRlcStats.amRlcStats.numRlcAmCellRetxPdu, gRlcStats.amRlcStats.numRlcAmMaxRetx, gRlcStats.amRlcStats.numRlcAmCellWinStall, gRlcStats.amRlcStats.numRlcAmCellDropOutWinRx, gRlcStats.amRlcStats.numRlcAmCellSduRx, @@ -188,10 +188,10 @@ Void PrintRLCStats(Void) ulInst->genSts.pdusRecv, ulInst->genSts.unexpPdusRecv, ulInst->genSts.errorPdusRecv); - RTLIN_DUMP_DEBUG("AMDL: StaPduSent:%u NacksInStaPdu:%u BytesUnused:%u PollTimerExpires SRB:%u DRB:%u MaxRetx:%u RetransPdus:%u \n" + RTLIN_DUMP_DEBUG("RLC_AMDL: StaPduSent:%u NacksInStaPdu:%u BytesUnused:%u PollTimerExpires SRB:%u DRB:%u MaxRetx:%u RetransPdus:%u \n" " SDUs Tx :(%u) SDU Bytes Tx :(%u) SDUs Retx :(%u) WindowStalls: (%u) \n" - "AMUL: PdusDiscarded:%u ReOrdTimerExpires:%u StaPduRcvd:%u NackInStaPduRcvd:%u \n" + "RLC_AMUL: PdusDiscarded:%u ReOrdTimerExpires:%u StaPduRcvd:%u NackInStaPduRcvd:%u \n" " DropOutWinRx :(%u) SDUs Rx :(%u) SDU Bytes Rx :(%u) SDUNack Rx :(%u) Duplicate Pdu Rx:(%u) \n", gRlcStats.amRlcStats.numDLStaPduSent, gRlcStats.amRlcStats.numDLNacksInStaPdu, gRlcStats.amRlcStats.numDLBytesUnused, gRlcStats.amRlcStats.numDLPollTimerExpiresSrb, gRlcStats.amRlcStats.numDLPollTimerExpiresDrb, @@ -490,8 +490,8 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) datIndSz += len; } datReqTb->lchData[count].setMaxUlPrio = FALSE; - if (RLC_AM_IS_POLL_BIT_SET(AMDL) && - (AMDL.sduQ.count > 1)) + if (RLC_AM_IS_POLL_BIT_SET(RLC_AMDL) && + (RLC_AMDL.sduQ.count > 1)) { /* Poll bit is set indicate to MAC*/ datReqTb->lchData[count].setMaxUlPrio = TRUE; @@ -623,7 +623,7 @@ uint8_t rlcUtlSendDedLcBoStatus(RlcCb *gCb, RlcDlRbCb *rbCb, int32_t bo, \ #ifndef TENB_ACC if ((rbCb->lastRprtdBoToMac > (uint32_t)8000) && (rbCb->boUnRprtdCnt < (uint32_t)5) - && (!staPduPrsnt) && ((CM_LTE_MODE_AM == rbCb->mode ) && (AMDL.nxtRetx == NULLP))) + && (!staPduPrsnt) && ((CM_LTE_MODE_AM == rbCb->mode ) && (RLC_AMDL.nxtRetx == NULLP))) { rbCb->boUnRprtdCnt++; return ROK; @@ -1033,30 +1033,30 @@ static Bool rlcUtlFreeDlAmRbMemory(RlcCb *gCb,RlcDlRbCb *rbCb,uint32_t *toBeFree RlcSn mTxNext; /* send state variable */ RlcTx *txBuf; - MODAMT(AMDL.txNext, mTxNext, AMDL.txNextAck,AMDL.snModMask); + MODAMT(RLC_AMDL.txNext, mTxNext, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); /* TODO : to be checked changed from <= to < */ while ((0 < mTxNext) && *toBeFreed) { - txBuf = rlcUtlGetTxBuf(AMDL.txBufLst, AMDL.txNextAck); + txBuf = rlcUtlGetTxBuf(RLC_AMDL.txBufLst, RLC_AMDL.txNextAck); if (txBuf && txBuf->pduLst.first) { while(txBuf->pduLst.first) { RlcDlPduInfo *pduInfo = (RlcDlPduInfo *)(txBuf->pduLst.first->node); - RLC_FREE_BUF(pduInfo->pdu); + ODU_PUT_MSG_BUF(pduInfo->pdu); /* Delete node from the txBuf Pdu lst */ cmLListDelFrm(&txBuf->pduLst, txBuf->pduLst.first); - RLC_FREE_WC(gCb, pduInfo, sizeof(RlcDlPduInfo)); + RLC_FREE(gCb, pduInfo, sizeof(RlcDlPduInfo)); } - rlcUtlDelTxBuf(AMDL.txBufLst, txBuf, gCb); + rlcUtlDelTxBuf(RLC_AMDL.txBufLst, txBuf, gCb); if(gCb->u.dlCb->shutdownReceived == 0) { (*toBeFreed)--; } } - AMDL.txNextAck = (AMDL.txNextAck + 1) & AMDL.snModMask; - MODAMT(AMDL.txNext, mTxNext, AMDL.txNextAck,AMDL.snModMask); + RLC_AMDL.txNextAck = (RLC_AMDL.txNextAck + 1) & RLC_AMDL.snModMask; + MODAMT(RLC_AMDL.txNext, mTxNext, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); } if(*toBeFreed == 0) { @@ -1064,19 +1064,19 @@ static Bool rlcUtlFreeDlAmRbMemory(RlcCb *gCb,RlcDlRbCb *rbCb,uint32_t *toBeFree } #ifndef LTE_TDD - RLC_FREE(gCb,AMDL.txBufLst, (RLC_TX_BUF_BIN_SIZE * sizeof(CmLListCp))); + RLC_FREE(gCb,RLC_AMDL.txBufLst, (RLC_TX_BUF_BIN_SIZE * sizeof(CmLListCp))); #endif - RLC_LLIST_FIRST_RETX(AMDL.retxLst, retx); + RLC_LLIST_FIRST_RETX(RLC_AMDL.retxLst, retx); while (retx && (*toBeFreed)) /* Till to be freed becomes 0 */ { - RLC_FREE_BUF(retx->seg); + ODU_PUT_MSG_BUF(retx->seg); - cmLListDelFrm(&AMDL.retxLst, &retx->lstEnt); - RLC_FREE_WC(gCb, retx, sizeof(RlcRetx)); + cmLListDelFrm(&RLC_AMDL.retxLst, &retx->lstEnt); + RLC_FREE(gCb, retx, sizeof(RlcRetx)); - RLC_LLIST_FIRST_RETX(AMDL.retxLst, retx); + RLC_LLIST_FIRST_RETX(RLC_AMDL.retxLst, retx); if(gCb->u.dlCb->shutdownReceived == 0) { (*toBeFreed)--; @@ -1084,18 +1084,18 @@ static Bool rlcUtlFreeDlAmRbMemory(RlcCb *gCb,RlcDlRbCb *rbCb,uint32_t *toBeFree } - AMDL.nxtRetx = NULLP; + RLC_AMDL.nxtRetx = NULLP; /* clean up if there is info about STATUS PDU to be sent */ - if(AMDL.pStaPdu) + if(RLC_AMDL.pStaPdu) { Pst *udxPst; udxPst = &gCb->u.dlCb->udxDlSap->pst; RLC_FREE_SHRABL_BUF_WC(udxPst->region, udxPst->pool, - AMDL.pStaPdu, + RLC_AMDL.pStaPdu, sizeof(RlcUdxDlStaPdu)); - AMDL.pStaPdu = NULLP; + RLC_AMDL.pStaPdu = NULLP; } if(*toBeFreed == 0) @@ -1170,8 +1170,8 @@ Void rlcUtlFreeDlMemory(RlcCb *gCb) { RlcRetx* seg = (RlcRetx *)(lst->first->node); cmLListDelFrm(lst, lst->first); - RLC_FREE_BUF_WC(seg->seg); - RLC_FREE_WC(gCb,seg, sizeof(RlcRetx)); + ODU_PUT_MSG_BUF(seg->seg); + RLC_FREE(gCb,seg, sizeof(RlcRetx)); toBeFreed--; } @@ -1190,10 +1190,10 @@ Void rlcUtlFreeDlMemory(RlcCb *gCb) RlcDlPduInfo *pduInfo = (RlcDlPduInfo *)(pdu->pduLst.first->node); cmLListDelFrm(&pdu->pduLst, pdu->pduLst.first); - RLC_FREE_BUF_WC(pduInfo->pdu); - RLC_FREE_WC(gCb, pduInfo, sizeof(RlcDlPduInfo)); + ODU_PUT_MSG_BUF(pduInfo->pdu); + RLC_FREE(gCb, pduInfo, sizeof(RlcDlPduInfo)); } - RLC_FREE_WC(gCb,pdu, sizeof(RlcTx)); + RLC_FREE(gCb,pdu, sizeof(RlcTx)); toBeFreed--; } @@ -1223,7 +1223,7 @@ Void rlcUtlFreeDlMemory(RlcCb *gCb) if(!moreToBeFreed) { cmLListDelFrm(lst, lst->first); - RLC_FREE_WC(gCb, rbCb, sizeof(RlcDlRbCb)); + RLC_FREE(gCb, rbCb, sizeof(RlcDlRbCb)); } } @@ -2158,7 +2158,7 @@ Void rlcUtlDelTxBuf (CmLListCp *txBufLst,RlcTx *txBuf,RlcCb *gCb) txBufLstCp = &txBufLst[hashKey]; //printf("D-sn(%d)\n", txBuf->hdr.sn); cmLListDelFrm(txBufLstCp, &txBuf->lnk); - RLC_FREE_WC(gCb, txBuf, sizeof(RlcTx)); + RLC_FREE(gCb, txBuf, sizeof(RlcTx)); return; } /* rlcUtlDelTxBuf */ diff --git a/src/5gnrrlc/kw_utl_ul.c b/src/5gnrrlc/kw_utl_ul.c index f954e768e..b8a56f479 100755 --- a/src/5gnrrlc/kw_utl_ul.c +++ b/src/5gnrrlc/kw_utl_ul.c @@ -120,7 +120,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 +155,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; @@ -221,7 +221,7 @@ uint8_t rlcUtlSendUlDataToDu(RlcCb *gCb, RlcUlRbCb *rbCb, Buffer *sdu) { DU_LOG("\nRLC : 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 */ @@ -1010,7 +1010,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 @@ -1034,12 +1034,74 @@ 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 */ +#ifdef NR_RLC_UL +/** + * + * @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 */ +#endif /********************************************************************30** -- 2.16.6