Modified SCH design to process pending RACH Ind when Slot Ind is received [Issue... 77/6577/1
authorlal.harshita <Harshita.Lal@radisys.com>
Mon, 23 Aug 2021 18:56:28 +0000 (00:26 +0530)
committerHarshita Lal <harshita.lal@radisys.com>
Mon, 6 Sep 2021 06:57:34 +0000 (06:57 +0000)
Change-Id: I05e42e72eff35d406d5d93c5d7939fbec1ff77d3
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
(cherry picked from commit 488f5ed56e82148cd09eb8c4e62ad6f0009d6761)

src/5gnrmac/mac_rach.c
src/5gnrsch/sch.h
src/5gnrsch/sch_rach.c
src/5gnrsch/sch_slot_ind.c

index 306913c..363f0b9 100644 (file)
@@ -78,29 +78,40 @@ uint8_t fapiMacRachInd(Pst *pst, RachInd *rachInd)
 {
    uint8_t      pduIdx;
    uint8_t      preambleIdx;
-   RachIndInfo  rachIndInfo;
+   RachIndInfo  *rachIndInfo;
 
    DU_LOG("\nINFO  -->  MAC : Received RACH indication");
    /* Considering one pdu and one preamble */
    pduIdx = 0;
    preambleIdx = 0;
 
-   rachIndInfo.cellId = rachInd->cellId;
-   rachIndInfo.timingInfo.sfn = rachInd->timingInfo.sfn;
-   rachIndInfo.timingInfo.slot = rachInd->timingInfo.slot;
-   rachIndInfo.slotIdx = rachInd->rachPdu[pduIdx].slotIdx;
-   rachIndInfo.symbolIdx = rachInd->rachPdu[pduIdx].symbolIdx;
-   rachIndInfo.freqIdx = rachInd->rachPdu[pduIdx].freqIdx;
-   rachIndInfo.preambleIdx = \
+   MAC_ALLOC(rachIndInfo, sizeof(RachIndInfo));
+   if(!rachIndInfo)
+   {
+      DU_LOG("\nERROR  --> MAC : Memory allocation failure in fapiMacRachInd");
+      MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rachInd, sizeof(RachInd));
+      return RFAILED;
+   }
+
+   rachIndInfo->cellId = rachInd->cellId;
+   rachIndInfo->timingInfo.sfn = rachInd->timingInfo.sfn;
+   rachIndInfo->timingInfo.slot = rachInd->timingInfo.slot;
+   rachIndInfo->slotIdx = rachInd->rachPdu[pduIdx].slotIdx;
+   rachIndInfo->symbolIdx = rachInd->rachPdu[pduIdx].symbolIdx;
+   rachIndInfo->freqIdx = rachInd->rachPdu[pduIdx].freqIdx;
+   rachIndInfo->preambleIdx = \
       rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].preamIdx;
-   rachIndInfo.timingAdv = \
+   rachIndInfo->timingAdv = \
       rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].timingAdv;
 
-   /* storing the value in macRaCb */
-   createMacRaCb(&rachIndInfo);
+   /* Store the value in macRaCb */
+   createMacRaCb(rachIndInfo);
 
+   /* Free sharable buffer used to send RACH Indication from lower MAC to MAC */
    MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rachInd, sizeof(RachInd));
-   return(sendRachIndMacToSch(&rachIndInfo));
+
+   /* Send RACH Indication to SCH */
+   return(sendRachIndMacToSch(rachIndInfo));
 }
 
 /* spec-38.211 Table 6.3.3.1-7 */
index 15c1125..75ca894 100644 (file)
@@ -209,6 +209,18 @@ typedef struct schUeCb
    SchDlCb    dlInfo;
 }SchUeCb;
 
+/**
+ * @brief
+ * RA Request Info
+ */
+typedef struct schRaReq
+{
+   uint32_t        raRnti;
+   RachIndInfo     *rachInd;
+   SlotTimingInfo  winStartTime;
+   SlotTimingInfo  winEndTime;
+}SchRaReq;
+
 /**
  * @brief
  * Cell Control block per cell.
@@ -226,7 +238,8 @@ typedef struct schCellCb
    bool          firstSsbTransmitted;
    bool          firstSib1Transmitted;
    uint8_t       ssbStartSymbArr[SCH_MAX_SSB_BEAM]; /*!<start symbol per SSB beam */
-   SchRaCb       raCb[MAX_NUM_UE];                  /*!< Rach Cb */
+   SchRaReq      *raReq[MAX_NUM_UE];                /*!< Pending RA request */
+   SchRaCb       raCb[MAX_NUM_UE];                  /*!< RA Cb */
    uint16_t      numActvUe;                         /*!<Number of active UEs */
    uint32_t      actvUeBitMap;                      /*!<Bit map to find active UEs */
    uint32_t      boIndBitMap;                       /*!<Bit map to indicate UEs that have recevied BO */
