+MacCb macCb;
+
+uint16_t buildMacPdu(RlcData *dlData);
+#ifdef EGTP_TEST
+void macStubBuildUlData(Buffer *mBuf);
+#endif
+
+/* 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
+ *
+ * @details
+ *
+ * Function : sendDlRlcBoInfoToSch
+ *
+ * Functionality:
+ * Sends DL BO Info to SCH
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ ****************************************************************/
+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);
+}
+
+/*******************************************************************
+ *
+ * @brief Sends CRC Indication to SCH
+ *
+ * @details
+ *
+ * Function : sendCrcIndMacToSch
+ *
+ * Functionality:
+ * Sends CRC Indication to SCH
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ ****************************************************************/
+uint8_t sendCrcIndMacToSch(CrcIndInfo *crcInd)
+{
+ Pst pst;
+
+ FILL_PST_MAC_TO_SCH(pst, EVENT_CRC_IND_TO_SCH);
+ return(*macSchCrcIndOpts[pst.selector])(&pst, crcInd);
+}
+
+/*******************************************************************
+ *
+ * @brief Processes CRC Indication from PHY
+ *
+ * @details
+ *
+ * Function : fapiMacCrcInd
+ *
+ * Functionality:
+ * Processes CRC Indication from PHY
+ *
+ * @params[in] Post Structure Pointer
+ * Crc Indication Pointer
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t fapiMacCrcInd(Pst *pst, CrcInd *crcInd)
+{
+ uint16_t cellIdx;
+ CrcIndInfo crcIndInfo;
+ DU_LOG("\nDEBUG --> MAC : Received CRC indication");
+ GET_CELL_IDX(crcInd->cellId, cellIdx);
+ /* Considering one pdu and one preamble */
+ crcIndInfo.cellId = macCb.macCell[cellIdx]->cellId;
+ crcIndInfo.crnti = crcInd->crcInfo[0].rnti;
+ crcIndInfo.timingInfo.sfn = crcInd->timingInfo.sfn;
+ crcIndInfo.timingInfo.slot = crcInd->timingInfo.slot;
+ crcIndInfo.numCrcInd = crcInd->crcInfo[0].numCb;
+ crcIndInfo.crcInd[0] = crcInd->crcInfo[0].cbCrcStatus[0];
+
+ MAC_FREE_SHRABL_BUF(pst->region, pst->pool, crcInd, sizeof(CrcInd));
+ return(sendCrcIndMacToSch(&crcIndInfo));
+}
+
+/*******************************************************************
+ *
+ * @brief Process Rx Data Ind at MAC
+ *
+ * @details
+ *
+ * Function : fapiMacRxDataInd
+ *
+ * Functionality:
+ * Process Rx Data Ind at MAC
+ *
+ * @params[in] Post structure
+ * Rx Data Indication
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t fapiMacRxDataInd(Pst *pst, RxDataInd *rxDataInd)
+{
+ uint16_t pduIdx;
+ 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]);
+ MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rxDataInd->pdus[pduIdx].pduData,\
+ rxDataInd->pdus[pduIdx].pduLength);
+ }
+ MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rxDataInd, sizeof(RxDataInd));
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes DL data from RLC
+ *
+ * @details
+ *
+ * Function : MacProcRlcDlData
+ *
+ * Functionality:
+ * Processes DL data from RLC
+ *
+ * @params[in] Post structure
+ * DL data
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData)
+{
+ uint8_t pduIdx =0;
+ uint8_t lcIdx = 0;
+ uint8_t *txPdu =NULLP;
+ uint16_t tbSize =0;
+ MacDlData macDlData;
+ MacDlSlot *currDlSlot = NULLP;
+ DlRlcBoInfo dlBoInfo;
+
+ memset(&macDlData , 0, sizeof(MacDlData));
+ DU_LOG("\nDEBUG --> MAC: Received DL data for sfn=%d slot=%d numPdu= %d", \
+ dlData->slotInfo.sfn, dlData->slotInfo.slot, dlData->numPdu);
+ /* Copy the pdus to be muxed into mac Dl data */
+ macDlData.numPdu = dlData->numPdu;
+ for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++)
+ {
+ macDlData.pduInfo[pduIdx].lcId = dlData->pduInfo[pduIdx].lcId;
+ macDlData.pduInfo[pduIdx].pduLen = dlData->pduInfo[pduIdx].pduLen;
+ macDlData.pduInfo[pduIdx].dlPdu = dlData->pduInfo[pduIdx].pduBuf;
+ }
+
+ /* Store DL data in the scheduled slot */
+ currDlSlot = &macCb.macCell[dlData->cellId -1]->dlSlot[dlData->slotInfo.slot];
+ if(currDlSlot)
+ {
+ if(currDlSlot->dlInfo.dlMsgAlloc)
+ {
+ tbSize = currDlSlot->dlInfo.dlMsgAlloc->dlMsgPdschCfg.codeword[0].tbSize;
+ MAC_ALLOC(txPdu, tbSize);
+ if(!txPdu)
+ {
+ DU_LOG("\nERROR --> MAC : Memory allocation failed in MacProcRlcDlData");
+ return RFAILED;
+ }
+ macMuxPdu(&macDlData, NULLP, txPdu, tbSize);
+
+ currDlSlot->dlInfo.dlMsgAlloc->dlMsgInfo.dlMsgPduLen = tbSize;
+ currDlSlot->dlInfo.dlMsgAlloc->dlMsgInfo.dlMsgPdu = txPdu;
+ }
+ }
+
+ for(lcIdx = 0; lcIdx < dlData->numLc; lcIdx++)
+ {
+ if(dlData->boStatus[lcIdx].bo)
+ {
+ memset(&dlBoInfo, 0, sizeof(DlRlcBoInfo));
+ dlBoInfo.cellId = dlData->boStatus[lcIdx].cellId;
+ GET_CRNTI(dlBoInfo.crnti, dlData->boStatus[lcIdx].ueIdx);
+ dlBoInfo.lcId = dlData->boStatus[lcIdx].lcId;
+ dlBoInfo.dataVolume = dlData->boStatus[lcIdx].bo;
+ sendDlRlcBoInfoToSch(&dlBoInfo);
+ }
+ }
+
+ /* Free memory */
+ for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++)
+ {
+ MAC_FREE_SHRABL_BUF(pstInfo->region, pstInfo->pool, dlData->pduInfo[pduIdx].pduBuf,\
+ dlData->pduInfo[pduIdx].pduLen);
+ }
+ if(pstInfo->selector == ODU_SELECTOR_LWLC)
+ {
+ MAC_FREE_SHRABL_BUF(pstInfo->region, pstInfo->pool, dlData, sizeof(RlcData));
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds and Sends UL Data to RLC
+ *
+ * @details
+ *
+ * Function : macProcUlData
+ *
+ * Functionality: Builds and Sends UL Data to RLC
+ *
+ * @params[in] CellId
+ * CRNTI
+ * Slot information
+ * LC Id on which payload was received
+ * Pointer to the payload
+ * Length of payload
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t macProcUlData(uint16_t cellId, uint16_t rnti, SlotIndInfo slotInfo, \
+uint8_t lcId, uint16_t pduLen, uint8_t *pdu)
+{
+ Pst pst;
+ RlcData *ulData;
+
+ /* Filling RLC Ul Data*/
+ MAC_ALLOC_SHRABL_BUF(ulData, sizeof(RlcData));
+ if(!ulData)
+ {
+ DU_LOG("\nERROR --> MAC : Memory allocation failed while sending UL data to RLC");
+ return RFAILED;
+ }
+ memset(ulData, 0, sizeof(RlcData));
+ ulData->cellId = cellId;
+ ulData->rnti = rnti;
+ memcpy(&ulData->slotInfo, &slotInfo, sizeof(SlotIndInfo));
+ 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;
+ ulData->numPdu++;
+
+ /* Filling Post and send to RLC */
+ memset(&pst, 0, sizeof(Pst));
+ FILL_PST_MAC_TO_RLC(pst, 0, EVENT_UL_DATA_TO_RLC);
+ MacSendUlDataToRlc(&pst, ulData);
+
+ return ROK;
+}
+
+
+/*******************************************************************
+ *
+ * @brief Processes BO status from RLC
+ *
+ * @details
+ *
+ * Function : MacProcRlcBOStatus
+ *
+ * Functionality:
+ * Processes BO status from RLC
+ *
+ * @params[in] Post structure
+ * BO status
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t MacProcRlcBoStatus(Pst* pst, RlcBoStatus* boStatus)
+{
+ DlRlcBoInfo dlBoInfo;
+
+ dlBoInfo.cellId = boStatus->cellId;
+ GET_CRNTI(dlBoInfo.crnti, boStatus->ueIdx);
+ dlBoInfo.lcId = boStatus->lcId;
+ dlBoInfo.dataVolume = boStatus->bo;
+
+ sendDlRlcBoInfoToSch(&dlBoInfo);
+
+ if(pst->selector == ODU_SELECTOR_LWLC)
+ {
+ MAC_FREE_SHRABL_BUF(pst->region, pst->pool, boStatus, sizeof(RlcBoStatus));
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Send LC schedule result report to RLC
+ *
+ * @details
+ *
+ * Function : sendSchRptToRlc
+ *
+ * Functionality: Send LC schedule result report to RLC
+ *
+ * @params[in]
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t sendSchedRptToRlc(DlSchedInfo dlInfo, SlotIndInfo slotInfo)
+{
+ Pst pst;
+ uint8_t lcIdx;
+ RlcSchedResultRpt *schedRpt = NULLP;
+
+ MAC_ALLOC_SHRABL_BUF(schedRpt, sizeof(RlcSchedResultRpt));
+ if(!schedRpt)
+ {
+ DU_LOG("\nERROR --> MAC: Memory allocation failure in sendSchResultRepToRlc");
+ return RFAILED;
+ }
+
+ DU_LOG("\nDEBUG --> MAC: Send scheduled result report for sfn %d slot %d", slotInfo.sfn, slotInfo.slot);
+ schedRpt->cellId = dlInfo.cellId;
+ schedRpt->rnti = dlInfo.dlMsgAlloc->crnti;
+ schedRpt->numLc = dlInfo.dlMsgAlloc->numLc;
+ schedRpt->slotInfo.sfn = slotInfo.sfn;
+ schedRpt->slotInfo.slot = slotInfo.slot;
+
+ for(lcIdx = 0; lcIdx < schedRpt->numLc; lcIdx++)
+ {
+ schedRpt->lcSch[lcIdx].lcId = dlInfo.dlMsgAlloc->lcSchInfo[lcIdx].lcId;
+ schedRpt->lcSch[lcIdx].bufSize = dlInfo.dlMsgAlloc->lcSchInfo[lcIdx].schBytes;
+ schedRpt->lcSch[lcIdx].commCh = false;
+ }
+
+ /* Fill Pst */
+ FILL_PST_MAC_TO_RLC(pst, RLC_DL_INST, EVENT_SCHED_RESULT_TO_RLC);
+ if(MacSendSchedResultRptToRlc(&pst, schedRpt) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC: Failed to send Schedule result report to RLC");
+ MAC_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, schedRpt, sizeof(RlcSchedResultRpt));
+ return RFAILED;
+ }
+
+ return ROK;
+}
+