[Epic-ID: ODUHIGH-488][Task-ID: ODUHIGH-492] WG8 Alignment [RAR Scheduling + Downlink...
[o-du/l2.git] / src / 5gnrmac / mac_msg_hdl.c
index bb3e658..0369b2c 100644 (file)
 #include "lwr_mac_upr_inf.h"
 #include "mac.h"
 #include "mac_utils.h"
+#include "mac_harq_dl.h"
 
 /* This file contains message handling functionality for MAC */
 
 MacCb  macCb;
 
-/* Function pointer for sending crc ind from MAC to SCH */
-MacSchCrcIndFunc macSchCrcIndOpts[]=
-{
-   packMacSchCrcInd,
-   MacSchCrcInd,
-   packMacSchCrcInd
-};
-
-/* Function pointer for sending DL RLC BO Info from MAC to SCH */
-MacSchDlRlcBoInfoFunc macSchDlRlcBoInfoOpts[]=
-{
-   packMacSchDlRlcBoInfo,
-   MacSchDlRlcBoInfo,
-   packMacSchDlRlcBoInfo
-};
-
-/* Function pointer for sending short BSR from MAC to SCH */
-MacSchBsrFunc macSchBsrOpts[]=
-{
-   packMacSchBsr,
-   MacSchBsr,
-   packMacSchBsr
-};
-
-/* Function pointer for sending SR Uci ind from MAC to SCH */
-MacSchSrUciIndFunc macSchSrUciIndOpts[]=
-{
-   packMacSchSrUciInd,
-   MacSchSrUciInd,
-   packMacSchSrUciInd
-};
-
 /*******************************************************************
  *
  * @brief Sends DL BO Info to SCH
@@ -90,7 +59,7 @@ uint8_t sendDlRlcBoInfoToSch(DlRlcBoInfo *dlBoInfo)
    Pst pst;
 
    FILL_PST_MAC_TO_SCH(pst, EVENT_DL_RLC_BO_INFO_TO_SCH);
-   return(*macSchDlRlcBoInfoOpts[pst.selector])(&pst, dlBoInfo);
+   return(SchMessageRouter(&pst, (void *)dlBoInfo));
 }
 
 /*******************************************************************
@@ -114,7 +83,7 @@ uint8_t sendCrcIndMacToSch(CrcIndInfo *crcInd)
    Pst pst;
 
    FILL_PST_MAC_TO_SCH(pst, EVENT_CRC_IND_TO_SCH);
-   return(*macSchCrcIndOpts[pst.selector])(&pst, crcInd);
+   return(SchMessageRouter(&pst, (void *)crcInd));
 }
 
 /*******************************************************************
@@ -171,14 +140,26 @@ uint8_t fapiMacCrcInd(Pst *pst, CrcInd *crcInd)
  * ****************************************************************/
 uint8_t fapiMacRxDataInd(Pst *pst, RxDataInd *rxDataInd)
 {
-   uint16_t pduIdx;
+   uint8_t ueId = 0;
+   uint16_t pduIdx, cellIdx = 0;
    DU_LOG("\nDEBUG  -->  MAC : Received Rx Data indication");
    /* TODO : compare the handle received in RxDataInd with handle send in PUSCH
     * PDU, which is stored in raCb */
 
    for(pduIdx = 0; pduIdx < rxDataInd->numPdus; pduIdx++)
    {
-      unpackRxData(rxDataInd->cellId, rxDataInd->timingInfo, &rxDataInd->pdus[pduIdx]);
+
+      GET_CELL_IDX(rxDataInd->cellId, cellIdx);
+      GET_UE_ID(rxDataInd->pdus[pduIdx].rnti, ueId);
+      
+      if(macCb.macCell[cellIdx] && macCb.macCell[cellIdx]->ueCb[ueId -1].transmissionAction == STOP_TRANSMISSION)
+      {
+         DU_LOG("\nINFO   -->  MAC : UL data transmission not allowed for UE %d", macCb.macCell[cellIdx]->ueCb[ueId -1].ueId);
+      }
+      else
+      {
+         unpackRxData(rxDataInd->cellId, rxDataInd->timingInfo, &rxDataInd->pdus[pduIdx]);
+      }
       MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rxDataInd->pdus[pduIdx].pduData,\
          rxDataInd->pdus[pduIdx].pduLength);
    }
@@ -203,13 +184,12 @@ uint8_t fapiMacRxDataInd(Pst *pst, RxDataInd *rxDataInd)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData)
+uint8_t MacProcRlcDlData(Pst* pstInfo, RlcDlData *dlData)
 {
    uint8_t   pduIdx = 0;
    uint8_t   ueId  = 0;
    uint8_t   lcIdx = 0;
    uint8_t   *txPdu = NULLP;
-   uint8_t   schInfoIdx = 0 ;
    uint16_t  cellIdx = 0, txPduLen = 0;
    MacDlData macDlData;
    MacDlSlot *currDlSlot = NULLP;
@@ -219,7 +199,7 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData)
    DU_LOG("\nDEBUG  -->  MAC: Received DL data for sfn=%d slot=%d numPdu= %d", \
       dlData->slotInfo.sfn, dlData->slotInfo.slot, dlData->numPdu);
 
