X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_msg_hdl.c;h=f167513141664da4c8634efc94ec432ae0c38230;hb=de6a435729e3cad9d4a66329080b8206a64f452c;hp=8eb566cb0b2a6fe8b9625146570b6788f94c47fd;hpb=d97caa5d16b9c6a2960a3b6d94d7737b7263004b;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_msg_hdl.c b/src/5gnrmac/mac_msg_hdl.c index 8eb566cb0..f16751314 100644 --- a/src/5gnrmac/mac_msg_hdl.c +++ b/src/5gnrmac/mac_msg_hdl.c @@ -32,6 +32,7 @@ #include "lwr_mac_upr_inf.h" #include "mac.h" #include "mac_utils.h" +#include "mac_harq_dl.h" /* This file contains message handling functionality for MAC */ @@ -69,6 +70,29 @@ MacSchSrUciIndFunc macSchSrUciIndOpts[]= packMacSchSrUciInd }; +/* Function pointer for sending HARQ Uci ind from MAC to SCH */ +MacSchHarqUciIndFunc macSchHarqUciIndOpts[]= +{ + packMacSchHarqUciInd, + MacSchHarqUciInd, + packMacSchHarqUciInd +}; + +/* 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 @@ -171,14 +195,26 @@ uint8_t fapiMacCrcInd(Pst *pst, CrcInd *crcInd) * ****************************************************************/ uint8_t fapiMacRxDataInd(Pst *pst, RxDataInd *rxDataInd) { - uint16_t pduIdx; + uint8_t ueId = 0; + uint16_t pduIdx, cellIdx = 0; DU_LOG("\nDEBUG --> MAC : Received Rx Data indication"); /* TODO : compare the handle received in RxDataInd with handle send in PUSCH * PDU, which is stored in raCb */ for(pduIdx = 0; pduIdx < rxDataInd->numPdus; pduIdx++) { - unpackRxData(rxDataInd->cellId, rxDataInd->timingInfo, &rxDataInd->pdus[pduIdx]); + + GET_CELL_IDX(rxDataInd->cellId, cellIdx); + GET_UE_ID(rxDataInd->pdus[pduIdx].rnti, ueId); + + if(macCb.macCell[cellIdx] && macCb.macCell[cellIdx]->ueCb[ueId -1].transmissionAction == STOP_TRANSMISSION) + { + DU_LOG("\nINFO --> MAC : UL data transmission not allowed for UE %d", macCb.macCell[cellIdx]->ueCb[ueId -1].ueId); + } + else + { + unpackRxData(rxDataInd->cellId, rxDataInd->timingInfo, &rxDataInd->pdus[pduIdx]); + } MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rxDataInd->pdus[pduIdx].pduData,\ rxDataInd->pdus[pduIdx].pduLength); } @@ -219,7 +255,7 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData) DU_LOG("\nDEBUG --> MAC: Received DL data for sfn=%d slot=%d numPdu= %d", \ dlData->slotInfo.sfn, dlData->slotInfo.slot, dlData->numPdu); - GET_UE_IDX(dlData->rnti, ueId); + GET_UE_ID(dlData->rnti, ueId); /* Copy the pdus to be muxed into mac Dl data */ macDlData.ueId = ueId; @@ -260,6 +296,10 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData) currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPduLen = txPduLen; currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPdu = txPdu; + /* Add muxed TB to DL HARQ Proc CB. This will be used if retranmission of + * TB is requested in future. */ + updateNewTbInDlHqProcCb(dlData->slotInfo, &macCb.macCell[cellIdx]->ueCb[ueId -1], \ + currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgPdschCfg.codeword[0].tbSize, txPdu); } for(lcIdx = 0; lcIdx < dlData->numLc; lcIdx++) @@ -268,7 +308,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); @@ -328,10 +368,11 @@ uint8_t lcId, uint16_t pduLen, uint8_t *pdu) ulData->slotInfo.cellId = cellId; /* Filling pdu info */ - if(lcId == SRB1_LCID || lcId == SRB2_LCID) - { + if(lcId != SRB0_LCID) + ulData->pduInfo[ulData->numPdu].commCh = false; + else ulData->pduInfo[ulData->numPdu].commCh = true; - } + ulData->pduInfo[ulData->numPdu].lcId = lcId; ulData->pduInfo[ulData->numPdu].pduBuf = pdu; ulData->pduInfo[ulData->numPdu].pduLen = pduLen; @@ -368,7 +409,7 @@ 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; @@ -523,7 +564,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; @@ -543,8 +584,8 @@ uint8_t MacProcDlCcchInd(Pst *pst, DlCcchIndInfo *dlCcchIndInfo) 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; @@ -698,6 +739,51 @@ uint8_t macProcLongBsr(uint16_t cellId, uint16_t crnti,uint8_t numLcg,\ return(*macSchBsrOpts[pst.selector])(&pst, &bsrInd); } +/******************************************************************* + * + * @brief Builds and send HARQ UCI Indication to SCH + * + * @details + * + * Function : buildAndSendHarqInd + * + * Functionality: + * Builds and send HARQ UCI Indication to SCH + * + * @params[in] harqInfo Pointer + * crnti value + * cell Index value + * slot Ind Pointer + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t buildAndSendHarqInd(HarqInfoF0F1 *harqInfo, uint8_t crnti, uint16_t cellIdx, SlotTimingInfo *slotInd) +{ + uint16_t harqCounter=0; + Pst pst; + HarqUciIndInfo harqUciInd; + memset(&pst, 0, sizeof(Pst)); + memset(&harqUciInd, 0, sizeof(HarqUciIndInfo)); + + harqUciInd.cellId = macCb.macCell[cellIdx]->cellId; + harqUciInd.crnti = crnti; + harqUciInd.slotInd.sfn = slotInd->sfn; + harqUciInd.slotInd.slot = slotInd->slot; + harqUciInd.numHarq = harqInfo->numHarq; + memset(harqUciInd.harqPayload, 0, MAX_SR_BITS_IN_BYTES); + for(harqCounter = 0; harqCounter < harqInfo->numHarq; harqCounter++) + { + harqUciInd.harqPayload[harqCounter] = harqInfo->harqValue[harqCounter]; + } + + /* Fill Pst */ + FILL_PST_MAC_TO_SCH(pst, EVENT_UCI_IND_TO_SCH); + + return(*macSchHarqUciIndOpts[pst.selector])(&pst, &harqUciInd); +} + + /******************************************************************* * * @brief Builds and send SR UCI Indication to SCH @@ -756,10 +842,8 @@ uint8_t buildAndSendSrInd(UciInd *macUciInd, uint8_t crnti) * ****************************************************************/ uint8_t FapiMacUciInd(Pst *pst, UciInd *macUciInd) { - uint8_t pduIdx = 0; - uint8_t ret = ROK; - uint16_t nPdus; - uint16_t crnti; + uint8_t pduIdx = 0, ret = ROK; + uint16_t nPdus = 0, crnti = 0, cellIdx = 0; if(macUciInd) { @@ -771,12 +855,19 @@ uint8_t FapiMacUciInd(Pst *pst, UciInd *macUciInd) case UCI_IND_PUSCH: break; case UCI_IND_PUCCH_F0F1: + { + { + DU_LOG("\nDEBUG --> MAC : Received HARQ UCI Indication\n"); + GET_CELL_IDX(macUciInd->cellId, cellIdx); + buildAndSendHarqInd(&macUciInd->pdus[pduIdx].uci.uciPucchF0F1.harqInfo, macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti, cellIdx, &macUciInd->slotInd); + } if(macUciInd->pdus[pduIdx].uci.uciPucchF0F1.srInfo.srIndPres) { DU_LOG("\nDEBUG --> MAC : Received SR UCI indication"); - crnti = macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti; - ret = buildAndSendSrInd(macUciInd, crnti); + crnti = macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti; + ret = buildAndSendSrInd(macUciInd, crnti); } + } break; case UCI_IND_PUCCH_F2F3F4: break; @@ -798,6 +889,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