X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrrlc%2Frlc_utl_dl.c;h=f188d096e15004fc241b4b300251e5f02a5c52d1;hb=8e6123e23f6d831b1fe972f8229e9594a2e92237;hp=ff7c636c38381ceabb21d1affa5ff097bd33b4cd;hpb=743103e6bd7d291c71a3ffaa77166a2a3a13c6b4;p=o-du%2Fl2.git diff --git a/src/5gnrrlc/rlc_utl_dl.c b/src/5gnrrlc/rlc_utl_dl.c index ff7c636c3..f188d096e 100755 --- a/src/5gnrrlc/rlc_utl_dl.c +++ b/src/5gnrrlc/rlc_utl_dl.c @@ -230,14 +230,16 @@ uint8_t rlcSendDedLcDlData(Pst *post, SpId spId, RguDDatReqInfo *datReqInfo) uint16_t pduLen; /* PDU length */ uint16_t copyLen; /* Number of bytes copied */ uint8_t lcId = 0; + RlcBoStatus *boStatus = NULLP; /* Buffer occupancy status information */ + uint8_t ret = ROK; RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, - dlData, sizeof(RlcData)); + dlData, sizeof(RlcData)); if(dlData == NULLP) { DU_LOG("\nERROR --> RLC_DL : rlcSendDedLcDlData: Memory allocation failed for dl data"); RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, - datReqInfo, sizeof(RguDDatReqInfo)); + datReqInfo, sizeof(RguDDatReqInfo)); return RFAILED; } memset(dlData, 0, sizeof(RlcData)); @@ -267,31 +269,31 @@ uint8_t rlcSendDedLcDlData(Pst *post, SpId spId, RguDDatReqInfo *datReqInfo) dlData->pduInfo[dlData->numPdu].lcId = datPerLch.lcId; /* Copy Message to fixed buffer to send */ - ODU_GET_MSG_LEN(datPerLch.pdu.mBuf[pduIdx], (MsgLen *)&pduLen); - RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, - dlData->pduInfo[dlData->numPdu].pduBuf, pduLen); - - if (dlData->pduInfo[dlData->numPdu].pduBuf == NULLP ) - { - DU_LOG("\nERROR --> RLC_DL : rlcSendDedLcDlData: Memory allocation failed"); - for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++) - { - RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlData->pduInfo[pduIdx].pduBuf,\ - dlData->pduInfo[pduIdx].pduLen); - } - RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, - dlData, sizeof(RlcData)); - RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, - datReqInfo, sizeof(RguDDatReqInfo)); - return RFAILED; - } + ODU_GET_MSG_LEN(datPerLch.pdu.mBuf[pduIdx], (MsgLen *)&pduLen); + RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, + dlData->pduInfo[dlData->numPdu].pduBuf, pduLen); + + if (dlData->pduInfo[dlData->numPdu].pduBuf == NULLP ) + { + DU_LOG("\nERROR --> RLC_DL : rlcSendDedLcDlData: Memory allocation failed"); + for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++) + { + RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, dlData->pduInfo[pduIdx].pduBuf,\ + dlData->pduInfo[pduIdx].pduLen); + } + RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, + dlData, sizeof(RlcData)); + RLC_FREE_SHRABL_BUF(post->region, post->pool, + datReqInfo, sizeof(RguDDatReqInfo)); + return RFAILED; + } ODU_COPY_MSG_TO_FIX_BUF(datPerLch.pdu.mBuf[pduIdx], 0, pduLen, \ - dlData->pduInfo[dlData->numPdu].pduBuf, (MsgLen *)©Len); - dlData->pduInfo[dlData->numPdu].pduLen = pduLen; + dlData->pduInfo[dlData->numPdu].pduBuf, (MsgLen *)©Len); + dlData->pduInfo[dlData->numPdu].pduLen = pduLen; /* Free message */ - ODU_PUT_MSG_BUF(datPerLch.pdu.mBuf[pduIdx]); + ODU_PUT_MSG_BUF(datPerLch.pdu.mBuf[pduIdx]); dlData->numPdu++; }/* For per PDU */ @@ -304,6 +306,42 @@ uint8_t rlcSendDedLcDlData(Pst *post, SpId spId, RguDDatReqInfo *datReqInfo) }/* For Data per Lch */ }/* For Data per Tb */ + /*No Data to send for this UE, Only send the BO REQUEST to SCH */ + if(dlData->numPdu == 0) + { + for(lchIdx = 0; lchIdx < dlData->numLc; lchIdx++) + { + RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, \ + boStatus, sizeof(RlcBoStatus)); + if(boStatus == NULLP) + { + DU_LOG("\nERROR --> RLC_DL : rlcSendDedLcDlData: Memory allocation failed for boStatus"); + ret = RFAILED; + break; + } + boStatus->cellId = dlData->cellId; + GET_UE_IDX(dlData->rnti, boStatus->ueIdx); + boStatus->commCh = FALSE; + boStatus->lcId = dlData->boStatus[lchIdx].lcId; + boStatus->bo = dlData->boStatus[lchIdx].bo; + + FILL_PST_RLC_TO_MAC(pst, RLC_DL_INST, EVENT_BO_STATUS_TO_MAC); + /* Send Status Response to MAC layer */ + if(RlcSendBoStatusToMac(&pst, boStatus) != ROK) + { + DU_LOG("\nERROR --> RLC_DL : rlcSendDedLcDlData: Failed to send BO status"); + RLC_FREE_SHRABL_BUF(pst.region, pst.pool, boStatus, sizeof(RlcBoStatus)); + ret = RFAILED; + break; + } + DU_LOG("\nINFO --> RLC_DL : rlcSendDedLcDlData: BO Status sent successfully for LCID:%d,BO:%d",\ + boStatus->lcId, boStatus->bo); + } + RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, dlData, sizeof(RlcData)); + RLC_FREE_SHRABL_BUF(post->region, post->pool, datReqInfo, sizeof(RguDDatReqInfo)); + return (ret); + } + RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, dlRrcMsgRsp, sizeof(RlcDlRrcMsgRsp)); if(dlRrcMsgRsp == NULLP) { @@ -311,11 +349,11 @@ uint8_t rlcSendDedLcDlData(Pst *post, SpId spId, RguDDatReqInfo *datReqInfo) for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++) { RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlData->pduInfo[pduIdx].pduBuf,\ - dlData->pduInfo[pduIdx].pduLen); + dlData->pduInfo[pduIdx].pduLen); } RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlData, sizeof(RlcData)); RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, - datReqInfo, sizeof(RguDDatReqInfo)); + datReqInfo, sizeof(RguDDatReqInfo)); return RFAILED; } dlRrcMsgRsp->cellId = dlData->cellId; @@ -330,10 +368,10 @@ uint8_t rlcSendDedLcDlData(Pst *post, SpId spId, RguDDatReqInfo *datReqInfo) for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++) { RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlData->pduInfo[pduIdx].pduBuf,\ - dlData->pduInfo[pduIdx].pduLen); + dlData->pduInfo[pduIdx].pduLen); } RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlData, sizeof(RlcData)); - RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, datReqInfo, sizeof(RguDDatReqInfo)); + RLC_FREE_SHRABL_BUF(post->region, post->pool, datReqInfo, sizeof(RguDDatReqInfo)); RLC_FREE_SHRABL_BUF(pst.region, pst.pool, dlRrcMsgRsp, sizeof(RlcDlRrcMsgRsp)); return RFAILED; } @@ -353,7 +391,7 @@ uint8_t rlcSendDedLcDlData(Pst *post, SpId spId, RguDDatReqInfo *datReqInfo) } } /* For Data per UE */ RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, datReqInfo, sizeof(RguDDatReqInfo)); - + return ROK; }/* End of rlcSendDedLcDlData */ @@ -389,31 +427,33 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) RguDDatReqInfo *datReqInfo; /* Data Request Information */ RlcRguSapCb *rguSap; /* MAC SAP CB */ uint32_t totNumPdu; /* Total number of PDUS */ + MsgLen len = 0; RguStaIndTb *staIndTb = NULLP; RguDatReqTb *datReqTb = NULLP; RguDStaIndPerUe *staInd = NULLP; #ifdef LTE_L2_MEAS uint32_t grantPerLch[RGU_MAX_LC] = {0}; #endif -/* kw005.201 added support for L2 Measurement */ + /* kw005.201 added support for L2 Measurement */ #ifdef LTE_L2_MEAS_LOSS_DELAY uint8_t snIdx1; uint8_t snIdx2; #endif /* LTE_L2_MEAS */ - uint32_t idx; + uint32_t idx, ueDataIdx = 0; -//Debug + //Debug uint32_t staIndSz=0,datIndSz = 0; + RlcTptPerSnssai *snssaiTputNode = NULLP; datReqInfo = NULLP; RLC_ALLOC_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, - datReqInfo,sizeof(RguDDatReqInfo)); + datReqInfo,sizeof(RguDDatReqInfo)); #if (ERRCLASS & ERRCLS_ADD_RES) - if ( datReqInfo == NULLP ) - { - DU_LOG("\nERROR --> RLC_DL : rlcUtlSendToMac: Memory allocation failed"); - return RFAILED; - } + if ( datReqInfo == NULLP ) + { + DU_LOG("\nERROR --> RLC_DL : rlcUtlSendToMac: Memory allocation failed"); + return RFAILED; + } #endif /* ERRCLASS & ERRCLS_ADD_RES */ for(idx = 0; idx < staIndInfo->nmbOfUeGrantPerTti; idx++) { @@ -424,11 +464,11 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) { /* Fetch UeCb failed */ DU_LOG("\nERROR --> RLC_DL : rlcUtlSendToMac: UeId[%u]:ueCb not found", - staInd->rnti); + staInd->rnti); /* If ueCb is not found for current rnti then continue to look for next rnti*/ continue; } - + /* kw002.201 Removed the allocation of RlcDatReq */ /* kw004.201 Used SSI function to initialize the variable */ memset(&datReq, 0, sizeof(RlcDatReq) ); @@ -436,16 +476,17 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) for (numTb = 0; numTb < staInd->nmbOfTbs; numTb++) { staIndTb = &(staInd->staIndTb[numTb]); - datReqTb = &(datReqInfo->datReq[idx].datReqTb[numTb]); + datReqTb = &(datReqInfo->datReq[ueDataIdx].datReqTb[numTb]); #ifdef LTE_L2_MEAS ueCb->tbIdx = (ueCb->tbIdx+1) % RLC_MAX_TB_PER_UE; #endif + snssaiTputNode = NULLP; for (count = 0;count < staIndTb->nmbLch; count++) { #ifdef LTE_L2_MEAS /*Calculate the total grant size from MAC */ if((staIndTb->lchStaInd[count].lcId >= RGU_MAX_LC) - || (staIndTb->lchStaInd[count].lcId == 0)) + || (staIndTb->lchStaInd[count].lcId == 0)) { /* TODO : Need to figure out why this is happening */ break; @@ -460,8 +501,20 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) if (rbCb && (!rlcDlUtlIsReestInProgress(rbCb))) { /* Cosider buffer size for throughput calculation */ - if(gCb->rlcThpt.thptPerUe[ueId-1].ueId == ueId) - gCb->rlcThpt.thptPerUe[ueId-1].dataVol += staIndTb->lchStaInd[count].totBufSize; + if(gCb->rlcThpt.ueTputInfo.thptPerUe[ueId-1].ueId == ueId) + gCb->rlcThpt.ueTputInfo.thptPerUe[ueId-1].dataVol += staIndTb->lchStaInd[count].totBufSize; + + if(rbCb->snssai) + { + snssaiTputNode = rlcHandleSnssaiTputlist(gCb, rbCb->snssai, SEARCH); + if(snssaiTputNode != NULLP) + { + snssaiTputNode->dataVol += staIndTb->lchStaInd[count].totBufSize; + DU_LOG("\nINFO -->SCH: SNSSAI List Grant:%d, lcId:%d, total :%d",\ + staIndTb->lchStaInd[count].totBufSize, staIndTb->lchStaInd[count].lcId,\ + snssaiTputNode->dataVol); + } + } staIndSz += staIndTb->lchStaInd[count].totBufSize; datReq.pduSz = staIndTb->lchStaInd[count].totBufSize; @@ -480,23 +533,9 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) #ifdef LTE_L2_MEAS grantPerLch[staIndTb->lchStaInd[count].lcId] = datReq.totMacGrant; #endif - if ( 0 == datReq.pduInfo.numPdu ) - { - continue; - } - totNumPdu += datReq.pduInfo.numPdu; - memcpy(&(datReqTb->lchData[count].pdu), - &(datReq.pduInfo),sizeof(KwPduInfo)); - - for (;numPdu < datReqTb->lchData[count].pdu.numPdu ; numPdu ++) - { - MsgLen len = 0; - ODU_GET_MSG_LEN(datReqTb->lchData[count].pdu.mBuf[numPdu],&len); - datIndSz += len; - } datReqTb->lchData[count].setMaxUlPrio = FALSE; if (RLC_AM_IS_POLL_BIT_SET(RLC_AMDL) && - (RLC_AMDL.sduQ.count > 1)) + (RLC_AMDL.sduQ.count > 1)) { /* Poll bit is set indicate to MAC*/ datReqTb->lchData[count].setMaxUlPrio = TRUE; @@ -505,7 +544,7 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) #ifdef CCPU_OPT datReqTb->lchData[count].boReport.estRlcHdrSz = - datReq.boRep.estHdrSz; + datReq.boRep.estHdrSz; datReqTb->lchData[count].boReport.staPduPrsnt = datReq.boRep.staPduPrsnt; #endif /* CCPU_OPT */ @@ -525,6 +564,23 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) } #endif + datReqTb->lchData[count].boReport.oldestSduArrTime = + datReq.boRep.oldestSduArrTime; + if ( 0 == datReq.pduInfo.numPdu ) + { + /* kw004.201 Used SSI function to initialize the variable */ + memset(&datReq, 0, sizeof(RlcDatReq) ); + continue; + } + totNumPdu += datReq.pduInfo.numPdu; + memcpy(&(datReqTb->lchData[count].pdu), + &(datReq.pduInfo),sizeof(KwPduInfo)); + + for (;numPdu < datReqTb->lchData[count].pdu.numPdu ; numPdu ++) + { + ODU_GET_MSG_LEN(datReqTb->lchData[count].pdu.mBuf[numPdu],&len); + datIndSz += len; + } /* kw005.201 added support for L2 Measurement */ #ifdef LTE_L2_MEAS_LOSS_DELAY datReqTb->rguSnInfo->lchMap[count].lChId = @@ -547,8 +603,6 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) tbSnMap->prevNumSn = tbSnMap->numSn; } #endif - datReqTb->lchData[count].boReport.oldestSduArrTime = - datReq.boRep.oldestSduArrTime; /* kw004.201 Used SSI function to initialize the variable */ memset(&datReq, 0, sizeof(RlcDatReq) ); } @@ -564,12 +618,7 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) } #endif datReqTb->nmbLch = staIndTb->nmbLch; - /*adding the check to make sure that lcId is not sent as 0 - * when no data is there in datReq */ - if ( 0 == totNumPdu ) - { - datReqTb->lchData[0].lcId = staIndTb->lchStaInd[0].lcId; - } + /* kw005.201 added support for L2 Measurement */ #ifdef LTE_L2_MEAS_LOSS_DELAY if(tbSnMap->numSn == 0) @@ -588,15 +637,24 @@ uint8_t rlcUtlSendToMac(RlcCb *gCb, SuId suId, KwDStaIndInfo *staIndInfo) } #endif /* LTE_L2_MEAS */ } - datReqInfo->datReq[idx].nmbOfTbs = staInd->nmbOfTbs; - datReqInfo->datReq[idx].transId = staInd->transId; - datReqInfo->datReq[idx].rnti = staInd->rnti; + datReqInfo->datReq[ueDataIdx].nmbOfTbs = staInd->nmbOfTbs; + datReqInfo->datReq[ueDataIdx].transId = staInd->transId; + datReqInfo->datReq[ueDataIdx].rnti = staInd->rnti; + ueDataIdx++; } - datReqInfo->cellId = staIndInfo->cellId; - datReqInfo->nmbOfUeGrantPerTti = staIndInfo->nmbOfUeGrantPerTti; - rguSap = &(gCb->u.dlCb->rguDlSap[suId]); - rlcSendDedLcDlData(&rguSap->pst,rguSap->spId,datReqInfo); + if(ueDataIdx > 0) + { + datReqInfo->cellId = staIndInfo->cellId; + datReqInfo->nmbOfUeGrantPerTti = staIndInfo->nmbOfUeGrantPerTti; + + rguSap = &(gCb->u.dlCb->rguDlSap[suId]); + rlcSendDedLcDlData(&rguSap->pst,rguSap->spId,datReqInfo); + } + else + { + RLC_FREE_SHRABL_BUF(RLC_MEM_REGION_DL, RLC_POOL, datReqInfo,sizeof(RguDDatReqInfo)); + } return ROK; } @@ -1007,22 +1065,23 @@ static Bool rlcUtlFreeDlAmRbMemory(RlcCb *gCb,RlcDlRbCb *rbCb,uint32_t *toBeFree if (txBuf && txBuf->pduLst.first) { while(txBuf->pduLst.first) - { - RlcDlPduInfo *pduInfo = (RlcDlPduInfo *)(txBuf->pduLst.first->node); - ODU_PUT_MSG_BUF(pduInfo->pdu); - /* Delete node from the txBuf Pdu lst */ - cmLListDelFrm(&txBuf->pduLst, txBuf->pduLst.first); - RLC_FREE(gCb, pduInfo, sizeof(RlcDlPduInfo)); - } + { + RlcDlPduInfo *pduInfo = (RlcDlPduInfo *)(txBuf->pduLst.first->node); + ODU_PUT_MSG_BUF(pduInfo->pdu); + /* Delete node from the txBuf Pdu lst */ + cmLListDelFrm(&txBuf->pduLst, txBuf->pduLst.first); + RLC_FREE(gCb, pduInfo, sizeof(RlcDlPduInfo)); + } rlcUtlDelTxBuf(RLC_AMDL.txBufLst, txBuf, gCb); if(gCb->u.dlCb->shutdownReceived == 0) { (*toBeFreed)--; - } + } } RLC_AMDL.txNextAck = (RLC_AMDL.txNextAck + 1) & RLC_AMDL.snModMask; MODAMT(RLC_AMDL.txNext, mTxNext, RLC_AMDL.txNextAck,RLC_AMDL.snModMask); } + RLC_FREE(gCb, rbCb->snssai, sizeof(Snssai)); if(*toBeFreed == 0) { return (TRUE); @@ -1127,11 +1186,7 @@ Void rlcUtlFreeDlMemory(RlcCb *gCb) /* Free from the ReTx list */ lst = &pToBeFreed->reTxLst; -#ifndef L2_OPTMZ - while((lst->first) && toBeFreed && (pToBeFreed->reTxLst.count > 100)) -#else while((lst->first) && toBeFreed) -#endif { RlcRetx* seg = (RlcRetx *)(lst->first->node); cmLListDelFrm(lst, lst->first); @@ -1142,11 +1197,7 @@ Void rlcUtlFreeDlMemory(RlcCb *gCb) /* Free from the Tx list */ lst = &pToBeFreed->txLst; -#ifndef L2_OPTMZ - while((lst->first) && toBeFreed && (pToBeFreed->txLst.count > 100)) -#else while((lst->first) && toBeFreed) -#endif { RlcTx* pdu = (RlcTx *)(lst->first->node); cmLListDelFrm(lst, lst->first); @@ -1164,11 +1215,7 @@ Void rlcUtlFreeDlMemory(RlcCb *gCb) /* Free from the SDU queue */ lst = &pToBeFreed->sduLst; -#ifndef L2_OPTMZ - while((lst->first) && toBeFreed && (pToBeFreed->sduLst.count > 100)) -#else while((lst->first) && toBeFreed) -#endif { RlcSdu* sdu = (RlcSdu *)(lst->first->node); RLC_REMOVE_SDU(gCb, lst, sdu); @@ -1177,11 +1224,7 @@ Void rlcUtlFreeDlMemory(RlcCb *gCb) /* Free from the RBs */ lst = &pToBeFreed->rbLst; -#ifndef L2_OPTMZ - while((lst->first) && toBeFreed && (pToBeFreed->rbLst.count > 100)) -#else while((lst->first) && toBeFreed) -#endif { RlcDlRbCb* rbCb = (RlcDlRbCb *)(lst->first->node); Bool moreToBeFreed = rlcUtlFreeDlAmRbMemory(gCb, rbCb,&toBeFreed); @@ -1390,11 +1433,10 @@ RlcL2MeasTb * rlcUtlGetCurMeasTb(RlcCb *gCb,RlcDlRbCb *rbCb) if((curL2MeasTb = rbCb->ueCb->l2MeasTbCb[rbCb->ueCb->tbIdx]) == NULLP) { /* Intentionally avoiding the RLC_ALLOC macro to avoid memset */ - if (SGetSBuf(gCb->init.region, - gCb->init.pool, - (Data **)&curL2MeasTb, - (Size)sizeof(RlcL2MeasTb)) != ROK) + RLC_ALLOC(gCb, curL2MeasTb, (Size)sizeof(RlcL2MeasTb)); + if(curL2MeasTb == NULLP) { + DU_LOG("ERROR --> RLC_DL : rlcUtlGetCurMeasTb(): Memory allocation failed"); return (NULLP); } rbCb->ueCb->l2MeasTbCb[rbCb->ueCb->tbIdx] = curL2MeasTb;