X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrrlc%2Fkw_lim.c;h=303745a8f2933c9105cd0c6c51b5bed72d5c3edc;hb=deeae2741b8520edcd37ecb20a40f1de821ceadf;hp=7ad2d1487fa2beeb48b945f61009854cd9b9098b;hpb=5625a52ad68f6ad93684e68bbbdbaef0d462cf9a;p=o-du%2Fl2.git diff --git a/src/5gnrrlc/kw_lim.c b/src/5gnrrlc/kw_lim.c index 7ad2d1487..303745a8f 100755 --- a/src/5gnrrlc/kw_lim.c +++ b/src/5gnrrlc/kw_lim.c @@ -209,6 +209,98 @@ U8 status; RETVALUE(ROK); } /* KwLiRguBndCfm */ +/** + * @brief Handler to process PDU received from MAC + * + * @details + * This function receives the PDU from MAC. + * seggregates common and dedicated logical channel + * PDU and call respective handler. + * + * @param[in] pst Post structure + * @param[in] suId Service User ID + * @param[in] datInd Data Indication Information + * + * @return S16 + * -# ROK + * -# RFAILED + * +*/ + +PUBLIC S16 RlcMacProcUlData(Pst *pst, SuId suId, RlcMacData *ulData) +{ + U8 idx; + U8 lcId; /* Logical Channel */ + U8 numDLch = 0; /* Number of dedicated logical channel */ + Bool dLchPduPres; /* PDU received on dedicated logical channel */ + RguLchDatInd dLchData[RGU_MAX_LC]; /* PDU info on dedicated logical channel */ + RguDDatIndInfo *dLchUlDat; /* UL data on dedicated logical channel */ + RguCDatIndInfo *cLchUlDat; /* UL data on common logical channel */ + + /* Initializing dedicated logical channel Database */ + for(idx = 0; idx < RGU_MAX_LC; idx++) + { + dLchData[idx].lcId = idx; + dLchData[idx].pdu.numPdu = 0; + } + + dLchPduPres = FALSE; + + /* Seggregate PDUs received on common and dedicated channels + * and call common channel's handler */ + for(idx = 0; idx< ulData->nmbPdu; idx++) + { + if(ulData->pduInfo[idx].commCh) + { + KW_SHRABL_STATIC_BUF_ALLOC(pst->region, pst->pool, cLchUlDat, sizeof(RguCDatIndInfo)); + cmMemset((U8*)cLchUlDat, (U8)0, sizeof(RguCDatIndInfo)); + + cLchUlDat->cellId = ulData->cellId; + cLchUlDat->rnti = ulData->rnti; + cLchUlDat->lcId = ulData->pduInfo[idx].lcId; + cLchUlDat->pdu = ulData->pduInfo[idx].pduBuf; + + KwLiRguCDatInd(pst, suId, cLchUlDat); + } + else + { + if(!dLchPduPres) + { + KW_SHRABL_STATIC_BUF_ALLOC(pst->region, pst->pool, dLchUlDat, sizeof(RguDDatIndInfo)); + dLchPduPres = TRUE; + } + + lcId = ulData->pduInfo[idx].lcId; + dLchData[lcId].pdu.mBuf[dLchData[lcId].pdu.numPdu] = ulData->pduInfo[idx].pduBuf; + dLchData[lcId].pdu.numPdu++; + } + } + + /* If any PDU received on dedicated logical channel, copy into RguDDatIndInfo + * and call its handler */ + if(dLchPduPres) + { + dLchUlDat->cellId = ulData->cellId; + dLchUlDat->rnti = ulData->rnti; + + for(idx = 0; idx < RGU_MAX_LC; idx++) + { + if(dLchData[idx].pdu.numPdu) + { + cmMemcpy((U8 *)&dLchUlDat->lchData[numDLch], (U8 *)&dLchData[idx], sizeof(RguLchDatInd)); + numDLch++; + } + } + dLchUlDat->numLch = numDLch; + KwLiRguDDatInd(pst, suId, dLchUlDat); + } + + + KW_FREE_SHRABL_BUF(pst->region, pst->pool, ulData, sizeof(RlcMacData)); + RETVALUE(ROK); + +}/* End of RlcMacProcUlData */ + PUBLIC int rlcDDatIndRcvd; PUBLIC int rlcCDatIndRcvd; /** @@ -362,6 +454,87 @@ RguDDatIndInfo *datInd; RETVALUE(ROK); } /* KwLiRguDDatInd */ + +/******************************************************************* + * + * @brief Handler for extracting common and dedicated channel + * Scheduling result report. + * + * @details + * + * Function : RlcMacProcSchedRep + * + * Functionality: + * Handler for extracting common and dedicated channel + * Scheduling result report + * + * @params[in] + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +PUBLIC S16 RlcMacProcSchedRep(Pst *pst, SuId suId, RlcMacSchedRep *schRep) +{ + U8 idx; /* Iterator */ + U8 nmbDLch = 0; /* Number of dedicated logical channles */ + RguCStaIndInfo *cLchSchInfo; /* Common logical channel scheduling result */ + RguDStaIndInfo *dLchSchInfo; /* Dedicated logical channel scheduling result */ + + DU_LOG("\nRLC : Received scheduling report from MAC"); + + for(idx=0; idx < schRep->nmbLch; idx++) + { + /* If it is common channel, fill status indication information + * and trigger the handler for each common lch separately */ + if(schRep->lchSta[idx].commCh) + { + KW_SHRABL_STATIC_BUF_ALLOC(pst->region, pst->pool, cLchSchInfo, sizeof(RguCStaIndInfo)); + cmMemset((U8*)cLchSchInfo, (U8)0, sizeof(RguCStaIndInfo)); + + cLchSchInfo->cellId = schRep->cellId; + cLchSchInfo->lcId = schRep->lchSta[idx].lchStaInd.lcId; + //cLchSchInfo->transId = schRep->timeToTx; /* TODO : fill transId suing timeToTx */ + cLchSchInfo->rnti = schRep->rnti; + + KwLiRguCStaInd(pst, suId, cLchSchInfo); + + } + else + { + /* Fill status info structure if at least one dedicated channel + * scheduling report is received */ + if(nmbDLch == 0) + { + KW_SHRABL_STATIC_BUF_ALLOC(pst->region, pst->pool, dLchSchInfo, sizeof(RguDStaIndInfo)); + + dLchSchInfo->cellId = schRep->cellId; + dLchSchInfo->nmbOfUeGrantPerTti = 1; + dLchSchInfo->staInd[0].rnti = schRep->rnti; + //dLchSchInfo->staInd[0].transId = schRep->timeToTx; /* TODO : fill transId suing timeToTx */ + dLchSchInfo->staInd[0].nmbOfTbs = 1; + //dLchSchInfo->staInd[0].fillCrlPdu = /* TODO : Check the value needed to be filled */ + } + + /* Fill logical channel scheduling info */ + cmMemcpy((U8 *)&dLchSchInfo->staInd[0].staIndTb[0].lchStaInd[nmbDLch], (U8 *)&schRep->lchSta[idx].lchStaInd, sizeof(RguLchStaInd)); + nmbDLch++; + + } + + } + + /* Calling handler for all dedicated channels scheduling*/ + if(nmbDLch) + { + dLchSchInfo->staInd[0].staIndTb[0].nmbLch = nmbDLch; + KwLiRguDStaInd(pst, suId, dLchSchInfo); + } + + KW_SHRABL_STATIC_BUF_FREE(pst->region, pst->pool, schRep, sizeof(RlcMacSchedRep)); + + RETVALUE(ROK); +} + /** * @brief Handler for trigerring the data transfer from RLC to MAC * for common logical channels.