@@ -276,7 +289,7 @@ uint16_t schAccumalateLcBoSize(SchCellCb *cell, uint16_t ueIdx);
 uint8_t schFillRar(RarAlloc *rarAlloc, uint16_t raRnti, uint16_t pci, uint8_t offsetPointA, bool ssbPresent, bool sib1Present);
 void BuildK0K1Table(SchCellCb *cell, SchK0K1TimingInfoTbl *k0K1InfoTbl, bool pdschCfgCmnPres, SchPdschCfgCmn pdschCmnCfg,\
 SchPdschConfig pdschDedCfg, uint8_t ulAckListCount, uint8_t *UlAckTbl);
-
+void schProcessRaReq(SlotTimingInfo currTime, SchCellCb *cellCb);
 /**********************************************************************
   End of file
  **********************************************************************/
index 3339e4e..e7bafd6 100644 (file)
@@ -62,10 +62,10 @@ uint8_t puschDeltaTable[MAX_MU_PUSCH];
 uint16_t calculateRaRnti(uint8_t symbolIdx, uint8_t slotIdx, uint8_t freqIdx)
 {
    uint16_t raRnti = 0;
-   uint8_t ulCarrierIdx = 0; /* configured to 0 */
-   
-   raRnti = (1+symbolIdx+(14*slotIdx)+(14*80*freqIdx)+(14*80*8*ulCarrierIdx));
+   uint8_t  ulCarrierIdx = 0; /* Uplink carrier used for MSG1 transmission. 0:NUL carrier; 1:SUL carrier */
    
+   /* Refer to spec 38.321, section 5.1.3 */
+   raRnti = (1 + symbolIdx + (14*slotIdx) + (14*80*freqIdx) + (14*80*8*ulCarrierIdx));
    return raRnti;
 }
 
@@ -169,24 +169,21 @@ uint8_t schAllocMsg3Pusch(Inst schInst, uint16_t slot, uint16_t crnti, \
    return ROK;
 }
 
-
-
 /**
- * @brief process rach indication function. 
+ * @brief Processes any pending RA request
  *
  * @details
  *
- *     Function : schProcessRachInd
- *     
- *     This function process rach indication
- *     
- *  @param[in]  rachInd parameters
- *  @param[in]  shed instance
+ *     Function : schProcessRaReq
+ *
+ *     This function process pending RA request
+ *
+ *  @param[in]  Current timing of the cell
  *  @return  ROK
  **/
