[ODUHIGH-557][ODUHIGH-648] MSG3 transmitted from OAI-UE but not received at OAI-L1 83/14783/1
authorsvaidhya <svaidhya@radisys.com>
Mon, 4 Aug 2025 06:33:46 +0000 (06:33 +0000)
committersvaidhya <svaidhya@radisys.com>
Mon, 4 Aug 2025 06:33:50 +0000 (06:33 +0000)
Change-Id: Ib92bfbb5ab436641fbfb47831cb9e36f900b4aec
Signed-off-by: svaidhya <svaidhya@radisys.com>
build/config/tdd_odu_config.xml
src/5gnrmac/lwr_mac_fsm.c
src/5gnrsch/sch.c
src/5gnrsch/sch_rach.c
src/5gnrsch/sch_utils.c
src/5gnrsch/sch_utils.h

index 9b29bb6..6031a4a 100644 (file)
                <PUCCH_GROUP_HOPPING>0</PUCCH_GROUP_HOPPING>
             </PUCCH_CFG_COMMON>
             <PUSCH_CFG_COMMON>
-               <NUM_TIME_DOM_RSRC_ALLOC>2</NUM_TIME_DOM_RSRC_ALLOC>
+               <NUM_TIME_DOM_RSRC_ALLOC>3</NUM_TIME_DOM_RSRC_ALLOC>
                <PUSCH_COMM_TIME_ALLOC_LIST>
                   <PUSCH_COMM_TIME_ALLOC>
                      <PUSCH_K2_CFG>4</PUSCH_K2_CFG>
                      <PUSCH_MAPPING_TYPE>0</PUSCH_MAPPING_TYPE>
-                     <PUSCH_START_SYMBOL>3</PUSCH_START_SYMBOL>
-                     <PUSCH_LENGTH_SYMBOL>11</PUSCH_LENGTH_SYMBOL>
+                     <PUSCH_START_SYMBOL>10</PUSCH_START_SYMBOL>
+                     <PUSCH_LENGTH_SYMBOL>3</PUSCH_LENGTH_SYMBOL>
+                  </PUSCH_COMM_TIME_ALLOC>
+                  <PUSCH_COMM_TIME_ALLOC>
+                     <PUSCH_K2_CFG>4</PUSCH_K2_CFG>
+                     <PUSCH_MAPPING_TYPE>0</PUSCH_MAPPING_TYPE>
+                    <PUSCH_START_SYMBOL>10</PUSCH_START_SYMBOL>
+                     <PUSCH_LENGTH_SYMBOL>3</PUSCH_LENGTH_SYMBOL>
                   </PUSCH_COMM_TIME_ALLOC>
                   <PUSCH_COMM_TIME_ALLOC>
                      <PUSCH_K2_CFG>5</PUSCH_K2_CFG>
                      <PUSCH_MAPPING_TYPE>0</PUSCH_MAPPING_TYPE>
-                     <PUSCH_START_SYMBOL>3</PUSCH_START_SYMBOL>
-                     <PUSCH_LENGTH_SYMBOL>11</PUSCH_LENGTH_SYMBOL>
+                    <PUSCH_START_SYMBOL>10</PUSCH_START_SYMBOL>
+                     <PUSCH_LENGTH_SYMBOL>3</PUSCH_LENGTH_SYMBOL>
                   </PUSCH_COMM_TIME_ALLOC>
                </PUSCH_COMM_TIME_ALLOC_LIST>
             </PUSCH_CFG_COMMON>  
    </E2AP_CFG>
    <GLOBAL_CFG>
       <RADIO_FRAME_DURATION>10</RADIO_FRAME_DURATION>
-      <PHY_DELTA_DL>1</PHY_DELTA_DL>
+      <PHY_DELTA_DL>0</PHY_DELTA_DL>
       <PHY_DELTA_UL>0</PHY_DELTA_UL>
       <ODU_UE_THROUGHPUT_PRINT_TIME_INTERVAL>5</ODU_UE_THROUGHPUT_PRINT_TIME_INTERVAL>
       <ODU_SNSSAI_THROUGHPUT_PRINT_TIME_INTERVAL>60000</ODU_SNSSAI_THROUGHPUT_PRINT_TIME_INTERVAL>
index ccf06fa..71e670d 100644 (file)
@@ -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 */
index 49db8f5..abfa5fe 100644 (file)
@@ -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;
          }
       }
index 2407596..cce509b 100644 (file)
@@ -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;
index a35ed7e..1a6bfd5 100644 (file)
@@ -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<<n)*(nInfo/(1<<n)));
       while(nInfoDash > 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. 
index 5d2ac3a..89bf35c 100644 (file)
@@ -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);