#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 */
packMacSchSrUciInd
};
+/* Function pointer for sending HARQ Uci ind from MAC to SCH */
+MacSchHarqUciIndFunc macSchHarqUciIndOpts[]=
+{
+ packMacSchHarqUciInd,
+ MacSchHarqUciInd,
+ packMacSchHarqUciInd
+};
+
/* Function pointer for sending Slice cfg ind from MAC to SCH */
MacSchSliceCfgReqFunc macSchSliceCfgReqOpts[]=
{
* ****************************************************************/
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);
}
currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.dlMsgPduLen = txPduLen;
currDlSlot->dlInfo.dlMsgAlloc[ueId-1]->dlMsgSchedInfo[schInfoIdx].dlMsgInfo.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]->dlMsgSchedInfo[schInfoIdx].dlMsgPdschCfg.codeword[0].tbSize, txPdu);
}
for(lcIdx = 0; lcIdx < dlData->numLc; lcIdx++)
{
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);
ulData->slotInfo.cellId = cellId;
/* Filling pdu info */
- if(lcId == SRB1_LCID || lcId == SRB2_LCID)
- {
+ if(lcId != SRB0_LCID)
+ ulData->pduInfo[ulData->numPdu].commCh = false;
+ else
ulData->pduInfo[ulData->numPdu].commCh = true;
- }
+
ulData->pduInfo[ulData->numPdu].lcId = lcId;
ulData->pduInfo[ulData->numPdu].pduBuf = pdu;
ulData->pduInfo[ulData->numPdu].pduLen = pduLen;
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;
return(*macSchBsrOpts[pst.selector])(&pst, &bsrInd);
}
+/*******************************************************************
+ *
+ * @brief Builds and send HARQ UCI 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;
+ HarqUciIndInfo harqUciInd;
+ memset(&pst, 0, sizeof(Pst));
+ memset(&harqUciInd, 0, sizeof(HarqUciIndInfo));
+
+ harqUciInd.cellId = macCb.macCell[cellIdx]->cellId;
+ harqUciInd.crnti = crnti;
+ harqUciInd.slotInd.sfn = slotInd->sfn;
+ harqUciInd.slotInd.slot = slotInd->slot;
+ harqUciInd.numHarq = harqInfo->numHarq;
+ memset(harqUciInd.harqPayload, 0, MAX_SR_BITS_IN_BYTES);
+ for(harqCounter = 0; harqCounter < harqInfo->numHarq; harqCounter++)
+ {
+ harqUciInd.harqPayload[harqCounter] = harqInfo->harqValue[harqCounter];
+ }
+
+ /* Fill Pst */
+ FILL_PST_MAC_TO_SCH(pst, EVENT_UCI_IND_TO_SCH);
+
+ return(*macSchHarqUciIndOpts[pst.selector])(&pst, &harqUciInd);
+}
+
+
/*******************************************************************
*
* @brief Builds and send SR UCI Indication to SCH
* ****************************************************************/
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)
{
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;