-uint8_t schProcessRachInd(RachIndInfo *rachInd, Inst schInst)
+void schProcessRaReq(SlotTimingInfo currTime, SchCellCb *cell)
 {
-   SchCellCb *cell = schCb[schInst].cells[schInst];
+   uint8_t ueIdx = 0;
    RarInfo *rarInfo = NULLP;
    uint16_t raRnti = 0;
    uint16_t rarSlot = 0;
@@ -194,74 +191,134 @@ uint8_t schProcessRachInd(RachIndInfo *rachInd, Inst schInst)
    uint8_t  msg3NumRb;
    uint8_t  ret = ROK;
    uint8_t delta = 0;
-   uint8_t k2 = 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.timeDomRsrcAllocList[0].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++)
+   while(ueIdx < MAX_NUM_UE)
    {
-      /* 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))
+      if(cell->raReq[ueIdx] == NULLP)
       {
-         rarSlot = (rarSlot + 1) % cell->numSlots;
+         ueIdx++;
          continue;
       }
-      break;
-   }
-   if(slotIdx>=cell->numSlots)
-   {
-       DU_LOG("\nERROR  -->  SCH : NO Slot for Msg2 with Msg3 Grant\n");
-       return RFAILED;
-   }
+
+      //puschMu = cell->cellCfg.puschMu;
+      delta = puschDeltaTable[puschMu];
+      k2 = cell->cellCfg.schInitialUlBwp.puschCommon.timeDomRsrcAllocList[0].k2;
+
+      /* RAR will sent with a delay of RAR_DELAY */
+      rarSlot = (currTime.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; 
+      /* 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 */
+      SchDlSlotInfo *schDlSlotInfo = cell->schDlSlotInfo[rarSlot]; /* RAR will sent in the next slot */
+
+      /* Allocate the rarInfo, this pointer will be checked at schProcessSlotInd function */
+      SCH_ALLOC(rarInfo, sizeof(RarInfo));
+      if(rarInfo == NULLP)
+      {
+         DU_LOG("\nERROR  -->  SCH : Memory Allocation failed for rarInfo");
+         return RFAILED;
+      }
 
-   /* Allocate the rarInfo, this pointer will be checked at schProcessSlotInd function */
-   SCH_ALLOC(rarInfo, sizeof(RarInfo));
-   if(rarInfo == NULLP)
+      schDlSlotInfo->rarInfo = rarInfo;
+
+      /* create raCb at SCH */
+      createSchRaCb(cell->raReq[ueIdx]->rachInd->crnti, cell->instIdx);
+
+      /* allocate resources for msg3 */
+      ret = schAllocMsg3Pusch(cell->instIdx, rarSlot, cell->raReq[ueIdx]->rachInd->crnti, &msg3StartRb, &msg3NumRb, msg3Slot);
+      if(ret == ROK)
+      {
+         /* fill RAR info */
+         rarInfo->raRnti                 = cell->raReq[ueIdx]->raRnti;
+         rarInfo->tcrnti                 = cell->raReq[ueIdx]->rachInd->crnti;
+         rarInfo->RAPID                  = cell->raReq[ueIdx]->rachInd->preambleIdx;
+         rarInfo->ta                     = cell->raReq[ueIdx]->rachInd->timingAdv;
+         rarInfo->msg3FreqAlloc.startPrb = msg3StartRb;
+         rarInfo->msg3FreqAlloc.numPrb   = msg3NumRb;
+      }
+
+      SCH_FREE(cell->raReq[ueIdx]->rachInd, sizeof(RachIndInfo));
+      SCH_FREE(cell->raReq[ueIdx], sizeof(SchRaReq));
+      ueIdx++;
+
+   } /* End of while(ueIdx < MAX_NUM_UE) */
+}
+
+/**
+ * @brief process rach indication function. 
+ *
+ * @details
+ *
+ *     Function : schProcessRachInd
+ *     
+ *     This function process rach indication
+ *     
+ *  @param[in]  rachInd parameters
+ *  @param[in]  shed instance
+ *  @return  ROK
+ **/
+uint8_t schProcessRachInd(RachIndInfo *rachInd, Inst schInst)
+{
+   SchCellCb *cell = schCb[schInst].cells[schInst];
+   SchRaReq  *raReq = NULLP;
+   float    slotDuration;
+   uint8_t  winNumSlots;
+   uint8_t  ueIdx;
+
+   SCH_ALLOC(raReq, sizeof(SchRaReq));
+   if(!raReq)
    {
-      DU_LOG("\nERROR  -->  SCH : Memory Allocation failed for rarInfo");
+      DU_LOG("\nERROR  -->  SCH : Memory allocation failure in schProcessRachInd");
+      SCH_FREE(rachInd, sizeof(RachIndInfo));
       return RFAILED;
    }
 
-   schDlSlotInfo->rarInfo = rarInfo;
-
    /* calculate the ra-rnti value */
-   raRnti = calculateRaRnti(rachInd->symbolIdx,rachInd->slotIdx,rachInd->freqIdx);
+   raReq->raRnti = calculateRaRnti(rachInd->symbolIdx, rachInd->slotIdx, rachInd->freqIdx);
+   raReq->rachInd = rachInd;
+   raReq->winStartTime.sfn = rachInd->timingInfo.sfn;
+   raReq->winStartTime.slot = rachInd->timingInfo.slot;
+  
+   /* Converting window size from ms to number of slots */
+   slotDuration = (1 / pow(2, cell->cellCfg.numerology));
+   winNumSlots = (float)cell->cellCfg.schRachCfg.raRspWindow / slotDuration;
+   
+   /* Adding window size to window start time to get window end time */
+   ADD_DELTA_TO_TIME(raReq->winStartTime, raReq->winEndTime, winNumSlots);
 
-   /* create raCb at SCH */
-   createSchRaCb(rachInd->crnti,schInst);
+   /* Storing RA request in cellCb */
+   GET_UE_IDX(rachInd->crnti, ueIdx);
+   cell->raReq[ueIdx] = raReq;
 
-   /* allocate resources for msg3 */
-   ret = schAllocMsg3Pusch(schInst, rarSlot, rachInd->crnti, &msg3StartRb, &msg3NumRb, msg3Slot);
-   if(ret == ROK)
-   {
-      /* fill RAR info */
-      rarInfo->raRnti                 = raRnti;
-      rarInfo->tcrnti                 = rachInd->crnti;
-      rarInfo->RAPID                  = rachInd->preambleIdx;
-      rarInfo->ta                     = rachInd->timingAdv;
-      rarInfo->msg3FreqAlloc.startPrb = msg3StartRb;
-      rarInfo->msg3FreqAlloc.numPrb   = msg3NumRb;
-   }
-   return ret;
+   return ROK;
 }
 
 /**
index a936494..59501bc 100644 (file)
@@ -312,6 +312,9 @@ uint8_t schProcessSlotInd(SlotTimingInfo *slotInd, Inst schInst)
       }
    }
 
+   /* Check for Pending RA Requests */
+   schProcessRaReq(*slotInd, cell);
+
    /* check for RAR */
    if(cell->schDlSlotInfo[dlSchedInfo.schSlotValue.rarTime.slot]->rarInfo != NULLP)
    {