[EPIC-ID: ODUHIGH-488][TASK-ID: ODUHIGH-494]SCH framework update to support different...
[o-du/l2.git] / src / 5gnrmac / mac_rach.c
index df230dd..5531917 100644 (file)
 #include "mac.h"
 #include "mac_utils.h"
 
-/* Function pointer for sending rach ind from MAC to SCH */
-MacSchRachIndFunc macSchRachIndOpts[]=
-{
-   packMacSchRachInd,   /* packing for loosely coupled */
-   MacSchRachInd,       /* packing for tightly coupled */ 
-   packMacSchRachInd    /* packing for light weight loosely coupled */
-};
-
-/* Function pointer for sending RACH resource request from MAC to SCH */
-MacSchRachRsrcReqFunc macSchRachRsrcReqOpts[] = 
-{
-   packMacSchRachRsrcReq,   /* packing for loosely coupled */
-   MacSchRachRsrcReq,       /* packing for tightly coupled */
-   packMacSchRachRsrcReq    /* packing for light weight loosely coupled */
-};
-
 /* Function pointer for sending RACH resource response from MAC to DU APP */
 MacDuRachRsrcRspFunc macDuRachRsrcRspOpts[] =
 {
@@ -70,7 +54,7 @@ uint8_t sendRachIndMacToSch(RachIndInfo *rachInd)
    Pst pst;
 
    FILL_PST_MAC_TO_SCH(pst, EVENT_RACH_IND_TO_SCH);
-   return(*macSchRachIndOpts[pst.selector])(&pst, rachInd); 
+   return(SchMessageRouter(&pst, (void *)rachInd));
 }
 
 /*******************************************************************
@@ -138,8 +122,13 @@ uint8_t createMacRaCb(MacCellCb *cellCb, RachIndInfo *rachIndInfo)
       GET_CRNTI(crnti, ueIdx+1);
 
       /* Store in raCb */
+      memset(&cellCb->macRaCb[ueIdx], 0, sizeof(MacRaCbInfo));
       cellCb->macRaCb[ueIdx].cellId = rachIndInfo->cellId;
       cellCb->macRaCb[ueIdx].crnti  = crnti;
+
+     /* Initialize MSG4 HARQ PROC CB */
+     cellCb->macRaCb[ueIdx].msg4HqInfo.procId = MAX_NUM_HARQ_PROC;
+
    }
 
    /* Store in Rach Indication message to be sent to SCH */
@@ -270,7 +259,7 @@ uint8_t MacProcRachRsrcReq(Pst *pst, MacRachRsrcReq *rachRsrcReq)
 
             /* Send RACH resource request from MAC to SCH */
             FILL_PST_MAC_TO_SCH(schPst, EVENT_RACH_RESOURCE_REQUEST_TO_SCH);
-            ret = (*macSchRachRsrcReqOpts[schPst.selector])(&schPst, schRachRsrcReq);
+            ret = SchMessageRouter(&schPst, (void *)schRachRsrcReq);
          }
          else
             DU_LOG("\nERROR  -->  MAC : Memory allocation failed for RACH resource request to SCH");
@@ -382,6 +371,77 @@ uint8_t MacProcSchRachRsrcRsp(Pst *pst, SchRachRsrcRsp *schRachRsrcRsp)
    return (*macDuRachRsrcRspOpts[rspPst.selector])(&rspPst, rachRsrcRsp);
 }
 
+
+/*******************************************************************
+ *
+ * @brief Processes RACH Resource release from DU APP
+ *
+ * @details
+ *
+ *    Function : MacProcRachRsrcRel
+ *
+ *    Functionality: Processes RACH resource release from DU APP.
+ *      Fills and sends RACH resource release towards SCH.
+ *
+ * @params[in] Post structure
+ *             RACH resource release
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t MacProcRachRsrcRel(Pst *pst, MacRachRsrcRel *rachRsrcRel)
+{
+   uint8_t   ret = RFAILED;
+   uint16_t  cellIdx = 0;
+   Pst       schPst;
+   MacCellCb *cellCb = NULLP;
+   MacUeCb   *ueCb = NULLP;
+   SchRachRsrcRel *schRachRsrcRel = NULLP;
+
+   DU_LOG("\nINFO  -->  MAC : Recieved RACH Resource Release for Cell ID [%d] UE ID [%d]",\
+         rachRsrcRel->cellId, rachRsrcRel->ueId);
+
+   /* Fetch Cell Cb */
+   GET_CELL_IDX(rachRsrcRel->cellId, cellIdx);
+   if(macCb.macCell[cellIdx] && (macCb.macCell[cellIdx]->cellId == rachRsrcRel->cellId))
+   {
+      cellCb = macCb.macCell[cellIdx];
+
+      /* Fetch UE Cb */
+      if(cellCb->ueCb[rachRsrcRel->ueId-1].ueId == rachRsrcRel->ueId)
+      {
+         ueCb = &cellCb->ueCb[rachRsrcRel->ueId-1];
+         /* Allocate memory to RACH resource release to be sent to SCH */
+         MAC_ALLOC(schRachRsrcRel, sizeof(SchRachRsrcRel));
+         if(schRachRsrcRel)
+         {
+            /* Fill SCH RACH resource release from information received from DU APP to MAC */
+            memset(schRachRsrcRel, 0, sizeof(SchRachRsrcRel));
+            schRachRsrcRel->cellId = rachRsrcRel->cellId;
+            schRachRsrcRel->crnti = ueCb->crnti;
+            memcpy(&schRachRsrcRel->cfraResource, &ueCb->cfraResource, sizeof(schRachRsrcRel->cfraResource));
+            
+            /* Release RACH resources at MAC */
+            memset(&ueCb->cfraResource, 0, sizeof(MacCfraResource));
+
+            /* Send RACH resource release from MAC to SCH */
+            FILL_PST_MAC_TO_SCH(schPst, EVENT_RACH_RESOURCE_RELEASE_TO_SCH);
+            ret = SchMessageRouter(&schPst, (void *)schRachRsrcRel);
+         }
+         else
+            DU_LOG("\nERROR  -->  MAC : Memory allocation failed for RACH resource release to SCH");
+      }
+      else
+         DU_LOG("\nERROR  -->  MAC : UE ID [%d] not found", rachRsrcRel->ueId);
+   }
+   else
+      DU_LOG("\nERROR  -->  MAC : Cell ID [%d] not found", rachRsrcRel->cellId);
+
+   /* Free sharable buffer used to send RACH reource release from DU APP to MAC */
+   MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rachRsrcRel, sizeof(MacRachRsrcRel));
+   return ret;
+}
+
 /* spec-38.211 Table 6.3.3.1-7 */
 uint8_t UnrestrictedSetNcsTable[MAX_ZERO_CORR_CFG_IDX] = 
 {0, 2, 4, 6, 8, 10, 12, 13, 15, 17, 19, 23, 27, 34, 46, 69};
@@ -414,7 +474,7 @@ uint8_t MacProcUlSchInfo(Pst *pst, UlSchedInfo *ulSchedInfo)
    if(ulSchedInfo != NULLP)
    {
       MacUlSlot *currUlSlot = 
-        &macCb.macCell[cellIdx]->ulSlot[ulSchedInfo->slotIndInfo.slot % MAX_SLOTS];
+        &macCb.macCell[cellIdx]->ulSlot[ulSchedInfo->slotIndInfo.slot % macCb.macCell[cellIdx]->numOfSlots];
       memcpy(&currUlSlot->ulInfo, ulSchedInfo, sizeof(UlSchedInfo)); 
    }
    return ROK;