Jira id - ODUHIGH-241 calculation of tb size 30/4830/3
authorbalajihands <balaji.shankaran@radisys.com>
Mon, 12 Oct 2020 04:59:37 +0000 (10:29 +0530)
committerbalajihands <balaji.shankaran@radisys.com>
Mon, 12 Oct 2020 09:13:49 +0000 (14:43 +0530)
Change-Id: I9ecf1ab32168fd0785cd8221e2390e3394333a0e
Signed-off-by: balajihands <balaji.shankaran@radisys.com>
src/5gnrsch/sch_rach.c
src/5gnrsch/sch_utils.c
src/5gnrsch/sch_utils.h

index 7f03bfd..1e4edb2 100644 (file)
@@ -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;
index 7e4b59a..a18df48 100644 (file)
@@ -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
  *
index 9212151..a6ffdae 100644 (file)
@@ -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);