X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_slot_ind.c;h=1aa842db8af5f402d1acc3f22b246853199088b9;hb=545c7a4a13972142fb36962323556dcad7119710;hp=37cb68751f453e718558e7c3b7711c0990b93da4;hpb=2324a199636bc2e127af6bb3beefef668b4f45d7;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_slot_ind.c b/src/5gnrmac/mac_slot_ind.c index 37cb68751..1aa842db8 100644 --- a/src/5gnrmac/mac_slot_ind.c +++ b/src/5gnrmac/mac_slot_ind.c @@ -54,9 +54,14 @@ MacSchSlotIndFunc macSchSlotIndOpts[] = **/ uint8_t MacProcDlAlloc(Pst *pst, DlSchedInfo *dlSchedInfo) { - uint16_t cellIdx; + uint8_t schInfoIdx = 0; + uint8_t ueId = 0, ueIdx = 0; + uint16_t cellIdx = 0; MacDlSlot *currDlSlot = NULLP; +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTSCH -> ENTMAC : EVENT_DL_SCH_INFO\n"); +#endif if(dlSchedInfo != NULLP) { GET_CELL_IDX(dlSchedInfo->cellId, cellIdx); @@ -70,33 +75,43 @@ uint8_t MacProcDlAlloc(Pst *pst, DlSchedInfo *dlSchedInfo) &currDlSlot->dlInfo.brdcstAlloc.sib1Alloc.sib1PdschCfg; } - if(dlSchedInfo->rarAlloc != NULLP) + for(ueIdx=0; ueIdx\ - dlSlot[dlSchedInfo->schSlotValue.rarTime.slot]; - currDlSlot->dlInfo.rarAlloc = dlSchedInfo->rarAlloc; - - /* MUXing of RAR */ - fillRarPdu(&currDlSlot->dlInfo.rarAlloc->rarInfo); - } - - if(dlSchedInfo->dlMsgAlloc != NULLP) - { - currDlSlot = &macCb.macCell[cellIdx]->\ - dlSlot[dlSchedInfo->schSlotValue.dlMsgTime.slot]; - currDlSlot->dlInfo.dlMsgAlloc = dlSchedInfo->dlMsgAlloc; /* copy msg4 alloc pointer in MAC slot info */ - currDlSlot->dlInfo.cellId = dlSchedInfo->cellId; - - /* Check if the downlink pdu is msg4 */ - if(dlSchedInfo->dlMsgAlloc->dlMsgInfo.isMsg4Pdu) + if(dlSchedInfo->rarAlloc[ueIdx] != NULLP) { - macCb.macCell[cellIdx]->macRaCb[0].msg4TbSize = dlSchedInfo->dlMsgAlloc->dlMsgPdschCfg.codeword[0].tbSize; + currDlSlot = &macCb.macCell[cellIdx]->dlSlot[dlSchedInfo->schSlotValue.rarTime.slot]; + currDlSlot->dlInfo.rarAlloc[ueIdx] = dlSchedInfo->rarAlloc[ueIdx]; + + /* MUXing of RAR */ + fillRarPdu(&currDlSlot->dlInfo.rarAlloc[ueIdx]->rarInfo); } - else + + if(dlSchedInfo->dlMsgAlloc[ueIdx] != NULLP) { - memcpy(&currDlSlot->dlInfo.schSlotValue, &dlSchedInfo->schSlotValue, sizeof(SchSlotValue)); - /* Send LC schedule result to RLC */ - sendSchedRptToRlc(currDlSlot->dlInfo, dlSchedInfo->schSlotValue.dlMsgTime); + currDlSlot = &macCb.macCell[cellIdx]->\ + dlSlot[dlSchedInfo->schSlotValue.dlMsgTime.slot]; + currDlSlot->dlInfo.dlMsgAlloc[ueIdx] = dlSchedInfo->dlMsgAlloc[ueIdx]; /* copy msg4 alloc pointer in MAC slot info */ + currDlSlot->dlInfo.cellId = dlSchedInfo->cellId; + + /* Check if the downlink pdu is msg4 */ + for(schInfoIdx=0; schInfoIdx < dlSchedInfo->dlMsgAlloc[ueIdx]->numSchedInfo; schInfoIdx++) + { + if(dlSchedInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.isMsg4Pdu) + { + GET_UE_ID(dlSchedInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.crnti, ueId); + ueIdx = ueId -1; + macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize = \ + dlSchedInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgPdschCfg.codeword[0].tbSize; + } + else + { + memcpy(&currDlSlot->dlInfo.schSlotValue, &dlSchedInfo->schSlotValue, sizeof(SchSlotValue)); + /* Send LC schedule result to RLC */ + if((dlSchedInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].pduPres == PDSCH_PDU) || + (dlSchedInfo->dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].pduPres == BOTH)) + sendSchedRptToRlc(currDlSlot->dlInfo, dlSchedInfo->schSlotValue.dlMsgTime, ueIdx, schInfoIdx); + } + } } } @@ -121,10 +136,11 @@ uint8_t MacProcDlAlloc(Pst *pst, DlSchedInfo *dlSchedInfo) * @param[in] DlMsgAlloc *msg4Alloc * @return void **/ -void fillMsg4Pdu(uint16_t cellId, DlMsgAlloc *msg4Alloc) +void fillMsg4Pdu(uint16_t cellId, DlMsgSchInfo *msg4SchInfo) { - uint8_t ueIdx; + uint8_t ueId = 0, ueIdx = 0; uint16_t cellIdx; + uint16_t msg4TxPduLen; MacDlData msg4DlData; MacCeInfo macCeData; @@ -133,52 +149,57 @@ void fillMsg4Pdu(uint16_t cellId, DlMsgAlloc *msg4Alloc) memset(&msg4DlData, 0, sizeof(MacDlData)); memset(&macCeData, 0, sizeof(MacCeInfo)); - GET_UE_IDX(msg4Alloc->dlMsgInfo.crnti, ueIdx); - ueIdx = ueIdx -1; + GET_UE_ID(msg4SchInfo->dlMsgInfo.crnti, ueId); + ueIdx = ueId -1; + + if(macCb.macCell[cellIdx] == NULLP) + { + DU_LOG("\nERROR --> MAC: Cell Id[%d] not found", cellId); + return; + } + if(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4Pdu != NULLP) { - MAC_ALLOC(msg4DlData.pduInfo[ueIdx].dlPdu, \ - macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen); - if(msg4DlData.pduInfo[ueIdx].dlPdu != NULLP) + MAC_ALLOC(msg4DlData.pduInfo[msg4DlData.numPdu].dlPdu, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen); + if(msg4DlData.pduInfo[msg4DlData.numPdu].dlPdu != NULLP) { - fillMsg4DlData(&msg4DlData, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen,\ + msg4TxPduLen = macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize - TX_PAYLOAD_HDR_LEN; + + fillMsg4DlData(&msg4DlData, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen, \ macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4Pdu); - fillMacCe(&macCeData, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg3Pdu); - /* Forming Mux Pdu */ - macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu = NULLP; - MAC_ALLOC(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, \ - macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize); - if(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu != NULLP) - { - memset(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, 0, \ - macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize); - macMuxPdu(&msg4DlData, &macCeData, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu,\ - macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize); - - } - else - { - DU_LOG("\nERROR --> MAC: Failed allocating memory for msg4TxPdu"); - } - /* Free memory allocated */ - MAC_FREE(msg4DlData.pduInfo[0].dlPdu, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen); + fillMacCe(&macCeData, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg3Pdu); + /* Forming Mux Pdu */ + macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu = NULLP; + MAC_ALLOC(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, msg4TxPduLen); + if(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu != NULLP) + { + memset(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, 0, msg4TxPduLen); + macMuxPdu(&msg4DlData, &macCeData, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, msg4TxPduLen); + } + else + { + DU_LOG("\nERROR --> MAC: Failed allocating memory for msg4TxPdu"); + } + /* Free memory allocated */ + MAC_FREE(msg4DlData.pduInfo[msg4DlData.numPdu-1].dlPdu, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen); + msg4DlData.numPdu--; } } /* storing msg4 Pdu in macDlSlot */ if(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu) { - msg4Alloc->dlMsgInfo.dlMsgPduLen = macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize; - MAC_ALLOC(msg4Alloc->dlMsgInfo.dlMsgPdu, msg4Alloc->dlMsgInfo.dlMsgPduLen); - if(msg4Alloc->dlMsgInfo.dlMsgPdu != NULLP) + msg4SchInfo->dlMsgInfo.dlMsgPduLen = msg4TxPduLen; + MAC_ALLOC(msg4SchInfo->dlMsgInfo.dlMsgPdu, msg4SchInfo->dlMsgInfo.dlMsgPduLen); + if(msg4SchInfo->dlMsgInfo.dlMsgPdu != NULLP) { - memcpy(msg4Alloc->dlMsgInfo.dlMsgPdu, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, \ - msg4Alloc->dlMsgInfo.dlMsgPduLen); + memcpy(msg4SchInfo->dlMsgInfo.dlMsgPdu, macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, \ + msg4SchInfo->dlMsgInfo.dlMsgPduLen); } } else { - DU_LOG("\nERROR --> MAC: Failed at macMuxPdu()"); + DU_LOG("\nERROR --> MAC: Failed at fillMsg4Pdu()"); } } @@ -191,27 +212,37 @@ void fillMsg4Pdu(uint16_t cellId, DlMsgAlloc *msg4Alloc) * * Build and Sends the Muxed Pdu to Lower MAC. * - * @param[in] SlotIndInfo *slotInd + * @param[in] SlotTimingInfo *slotInd * @return void **/ -void buildAndSendMuxPdu(SlotIndInfo currTimingInfo) +void buildAndSendMuxPdu(SlotTimingInfo currTimingInfo) { + uint8_t ueIdx; + uint8_t schInfoIdx; uint16_t cellIdx; MacDlSlot *currDlSlot = NULLP; - SlotIndInfo muxTimingInfo; - memset(&muxTimingInfo, 0, sizeof(SlotIndInfo)); + SlotTimingInfo muxTimingInfo; + memset(&muxTimingInfo, 0, sizeof(SlotTimingInfo)); GET_CELL_IDX(currTimingInfo.cellId, cellIdx); ADD_DELTA_TO_TIME(currTimingInfo, muxTimingInfo, PHY_DELTA_DL); currDlSlot = &macCb.macCell[cellIdx]->dlSlot[muxTimingInfo.slot]; - if(currDlSlot->dlInfo.dlMsgAlloc) + + for(ueIdx=0; ueIdxdlInfo.dlMsgAlloc->dlMsgInfo.isMsg4Pdu) + if(currDlSlot->dlInfo.dlMsgAlloc[ueIdx]) { - fillMsg4Pdu(currTimingInfo.cellId, currDlSlot->dlInfo.dlMsgAlloc); - currDlSlot = NULLP; + for(schInfoIdx=0; schInfoIdxdlInfo.dlMsgAlloc[ueIdx]->numSchedInfo; schInfoIdx++) + { + if((currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.isMsg4Pdu) && + ((currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].pduPres == PDSCH_PDU) || + (currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].pduPres == BOTH))) + { + fillMsg4Pdu(currTimingInfo.cellId, &currDlSlot->dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx]); + } + } } } } @@ -225,12 +256,12 @@ void buildAndSendMuxPdu(SlotIndInfo currTimingInfo) * * This API is invoked by MAC to send slot ind to scheduler. * - * @param[in] SlotIndInfo *slotInd + * @param[in] SlotTimingInfo *slotInd * @return * -# ROK * -# RFAILED **/ -int sendSlotIndMacToSch(SlotIndInfo *slotInd) +int sendSlotIndMacToSch(SlotTimingInfo *slotInd) { /* fill Pst structure to send to lwr_mac to MAC */ Pst pst; @@ -298,12 +329,18 @@ int sendCellUpIndMacToDuApp(uint16_t cellId) * RFAILED - failure * * ****************************************************************/ -uint8_t macProcSlotInd(SlotIndInfo slotInd) +uint8_t macProcSlotInd(SlotTimingInfo slotInd) { uint16_t cellIdx = 0; GET_CELL_IDX(slotInd.cellId, cellIdx); - + + if(macCb.macCell[cellIdx] == NULLP) + { + DU_LOG("ERROR --> MAC : macProcSlotInd(): CellId[%d] does not exist. Error occurred at SFN [%d] Slot [%d]",\ + slotInd.cellId, slotInd.sfn, slotInd.slot); + return RFAILED; + } /* Store current time info */ macCb.macCell[cellIdx]->currTime.cellId = slotInd.cellId; macCb.macCell[cellIdx]->currTime.slot = slotInd.slot; @@ -315,11 +352,6 @@ uint8_t macProcSlotInd(SlotIndInfo slotInd) /* Trigger for DL TTI REQ */ fillDlTtiReq(slotInd); - /* TODO : check if this too needs to be sent in sequence with Dl and Ul TTI req. - * If so , move trigger for fillUlDciReq to lower mac */ - /* Trigger for UL DCI REQ */ - fillUlDciReq(slotInd); - return ROK; } /* macProcSlotInd */ @@ -334,14 +366,15 @@ uint8_t macProcSlotInd(SlotIndInfo slotInd) * * @param[in] Pst *pst * @param[in] SuId suId - * @param[in] SlotIndInfo *slotInd + * @param[in] SlotTimingInfo *slotInd * @return * -# ROK * -# RFAILED **/ -uint8_t fapiMacSlotInd(Pst *pst, SlotIndInfo *slotInd) +uint8_t fapiMacSlotInd(Pst *pst, SlotTimingInfo *slotInd) { uint8_t ret = ROK; + uint16_t cellIdx; volatile uint32_t startTime=0; #ifdef ODU_SLOT_IND_DEBUG_LOG @@ -351,6 +384,12 @@ uint8_t fapiMacSlotInd(Pst *pst, SlotIndInfo *slotInd) ODU_START_TASK(&startTime, PID_MAC_TTI_IND); gSlotCount++; + if(gSlotCount == 1) + { + GET_CELL_IDX(slotInd->cellId, cellIdx); + macCb.macCell[cellIdx]->state = CELL_STATE_UP; + } + /* When testing L2 with Intel-L1, any changes specific to * timer mode testing must be guarded under INTEL_TIMER_MODE*/ #ifndef INTEL_TIMER_MODE @@ -359,7 +398,7 @@ uint8_t fapiMacSlotInd(Pst *pst, SlotIndInfo *slotInd) if(ret != ROK) { DU_LOG("\nERROR --> MAC : Sending of slot ind msg from MAC to SCH failed"); - MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotIndInfo)); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotTimingInfo)); return ret; } @@ -367,7 +406,7 @@ uint8_t fapiMacSlotInd(Pst *pst, SlotIndInfo *slotInd) if(ret != ROK) { DU_LOG("\nERROR --> MAC : macProcSlotInd failed"); - MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotIndInfo)); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotTimingInfo)); return ret; } #endif @@ -379,14 +418,14 @@ uint8_t fapiMacSlotInd(Pst *pst, SlotIndInfo *slotInd) if(ret != ROK) { DU_LOG("\nERROR --> MAC :Sending of slot ind msg from MAC to DU APP failed"); - MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotIndInfo)); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotTimingInfo)); return ret; } } /*stoping Task*/ ODU_STOP_TASK(startTime, PID_MAC_TTI_IND); - MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotIndInfo)); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, slotInd, sizeof(SlotTimingInfo)); #ifdef INTEL_WLS_MEM lwrMacCb.phySlotIndCntr++;