X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_msg_hdl.c;h=e59e9bb19801e784be8b3f041df7fc7e5e51d987;hb=545c7a4a13972142fb36962323556dcad7119710;hp=c3a4b80c1bf67bf312bdf01c3fbf5f41917dd3d1;hpb=d76403d03e7b7f60cd515f1b834d28278685a70b;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_msg_hdl.c b/src/5gnrmac/mac_msg_hdl.c index c3a4b80c1..e59e9bb19 100644 --- a/src/5gnrmac/mac_msg_hdl.c +++ b/src/5gnrmac/mac_msg_hdl.c @@ -37,11 +37,6 @@ MacCb macCb; -uint16_t buildMacPdu(RlcData *dlData); -#ifdef EGTP_TEST -void macStubBuildUlData(Buffer *mBuf); -#endif - /* Function pointer for sending crc ind from MAC to SCH */ MacSchCrcIndFunc macSchCrcIndOpts[]= { @@ -74,6 +69,21 @@ MacSchSrUciIndFunc macSchSrUciIndOpts[]= packMacSchSrUciInd }; +/* Function pointer for sending Slice cfg ind from MAC to SCH */ +MacSchSliceCfgReqFunc macSchSliceCfgReqOpts[]= +{ + packMacSchSliceCfgReq, + MacSchSliceCfgReq, + packMacSchSliceCfgReq +}; + +/* Function pointer for sending Slice cfg ind from MAC to SCH */ +MacSchSliceReCfgReqFunc macSchSliceReCfgReqOpts[]= +{ + packMacSchSliceReCfgReq, + MacSchSliceReCfgReq, + packMacSchSliceReCfgReq +}; /******************************************************************* * * @brief Sends DL BO Info to SCH @@ -210,18 +220,24 @@ uint8_t fapiMacRxDataInd(Pst *pst, RxDataInd *rxDataInd) * ****************************************************************/ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData) { - uint8_t pduIdx =0; + uint8_t pduIdx = 0; + uint8_t ueId = 0; uint8_t lcIdx = 0; - uint8_t *txPdu =NULLP; - uint16_t tbSize =0; + uint8_t *txPdu = NULLP; + uint8_t schInfoIdx = 0 ; + uint16_t cellIdx = 0, txPduLen = 0; MacDlData macDlData; MacDlSlot *currDlSlot = NULLP; DlRlcBoInfo dlBoInfo; - + memset(&macDlData , 0, sizeof(MacDlData)); DU_LOG("\nDEBUG --> MAC: Received DL data for sfn=%d slot=%d numPdu= %d", \ dlData->slotInfo.sfn, dlData->slotInfo.slot, dlData->numPdu); + + GET_UE_ID(dlData->rnti, ueId); + /* Copy the pdus to be muxed into mac Dl data */ + macDlData.ueId = ueId; macDlData.numPdu = dlData->numPdu; for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++) { @@ -230,24 +246,35 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData) macDlData.pduInfo[pduIdx].dlPdu = dlData->pduInfo[pduIdx].pduBuf; } + GET_CELL_IDX(dlData->cellId, cellIdx); /* Store DL data in the scheduled slot */ - currDlSlot = &macCb.macCell[dlData->cellId -1]->dlSlot[dlData->slotInfo.slot]; - if(currDlSlot) + if(macCb.macCell[cellIdx] ==NULLP) + { + DU_LOG("\nERROR --> MAC : MacProcRlcDlData(): macCell does not exists"); + return RFAILED; + } + currDlSlot = &macCb.macCell[cellIdx]->dlSlot[dlData->slotInfo.slot]; + if(currDlSlot->dlInfo.dlMsgAlloc[ueId-1]) { - if(currDlSlot->dlInfo.dlMsgAlloc) + for(schInfoIdx=0; schInfoIdxdlInfo.dlMsgAlloc[ueId-1]->numSchedInfo; schInfoIdx++) { - tbSize = currDlSlot->dlInfo.dlMsgAlloc->dlMsgPdschCfg.codeword[0].tbSize; - MAC_ALLOC(txPdu, tbSize); - if(!txPdu) - { - DU_LOG("\nERROR --> MAC : Memory allocation failed in MacProcRlcDlData"); - return RFAILED; - } - macMuxPdu(&macDlData, NULLP, txPdu, tbSize); + if((currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].pduPres == PDSCH_PDU) || + (currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].pduPres == BOTH)) + break; + } - currDlSlot->dlInfo.dlMsgAlloc->dlMsgInfo.dlMsgPduLen = tbSize; - currDlSlot->dlInfo.dlMsgAlloc->dlMsgInfo.dlMsgPdu = txPdu; + txPduLen = currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgPdschCfg.codeword[0].tbSize\ + - TX_PAYLOAD_HDR_LEN; + MAC_ALLOC(txPdu, txPduLen); + if(!txPdu) + { + DU_LOG("\nERROR --> MAC : Memory allocation failed in MacProcRlcDlData"); + return RFAILED; } + macMuxPdu(&macDlData, NULLP, txPdu, txPduLen); + + currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPduLen = txPduLen; + currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPdu = txPdu; } for(lcIdx = 0; lcIdx < dlData->numLc; lcIdx++) @@ -256,7 +283,7 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData) { memset(&dlBoInfo, 0, sizeof(DlRlcBoInfo)); dlBoInfo.cellId = dlData->boStatus[lcIdx].cellId; - GET_CRNTI(dlBoInfo.crnti, dlData->boStatus[lcIdx].ueIdx); + GET_CRNTI(dlBoInfo.crnti, dlData->boStatus[lcIdx].ueId); dlBoInfo.lcId = dlData->boStatus[lcIdx].lcId; dlBoInfo.dataVolume = dlData->boStatus[lcIdx].bo; sendDlRlcBoInfoToSch(&dlBoInfo); @@ -267,11 +294,11 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData) for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++) { MAC_FREE_SHRABL_BUF(pstInfo->region, pstInfo->pool, dlData->pduInfo[pduIdx].pduBuf,\ - dlData->pduInfo[pduIdx].pduLen); + dlData->pduInfo[pduIdx].pduLen); } if(pstInfo->selector == ODU_SELECTOR_LWLC) { - MAC_FREE_SHRABL_BUF(pstInfo->region, pstInfo->pool, dlData, sizeof(RlcData)); + MAC_FREE_SHRABL_BUF(pstInfo->region, pstInfo->pool, dlData, sizeof(RlcData)); } return ROK; } @@ -296,7 +323,7 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData) * RFAILED - failure * * ****************************************************************/ -uint8_t macProcUlData(uint16_t cellId, uint16_t rnti, SlotIndInfo slotInfo, \ +uint8_t macProcUlData(uint16_t cellId, uint16_t rnti, SlotTimingInfo slotInfo, \ uint8_t lcId, uint16_t pduLen, uint8_t *pdu) { Pst pst; @@ -312,7 +339,7 @@ uint8_t lcId, uint16_t pduLen, uint8_t *pdu) memset(ulData, 0, sizeof(RlcData)); ulData->cellId = cellId; ulData->rnti = rnti; - memcpy(&ulData->slotInfo, &slotInfo, sizeof(SlotIndInfo)); + memcpy(&ulData->slotInfo, &slotInfo, sizeof(SlotTimingInfo)); ulData->slotInfo.cellId = cellId; /* Filling pdu info */ @@ -356,10 +383,10 @@ uint8_t MacProcRlcBoStatus(Pst* pst, RlcBoStatus* boStatus) DlRlcBoInfo dlBoInfo; dlBoInfo.cellId = boStatus->cellId; - GET_CRNTI(dlBoInfo.crnti, boStatus->ueIdx); + GET_CRNTI(dlBoInfo.crnti, boStatus->ueId); dlBoInfo.lcId = boStatus->lcId; dlBoInfo.dataVolume = boStatus->bo; - + sendDlRlcBoInfoToSch(&dlBoInfo); if(pst->selector == ODU_SELECTOR_LWLC) @@ -385,7 +412,7 @@ uint8_t MacProcRlcBoStatus(Pst* pst, RlcBoStatus* boStatus) * RFAILED - failure * * ****************************************************************/ -uint8_t sendSchedRptToRlc(DlSchedInfo dlInfo, SlotIndInfo slotInfo) +uint8_t sendSchedRptToRlc(DlSchedInfo dlInfo, SlotTimingInfo slotInfo, uint8_t ueIdx, uint8_t schInfoIdx) { Pst pst; uint8_t lcIdx; @@ -400,16 +427,19 @@ uint8_t sendSchedRptToRlc(DlSchedInfo dlInfo, SlotIndInfo slotInfo) DU_LOG("\nDEBUG --> MAC: Send scheduled result report for sfn %d slot %d", slotInfo.sfn, slotInfo.slot); schedRpt->cellId = dlInfo.cellId; - schedRpt->rnti = dlInfo.dlMsgAlloc->crnti; - schedRpt->numLc = dlInfo.dlMsgAlloc->numLc; schedRpt->slotInfo.sfn = slotInfo.sfn; schedRpt->slotInfo.slot = slotInfo.slot; - for(lcIdx = 0; lcIdx < schedRpt->numLc; lcIdx++) + if(dlInfo.dlMsgAlloc[ueIdx]) { - schedRpt->lcSch[lcIdx].lcId = dlInfo.dlMsgAlloc->lcSchInfo[lcIdx].lcId; - schedRpt->lcSch[lcIdx].bufSize = dlInfo.dlMsgAlloc->lcSchInfo[lcIdx].schBytes; - schedRpt->lcSch[lcIdx].commCh = false; + schedRpt->rnti = dlInfo.dlMsgAlloc[ueIdx]->crnti; + schedRpt->numLc = dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].numLc; + for(lcIdx = 0; lcIdx < schedRpt->numLc; lcIdx++) + { + schedRpt->lcSch[lcIdx].lcId = dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].lcSchInfo[lcIdx].lcId; + schedRpt->lcSch[lcIdx].bufSize = dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].lcSchInfo[lcIdx].schBytes; + schedRpt->lcSch[lcIdx].commCh = false; + } } /* Fill Pst */ @@ -474,14 +504,13 @@ uint8_t MacProcCellStop(Pst *pst, OduCellId *cellId) { #ifdef INTEL_FAPI uint16_t cellIdx; - SlotIndInfo slotInfo; DU_LOG("\nINFO --> MAC : Sending cell stop request to Lower Mac"); GET_CELL_IDX(cellId->cellId, cellIdx); - slotInfo.cellId = cellId->cellId; - slotInfo.sfn = macCb.macCell[cellIdx]->currTime.sfn; - slotInfo.slot = macCb.macCell[cellIdx]->currTime.slot; - sendToLowerMac(FAPI_STOP_REQUEST, 0, &slotInfo); + if(macCb.macCell[cellIdx]) + { + macCb.macCell[cellIdx]->state = CELL_TO_BE_STOPPED; + } #endif MAC_FREE_SHRABL_BUF(pst->region, pst->pool, cellId, \ @@ -509,7 +538,7 @@ uint8_t MacProcCellStop(Pst *pst, OduCellId *cellId) * ****************************************************************/ uint8_t MacProcDlCcchInd(Pst *pst, DlCcchIndInfo *dlCcchIndInfo) { - uint8_t ueIdx = 0; + uint8_t ueId = 0, ueIdx = 0; uint16_t cellIdx; uint16_t idx; DlRlcBoInfo dlBoInfo; @@ -525,12 +554,12 @@ uint8_t MacProcDlCcchInd(Pst *pst, DlCcchIndInfo *dlCcchIndInfo) if(dlCcchIndInfo->msgType == RRC_SETUP) { dlBoInfo.lcId = SRB0_LCID; // SRB ID 0 for msg4 - /* (MSG4 pdu + 3 bytes sub-header) + (Contention resolution id MAC CE + 1b byte sub-header) */ + /* (MSG4 pdu + 3 bytes sub-header) + (Contention resolution id MAC CE + 1 byte sub-header) */ dlBoInfo.dataVolume = (dlCcchIndInfo->dlCcchMsgLen + 3) + (MAX_CRI_SIZE + 1); /* storing Msg4 Pdu in raCb */ - GET_UE_IDX(dlBoInfo.crnti, ueIdx); - ueIdx = ueIdx -1; + GET_UE_ID(dlBoInfo.crnti, ueId); + ueIdx = ueId -1; if(macCb.macCell[cellIdx]->macRaCb[ueIdx].crnti == dlCcchIndInfo->crnti) { macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen = dlCcchIndInfo->dlCcchMsgLen; @@ -619,6 +648,8 @@ uint8_t macProcUlCcchInd(uint16_t cellId, uint16_t crnti, uint16_t rrcContSize, * lcg ID * buffer size * + * @return ROK - success + * RFAILED - failure * * ****************************************************************/ uint8_t macProcShortBsr(uint16_t cellId, uint16_t crnti, uint8_t lcgId, uint32_t bufferSize) @@ -640,6 +671,48 @@ uint8_t macProcShortBsr(uint16_t cellId, uint16_t crnti, uint8_t lcgId, uint32_t return(*macSchBsrOpts[pst.selector])(&pst, &bsrInd); } +/******************************************************************* + * + * @brief Processes received short BSR + * + * @details + * + * Function : macProcShortBsr + * + * Functionality: + * MAC sends Short BSR to SCH + * + * @params[in] cell ID + * crnti + * lcg ID + * buffer size + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t macProcLongBsr(uint16_t cellId, uint16_t crnti,uint8_t numLcg,\ + DataVolInfo dataVolInfo[MAX_NUM_LOGICAL_CHANNEL_GROUPS]) +{ + Pst pst; + UlBufferStatusRptInd bsrInd; + uint8_t lcgIdx = 0; + + memset(&pst, 0, sizeof(Pst)); + memset(&bsrInd, 0, sizeof(UlBufferStatusRptInd)); + + bsrInd.cellId = cellId; + bsrInd.crnti = crnti; + bsrInd.bsrType = LONG_BSR; + bsrInd.numLcg = numLcg; + + for(lcgIdx = 0; lcgIdx < numLcg; lcgIdx++) + memcpy(&(bsrInd.dataVolInfo[lcgIdx]), &(dataVolInfo[lcgIdx]), sizeof(DataVolInfo)); + + FILL_PST_MAC_TO_SCH(pst, EVENT_LONG_BSR); + return(*macSchBsrOpts[pst.selector])(&pst, &bsrInd); +} + /******************************************************************* * * @brief Builds and send SR UCI Indication to SCH @@ -740,6 +813,161 @@ uint8_t FapiMacUciInd(Pst *pst, UciInd *macUciInd) return ret; } +/******************************************************************* + * + * @brief fill Slice Cfg Request info in shared structre + * + * @details + * + * Function : fillSliceCfgInfo + * + * Functionality: + * fill Slice Cfg Request info in shared structre + * + * @params[in] SchSliceCfgReq *schSliceCfgReq + * MacSliceCfgReq *macSliceCfgReq; + * @return ROK - success + * RFAILED - failure + * + **********************************************************************/ + uint8_t fillSliceCfgInfo(SchSliceCfgReq *schSliceCfgReq, MacSliceCfgReq *macSliceCfgReq) + { + uint8_t cfgIdx = 0; + + if(macSliceCfgReq->listOfSliceCfg) + { + schSliceCfgReq->numOfConfiguredSlice = macSliceCfgReq->numOfConfiguredSlice; + MAC_ALLOC(schSliceCfgReq->listOfConfirguration, schSliceCfgReq->numOfConfiguredSlice *sizeof(SchRrmPolicyOfSlice*)); + if(schSliceCfgReq->listOfConfirguration == NULLP) + { + DU_LOG("\nERROR --> MAC : Memory allocation failed in fillSliceCfgInfo"); + return RFAILED; + } + for(cfgIdx = 0; cfgIdxnumOfConfiguredSlice; cfgIdx++) + { + MAC_ALLOC(schSliceCfgReq->listOfConfirguration[cfgIdx], sizeof(SchRrmPolicyOfSlice)); + if(schSliceCfgReq->listOfConfirguration[cfgIdx] == NULLP) + { + DU_LOG("\nERROR --> MAC : Memory allocation failed in fillSliceCfgInfo"); + return RFAILED; + } + + memcpy(&schSliceCfgReq->listOfConfirguration[cfgIdx]->snssai, &macSliceCfgReq->listOfSliceCfg[cfgIdx]->snssai, sizeof(Snssai)); + + if(macSliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio) + { + MAC_ALLOC(schSliceCfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo, sizeof(SchRrmPolicyRatio)); + if(schSliceCfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo == NULLP) + { + DU_LOG("\nERROR --> MAC : Memory allocation failed in fillSliceCfgInfo"); + return RFAILED; + } + schSliceCfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo->policyMaxRatio = macSliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio->policyMaxRatio; + schSliceCfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo->policyMinRatio = macSliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio->policyMinRatio; + schSliceCfgReq->listOfConfirguration[cfgIdx]->rrmPolicyRatioInfo->policyDedicatedRatio = macSliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio->policyDedicatedRatio; + } + } + } + return ROK; + } +/******************************************************************* + * + * @brief Processes Slice Cfg Request recived from DU + * + * @details + * + * Function : MacProcSliceCfgReq + * + * Functionality: + * Processes Processes Slice Cfg Request recived from DU + * + * @params[in] Post Structure Pointer + * MacSliceCfgReq *macSliceCfgReq; + * @return ROK - success + * RFAILED - failure + * + **********************************************************************/ +uint8_t MacProcSliceCfgReq(Pst *pst, MacSliceCfgReq *macSliceCfgReq) +{ + uint8_t ret = ROK; + Pst schPst; + SchSliceCfgReq *schSliceCfgReq; + + DU_LOG("\nINFO --> MAC : Received Slice Cfg request from DU APP"); + if(macSliceCfgReq) + { + MAC_ALLOC(schSliceCfgReq, sizeof(SchSliceCfgReq)); + if(schSliceCfgReq == NULLP) + { + DU_LOG("\nERROR --> MAC : Memory allocation failed in MacProcSliceCfgReq"); + ret = RFAILED; + } + else + { + if(fillSliceCfgInfo(schSliceCfgReq, macSliceCfgReq) == ROK) + { + FILL_PST_MAC_TO_SCH(schPst, EVENT_SLICE_CFG_REQ_TO_SCH); + ret = (*macSchSliceCfgReqOpts[schPst.selector])(&schPst, schSliceCfgReq); + } + } + freeMacSliceCfgReq(macSliceCfgReq, pst); + } + else + { + DU_LOG("\nINFO --> MAC : Received MacSliceCfgReq is NULL"); + } + return ret; +} + +/******************************************************************* + * + * @brief Processes Slice ReCfg Request recived from DU + * + * @details + * + * Function : MacProcSliceReCfgReq + * + * Functionality: + * Processes Processes Slice ReCfg Request recived from DU + * + * @params[in] Post Structure Pointer + * MacSliceCfgReq *macSliceReCfgReq; + * @return ROK - success + * RFAILED - failure + * + **********************************************************************/ +uint8_t MacProcSliceReCfgReq(Pst *pst, MacSliceCfgReq *macSliceReCfgReq) +{ + uint8_t ret = ROK; + Pst schPst; + SchSliceCfgReq *schSliceReCfgReq; + + DU_LOG("\nINFO --> MAC : Received Slice ReCfg request from DU APP"); + if(macSliceReCfgReq) + { + MAC_ALLOC(schSliceReCfgReq, sizeof(SchSliceCfgReq)); + if(schSliceReCfgReq == NULLP) + { + DU_LOG("\nERROR --> MAC : Memory allocation failed in MacProcSliceReCfgReq"); + ret = RFAILED; + } + else + { + if(fillSliceCfgInfo(schSliceReCfgReq, macSliceReCfgReq) == ROK) + { + FILL_PST_MAC_TO_SCH(schPst, EVENT_SLICE_RECFG_REQ_TO_SCH); + ret = (*macSchSliceReCfgReqOpts[schPst.selector])(&schPst, schSliceReCfgReq); + } + + } + freeMacSliceCfgReq(macSliceReCfgReq, pst); + } + else + { + DU_LOG("\nINFO --> MAC : Received MacSliceCfgReq is NULL"); + } + return ret; +} /********************************************************************** End of file