-   GET_UE_IDX(dlData->rnti, ueId);   
+   GET_UE_ID(dlData->rnti, ueId);   
 
    /* Copy the pdus to be muxed into mac Dl data */
    macDlData.ueId = ueId;
@@ -241,25 +221,25 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData)
    currDlSlot = &macCb.macCell[cellIdx]->dlSlot[dlData->slotInfo.slot];
    if(currDlSlot->dlInfo.dlMsgAlloc[ueId-1])
    {
-      for(schInfoIdx=0; schInfoIdx<currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->numSchedInfo; schInfoIdx++)
-      {
-         if((currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].pduPres == PDSCH_PDU) ||
-               (currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].pduPres == BOTH))
-            break;
-      }
-
-      txPduLen = currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgPdschCfg.codeword[0].tbSize\
-                 - TX_PAYLOAD_HDR_LEN;
-      MAC_ALLOC(txPdu, txPduLen);
-      if(!txPdu)
+      if(currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgPdschCfg)
       {
-         DU_LOG("\nERROR  -->  MAC : Memory allocation failed in MacProcRlcDlData");
-         return RFAILED;
+         txPduLen = currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgPdschCfg->codeword[0].tbSize\
+                    - TX_PAYLOAD_HDR_LEN;
+         MAC_ALLOC(txPdu, txPduLen);
+         if(!txPdu)
+         {
+            DU_LOG("\nERROR  -->  MAC : Memory allocation failed in MacProcRlcDlData");
+            return RFAILED;
+         }
+         macMuxPdu(&macDlData, NULLP, txPdu, txPduLen);
+
+         currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgPduLen = txPduLen;
+         currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgPdu = txPdu;
+         /* Add muxed TB to DL HARQ Proc CB. This will be used if retranmission of
+          * TB is requested in future. */
+         updateNewTbInDlHqProcCb(dlData->slotInfo, &macCb.macCell[cellIdx]->ueCb[ueId -1], \
+               currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgPdschCfg->codeword[0].tbSize, txPdu);
       }
-      macMuxPdu(&macDlData, NULLP, txPdu, txPduLen);
-
-      currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPduLen = txPduLen;
-      currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPdu = txPdu;
    }
 
    for(lcIdx = 0; lcIdx < dlData->numLc; lcIdx++)
@@ -268,7 +248,7 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData)
       {
          memset(&dlBoInfo, 0, sizeof(DlRlcBoInfo));
          dlBoInfo.cellId = dlData->boStatus[lcIdx].cellId;
-         GET_CRNTI(dlBoInfo.crnti, dlData->boStatus[lcIdx].ueIdx);
+         GET_CRNTI(dlBoInfo.crnti, dlData->boStatus[lcIdx].ueId);
          dlBoInfo.lcId = dlData->boStatus[lcIdx].lcId;
          dlBoInfo.dataVolume = dlData->boStatus[lcIdx].bo;
          sendDlRlcBoInfoToSch(&dlBoInfo);
@@ -283,7 +263,7 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData)
    }
    if(pstInfo->selector == ODU_SELECTOR_LWLC)
    {
-      MAC_FREE_SHRABL_BUF(pstInfo->region, pstInfo->pool, dlData, sizeof(RlcData));
+      MAC_FREE_SHRABL_BUF(pstInfo->region, pstInfo->pool, dlData, sizeof(RlcDlData));
    }
    return ROK;
 }
