From: svaidhya Date: Mon, 4 Aug 2025 06:33:46 +0000 (+0000) Subject: [ODUHIGH-557][ODUHIGH-648] MSG3 transmitted from OAI-UE but not received at OAI-L1 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=7b3f8ae6f1fd8c10c05d60cecd6194216d3fb0a6;p=o-du%2Fl2.git [ODUHIGH-557][ODUHIGH-648] MSG3 transmitted from OAI-UE but not received at OAI-L1 Change-Id: Ib92bfbb5ab436641fbfb47831cb9e36f900b4aec Signed-off-by: svaidhya --- diff --git a/build/config/tdd_odu_config.xml b/build/config/tdd_odu_config.xml index 9b29bb646..6031a4af7 100644 --- a/build/config/tdd_odu_config.xml +++ b/build/config/tdd_odu_config.xml @@ -510,19 +510,25 @@ 0 - 2 + 3 4 0 - 3 - 11 + 10 + 3 + + + 4 + 0 + 10 + 3 5 0 - 3 - 11 + 10 + 3 @@ -700,7 +706,7 @@ 10 - 1 + 0 0 5 60000 diff --git a/src/5gnrmac/lwr_mac_fsm.c b/src/5gnrmac/lwr_mac_fsm.c index ccf06fa60..71e670d93 100644 --- a/src/5gnrmac/lwr_mac_fsm.c +++ b/src/5gnrmac/lwr_mac_fsm.c @@ -6005,6 +6005,8 @@ void fillPuschPdu(fapi_ul_tti_req_pdu_t *ulTtiReqPdu, fapi_vendor_ul_tti_req_pdu ulTtiReqPdu->pdu.pusch_pdu.puschData.tbSize = reverseBytes32(puschInfo->tbInfo.tbSize); /* numCb is 0 for new transmission */ ulTtiReqPdu->pdu.pusch_pdu.puschData.numCb = reverseBytes16(0); + ulTtiReqPdu->pdu.pusch_pdu.maintParamV3.ldpcBaseGraph = 2; + ulTtiReqPdu->pdu.pusch_pdu.maintParamV3.tbSizeLbrmBytes = reverseBytes32(0); #else ulTtiReqPdu->pdu.pusch_pdu.puschData.tbSize = (puschInfo->tbInfo.tbSize); /* numCb is 0 for new transmission */ diff --git a/src/5gnrsch/sch.c b/src/5gnrsch/sch.c index 49db8f52d..abfa5fe53 100644 --- a/src/5gnrsch/sch.c +++ b/src/5gnrsch/sch.c @@ -603,6 +603,7 @@ uint8_t fillSchSib1Cfg(uint8_t mu, uint8_t bandwidth, uint8_t numSlots,SchPdcchC uint8_t qam = 0; uint8_t ssbIdx = 0; uint8_t freqIdx = 0; + uint8_t numDmrsSymbol = 0; PdcchCfg *pdcch; PdschCfg *pdsch; BwpCfg *bwp; @@ -706,6 +707,8 @@ uint8_t fillSchSib1Cfg(uint8_t mu, uint8_t bandwidth, uint8_t numSlots,SchPdcchC pdsch->pduIndex = 0; pdsch->numCodewords = 1; pdsch->pdschFreqAlloc.startPrb = 0; + pdsch->dmrs.dlDmrsSymbPos = DL_DMRS_SYMBOL_POS; + numDmrsSymbol = findNumDmrsSymbol(pdsch->dmrs.dlDmrsSymbPos); for(cwCount = 0; cwCount < pdsch->numCodewords; cwCount++) { mcs = DEFAULT_MCS; @@ -727,7 +730,7 @@ uint8_t fillSchSib1Cfg(uint8_t mu, uint8_t bandwidth, uint8_t numSlots,SchPdcchC else break; } - tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 10, &targetCodeRate, &qam) >> 3); + tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 10, numDmrsSymbol, &targetCodeRate, &qam) >> 3); }while(sib1PduLen > tbSize); pdsch->codeword[cwCount].targetCodeRate = targetCodeRate; @@ -741,7 +744,6 @@ uint8_t fillSchSib1Cfg(uint8_t mu, uint8_t bandwidth, uint8_t numSlots,SchPdcchC pdsch->numLayers = 1; pdsch->transmissionScheme = 0; pdsch->refPoint = 1; - pdsch->dmrs.dlDmrsSymbPos = DL_DMRS_SYMBOL_POS; pdsch->dmrs.dmrsConfigType = 0; /* type-1 */ pdsch->dmrs.dlDmrsScramblingId = pci; pdsch->dmrs.scid = 0; @@ -1540,10 +1542,9 @@ uint8_t allocatePrbUl(SchCellCb *cell, SlotTimingInfo slotTime, \ if((freePrbBlock->endPrb > prachEndPrb) && ((freePrbBlock->endPrb - prachEndPrb) >= numPrb)) { /* If sufficient free PRBs are available above PRACH message then, - * endPrb = freePrbBlock->endPrb - * startPrb = endPrb - numPrb +1; + * startPrb = freeBlock's StartPrb; */ - *startPrb = freePrbBlock->endPrb - numPrb +1; + *startPrb = freePrbBlock->startPrb; break; } else if((prachStartPrb > freePrbBlock->startPrb) && ((prachStartPrb - freePrbBlock->startPrb) >= numPrb)) @@ -1569,7 +1570,7 @@ uint8_t allocatePrbUl(SchCellCb *cell, SlotTimingInfo slotTime, \ freePrbNode = freePrbNode->next; continue; } - *startPrb = freePrbBlock->endPrb - numPrb +1; + *startPrb = freePrbBlock->startPrb; break; } } diff --git a/src/5gnrsch/sch_rach.c b/src/5gnrsch/sch_rach.c index 240759660..cce509b70 100644 --- a/src/5gnrsch/sch_rach.c +++ b/src/5gnrsch/sch_rach.c @@ -428,7 +428,7 @@ SchPuschInfo* schAllocMsg3Pusch(Inst schInst, uint16_t crnti, uint8_t k2Index, S uint16_t startRb = 0; uint16_t numRb = 0; uint16_t tbSize = 0; - uint16_t msg3PduLen = 8; /* 6 bytes msg3 and 2 bytes header */ + uint16_t msg3PduLen = 7; /*RRC Setup Req min size required as per Spec 38.331 RRCSetupReq */ uint16_t tgtCodeRate = 0; uint8_t qam = 0; @@ -454,7 +454,7 @@ SchPuschInfo* schAllocMsg3Pusch(Inst schInst, uint16_t crnti, uint8_t k2Index, S tbSize = schCalcTbSizeFromNPrb(numRb, mcs, NUM_PDSCH_SYMBOL, NULLP, NULLP); tbSize = tbSize / 8 ; /*bits to byte conversion*/ #else - numRb = 1; + numRb = 0; do { if(numRb < cell->cellCfg.ulCfgCommon.schInitialUlBwp.bwp.freqAlloc.numPrb) @@ -470,7 +470,7 @@ SchPuschInfo* schAllocMsg3Pusch(Inst schInst, uint16_t crnti, uint8_t k2Index, S else break; } - tbSize = (schCalcTbSizeFromNPrb(numRb, mcs, NUM_PDSCH_SYMBOL, &tgtCodeRate, &qam) >> 3); + tbSize = (schCalcTbSizeFromNPrb(numRb, mcs, symbLen, 1, &tgtCodeRate, &qam) >> 3); }while(tbSize < msg3PduLen); #endif @@ -678,9 +678,9 @@ bool schProcessRaReq(Inst schInst, SchCellCb *cell, SlotTimingInfo currTime, uin { k2Index = msg3K2InfoTbl->k2TimingInfo[rarSlot].k2Indexes[k2TblIdx]; k2 = cell->cellCfg.ulCfgCommon.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[k2Index].k2; - /* Delta is added to the slot allocation for msg3 based on 38.214 section 6.1.2.1 */ k2 = k2 + msg3Delta; + if(k2 >= msg3MinSchTime) { ADD_DELTA_TO_TIME(rarTime, msg3Time, k2, cell->numSlots); @@ -941,7 +941,7 @@ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueId, RarAl uint8_t coreset0Idx = 0; uint8_t firstSymbol = 0, numSymbols = 0; uint8_t mcs; - uint8_t dmrsStartSymbol, startSymbol, numSymbol ; + uint8_t dmrsStartSymbol, numDmrsSymbol = 0, startSymbol, numSymbol ; uint16_t numRbs = 0; uint16_t tbSize = 0; uint16_t offsetToPointA = 0; @@ -1029,6 +1029,8 @@ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueId, RarAl pdsch->rnti = cell->raReq[ueId-1]->raRnti; /* RA-RNTI */ pdsch->pduIndex = 0; pdsch->numCodewords = 1; + pdsch->dmrs.dlDmrsSymbPos = 2180; + numDmrsSymbol = findNumDmrsSymbol(pdsch->dmrs.dlDmrsSymbPos); for(cwCount = 0; cwCount < pdsch->numCodewords; cwCount++) { rarPduLen = RAR_PAYLOAD_SIZE + TX_PAYLOAD_HDR_LEN; @@ -1051,7 +1053,7 @@ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueId, RarAl else break; } - tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 13, &targetCodeRate, &qam) >> 3); + tbSize = (schCalcTbSizeFromNPrb(pdsch->pdschFreqAlloc.numPrb, mcs, 13, numDmrsSymbol, &targetCodeRate, &qam) >> 3); }while(rarPduLen > tbSize); pdsch->codeword[cwCount].targetCodeRate = targetCodeRate; @@ -1065,7 +1067,6 @@ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueId, RarAl pdsch->numLayers = 1; pdsch->transmissionScheme = 0; pdsch->refPoint = 0; - pdsch->dmrs.dlDmrsSymbPos = 2180; pdsch->dmrs.dmrsConfigType = 0; /* type-1 */ pdsch->dmrs.dlDmrsScramblingId = cell->cellCfg.phyCellId; pdsch->dmrs.scid = 0; diff --git a/src/5gnrsch/sch_utils.c b/src/5gnrsch/sch_utils.c index a35ed7e0a..1a6bfd531 100644 --- a/src/5gnrsch/sch_utils.c +++ b/src/5gnrsch/sch_utils.c @@ -835,6 +835,36 @@ uint8_t findDmrsStartSymbol(uint16_t dlDmrsSymbBitMap) return position; } +/** + * @brief Function to find number of DMRS symbol in PDSCH + * + * @details + * + * Function: findNumDmrsSymbol + * + * This function finds number of DMRS symbol using DMRS symbol + * position bitmap. + * + * @param[in] DMRS symbol position bitmap + * @return Success : total Number of Symbols + * Failure : 0 + **/ +uint8_t findNumDmrsSymbol(uint16_t dlDmrsSymbBitMap) +{ + uint8_t numDmrsSymb = 0,position = 0; + uint16_t mask = 1; + + while(position < MAX_SYMB_PER_SLOT) + { + if(dlDmrsSymbBitMap & mask) + { + numDmrsSymb++; + } + mask = mask << 1; + position++; + } + return numDmrsSymb; +} /** * @brief Function to add a node to a linked list * @@ -1102,7 +1132,7 @@ uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols) * @param[in] number of symbols * @return tbSize **/ -uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols, uint16_t *targeCodeRate, uint8_t *qam) +uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols, uint8_t numDmrsSymbPerPrb, uint16_t *targeCodeRate, uint8_t *qam) { uint8_t qm = mcsTable[mcs][1]; uint16_t rValue = mcsTable[mcs][2]; @@ -1116,7 +1146,8 @@ uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols uint32_t c = 0; const uint8_t numLayer = 1; const uint16_t numRbSc = 12; - const uint16_t numDmrsRes = 36; + const uint16_t numDmrsRes = 12 * numDmrsSymbPerPrb; + uint32_t nTmp = 0; // uint16_t numPrbOvrHead = 0; /* formula used for calculation of rbSize, 38.214 section 5.1.3.2 * @@ -1130,7 +1161,8 @@ uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols if(nInfo <= 3824) { - n = MAX(3, (uint32_t)cmLog2(nInfo) - 6); + nTmp = (floor(cmLog2(nInfo)) >= 6) ? floor(cmLog2(nInfo)) - 6 : 0; + n = MAX(3, nTmp); nInfoDash = MAX(24, (1< tbSizeTable[tbsIndex]) { @@ -1592,7 +1624,7 @@ uint32_t calculateEstimateTBSize(uint32_t reqBO, uint16_t mcsIdx, uint8_t numSym /*Loop Exit: Either estPRB reaches the maxRB or TBS is found greater than equal to reqBO*/ do { - tbs = schCalcTbSizeFromNPrb(*estPrb, mcsIdx, numSymbols, NULLP, NULLP); + tbs = schCalcTbSizeFromNPrb(*estPrb, mcsIdx, numSymbols, 3, NULLP, NULLP); /*TBS size calculated in above function is in Bits. * So to convert it into Bytes , we right shift by 3. diff --git a/src/5gnrsch/sch_utils.h b/src/5gnrsch/sch_utils.h index 5d2ac3a1d..89bf35cd9 100644 --- a/src/5gnrsch/sch_utils.h +++ b/src/5gnrsch/sch_utils.h @@ -133,16 +133,18 @@ uint8_t calculateSlotPatternLength(uint8_t scs, uint8_t periodicity); /* Functions declarations : Resource allocation handler */ uint16_t schCalcTbSize(uint32_t payLoadSize); uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols); -uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols, uint16_t *targeCodeRate, uint8_t* qam); +uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols,\ + uint8_t numDmrsSymbPerPrb, uint16_t *targeCodeRate, uint8_t* qam); bool fillPrbBitmap(uint64_t *prbBitmap, uint16_t startPrb, uint16_t numPrb); CmLList* isPrbAvailable(CmLListCp *freePrbBlockList, uint16_t startPrb, uint16_t numPrb); void removeAllocatedPrbFromFreePrbList(CmLListCp *freePrbBlockList, CmLList *node, \ uint16_t startPrb, uint16_t numPrb); uint8_t findDmrsStartSymbol(uint16_t dlDmrsSymbBitMap); +uint8_t findNumDmrsSymbol(uint16_t dlDmrsSymbBitMap); uint8_t updateLcListReqPRB(CmLListCp *lcLL, uint8_t lcId, uint32_t payloadSize); uint32_t calculateEstimateTBSize(uint32_t reqBO, uint16_t mcsIdx,uint8_t numSymbols,\ - uint16_t maxPRB, uint16_t *estPrb); + uint16_t maxPRB, uint16_t *estPrb); void deleteLcLL(CmLListCp *lcLL); CmLList *schPageInfoSearchFromPageList(SlotTimingInfo slotInfo, CmLListCp *storedPageList);