X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrrlc%2Fkw_lim.c;h=f590955669513ef29862a1bd53f57045dd1c96e2;hb=571b7d1991b8ea5cc64a76f38940d5ac9b4b84e2;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..f59095566 100755 --- a/src/5gnrrlc/kw_lim.c +++ b/src/5gnrrlc/kw_lim.c @@ -209,6 +209,94 @@ 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) + { + 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) + { + 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); + } + + RETVALUE(ROK); + +}/* End of RlcMacProcUlData */ + PUBLIC int rlcDDatIndRcvd; PUBLIC int rlcCDatIndRcvd; /** @@ -362,6 +450,80 @@ 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 */ + + 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) + { + 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) + { + 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); + } + + RETVALUE(ROK); +} + /** * @brief Handler for trigerring the data transfer from RLC to MAC * for common logical channels.