From 488f5ed56e82148cd09eb8c4e62ad6f0009d6761 Mon Sep 17 00:00:00 2001 From: "lal.harshita" Date: Tue, 24 Aug 2021 00:26:28 +0530 Subject: [PATCH] Modified SCH design to process pending RACH Ind when Slot Ind is received [Issue-ID: ODUHIGH-342] Change-Id: I05e42e72eff35d406d5d93c5d7939fbec1ff77d3 Signed-off-by: lal.harshita --- src/5gnrmac/mac_rach.c | 35 ++++++--- src/5gnrsch/sch.h | 17 ++++- src/5gnrsch/sch_rach.c | 179 ++++++++++++++++++++++++++++++--------------- src/5gnrsch/sch_slot_ind.c | 3 + 4 files changed, 159 insertions(+), 75 deletions(-) diff --git a/src/5gnrmac/mac_rach.c b/src/5gnrmac/mac_rach.c index 306913c69..363f0b956 100644 --- a/src/5gnrmac/mac_rach.c +++ b/src/5gnrmac/mac_rach.c @@ -78,29 +78,40 @@ uint8_t fapiMacRachInd(Pst *pst, RachInd *rachInd) { uint8_t pduIdx; uint8_t preambleIdx; - RachIndInfo rachIndInfo; + RachIndInfo *rachIndInfo; DU_LOG("\nINFO --> MAC : Received RACH indication"); /* Considering one pdu and one preamble */ pduIdx = 0; preambleIdx = 0; - rachIndInfo.cellId = rachInd->cellId; - rachIndInfo.timingInfo.sfn = rachInd->timingInfo.sfn; - rachIndInfo.timingInfo.slot = rachInd->timingInfo.slot; - rachIndInfo.slotIdx = rachInd->rachPdu[pduIdx].slotIdx; - rachIndInfo.symbolIdx = rachInd->rachPdu[pduIdx].symbolIdx; - rachIndInfo.freqIdx = rachInd->rachPdu[pduIdx].freqIdx; - rachIndInfo.preambleIdx = \ + MAC_ALLOC(rachIndInfo, sizeof(RachIndInfo)); + if(!rachIndInfo) + { + DU_LOG("\nERROR --> MAC : Memory allocation failure in fapiMacRachInd"); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rachInd, sizeof(RachInd)); + return RFAILED; + } + + rachIndInfo->cellId = rachInd->cellId; + rachIndInfo->timingInfo.sfn = rachInd->timingInfo.sfn; + rachIndInfo->timingInfo.slot = rachInd->timingInfo.slot; + rachIndInfo->slotIdx = rachInd->rachPdu[pduIdx].slotIdx; + rachIndInfo->symbolIdx = rachInd->rachPdu[pduIdx].symbolIdx; + rachIndInfo->freqIdx = rachInd->rachPdu[pduIdx].freqIdx; + rachIndInfo->preambleIdx = \ rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].preamIdx; - rachIndInfo.timingAdv = \ + rachIndInfo->timingAdv = \ rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].timingAdv; - /* storing the value in macRaCb */ - createMacRaCb(&rachIndInfo); + /* Store the value in macRaCb */ + createMacRaCb(rachIndInfo); + /* Free sharable buffer used to send RACH Indication from lower MAC to MAC */ MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rachInd, sizeof(RachInd)); - return(sendRachIndMacToSch(&rachIndInfo)); + + /* Send RACH Indication to SCH */ + return(sendRachIndMacToSch(rachIndInfo)); } /* spec-38.211 Table 6.3.3.1-7 */ diff --git a/src/5gnrsch/sch.h b/src/5gnrsch/sch.h index 15c112531..75ca894b3 100644 --- a/src/5gnrsch/sch.h +++ b/src/5gnrsch/sch.h @@ -209,6 +209,18 @@ typedef struct schUeCb SchDlCb dlInfo; }SchUeCb; +/** + * @brief + * RA Request Info + */ +typedef struct schRaReq +{ + uint32_t raRnti; + RachIndInfo *rachInd; + SlotTimingInfo winStartTime; + SlotTimingInfo winEndTime; +}SchRaReq; + /** * @brief * Cell Control block per cell. @@ -226,7 +238,8 @@ typedef struct schCellCb bool firstSsbTransmitted; bool firstSib1Transmitted; uint8_t ssbStartSymbArr[SCH_MAX_SSB_BEAM]; /*!cellCfg.puschMu; - delta = puschDeltaTable[puschMu]; - k2 = cell->cellCfg.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[0].k2; - /* RAR will sent with a delay of RAR_DELAY */ - rarSlot = (rachInd->timingInfo.slot+RAR_DELAY+PHY_DELTA_DL)%cell->numSlots; -#ifdef NR_TDD - for(slotIdx=0; slotIdxnumSlots;slotIdx++) + while(ueIdx < MAX_NUM_UE) { - /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */ - msg3Slot = (rarSlot+delta+k2)%cell->numSlots; - - if((schGetSlotSymbFrmt(rarSlot, cell->slotFrmtBitMap) != DL_SLOT) &&\ - (schGetSlotSymbFrmt(msg3Slot, cell->slotFrmtBitMap) != UL_SLOT)) + if(cell->raReq[ueIdx] == NULLP) { - rarSlot = (rarSlot + 1) % cell->numSlots; + ueIdx++; continue; } - break; - } - if(slotIdx>=cell->numSlots) - { - DU_LOG("\nERROR --> SCH : NO Slot for Msg2 with Msg3 Grant\n"); - return RFAILED; - } + + //puschMu = cell->cellCfg.puschMu; + delta = puschDeltaTable[puschMu]; + k2 = cell->cellCfg.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[0].k2; + + /* RAR will sent with a delay of RAR_DELAY */ + rarSlot = (currTime.slot + RAR_DELAY + PHY_DELTA_DL) % cell->numSlots; +#ifdef NR_TDD + for(slotIdx=0; slotIdxnumSlots;slotIdx++) + { + /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */ + msg3Slot = (rarSlot+delta+k2)%cell->numSlots; + + if((schGetSlotSymbFrmt(rarSlot, cell->slotFrmtBitMap) != DL_SLOT) &&\ + (schGetSlotSymbFrmt(msg3Slot, cell->slotFrmtBitMap) != UL_SLOT)) + { + rarSlot = (rarSlot + 1) % cell->numSlots; + continue; + } + break; + } + if(slotIdx>=cell->numSlots) + { + DU_LOG("\nERROR --> SCH : NO Slot for Msg2 with Msg3 Grant\n"); + return RFAILED; + } #else - /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */ - msg3Slot = rarSlot + k2 + delta; - msg3Slot = msg3Slot % cell->numSlots; + /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */ + msg3Slot = rarSlot + k2 + delta; + msg3Slot = msg3Slot % cell->numSlots; #endif - SchDlSlotInfo *schDlSlotInfo = cell->schDlSlotInfo[rarSlot]; /* RAR will sent in the next slot */ + SchDlSlotInfo *schDlSlotInfo = cell->schDlSlotInfo[rarSlot]; /* RAR will sent in the next slot */ + + /* Allocate the rarInfo, this pointer will be checked at schProcessSlotInd function */ + SCH_ALLOC(rarInfo, sizeof(RarInfo)); + if(rarInfo == NULLP) + { + DU_LOG("\nERROR --> SCH : Memory Allocation failed for rarInfo"); + return RFAILED; + } - /* Allocate the rarInfo, this pointer will be checked at schProcessSlotInd function */ - SCH_ALLOC(rarInfo, sizeof(RarInfo)); - if(rarInfo == NULLP) + schDlSlotInfo->rarInfo = rarInfo; + + /* create raCb at SCH */ + createSchRaCb(cell->raReq[ueIdx]->rachInd->crnti, cell->instIdx); + + /* allocate resources for msg3 */ + ret = schAllocMsg3Pusch(cell->instIdx, rarSlot, cell->raReq[ueIdx]->rachInd->crnti, &msg3StartRb, &msg3NumRb, msg3Slot); + if(ret == ROK) + { + /* fill RAR info */ + rarInfo->raRnti = cell->raReq[ueIdx]->raRnti; + rarInfo->tcrnti = cell->raReq[ueIdx]->rachInd->crnti; + rarInfo->RAPID = cell->raReq[ueIdx]->rachInd->preambleIdx; + rarInfo->ta = cell->raReq[ueIdx]->rachInd->timingAdv; + rarInfo->msg3FreqAlloc.startPrb = msg3StartRb; + rarInfo->msg3FreqAlloc.numPrb = msg3NumRb; + } + + SCH_FREE(cell->raReq[ueIdx]->rachInd, sizeof(RachIndInfo)); + SCH_FREE(cell->raReq[ueIdx], sizeof(SchRaReq)); + ueIdx++; + + } /* End of while(ueIdx < MAX_NUM_UE) */ +} + +/** + * @brief process rach indication function. + * + * @details + * + * Function : schProcessRachInd + * + * This function process rach indication + * + * @param[in] rachInd parameters + * @param[in] shed instance + * @return ROK + **/ +uint8_t schProcessRachInd(RachIndInfo *rachInd, Inst schInst) +{ + SchCellCb *cell = schCb[schInst].cells[schInst]; + SchRaReq *raReq = NULLP; + float slotDuration; + uint8_t winNumSlots; + uint8_t ueIdx; + + SCH_ALLOC(raReq, sizeof(SchRaReq)); + if(!raReq) { - DU_LOG("\nERROR --> SCH : Memory Allocation failed for rarInfo"); + DU_LOG("\nERROR --> SCH : Memory allocation failure in schProcessRachInd"); + SCH_FREE(rachInd, sizeof(RachIndInfo)); return RFAILED; } - schDlSlotInfo->rarInfo = rarInfo; - /* calculate the ra-rnti value */ - raRnti = calculateRaRnti(rachInd->symbolIdx,rachInd->slotIdx,rachInd->freqIdx); + raReq->raRnti = calculateRaRnti(rachInd->symbolIdx, rachInd->slotIdx, rachInd->freqIdx); + raReq->rachInd = rachInd; + raReq->winStartTime.sfn = rachInd->timingInfo.sfn; + raReq->winStartTime.slot = rachInd->timingInfo.slot; + + /* Converting window size from ms to number of slots */ + slotDuration = (1 / pow(2, cell->cellCfg.numerology)); + winNumSlots = (float)cell->cellCfg.schRachCfg.raRspWindow / slotDuration; + + /* Adding window size to window start time to get window end time */ + ADD_DELTA_TO_TIME(raReq->winStartTime, raReq->winEndTime, winNumSlots); - /* create raCb at SCH */ - createSchRaCb(rachInd->crnti,schInst); + /* Storing RA request in cellCb */ + GET_UE_IDX(rachInd->crnti, ueIdx); + cell->raReq[ueIdx] = raReq; - /* allocate resources for msg3 */ - ret = schAllocMsg3Pusch(schInst, rarSlot, rachInd->crnti, &msg3StartRb, &msg3NumRb, msg3Slot); - if(ret == ROK) - { - /* fill RAR info */ - rarInfo->raRnti = raRnti; - rarInfo->tcrnti = rachInd->crnti; - rarInfo->RAPID = rachInd->preambleIdx; - rarInfo->ta = rachInd->timingAdv; - rarInfo->msg3FreqAlloc.startPrb = msg3StartRb; - rarInfo->msg3FreqAlloc.numPrb = msg3NumRb; - } - return ret; + return ROK; } /** diff --git a/src/5gnrsch/sch_slot_ind.c b/src/5gnrsch/sch_slot_ind.c index a93649418..59501bc78 100644 --- a/src/5gnrsch/sch_slot_ind.c +++ b/src/5gnrsch/sch_slot_ind.c @@ -312,6 +312,9 @@ uint8_t schProcessSlotInd(SlotTimingInfo *slotInd, Inst schInst) } } + /* Check for Pending RA Requests */ + schProcessRaReq(*slotInd, cell); + /* check for RAR */ if(cell->schDlSlotInfo[dlSchedInfo.schSlotValue.rarTime.slot]->rarInfo != NULLP) { -- 2.16.6