@@ -312,26 +292,22 @@ uint8_t macProcUlData(uint16_t cellId, uint16_t rnti, SlotTimingInfo slotInfo, \
 uint8_t lcId, uint16_t pduLen, uint8_t *pdu)
 {
    Pst         pst;
-   RlcData     *ulData;
+   RlcUlData     *ulData;
 
    /* Filling RLC Ul Data*/
-   MAC_ALLOC_SHRABL_BUF(ulData, sizeof(RlcData));
+   MAC_ALLOC_SHRABL_BUF(ulData, sizeof(RlcUlData));
    if(!ulData)
    {
       DU_LOG("\nERROR  -->  MAC : Memory allocation failed while sending UL data to RLC");
       return RFAILED;
    }
-   memset(ulData, 0, sizeof(RlcData));
+   memset(ulData, 0, sizeof(RlcUlData));
    ulData->cellId = cellId; 
    ulData->rnti = rnti;
    memcpy(&ulData->slotInfo, &slotInfo, sizeof(SlotTimingInfo));
    ulData->slotInfo.cellId = cellId;
 
    /* Filling pdu info */
-   if(lcId == SRB1_LCID || lcId == SRB2_LCID)
-   {
-      ulData->pduInfo[ulData->numPdu].commCh = true;
-   }
    ulData->pduInfo[ulData->numPdu].lcId = lcId;
    ulData->pduInfo[ulData->numPdu].pduBuf = pdu;
    ulData->pduInfo[ulData->numPdu].pduLen = pduLen;
@@ -368,7 +344,7 @@ uint8_t MacProcRlcBoStatus(Pst* pst, RlcBoStatus* boStatus)
    DlRlcBoInfo  dlBoInfo;
 
    dlBoInfo.cellId = boStatus->cellId;
-   GET_CRNTI(dlBoInfo.crnti, boStatus->ueIdx);
+   GET_CRNTI(dlBoInfo.crnti, boStatus->ueId);
    dlBoInfo.lcId = boStatus->lcId;
    dlBoInfo.dataVolume = boStatus->bo;
    
@@ -418,12 +394,11 @@ uint8_t sendSchedRptToRlc(DlSchedInfo dlInfo, SlotTimingInfo slotInfo, uint8_t u
    if(dlInfo.dlMsgAlloc[ueIdx])
    {
       schedRpt->rnti = dlInfo.dlMsgAlloc[ueIdx]->crnti;
-      schedRpt->numLc = dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].numLc;
+      schedRpt->numLc = dlInfo.dlMsgAlloc[ueIdx]->transportBlock[0].numLc;
       for(lcIdx = 0; lcIdx < schedRpt->numLc; lcIdx++)
       {
-         schedRpt->lcSch[lcIdx].lcId = dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].lcSchInfo[lcIdx].lcId;
-         schedRpt->lcSch[lcIdx].bufSize = dlInfo.dlMsgAlloc[ueIdx]->dlMsgSchedInfo[schInfoIdx].lcSchInfo[lcIdx].schBytes;
-         schedRpt->lcSch[lcIdx].commCh = false;
+         schedRpt->lcSch[lcIdx].lcId = dlInfo.dlMsgAlloc[ueIdx]->transportBlock[0].lcSchInfo[lcIdx].lcId;
+         schedRpt->lcSch[lcIdx].bufSize = dlInfo.dlMsgAlloc[ueIdx]->transportBlock[0].lcSchInfo[lcIdx].schBytes;
       }
    }
 
