* @return void
**/
uint8_t schAllocMsg3Pusch(Inst schInst, uint16_t slot, uint16_t crnti, \
- uint16_t *msg3StartRb, uint8_t *msg3NumRb)
+ uint16_t *msg3StartRb, uint8_t *msg3NumRb, uint16_t msg3SlotAlloc)
{
SchCellCb *cell = NULLP;
SchUlSlotInfo *schUlSlotInfo = NULLP;
- uint8_t puschMu = 0;
- uint8_t msg3SlotAlloc = 0;
- uint8_t delta = 0;
- uint8_t k2 = 0;
uint8_t startSymb = 0;
uint8_t symbLen = 0;
uint8_t startRb = 0;
uint16_t tbSize = 0;
cell = schCb[schInst].cells[schInst];
- // puschMu = cell->cellCfg.puschMu;
- delta = puschDeltaTable[puschMu];
- k2 = cell->cellCfg.schInitialUlBwp.puschCommon.k2;
startSymb = cell->cellCfg.schInitialUlBwp.puschCommon.startSymbol;
symbLen = cell->cellCfg.schInitialUlBwp.puschCommon.lengthSymbol;
- /* Slot allocation for msg3 based on 38.214 section 6.1.2.1 */
- msg3SlotAlloc = slot + k2 + delta;
- msg3SlotAlloc = msg3SlotAlloc % cell->numSlots;
-
startRb = cell->schUlSlotInfo[msg3SlotAlloc]->puschCurrentPrb;
tbSize = schCalcTbSize(8); /* 6 bytes msg3 and 2 bytes header */
numRb = schCalcNumPrb(tbSize, mcs, numPdschSymbols);
}
tbSize = 0; /* since nPrb has been incremented, recalculating tbSize */
tbSize = schCalcTbSizeFromNPrb(numRb, mcs, numPdschSymbols);
-
+ tbSize = tbSize/8;/*bits to byte conversion*/
schUlSlotInfo->schPuschInfo->crnti = crnti;
schUlSlotInfo->schPuschInfo->harqProcId = SCH_HARQ_PROC_ID;
schUlSlotInfo->schPuschInfo->resAllocType = SCH_ALLOC_TYPE_1;
uint16_t msg3StartRb;
uint8_t msg3NumRb;
uint8_t ret = ROK;
+ uint8_t delta = 0;
+ uint8_t k2 = 0;
+ uint8_t puschMu = 0;
+ uint16_t msg3Slot = 0;
+ #ifdef NR_TDD
+ uint16_t slotIdx = 0;
+ #endif
+ //puschMu = cell->cellCfg.puschMu;
+ delta = puschDeltaTable[puschMu];
+ k2 = cell->cellCfg.schInitialUlBwp.puschCommon.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; slotIdx<cell->numSlots;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;
+ #endif
SchDlSlotInfo *schDlSlotInfo = cell->schDlSlotInfo[rarSlot]; /* RAR will sent in the next slot */
createSchRaCb(rachInd->crnti,schInst);
/* allocate resources for msg3 */
- ret = schAllocMsg3Pusch(schInst, rarSlot, rachInd->crnti, &msg3StartRb, &msg3NumRb);
+ ret = schAllocMsg3Pusch(schInst, rarSlot, rachInd->crnti, &msg3StartRb, &msg3NumRb, msg3Slot);
if(ret == ROK)
{
/* fill RAR info */
numPrb = ceil((float)nre / nreDash);
return numPrb;
}
+
/**
* @brief calculation of transport block size.
*
**/
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 */
+ uint16_t tbsIndex = 0;
+ uint32_t tbSize = 0;
+ uint32_t nre = 0;
+ uint32_t nreDash = 0;
+ uint32_t nInfo = 0;
+ uint32_t n = 0;
+ uint32_t nInfoDash = 0;
+ uint32_t c = 0;
+ const uint8_t numLayer = 1;
+ const uint16_t numRbSc = 12;
+ const uint16_t numDmrsRes = 12;
+ const uint16_t sf = 1;
+// uint16_t numPrbOvrHead = 0;
- /* formula used for calculation of rbSize, 38.213 section 5.1.3.2 *
- * Ninfo = Nre . R . Qm . v where [ NInfo is tbSize] *
+ /* formula used for calculation of rbSize, 38.214 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;
+ nreDash = MIN(156, ceil( (numRbSc * numSymbols) - numDmrsRes - 0));
nre = nreDash * numPrb;
- tbSize = ceil(nre * qm * numLayer * rValue/1024.0);
- tbSize = ceil(tbSize/8.0);
-
- while(tbSize > tbSizeTable[tbsIndex])
+ nInfo = ceil(nre * qm * numLayer * rValue/(1024.0 * sf));
+
+ if(nInfo <= 3824)
{
- tbsIndex++;
+ n = MAX(3, (uint32_t)cmLog2(nInfo) - 6);
+ nInfoDash = MAX(24, (1<<n)*(nInfo/(1<<n)));
+ while(nInfoDash > tbSizeTable[tbsIndex])
+ {
+ tbsIndex++;
+ }
+ tbSize = tbSizeTable[tbsIndex];
}
- tbSize = tbSizeTable[tbsIndex];
+ else
+ {
+ n = (uint32_t)cmLog2(nInfo - 24) - 5;
+ nInfoDash = MAX(3840, (1<<n)*ceil((nInfo - 24)/(1<<n)));
+ if(rValue<256)
+ {
+ c = ceil((nInfoDash + 24)/3816);
+ tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
+ }
+ else
+ {
+ if(nInfoDash > 8424)
+ {
+ c = ceil((nInfoDash + 24)/8424);
+ tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
+ }
+ else
+ {
+ tbSize = 8 * ceil((nInfoDash + 24)/(8)) - 24;
+ }
+ }
+ }
return tbSize;
-
}
/**
* @brief fetching ueCb from cellCb
**/
SlotConfig schGetSlotSymbFrmt(uint16_t slot, uint32_t bitMap)
{
+ uint32_t offset = (slot)*2;
+ return (bitMap & 0x3<<offset)>>offset;
+ #if 0
SlotConfig slotFrmt;
int mask1 = 0, mask2 = 0;
- slot = (slot%10)*2;
+ slot = (slot%n)*2;//n num of slots in defined periodicity or num of symbols
mask1 = 1<<(slot);
mask2 = 1<<(slot+1);
slotFrmt = ((mask1 & bitMap)>>slot) + (2*((mask2 & bitMap)>>(slot+1)));
//printf("\n\n\n\n*****FormatType:%d Slot:%d****\n\n\n\n", slotFrmt, slot/2);
return slotFrmt;
+ #endif
}
#endif