From 67b89506e1d6a7a775d5095f390d5dcb610deb86 Mon Sep 17 00:00:00 2001 From: "lal.harshita" Date: Sun, 17 Oct 2021 01:50:47 +0530 Subject: [PATCH] Fix in DL PRB allocation [Issue-ID: ODUHIGH-380] Change-Id: I3915a811a09d53478251efce8e923ee5ccf4747f Signed-off-by: lal.harshita --- src/5gnrsch/sch.c | 36 +++++--- src/5gnrsch/sch.h | 3 +- src/5gnrsch/sch_common.c | 143 ++++++++++++++++++++++++------ src/5gnrsch/sch_rach.c | 48 ++++++---- src/5gnrsch/sch_ue_mgr.c | 7 ++ src/5gnrsch/sch_utils.c | 83 ++++++++++++++++- src/5gnrsch/sch_utils.h | 3 +- src/cm/common_def.c | 82 +++++++++-------- src/cm/common_def.h | 5 +- src/cm/mac_sch_interface.h | 5 +- src/codec_utils/common/odu_common_codec.c | 2 +- src/cu_stub/cu_f1ap_msg_hdl.c | 2 +- src/du_app/du_f1ap_msg_hdl.c | 139 ++++++++++++++++------------- src/du_app/du_ue_mgr.c | 2 +- 14 files changed, 395 insertions(+), 165 deletions(-) diff --git a/src/5gnrsch/sch.c b/src/5gnrsch/sch.c index 5fd4bede1..d3de74f23 100644 --- a/src/5gnrsch/sch.c +++ b/src/5gnrsch/sch.c @@ -528,8 +528,8 @@ void fillSsbStartSymb(SchCellCb *cellCb) for(uint8_t idx=0; idxn0 = slotIndex; - /* calculate the PRBs */ - //freqDomRscAllocType0(((offsetPointA-offset)/6), (numRbs/6), FreqDomainResource); - /* fill BWP */ switch(bandwidth) { @@ -760,7 +756,11 @@ void fillSchSib1Cfg(uint8_t mu, uint8_t bandwidth, uint8_t numSlots, SchSib1Cfg pdcch->coresetCfg.coreSetSize = numRbs; pdcch->coresetCfg.startSymbolIndex = firstSymbol; pdcch->coresetCfg.durationSymbols = numSymbols; - memcpy(pdcch->coresetCfg.freqDomainResource,FreqDomainResource,6); + + /* Fill Bitmap for PRBs in coreset */ + fillCoresetFeqDomAllocMap(((offsetPointA-offset)/6), (numRbs/6), FreqDomainResource); + covertFreqDomRsrcMapToIAPIFormat(FreqDomainResource, pdcch->coresetCfg.freqDomainResource); + pdcch->coresetCfg.cceRegMappingType = 1; /* coreset0 is always interleaved */ pdcch->coresetCfg.regBundleSize = 6; /* spec-38.211 sec 7.3.2.2 */ pdcch->coresetCfg.interleaverSize = 2; /* spec-38.211 sec 7.3.2.2 */ @@ -855,6 +855,10 @@ uint8_t SchHdlCellCfgReq(Pst *pst, SchCellCfg *schCellCfg) SchCellCfgCfm schCellCfgCfm; Pst rspPst; Inst inst = pst->dstInst-1; + uint8_t coreset0Idx = 0; + uint8_t numRbs = 0; + uint8_t offset = 0; + uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0}; SchPdschConfig pdschCfg; #ifdef CALL_FLOW_DEBUG_LOG @@ -871,6 +875,14 @@ uint8_t SchHdlCellCfgReq(Pst *pst, SchCellCfg *schCellCfg) schCellCfg->ssbSchCfg.ssbOffsetPointA); memcpy(&cellCb->cellCfg, schCellCfg, sizeof(SchCellCfg)); + /* Fill coreset frequencyDomainResource bitmap */ + coreset0Idx = cellCb->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.coresetId; + numRbs = coresetIdxTable[coreset0Idx][1]; + offset = coresetIdxTable[coreset0Idx][3]; + fillCoresetFeqDomAllocMap(((cellCb->cellCfg.ssbSchCfg.ssbOffsetPointA - offset)/6), (numRbs/6), freqDomainResource); + covertFreqDomRsrcMapToIAPIFormat(freqDomainResource, \ + cellCb->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc); + /* Fill K0 - K1 table for common cfg*/ BuildK0K1Table(cellCb, &cellCb->cellCfg.schInitialDlBwp.k0K1InfoTbl, true, cellCb->cellCfg.schInitialDlBwp.pdschCommon, pdschCfg, DEFAULT_UL_ACK_LIST_COUNT, defaultUlAckTbl); diff --git a/src/5gnrsch/sch.h b/src/5gnrsch/sch.h index bacee4064..50aae0918 100644 --- a/src/5gnrsch/sch.h +++ b/src/5gnrsch/sch.h @@ -34,7 +34,6 @@ #define SCH_SIB1_TRANS 16 /* SIB1 transmission as per 38.331 is every 160 ms */ #define SCH_NUM_SC_PRB 12 /* number of SCs in a PRB */ #define SCH_MAX_SSB_BEAM 8 /* since we are supporting only SCS=15KHz and 30KHz */ -#define SCH_SYMBOL_PER_SLOT 14 #define SCH_SSB_NUM_SYMB 4 #define SCH_SSB_NUM_PRB 21 /* One extra PRB as buffer */ #define SCHED_DELTA 1 @@ -126,7 +125,7 @@ typedef struct freePrbBlock typedef struct schPrbAlloc { CmLListCp freePrbBlockList; /*!< List of continuous blocks for available PRB */ - uint64_t prbBitMap[SCH_SYMBOL_PER_SLOT][PRB_BITMAP_MAX_IDX]; /*!< BitMap to store the allocated PRBs */ + uint64_t prbBitMap[ MAX_SYMB_PER_SLOT][PRB_BITMAP_MAX_IDX]; /*!< BitMap to store the allocated PRBs */ }SchPrbAlloc; /** diff --git a/src/5gnrsch/sch_common.c b/src/5gnrsch/sch_common.c index 2db25f06e..8929c3308 100644 --- a/src/5gnrsch/sch_common.c +++ b/src/5gnrsch/sch_common.c @@ -77,10 +77,21 @@ uint8_t schBroadcastSsbAlloc(SchCellCb *cell, SlotTimingInfo slotTime, DlBrdcstA SchDlSlotInfo *schDlSlotInfo; SsbInfo ssbInfo; + if(cell == NULL) + { + DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : Cell is NULL"); + return RFAILED; + } + + if(dlBrdcstAlloc == NULL) + { + DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : dlBrdcstAlloc is NULL"); + return RFAILED; + } + schDlSlotInfo = cell->schDlSlotInfo[slotTime.slot]; ssbStartPrb = cell->cellCfg.ssbSchCfg.ssbOffsetPointA; //+Kssb - ssbStartSymb = cell->ssbStartSymbArr[dlBrdcstAlloc->ssbIdxSupported-1]; /*since we are - supporting only 1 ssb beam */ + ssbStartSymb = cell->ssbStartSymbArr[dlBrdcstAlloc->ssbIdxSupported-1]; /*since we are supporting only 1 ssb beam */ /* Assign interface structure */ for(idx=0; idxssbIdxSupported; idx++) @@ -121,11 +132,47 @@ uint8_t schBroadcastSsbAlloc(SchCellCb *cell, SlotTimingInfo slotTime, DlBrdcstA **/ uint8_t schBroadcastSib1Alloc(SchCellCb *cell, SlotTimingInfo slotTime, DlBrdcstAlloc *dlBrdcstAlloc) { - FreqDomainAlloc freqAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschFreqAlloc.freqAlloc; - TimeDomainAlloc timeAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschTimeAlloc.timeAlloc; - SchDlSlotInfo *schDlSlotInfo = cell->schDlSlotInfo[slotTime.slot]; + uint8_t dmrsStartSymbol, startSymbol, numSymbol ; + DmrsInfo dmrs; + FreqDomainAlloc freqAlloc; + TimeDomainAlloc timeAlloc; + SchDlSlotInfo *schDlSlotInfo = NULLP; + + if(cell == NULL) + { + DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : Cell is NULL"); + return RFAILED; + } - if((allocatePrbDl(cell, slotTime, timeAlloc.startSymb, timeAlloc.numSymb, &freqAlloc.startPrb, freqAlloc.numPrb)) != ROK) + if(dlBrdcstAlloc == NULL) + { + DU_LOG("\nERROR --> SCH: schBroadcastSsbAlloc() : dlBrdcstAlloc is NULL"); + return RFAILED; + } + + dmrs = cell->cellCfg.sib1SchCfg.sib1PdschCfg.dmrs; + freqAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschFreqAlloc.freqAlloc; + timeAlloc = cell->cellCfg.sib1SchCfg.sib1PdschCfg.pdschTimeAlloc.timeAlloc; + schDlSlotInfo = cell->schDlSlotInfo[slotTime.slot]; + + /* Find total symbols used including DMRS */ + /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT, + * in that case only PDSCH symbols are marked as occupied */ + dmrsStartSymbol = findDmrsStartSymbol(dmrs.dlDmrsSymbPos); + if(dmrsStartSymbol == MAX_SYMB_PER_SLOT) + { + startSymbol = timeAlloc.startSymb; + numSymbol = timeAlloc.numSymb; + } + /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */ + else + { + startSymbol = dmrsStartSymbol; + numSymbol = dmrs.nrOfDmrsSymbols + timeAlloc.numSymb; + } + + /* Allocate PRB */ + if((allocatePrbDl(cell, slotTime, startSymbol, numSymbol, &freqAlloc.startPrb, freqAlloc.numPrb)) != ROK) { DU_LOG("\nERROR --> SCH: PRB allocation failed for SIB1 in SFN:Slot [%d : %d]", slotTime.sfn, slotTime.slot); return RFAILED; @@ -572,32 +619,42 @@ uint8_t schUlResAlloc(SchCellCb *cell, Inst schInst) uint8_t schDlRsrcAllocMsg4(SchCellCb *cell, SlotTimingInfo slotTime, DlMsgAlloc *msg4Alloc) { uint8_t coreset0Idx = 0; - uint8_t numRbs = 0; uint8_t firstSymbol = 0; uint8_t numSymbols = 0; - uint8_t offset = 0; - uint8_t offsetPointA; - uint8_t FreqDomainResource[6] = {0}; - uint16_t tbSize = 0; uint8_t mcs = 4; /* MCS fixed to 4 */ - SchBwpDlCfg *initialBwp; + uint8_t dmrsStartSymbol = 0, startSymbol = 0, numSymbol = 0; + uint16_t tbSize = 0; + uint16_t numRbs; + SchBwpDlCfg *initialBwp = NULLP; + PdcchCfg *pdcch = NULLP; + PdschCfg *pdsch = NULLP; + BwpCfg *bwp = NULLP; - PdcchCfg *pdcch = &msg4Alloc->dlMsgPdcchCfg; - PdschCfg *pdsch = &msg4Alloc->dlMsgPdschCfg; - BwpCfg *bwp = &msg4Alloc->bwp; + if(cell == NULL) + { + DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : Cell is NULL"); + return RFAILED; + } + if(msg4Alloc == NULL) + { + DU_LOG("\nERROR --> SCH: schDlRsrcAllocMsg4() : msg4Alloc is NULL"); + return RFAILED; + } + + pdcch = &msg4Alloc->dlMsgPdcchCfg; + pdsch = &msg4Alloc->dlMsgPdschCfg; + bwp = &msg4Alloc->bwp; initialBwp = &cell->cellCfg.schInitialDlBwp; - offsetPointA = cell->cellCfg.ssbSchCfg.ssbOffsetPointA; coreset0Idx = initialBwp->pdcchCommon.commonSearchSpace.coresetId; /* derive the sib1 coreset0 params from table 13-1 spec 38.213 */ - numRbs = coresetIdxTable[coreset0Idx][1]; - numSymbols = coresetIdxTable[coreset0Idx][2]; - offset = coresetIdxTable[coreset0Idx][3]; + numRbs = coresetIdxTable[coreset0Idx][1]; + numSymbols = coresetIdxTable[coreset0Idx][2]; /* calculate time domain parameters */ uint16_t mask = 0x2000; - for(firstSymbol=0; firstSymbol<14;firstSymbol++) + for(firstSymbol=0; firstSymbolpdcchCommon.commonSearchSpace.monitoringSymbol & mask) break; @@ -605,9 +662,6 @@ uint8_t schDlRsrcAllocMsg4(SchCellCb *cell, SlotTimingInfo slotTime, DlMsgAlloc mask = mask>>1; } - /* calculate the PRBs */ - freqDomRscAllocType0(((offsetPointA-offset)/6), (numRbs/6), FreqDomainResource); - /* fill BWP */ bwp->freqAlloc.numPrb = initialBwp->bwp.freqAlloc.numPrb; bwp->freqAlloc.startPrb = initialBwp->bwp.freqAlloc.startPrb; @@ -617,7 +671,9 @@ uint8_t schDlRsrcAllocMsg4(SchCellCb *cell, SlotTimingInfo slotTime, DlMsgAlloc /* fill the PDCCH PDU */ pdcch->coresetCfg.startSymbolIndex = firstSymbol; pdcch->coresetCfg.durationSymbols = numSymbols; - memcpy(pdcch->coresetCfg.freqDomainResource,FreqDomainResource,6); + memcpy(pdcch->coresetCfg.freqDomainResource, \ + cell->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc, FREQ_DOM_RSRC_SIZE); + pdcch->coresetCfg.cceRegMappingType = 1; /* coreset0 is always interleaved */ pdcch->coresetCfg.regBundleSize = 6; /* spec-38.211 sec 7.3.2.2 */ pdcch->coresetCfg.interleaverSize = 2; /* spec-38.211 sec 7.3.2.2 */ @@ -677,8 +733,24 @@ uint8_t schDlRsrcAllocMsg4(SchCellCb *cell, SlotTimingInfo slotTime, DlMsgAlloc pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize, mcs, NUM_PDSCH_SYMBOL); pdsch->pdschFreqAlloc.vrbPrbMapping = 0; /* non-interleaved */ + /* Find total symbols occupied including DMRS */ + dmrsStartSymbol = findDmrsStartSymbol(pdsch->dmrs.dlDmrsSymbPos); + /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT, + * in that case only PDSCH symbols are marked as occupied */ + if(dmrsStartSymbol == MAX_SYMB_PER_SLOT) + { + startSymbol = pdsch->pdschTimeAlloc.timeAlloc.startSymb; + numSymbol = pdsch->pdschTimeAlloc.timeAlloc.numSymb; + } + /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */ + else + { + startSymbol = dmrsStartSymbol; + numSymbol = pdsch->dmrs.nrOfDmrsSymbols + pdsch->pdschTimeAlloc.timeAlloc.numSymb; + } + /* Allocate the number of PRBs required for RAR PDSCH */ - if((allocatePrbDl(cell, slotTime, pdsch->pdschTimeAlloc.timeAlloc.startSymb, pdsch->pdschTimeAlloc.timeAlloc.numSymb,\ + if((allocatePrbDl(cell, slotTime, startSymbol, numSymbol,\ &pdsch->pdschFreqAlloc.freqAlloc.startPrb, pdsch->pdschFreqAlloc.freqAlloc.numPrb)) != ROK) { DU_LOG("\nERROR --> SCH : Resource allocation failed for MSG4"); @@ -757,6 +829,7 @@ uint8_t schDlRsrcAllocDlMsg(SchCellCb *cell, SlotTimingInfo slotTime, uint16_t c SchUeCb ueCb; SchControlRsrcSet coreset1; SchPdschConfig pdschCfg; + uint8_t dmrsStartSymbol, startSymbol, numSymbol; pdcch = &dlMsgAlloc->dlMsgPdcchCfg; pdsch = &dlMsgAlloc->dlMsgPdschCfg; @@ -841,8 +914,24 @@ uint8_t schDlRsrcAllocDlMsg(SchCellCb *cell, SlotTimingInfo slotTime, uint16_t c pdsch->pdschFreqAlloc.freqAlloc.numPrb = schCalcNumPrb(tbSize, ueCb.ueCfg.dlModInfo.mcsIndex, \ pdschCfg.timeDomRsrcAllociList[0].symbolLength); + /* Find total symbols occupied including DMRS */ + dmrsStartSymbol = findDmrsStartSymbol(pdsch->dmrs.dlDmrsSymbPos); + /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT, + * in that case only PDSCH symbols are marked as occupied */ + if(dmrsStartSymbol == MAX_SYMB_PER_SLOT) + { + startSymbol = pdsch->pdschTimeAlloc.timeAlloc.startSymb; + numSymbol = pdsch->pdschTimeAlloc.timeAlloc.numSymb; + } + /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */ + else + { + startSymbol = dmrsStartSymbol; + numSymbol = pdsch->dmrs.nrOfDmrsSymbols + pdsch->pdschTimeAlloc.timeAlloc.numSymb; + } + /* Allocate the number of PRBs required for DL PDSCH */ - if((allocatePrbDl(cell, slotTime, pdsch->pdschTimeAlloc.timeAlloc.startSymb, pdsch->pdschTimeAlloc.timeAlloc.numSymb,\ + if((allocatePrbDl(cell, slotTime, startSymbol, numSymbol,\ &pdsch->pdschFreqAlloc.freqAlloc.startPrb, pdsch->pdschFreqAlloc.freqAlloc.numPrb)) != ROK) { DU_LOG("\nERROR --> SCH : allocatePrbDl() failed for DL MSG"); @@ -1112,7 +1201,7 @@ SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl) } if(slotCfg == FLEXI_SLOT) { - for(checkSymbol = 0; checkSymbolcellCfg.tddCfg.slotCfg[tmpSlot][checkSymbol] == UL_SLOT) { diff --git a/src/5gnrsch/sch_rach.c b/src/5gnrsch/sch_rach.c index 54d27bab8..5941f0ad9 100644 --- a/src/5gnrsch/sch_rach.c +++ b/src/5gnrsch/sch_rach.c @@ -471,31 +471,27 @@ uint8_t schProcessRachInd(RachIndInfo *rachInd, Inst schInst) **/ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueIdx, RarAlloc *rarAlloc, uint8_t k0Index) { - uint8_t coreset0Idx = 0; - uint8_t numRbs = 0; - uint8_t firstSymbol = 0; - uint8_t numSymbols = 0; - uint8_t offset = 0; - uint8_t FreqDomainResource[6] = {0}; + uint8_t coreset0Idx = 0; + uint8_t firstSymbol = 0, numSymbols = 0; + uint8_t mcs = 4; /* MCS fixed to 4 */ + uint8_t dmrsStartSymbol, startSymbol, numSymbol ; + uint16_t numRbs = 0; uint16_t tbSize = 0; - uint8_t mcs = 4; /* MCS fixed to 4 */ SchBwpDlCfg *initialBwp = &cell->cellCfg.schInitialDlBwp; PdcchCfg *pdcch = &rarAlloc->rarPdcchCfg; PdschCfg *pdsch = &rarAlloc->rarPdschCfg; BwpCfg *bwp = &rarAlloc->bwp; - coreset0Idx = initialBwp->pdcchCommon.commonSearchSpace.coresetId; - /* derive the sib1 coreset0 params from table 13-1 spec 38.213 */ - numRbs = coresetIdxTable[coreset0Idx][1]; - numSymbols = coresetIdxTable[coreset0Idx][2]; - offset = coresetIdxTable[coreset0Idx][3]; + coreset0Idx = initialBwp->pdcchCommon.commonSearchSpace.coresetId; + numRbs = coresetIdxTable[coreset0Idx][1]; + numSymbols = coresetIdxTable[coreset0Idx][2]; /* calculate time domain parameters */ // note: since slot value is made sl1, RAR can be sent at all slots uint16_t mask = 0x2000; - for(firstSymbol=0; firstSymbol<14;firstSymbol++) + for(firstSymbol=0; firstSymbolpdcchCommon.commonSearchSpace.monitoringSymbol & mask) break; @@ -503,9 +499,6 @@ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueIdx, RarA mask = mask>>1; } - /* calculate the PRBs */ - freqDomRscAllocType0(((cell->cellCfg.ssbSchCfg.ssbOffsetPointA - offset)/6), (numRbs/6), FreqDomainResource); - /* fill BWP */ bwp->freqAlloc.numPrb = initialBwp->bwp.freqAlloc.numPrb; bwp->freqAlloc.startPrb = initialBwp->bwp.freqAlloc.startPrb; @@ -515,11 +508,14 @@ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueIdx, RarA /* fill the PDCCH PDU */ pdcch->coresetCfg.startSymbolIndex = firstSymbol; pdcch->coresetCfg.durationSymbols = numSymbols; - memcpy(pdcch->coresetCfg.freqDomainResource, FreqDomainResource, FREQ_DOM_RSRC_SIZE); + memcpy(pdcch->coresetCfg.freqDomainResource, \ + cell->cellCfg.schInitialDlBwp.pdcchCommon.commonSearchSpace.freqDomainRsrc, FREQ_DOM_RSRC_SIZE); + pdcch->coresetCfg.cceRegMappingType = 1; /* coreset0 is always interleaved */ pdcch->coresetCfg.regBundleSize = 6; /* spec-38.211 sec 7.3.2.2 */ pdcch->coresetCfg.interleaverSize = 2; /* spec-38.211 sec 7.3.2.2 */ pdcch->coresetCfg.coreSetType = 0; + pdcch->coresetCfg.coreSetSize = numRbs; pdcch->coresetCfg.shiftIndex = cell->cellCfg.phyCellId; pdcch->coresetCfg.precoderGranularity = 0; /* sameAsRegBundle */ pdcch->numDlDci = 1; @@ -577,8 +573,24 @@ uint8_t schFillRar(SchCellCb *cell, SlotTimingInfo rarTime, uint16_t ueIdx, RarA pdsch->pdschFreqAlloc.freqAlloc.numPrb = \ schCalcNumPrb(tbSize, mcs, initialBwp->pdschCommon.timeDomRsrcAllocList[k0Index].lengthSymbol); + /* Find total symbols occupied including DMRS */ + dmrsStartSymbol = findDmrsStartSymbol(pdsch->dmrs.dlDmrsSymbPos); + /* If there are no DRMS symbols, findDmrsStartSymbol() returns MAX_SYMB_PER_SLOT, + * in that case only PDSCH symbols are marked as occupied */ + if(dmrsStartSymbol == MAX_SYMB_PER_SLOT) + { + startSymbol = pdsch->pdschTimeAlloc.timeAlloc.startSymb; + numSymbol = pdsch->pdschTimeAlloc.timeAlloc.numSymb; + } + /* If DMRS symbol is found, mark DMRS and PDSCH symbols as occupied */ + else + { + startSymbol = dmrsStartSymbol; + numSymbol = pdsch->dmrs.nrOfDmrsSymbols + pdsch->pdschTimeAlloc.timeAlloc.numSymb; + } + /* Allocate the number of PRBs required for RAR PDSCH */ - if((allocatePrbDl(cell, rarTime, pdsch->pdschTimeAlloc.timeAlloc.startSymb, pdsch->pdschTimeAlloc.timeAlloc.numSymb,\ + if((allocatePrbDl(cell, rarTime, startSymbol, numSymbol,\ &pdsch->pdschFreqAlloc.freqAlloc.startPrb, pdsch->pdschFreqAlloc.freqAlloc.numPrb)) != ROK) { DU_LOG("\nERROR --> SCH : allocatePrbDl() failed for RAR"); diff --git a/src/5gnrsch/sch_ue_mgr.c b/src/5gnrsch/sch_ue_mgr.c index f1de4f44c..460f71e63 100644 --- a/src/5gnrsch/sch_ue_mgr.c +++ b/src/5gnrsch/sch_ue_mgr.c @@ -265,6 +265,7 @@ void updateSchDlCb(uint8_t delIdx, SchDlCb *dlInfo) uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg) { uint8_t lcIdx, ueLcIdx; + uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0}; SchPdschCfgCmn pdschCfg; SchPucchDlDataToUlAck *dlDataToUlAck; @@ -285,6 +286,12 @@ uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg) if(ueCfg->spCellCfgPres == true) { memcpy(&ueCb->ueCfg.spCellCfg , &ueCfg->spCellCfg, sizeof(SchSpCellCfg)); + + covertFreqDomRsrcMapToIAPIFormat(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc,\ + freqDomainResource); + memset(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE); + memcpy(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdcchCfg.cRSetToAddModList[0].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE); + ueCb->ueCfg.spCellCfgPres = true; dlDataToUlAck = ueCfg->spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck; if(ueCb->cellCb) diff --git a/src/5gnrsch/sch_utils.c b/src/5gnrsch/sch_utils.c index b01ca05a7..ac952c719 100644 --- a/src/5gnrsch/sch_utils.c +++ b/src/5gnrsch/sch_utils.c @@ -773,6 +773,34 @@ uint8_t minMsg3SchTime[MAX_NUM_MU] = {6, 6, 6, 6}; uint8_t defaultUlAckTbl[DEFAULT_UL_ACK_LIST_COUNT]= {1, 2, 3 , 4, 5, 6, 7, 8}; +/** + * @brief Function to find first DMRS symbol in PDSCH + * + * @details + * + * Function: findDmrsStartSymbol + * + * This function finds first DMRS symbol using DMRS symbol + * position bitmap. + * + * @param[in] DMRS symbol position bitmap + * @return Success : First DRMS symbol + * Failure : MAX_SYMB_PER_SLOT + **/ +uint8_t findDmrsStartSymbol(uint16_t dlDmrsSymbBitMap) +{ + uint8_t position = 0; + uint16_t mask = 1; + + while(position < MAX_SYMB_PER_SLOT) + { + if(dlDmrsSymbBitMap & mask) + break; + mask = mask << 1; + position++; + } + return position; +} /** * @brief Function to add a node to a linked list @@ -1391,8 +1419,61 @@ uint8_t calculateSlotPatternLength(uint8_t scs, uint8_t periodicity) } return slotPatternLength; } - #endif + +/* + * As per FAPI spec, + * Frequency domain resources is a bitmap defining non-overlapping groups of 6 PRBs in ascending order. + * [TS38.213 10.1]. Bitmap of uint8 array. 45 bits. + * + * As per IAPI, + * CORESET-freqdom.frequencyDomainResources : The bits of the bitmap have a one-to-one mapping with + * non-overlapping groups of 6 RBs. The most significant bit of the first word corresponds to + * the most significant bit defined in 38.331. + * + * FAPI and IAPI both are 45 bits. Mapped from bit 0 LS Byte for the FAPI and + * bit 0 LS U32 entry for IAPI. + * FAPI is to be filled in following format such that Intel L1 is able to decode it : + * + * FAPI IAPI + * FreqDomainResource[0] bits 7-0 -> nFreqDomain[0] bits 7-0 + * FreqDomainResource[1] bits 7-0 -> nFreqDomain[0] bits 15-8 + * FreqDomainResource[2] bits 7-0 -> nFreqDomain[0] bits 23-16 + * FreqDomainResource[3] bits 7-0 -> nFreqDomain[0] bits 31-24 + * FreqDomainResource[4] bits 7-0 -> nFreqDomain[1] bits 7-0 + * FreqDomainResource[5] bits 7-0 -> nFreqDomain[1] bits 15-8 + * + * where for the last entry bits 7,6 and 5 are don't care in the FAPI and bits + * 31-13 are don't care in the IAPI. + */ +void covertFreqDomRsrcMapToIAPIFormat(uint8_t *sourceBitMap, uint8_t *destBitMap) +{ + int8_t idx; + uint8_t numBitsToShift = 0; + uint64_t freqDomainResources = 0; + + /* Bit operation to create a 64-bit integer that has + * 48 LSBs [Bit 47 to Bit 0] mapped to sourceBitMap[0] to sourceBitMap[5] + */ + for(idx = FREQ_DOM_RSRC_SIZE-1; idx >=0; idx--) + { + freqDomainResources |= ((uint64_t)sourceBitMap[idx] << numBitsToShift); + numBitsToShift += 8; + } + + /* Right shift 3 bits because bits[2-0] are unused in sourceBitMap[5] */ + freqDomainResources = freqDomainResources >> 3; + + /* Filling destBitMap such that LSB bit 0 of freqDomainResources maps to LSB + * of first word of destBitMap */ + numBitsToShift = 0; + for(idx=0; idx> numBitsToShift; + numBitsToShift += 8; + } +} + /********************************************************************** End of file **********************************************************************/ diff --git a/src/5gnrsch/sch_utils.h b/src/5gnrsch/sch_utils.h index 9081fd790..469ebf809 100644 --- a/src/5gnrsch/sch_utils.h +++ b/src/5gnrsch/sch_utils.h @@ -113,7 +113,6 @@ uint8_t calculateSlotPatternLength(uint8_t scs, uint8_t periodicity); #endif /* Functions declarations : Resource allocation handler */ -void freqDomRscAllocType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain); 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); @@ -121,6 +120,8 @@ 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); +void covertFreqDomRsrcMapToIAPIFormat(uint8_t *sourceBitMap, uint8_t *destBitMap); /********************************************************************** End of file diff --git a/src/cm/common_def.c b/src/cm/common_def.c index 00b61dc13..f3c96ec89 100644 --- a/src/cm/common_def.c +++ b/src/cm/common_def.c @@ -23,7 +23,7 @@ * * @details * - * Function: freqDomRscAllocType0 + * Function: fillCoresetFeqDomAllocMap * * This function does allocation in frequency domain resource. * This is a bitmap defining non-overlapping groups of 6 PRBs in ascending order. @@ -33,45 +33,55 @@ * @param[in] freqDomain - 6 bytes of info, each bit represents a group of 6 PRB. * @return void **/ -void freqDomRscAllocType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain) +void fillCoresetFeqDomAllocMap(uint16_t startPrbGrp, uint16_t numPrbGrp, uint8_t *freqDomain) { - uint8_t remBits = prbSize; /* each bit represents 6 PRBs */ - uint8_t firstByte = 1; - uint8_t numBits,startBit,byteCount = 5; + uint8_t idx; + uint8_t prbGrpStartBit = 0; + uint8_t numBitsToRightShift = 0; + uint64_t mask = 0; + uint64_t freqAllocBitMap = 0; - while(remBits) + /* + * Frequency allocation bit string is 45 bits long. Hence using 6 bytes (i.e. 48 bits) to represent it. + * Each bit corresponds to a group of 6 RBs. + * + * For example if a coreset includes PRB 24 to 47, then on dividing the PRBs into group of 6, + * startPrbGrp = 24/6 = 4 + * numPrbGrp = 24/6 = 4 + * + * Frequency allocation bit string is 48 bits long i.e. Bit 47...0 + * Here, Bit 47 represents RB group 0, Bit 46 represent RB group 45 and so on. + * Since startPrbGrp = 4 and numPrbGrp = 4, it means RB group 4,5,6 and 7 are used in coreset. + * i.e. Bits 43, 42, 42 and 40 are masked to 1 and rest all bits are 0 in bitstring + */ + prbGrpStartBit = 47; + while(numPrbGrp) { - /* when the startPrb is not in this byteCount */ - if(startPrb/8) - { - startPrb -= 8; - byteCount--; - continue; - } - - /* max bytecount is 6 nearly equal to 45 bits*/ - if(byteCount >= 6) - break; - - /* when we are filling the second byte, then the start should be equal to 0 */ - if(firstByte) - startBit = startPrb; - else - startBit = 0; - - /* calculate the number of bits to be set in this byte */ - if((remBits+startPrb) <= 8) - numBits = remBits; - else - numBits = 8 - startBit; - - /* bit operation to set the bits */ - SET_BITS_MSB((startBit % 8),numBits,freqDomain[byteCount]) - firstByte = 0; + mask = 1; + printf("startPrbGrp [%d] numPrbGrp [%d] diff [%d]\n",startPrbGrp, numPrbGrp, (prbGrpStartBit - startPrbGrp)); + mask = mask << (prbGrpStartBit - startPrbGrp); + freqAllocBitMap = freqAllocBitMap | mask; + startPrbGrp++; + numPrbGrp--; + } - /* the ramaining bits should be subtracted with the numBits set in this byte */ - remBits -= numBits; - byteCount--; + /* Copying 48 LSBs from 64-bit integer to the 45 MSBS in 6-byte array + * The first (left-most / most significant) bit corresponds to the first RB + * group in the BWP, and so on + */ + /* On right shifting freqAllocBitMap by 40 bits, the bits 47 to 40 of freqAllocBitMap + * will now become 8-LSB. Copying these 8-bits into freqDomain[]. + * Now shifting freqAllocBitMap by 32 bits, the bit 39 to 32 of freqAllocBitMap will + * now become 8-LSB. Copying these 8-bits into next index of freqDomain. + * and so on. + */ + numBitsToRightShift = 40; + mask = 0x0000FF0000000000; + for(idx=0; idx> numBitsToRightShift; + numBitsToRightShift -= 8; + mask = mask >> 8; } } diff --git a/src/cm/common_def.h b/src/cm/common_def.h index 26a327a01..01ece247a 100644 --- a/src/cm/common_def.h +++ b/src/cm/common_def.h @@ -125,6 +125,8 @@ #define ODU_SET_THREAD_AFFINITY SSetAffinity #define ODU_CREATE_TASK SCreateSTsk +#define MAX_SYMB_PER_SLOT 14 + /* Slice */ #define SD_SIZE 3 @@ -132,7 +134,6 @@ /* Maximum slots for max periodicity and highest numerology is 320. * However, aligning to fapi_interface.h, setting this macro to 160 */ #define MAX_TDD_PERIODICITY_SLOTS 160 -#define MAX_SYMB_PER_SLOT 14 #endif #define GET_UE_IDX( _crnti,_ueIdx) \ @@ -277,7 +278,7 @@ OduCellStatus gCellStatus; uint64_t gSlotCount; uint64_t gDlDataRcvdCnt; /* Number of DL data received at EGTP */ -void freqDomRscAllocType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain); +void fillCoresetFeqDomAllocMap(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain); void oduCpyFixBufToMsg(uint8_t *fixBuf, Buffer *mBuf, uint16_t len); uint8_t buildPlmnId(Plmn plmn, uint8_t *buf); diff --git a/src/cm/mac_sch_interface.h b/src/cm/mac_sch_interface.h index 7207a4b09..6e43eafb2 100644 --- a/src/cm/mac_sch_interface.h +++ b/src/cm/mac_sch_interface.h @@ -621,8 +621,9 @@ typedef struct schCandidatesInfo typedef struct schSearchSpaceCfg { - uint8_t searchSpaceId; - uint8_t coresetId; + uint8_t searchSpaceId; + uint8_t coresetId; + uint8_t freqDomainRsrc[FREQ_DOM_RSRC_SIZE]; /* Frequency domain resource */ uint16_t monitoringSlot; uint16_t duration; uint16_t monitoringSymbol; diff --git a/src/codec_utils/common/odu_common_codec.c b/src/codec_utils/common/odu_common_codec.c index cb302f460..b3ba6bc3e 100644 --- a/src/codec_utils/common/odu_common_codec.c +++ b/src/codec_utils/common/odu_common_codec.c @@ -98,7 +98,7 @@ uint8_t bitStringToInt(BIT_STRING_t *bitString, void *value) { *val |= bitString->buf[idx]; *val <<= 8; - } + } *val |= bitString->buf[idx]; *val >>= bitString->bits_unused; diff --git a/src/cu_stub/cu_f1ap_msg_hdl.c b/src/cu_stub/cu_f1ap_msg_hdl.c index 85b46d911..fd8dac49f 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -2928,7 +2928,7 @@ void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg) coreset1StartPrb = coreset0EndPrb + 6; coreset1NumPrb = CORESET1_NUM_PRB; /* calculate the PRBs */ - freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); + fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE); controlRSet->frequencyDomainResources.bits_unused = bitsUnused; diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index 11b4b115c..ed276448e 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -3412,7 +3412,7 @@ uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddMod coreset1StartPrb = coreset0EndPrb + 6; coreset1NumPrb = CORESET1_NUM_PRB; /* calculate the PRBs */ - freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); + fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE); controlRSet->frequencyDomainResources.bits_unused = bitsUnused; @@ -8105,31 +8105,34 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(cRsetToAddModList->list.count) { macPdcchCfg->numCRsetToAddMod = cRsetToAddModList->list.count; - for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++) - { - macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \ - cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId; - bitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\ - macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc); + for(cRsetIdx = 0; cRsetIdx < cRsetToAddModList->list.count; cRsetIdx++) + { + macPdcchCfg->cRSetToAddModList[cRsetIdx].cRSetId = \ + cRsetToAddModList->list.array[cRsetIdx]->controlResourceSetId; + //freqDomRsrcBitStringToInt(&cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources,\ + macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc); + memcpy(macPdcchCfg->cRSetToAddModList[cRsetIdx].freqDomainRsrc, \ + cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.buf, + cRsetToAddModList->list.array[cRsetIdx]->frequencyDomainResources.size); + macPdcchCfg->cRSetToAddModList[cRsetIdx].duration = \ - cRsetToAddModList->list.array[cRsetIdx]->duration; + cRsetToAddModList->list.array[cRsetIdx]->duration; - macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \ - cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present; + macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType = \ + cRsetToAddModList->list.array[cRsetIdx]->cce_REG_MappingType.present; if(macPdcchCfg->cRSetToAddModList[cRsetIdx].cceRegMappingType == CCE_REG_MAPPINGTYPE_PR_INTERLEAVED) - { - //TODO: handle the case for Interleaved + { + //TODO: handle the case for Interleaved } macPdcchCfg->cRSetToAddModList[cRsetIdx].precoderGranularity = \ - cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity; - if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID) - { - macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \ - *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID); - } + cRsetToAddModList->list.array[cRsetIdx]->precoderGranularity; + if(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID) + { + macPdcchCfg->cRSetToAddModList[cRsetIdx].dmrsScramblingId= \ + *(cRsetToAddModList->list.array[cRsetIdx]->pdcch_DMRS_ScramblingID); + } } } - } /* Control Resource Set To Release List */ if(cuPdcchCfg->controlResourceSetToReleaseList) @@ -8138,10 +8141,10 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(cRsetToRelList->list.count) { macPdcchCfg->numCRsetToRel = cRsetToRelList->list.count; - for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++) - { + for(cRsetIdx = 0; cRsetIdx < cRsetToRelList->list.count; cRsetIdx++) + { macPdcchCfg->cRSetToRelList[cRsetIdx] = *(cRsetToRelList->list.array[cRsetIdx]); - } + } } } @@ -8152,49 +8155,49 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(srchSpcToAddModList->list.count) { macPdcchCfg->numSearchSpcToAddMod = srchSpcToAddModList->list.count; - for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++) - { + for(srchSpcIdx = 0; srchSpcIdx < srchSpcToAddModList->list.count; srchSpcIdx++) + { macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceId =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId; + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceId; macPdcchCfg->searchSpcToAddModList[srchSpcIdx].cRSetId =\ - *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId); - if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset) - { + *(srchSpcToAddModList->list.array[srchSpcIdx]->controlResourceSetId); + if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset) + { macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSlotPeriodicityAndOffset =\ - srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present; + srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSlotPeriodicityAndOffset->present; } if(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot) { - bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\ - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot); + bitStringToInt(srchSpcToAddModList->list.array[srchSpcIdx]->monitoringSymbolsWithinSlot,\ + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].mSymbolsWithinSlot); } - if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates) + if(srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates) { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1; - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2; - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4; - - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8; - - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \ - srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16; - } + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel1 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel1; + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel2 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel2; + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel4 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel4; + + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel8 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel8; + + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].numCandidatesAggLevel16 = \ + srchSpcToAddModList->list.array[srchSpcIdx]->nrofCandidates->aggregationLevel16; + } if(srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType) - { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present; - if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC) - { - macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\ - srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats; - } - - } - } + { + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType =\ + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->present; + if(macPdcchCfg->searchSpcToAddModList[srchSpcIdx].searchSpaceType == SEARCHSPACETYPE_PR_UE_SPECIFIC) + { + macPdcchCfg->searchSpcToAddModList[srchSpcIdx].ueSpecificDciFormat =\ + srchSpcToAddModList->list.array[srchSpcIdx]->searchSpaceType->choice.ue_Specific->dci_Formats; + } + + } + } } } /* Search space To Rel List */ @@ -8204,11 +8207,11 @@ void extractPdcchCfg(PDCCH_Config_t *cuPdcchCfg, PdcchConfig *macPdcchCfg) if(srchSpcToRelList->list.count) { macPdcchCfg->numSearchSpcToRel = srchSpcToRelList->list.count; - for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++) - { + for(srchSpcIdx = 0; srchSpcIdx < srchSpcToRelList->list.count; srchSpcIdx++) + { macPdcchCfg->searchSpcToRelList[srchSpcIdx] =\ - *(srchSpcToRelList->list.array[srchSpcIdx]); - } + *(srchSpcToRelList->list.array[srchSpcIdx]); + } } } } @@ -9160,7 +9163,21 @@ ServCellCfgInfo *storedSrvCellCfg) if(dlBwp->pdcch_Config->choice.setup) { macSrvCellCfg->initDlBwp.pdcchPresent = true; - extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + if(storedSrvCellCfg) + { + if(!storedSrvCellCfg->initDlBwp.pdcchPresent) + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } + else + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } + } + else + { + extractPdcchCfg(dlBwp->pdcch_Config->choice.setup, &macSrvCellCfg->initDlBwp.pdcchCfg); + } } } if(dlBwp->pdsch_Config) diff --git a/src/du_app/du_ue_mgr.c b/src/du_app/du_ue_mgr.c index 21491e2c5..be2a3a196 100644 --- a/src/du_app/du_ue_mgr.c +++ b/src/du_app/du_ue_mgr.c @@ -691,7 +691,7 @@ void fillDefaultInitDlBwp(InitialDlBwp *initDlBwp) coreset1StartPrb = coreset0EndPrb +6; coreset1NumPrb = CORESET1_NUM_PRB; /* calculate the PRBs */ - freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); + fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); memcpy(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE); -- 2.16.6