@@ -456,14 +431,14 @@ uint8_t sendSchedRptToRlc(DlSchedInfo dlInfo, SlotTimingInfo slotInfo, uint8_t u
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t MacProcCellStart(Pst *pst, OduCellId  *cellId)
+uint8_t MacProcCellStart(Pst *pst, CellStartInfo  *cellStart)
 {
    DU_LOG("\nINFO  -->  MAC : Handling cell start request");
    gSlotCount = 0;
-   sendToLowerMac(START_REQUEST, 0, cellId);
+   sendToLowerMac(START_REQUEST, 0, cellStart);
 
-   MAC_FREE_SHRABL_BUF(pst->region, pst->pool, cellId, \
-        sizeof(OduCellId));
+   MAC_FREE_SHRABL_BUF(pst->region, pst->pool, cellStart, \
+        sizeof(CellStartInfo));
 
    return ROK;
 }
@@ -485,21 +460,21 @@ uint8_t MacProcCellStart(Pst *pst, OduCellId  *cellId)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t MacProcCellStop(Pst *pst, OduCellId  *cellId)
+uint8_t MacProcCellStop(Pst *pst, CellStopInfo  *cellStop)
 {
 #ifdef INTEL_FAPI
    uint16_t      cellIdx; 
 
    DU_LOG("\nINFO  -->  MAC : Sending cell stop request to Lower Mac");
-   GET_CELL_IDX(cellId->cellId, cellIdx);
+   GET_CELL_IDX(cellStop->cellId, cellIdx);
    if(macCb.macCell[cellIdx])
    {
       macCb.macCell[cellIdx]->state = CELL_TO_BE_STOPPED;
    }
 #endif
 
-   MAC_FREE_SHRABL_BUF(pst->region, pst->pool, cellId, \
-        sizeof(OduCellId));
+   MAC_FREE_SHRABL_BUF(pst->region, pst->pool, cellStop, \
+        sizeof(CellStopInfo));
 
    return ROK;
 }
@@ -523,7 +498,7 @@ uint8_t MacProcCellStop(Pst *pst, OduCellId  *cellId)
  * ****************************************************************/
 uint8_t MacProcDlCcchInd(Pst *pst, DlCcchIndInfo *dlCcchIndInfo)
 {
-   uint8_t      ueIdx = 0;
+   uint8_t      ueId = 0, ueIdx = 0;
    uint16_t     cellIdx;
    uint16_t     idx;
    DlRlcBoInfo  dlBoInfo;
@@ -543,8 +518,8 @@ uint8_t MacProcDlCcchInd(Pst *pst, DlCcchIndInfo *dlCcchIndInfo)
       dlBoInfo.dataVolume = (dlCcchIndInfo->dlCcchMsgLen + 3) + (MAX_CRI_SIZE + 1);
 
       /* storing Msg4 Pdu in raCb */
-      GET_UE_IDX(dlBoInfo.crnti, ueIdx);
-      ueIdx = ueIdx -1;
+      GET_UE_ID(dlBoInfo.crnti, ueId);
+      ueIdx = ueId -1;
       if(macCb.macCell[cellIdx]->macRaCb[ueIdx].crnti == dlCcchIndInfo->crnti)
       {
         macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen = dlCcchIndInfo->dlCcchMsgLen;
@@ -633,6 +608,8 @@ uint8_t macProcUlCcchInd(uint16_t cellId, uint16_t crnti, uint16_t rrcContSize,
  *             lcg ID
  *             buffer size
  *
+ * @return ROK     - success
+ *         RFAILED - failure
  *
  * ****************************************************************/
 uint8_t macProcShortBsr(uint16_t cellId, uint16_t crnti, uint8_t lcgId, uint32_t bufferSize)
@@ -651,9 +628,96 @@ uint8_t macProcShortBsr(uint16_t cellId, uint16_t crnti, uint8_t lcgId, uint32_t
    bsrInd.dataVolInfo[0].dataVol = bufferSize;
 
    FILL_PST_MAC_TO_SCH(pst, EVENT_SHORT_BSR);
-   return(*macSchBsrOpts[pst.selector])(&pst, &bsrInd);
+   return(SchMessageRouter(&pst, (void *)&bsrInd));
+}
+
+/*******************************************************************
+ *
+ * @brief Processes received short BSR
+ *
+ * @details
+ *
+ *    Function : macProcShortBsr
+ *
+ *    Functionality:
+ *        MAC sends Short BSR to SCH
+ *
+ * @params[in] cell ID
+ *             crnti
+ *             lcg ID
+ *             buffer size
+ *
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t macProcLongBsr(uint16_t cellId, uint16_t crnti,uint8_t numLcg,\
+                         DataVolInfo dataVolInfo[MAX_NUM_LOGICAL_CHANNEL_GROUPS])
+{
+   Pst                  pst;
+   UlBufferStatusRptInd bsrInd;
+   uint8_t lcgIdx = 0;
+
+   memset(&pst, 0, sizeof(Pst));
+   memset(&bsrInd, 0, sizeof(UlBufferStatusRptInd));
+
+   bsrInd.cellId                 = cellId;
+   bsrInd.crnti                  = crnti;
+   bsrInd.bsrType                = LONG_BSR;
+   bsrInd.numLcg                 = numLcg; 
+
+   for(lcgIdx = 0; lcgIdx < numLcg; lcgIdx++)
+      memcpy(&(bsrInd.dataVolInfo[lcgIdx]), &(dataVolInfo[lcgIdx]), sizeof(DataVolInfo));
+
+   FILL_PST_MAC_TO_SCH(pst, EVENT_LONG_BSR);
+   return(SchMessageRouter(&pst, (void *)&bsrInd));
+}
+
+/*******************************************************************
+ *
+ * @brief Builds and send DL HARQ Indication to SCH
+ *
+ * @details
+ *
+ *    Function : buildAndSendHarqInd
+ *
+ *    Functionality:
+ *       Builds and send HARQ UCI Indication to SCH
+ *
+ * @params[in] harqInfo Pointer
+ *             crnti value
+ *             cell Index value
+ *             slot Ind Pointer
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t buildAndSendHarqInd(HarqInfoF0F1 *harqInfo, uint8_t crnti, uint16_t cellIdx, SlotTimingInfo *slotInd)
+{
+   uint16_t harqCounter=0;
+   Pst pst;
+   DlHarqInd   dlHarqInd;
+   memset(&pst, 0, sizeof(Pst));
+   memset(&dlHarqInd, 0, sizeof(DlHarqInd));
+
+   dlHarqInd.cellId       = macCb.macCell[cellIdx]->cellId;
+   dlHarqInd.crnti        = crnti;
+   dlHarqInd.slotInd.sfn  = slotInd->sfn;
+   dlHarqInd.slotInd.slot = slotInd->slot;
+   dlHarqInd.numHarq      = harqInfo->numHarq;
+   memset(dlHarqInd.harqPayload, 0, MAX_SR_BITS_IN_BYTES);
+   for(harqCounter = 0; harqCounter < harqInfo->numHarq; harqCounter++)
+   {
+      dlHarqInd.harqPayload[harqCounter] = harqInfo->harqValue[harqCounter];
+   }
+   
+   /* Fill Pst */
+   FILL_PST_MAC_TO_SCH(pst, EVENT_DL_HARQ_IND_TO_SCH);
+
+   return SchMessageRouter(&pst, (void *)&dlHarqInd);
 }
 
+
 /*******************************************************************
  *
  * @brief Builds and send SR UCI Indication to SCH
@@ -690,7 +754,7 @@ uint8_t buildAndSendSrInd(UciInd *macUciInd, uint8_t crnti)
    /* Fill Pst */
    FILL_PST_MAC_TO_SCH(pst, EVENT_UCI_IND_TO_SCH);
 
-   return(*macSchSrUciIndOpts[pst.selector])(&pst, &srUciInd);
+   return(SchMessageRouter(&pst, (void *)&srUciInd));
 }
 
 /*******************************************************************
@@ -712,10 +776,8 @@ uint8_t buildAndSendSrInd(UciInd *macUciInd, uint8_t crnti)
  * ****************************************************************/
 uint8_t FapiMacUciInd(Pst *pst, UciInd *macUciInd)
 {
-   uint8_t     pduIdx = 0;
-   uint8_t     ret = ROK;
-   uint16_t    nPdus;
-   uint16_t    crnti;
+   uint8_t     pduIdx = 0, ret = ROK;
+   uint16_t    nPdus = 0, crnti = 0, cellIdx = 0;
 
    if(macUciInd)
    {
@@ -727,12 +789,19 @@ uint8_t FapiMacUciInd(Pst *pst, UciInd *macUciInd)
             case UCI_IND_PUSCH:
                break;
             case UCI_IND_PUCCH_F0F1:
+            {
+               {
+                  DU_LOG("\nDEBUG  -->  MAC : Received HARQ UCI Indication\n");
+                  GET_CELL_IDX(macUciInd->cellId, cellIdx);
+                  buildAndSendHarqInd(&macUciInd->pdus[pduIdx].uci.uciPucchF0F1.harqInfo, macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti, cellIdx, &macUciInd->slotInd);
+               }
                if(macUciInd->pdus[pduIdx].uci.uciPucchF0F1.srInfo.srIndPres)
                {
                   DU_LOG("\nDEBUG  -->  MAC : Received SR UCI indication");
-                 crnti = macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti; 
-                 ret = buildAndSendSrInd(macUciInd, crnti);
+                  crnti = macUciInd->pdus[pduIdx].uci.uciPucchF0F1.crnti; 
+                  ret = buildAndSendSrInd(macUciInd, crnti);
                }
+            }
                break;
             case UCI_IND_PUCCH_F2F3F4:
                break;
@@ -754,6 +823,164 @@ uint8_t FapiMacUciInd(Pst *pst, UciInd *macUciInd)
    return ret;
 }
 
+/*******************************************************************
+ *
+ * @brief fill Slice Cfg Request info in shared structre
+ * 
+ * @details
+ *
+ *    Function : fillSliceCfgInfo 
+ *
+ *    Functionality:
+ *       fill Slice Cfg Request info in shared structre
+ *
+ * @params[in] SchSliceCfgReq *schSliceCfgReq 
+ *             MacSliceCfgReq *macSliceCfgReq;
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ **********************************************************************/
+uint8_t fillSliceCfgInfo(SchSliceCfgReq *schSliceCfgReq, MacSliceCfgReq *macSliceCfgReq)
+{
+   uint8_t cfgIdx = 0, memberListIdx = 0, totalSliceCfgRecvd = 0;
+
+   if(macSliceCfgReq->listOfRrmPolicy)
+   {
+      for(cfgIdx = 0; cfgIdx<macSliceCfgReq->numOfRrmPolicy; cfgIdx++)
+      {
+          totalSliceCfgRecvd += macSliceCfgReq->listOfRrmPolicy[cfgIdx]->numOfRrmPolicyMem;  
+      }
+
+      schSliceCfgReq->numOfConfiguredSlice =  totalSliceCfgRecvd;
+      MAC_ALLOC(schSliceCfgReq->listOfSlices, schSliceCfgReq->numOfConfiguredSlice *sizeof(SchRrmPolicyOfSlice*));
+      if(schSliceCfgReq->listOfSlices == NULLP)
+      {
+         DU_LOG("\nERROR  -->  MAC : Memory allocation failed in fillSliceCfgInfo");
+         return RFAILED;
+      }
+      for(cfgIdx = 0; cfgIdx<schSliceCfgReq->numOfConfiguredSlice; cfgIdx++)
+      {
+         for(memberListIdx = 0; memberListIdx<macSliceCfgReq->listOfRrmPolicy[cfgIdx]->numOfRrmPolicyMem; memberListIdx++)
+         {
+            if(macSliceCfgReq->listOfRrmPolicy[cfgIdx]->rRMPolicyMemberList[memberListIdx])
+            {
+
+               MAC_ALLOC(schSliceCfgReq->listOfSlices[cfgIdx], sizeof(SchRrmPolicyOfSlice));
+               if(schSliceCfgReq->listOfSlices[cfgIdx] == NULLP)
+               {
+                  DU_LOG("\nERROR  -->  MAC : Memory allocation failed in fillSliceCfgInfo");
+                  return RFAILED;
+               }
+
+               memcpy(&schSliceCfgReq->listOfSlices[cfgIdx]->snssai, &macSliceCfgReq->listOfRrmPolicy[cfgIdx]->rRMPolicyMemberList[memberListIdx]->snssai, sizeof(Snssai));
+
+               schSliceCfgReq->listOfSlices[cfgIdx]->rrmPolicyRatioInfo.maxRatio = macSliceCfgReq->listOfRrmPolicy[cfgIdx]->policyRatio.maxRatio;
+               schSliceCfgReq->listOfSlices[cfgIdx]->rrmPolicyRatioInfo.minRatio = macSliceCfgReq->listOfRrmPolicy[cfgIdx]->policyRatio.minRatio;
+               schSliceCfgReq->listOfSlices[cfgIdx]->rrmPolicyRatioInfo.dedicatedRatio = macSliceCfgReq->listOfRrmPolicy[cfgIdx]->policyRatio.dedicatedRatio;
+            }
+         }
+      }
+   }
+   return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes Slice Cfg Request recived from DU
+ *
+ * @details
+ *
+ *    Function : MacProcSliceCfgReq 
+ *
+ *    Functionality:
+ *       Processes Processes Slice Cfg Request recived from DU
+ *
+ * @params[in] Post Structure Pointer
+ *             MacSliceCfgReq *macSliceCfgReq;
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ **********************************************************************/
+uint8_t MacProcSliceCfgReq(Pst *pst, MacSliceCfgReq *macSliceCfgReq)
+{
+   uint8_t ret = ROK;
+   Pst schPst;
+   SchSliceCfgReq *schSliceCfgReq;
+
+   DU_LOG("\nINFO  -->  MAC : Received Slice Cfg request from DU APP");
+   if(macSliceCfgReq)
+   {
+      MAC_ALLOC(schSliceCfgReq, sizeof(SchSliceCfgReq));
+      if(schSliceCfgReq == NULLP)
+      {
+         DU_LOG("\nERROR -->  MAC : Memory allocation failed in MacProcSliceCfgReq");
+         ret = RFAILED;
+      }
+      else
+      {
+         if(fillSliceCfgInfo(schSliceCfgReq, macSliceCfgReq) == ROK)
+         {
+            FILL_PST_MAC_TO_SCH(schPst, EVENT_SLICE_CFG_REQ_TO_SCH);
+            ret = SchMessageRouter(&schPst, (void *)schSliceCfgReq);
+         }
+      }
+      freeMacSliceCfgReq(macSliceCfgReq, pst); 
+   }
+   else
+   {
+      DU_LOG("\nINFO  -->  MAC : Received MacSliceCfgReq is NULL");
+   }
+   return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes Slice ReCfg Request recived from DU
+ *
+ * @details
+ *
+ *    Function : MacProcSliceRecfgReq 
+ *
+ *    Functionality:
+ *       Processes Processes Slice ReCfg Request recived from DU
+ *
+ * @params[in] Post Structure Pointer
+ *             MacSliceCfgReq *macSliceRecfgReq;
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ **********************************************************************/
+uint8_t MacProcSliceRecfgReq(Pst *pst, MacSliceRecfgReq *macSliceRecfgReq)
+{
+   uint8_t ret = ROK;
+   Pst schPst;
+   SchSliceRecfgReq *schSliceRecfgReq;
+
+   DU_LOG("\nINFO  -->  MAC : Received Slice ReCfg request from DU APP");
+   if(macSliceRecfgReq)
+   {
+      MAC_ALLOC(schSliceRecfgReq, sizeof(SchSliceRecfgReq));
+      if(schSliceRecfgReq == NULLP)
+      {
+         DU_LOG("\nERROR -->  MAC : Memory allocation failed in MacProcSliceRecfgReq");
+         ret = RFAILED;
+      }
+      else
+      {
+         if(fillSliceCfgInfo(schSliceRecfgReq, macSliceRecfgReq) == ROK)
+         {
+            FILL_PST_MAC_TO_SCH(schPst, EVENT_SLICE_RECFG_REQ_TO_SCH);
+            ret = SchMessageRouter(&schPst, (void *)schSliceRecfgReq);
+         }
+      }
+      freeMacSliceCfgReq(macSliceRecfgReq, pst);
+   }
+   else
+   {
+      DU_LOG("\nINFO  -->  MAC : Received MacSliceRecfgReq is NULL");
+   }
+   return ret;
+}
 
 /**********************************************************************
   End of file