From 7ba0c6ecc645d7b36fdd02913d1b92727c36f413 Mon Sep 17 00:00:00 2001 From: balajihands Date: Mon, 12 Oct 2020 10:29:37 +0530 Subject: [PATCH] Jira id - ODUHIGH-241 calculation of tb size Change-Id: I9ecf1ab32168fd0785cd8221e2390e3394333a0e Signed-off-by: balajihands --- src/5gnrsch/sch_rach.c | 8 +++++--- src/5gnrsch/sch_utils.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/5gnrsch/sch_utils.h | 1 + 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/5gnrsch/sch_rach.c b/src/5gnrsch/sch_rach.c index 7f03bfd7f..1e4edb291 100644 --- a/src/5gnrsch/sch_rach.c +++ b/src/5gnrsch/sch_rach.c @@ -118,7 +118,6 @@ uint8_t *msg3NumRb) uint8_t numPdschSymbols= 14; uint16_t tbSize = 0; - cell = schCb[schInst].cells[schInst]; // puschMu = cell->cellCfg.puschMu; delta = puschDeltaTable[puschMu]; @@ -151,6 +150,9 @@ uint8_t *msg3NumRb) DU_LOG("SCH: Memory allocation failed in schAllocMsg3Pusch"); return RFAILED; } + tbSize = 0; /* since nPrb has been incremented, recalculating tbSize */ + tbSize = schCalcTbSizeFromNPrb(numRb, mcs, numPdschSymbols); + schUlSlotInfo->schPuschInfo->harqProcId = SCH_HARQ_PROC_ID; schUlSlotInfo->schPuschInfo->resAllocType = SCH_ALLOC_TYPE_1; schUlSlotInfo->schPuschInfo->fdAlloc.startPrb = startRb; @@ -159,8 +161,8 @@ uint8_t *msg3NumRb) schUlSlotInfo->schPuschInfo->tdAlloc.numSymb = symbLen; schUlSlotInfo->schPuschInfo->tbInfo.mcs = mcs; schUlSlotInfo->schPuschInfo->tbInfo.ndi = 1; /* new transmission */ - schUlSlotInfo->schPuschInfo->tbInfo.rv = 0; - schUlSlotInfo->schPuschInfo->tbInfo.tbSize = 24; /*Considering 2 PRBs */ + schUlSlotInfo->schPuschInfo->tbInfo.rv = 0; + schUlSlotInfo->schPuschInfo->tbInfo.tbSize = tbSize; /*Considering 2 PRBs */ schUlSlotInfo->schPuschInfo->dmrsMappingType = DMRS_MAP_TYPE_A; /* Setting Type-A */ schUlSlotInfo->schPuschInfo->nrOfDmrsSymbols = NUM_DMRS_SYMBOLS; schUlSlotInfo->schPuschInfo->dmrsAddPos = DMRS_ADDITIONAL_POS; diff --git a/src/5gnrsch/sch_utils.c b/src/5gnrsch/sch_utils.c index 7e4b59a6f..a18df4810 100644 --- a/src/5gnrsch/sch_utils.c +++ b/src/5gnrsch/sch_utils.c @@ -524,7 +524,53 @@ uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols) numPrb = ceil((float)nre / nreDash); return numPrb; } +/** +* @brief calculation of transport block size. +* +* @details +* +* Function: schCalcTbSizeFromNPrb +* +* This function calculates the transport block size +* +* @param[in] nPrb is num PRB +* @param[in] mcs +* @param[in] number of symbols +* @return tbSize +**/ +uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols) +{ + uint16_t tbSize = 0; + uint16_t tbsIndex = 0; + uint16_t nre = 0; + uint16_t nreDash = 0; + uint8_t qm = mcsTable[mcs][1]; + uint16_t rValue = mcsTable[mcs][2]; + uint8_t numLayer = 1; /* v value */ + + /* formula used for calculation of rbSize, 38.213 section 5.1.3.2 * + * Ninfo = Nre . R . Qm . v where [ NInfo is tbSize] * + * Nre' = Nsc . NsymPdsch - NdmrsSymb - Noh * + * Nre = min(156,Nre') . nPrb */ + + nreDash = ceil( (12 * numSymbols) - NUM_DMRS_SYMBOLS - 0); + + if(nreDash > 156) + nreDash = 156; + nre = nreDash * numPrb; + tbSize = ceil(nre * qm * numLayer * rValue/1024.0); + tbSize = ceil(tbSize/8.0); + + while(tbSize > tbSizeTable[tbsIndex]) + { + tbsIndex++; + } + tbSize = tbSizeTable[tbsIndex]; + + return tbSize; + +} /** * @brief fetching ueCb from cellCb * diff --git a/src/5gnrsch/sch_utils.h b/src/5gnrsch/sch_utils.h index 9212151ef..a6ffdae0d 100644 --- a/src/5gnrsch/sch_utils.h +++ b/src/5gnrsch/sch_utils.h @@ -89,6 +89,7 @@ extern int8_t searchSpaceIdxTable[MAX_SEARCH_SPACE_INDEX][4]; void schAllocFreqDomRscType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain); uint16_t schCalcTbSize(uint16_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); SchUeCb* schGetUeCb(SchCellCb *cellCb, uint16_t crnti); void schInitUlSlot(SchUlSlotInfo *schUlSlotInfo); void schInitDlSlot(SchDlSlotInfo *schDlSlotInfo); -- 2.16.6