[Epic-ID: ODUHIGH-464][Task-ID: ODUHIGH-478] WG8 Alignment | The First
[o-du/l2.git] / src / 5gnrmac / mac_msg_hdl.c
index e59e9bb..176d311 100644 (file)
@@ -32,6 +32,7 @@
 #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 */
 
@@ -69,6 +70,14 @@ MacSchSrUciIndFunc macSchSrUciIndOpts[]=
    packMacSchSrUciInd
 };
 
+/* Function pointer for sending DL HARQ Ind from MAC to SCH */
+MacSchDlHarqIndFunc macSchDlHarqIndOpts[]=
+{
+   packMacSchDlHarqInd,
+   MacSchDlHarqInd,
+   packMacSchDlHarqInd
+};
+
 /* Function pointer for sending Slice cfg  ind from MAC to SCH */
 MacSchSliceCfgReqFunc macSchSliceCfgReqOpts[]=
 {
@@ -78,11 +87,11 @@ MacSchSliceCfgReqFunc macSchSliceCfgReqOpts[]=
 };
 
 /* Function pointer for sending Slice cfg  ind from MAC to SCH */
-MacSchSliceReCfgReqFunc macSchSliceReCfgReqOpts[]=
+MacSchSliceRecfgReqFunc macSchSliceRecfgReqOpts[]=
 {
-   packMacSchSliceReCfgReq,
-   MacSchSliceReCfgReq,
-   packMacSchSliceReCfgReq
+   packMacSchSliceRecfgReq,
+   MacSchSliceRecfgReq,
+   packMacSchSliceRecfgReq
 };
 /*******************************************************************
  *
@@ -186,14 +195,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);
    }
@@ -275,6 +296,10 @@ uint8_t MacProcRlcDlData(Pst* pstInfo, RlcData *dlData)
 
       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++)
@@ -343,10 +368,11 @@ uint8_t lcId, uint16_t pduLen, uint8_t *pdu)
    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;
@@ -471,14 +497,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;
 }
@@ -500,21 +526,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;
 }
@@ -713,6 +739,51 @@ uint8_t macProcLongBsr(uint16_t cellId, uint16_t crnti,uint8_t numLcg,\
    return(*macSchBsrOpts[pst.selector])(&pst, &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(*macSchDlHarqIndOpts[pst.selector])(&pst, &dlHarqInd);
+}
+
+
 /*******************************************************************
  *
  * @brief Builds and send SR UCI Indication to SCH
@@ -771,10 +842,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)
    {
@@ -786,12 +855,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;
@@ -925,46 +1001,46 @@ uint8_t MacProcSliceCfgReq(Pst *pst, MacSliceCfgReq *macSliceCfgReq)
  *
  * @details
  *
- *    Function : MacProcSliceReCfgReq 
+ *    Function : MacProcSliceRecfgReq 
  *
  *    Functionality:
  *       Processes Processes Slice ReCfg Request recived from DU
  *
  * @params[in] Post Structure Pointer
- *             MacSliceCfgReq *macSliceReCfgReq;
+ *             MacSliceCfgReq *macSliceRecfgReq;
  * @return ROK     - success
  *         RFAILED - failure
  *
  **********************************************************************/
-uint8_t MacProcSliceReCfgReq(Pst *pst, MacSliceCfgReq *macSliceReCfgReq)
+uint8_t MacProcSliceRecfgReq(Pst *pst, MacSliceRecfgReq *macSliceRecfgReq)
 {
    uint8_t ret = ROK;
    Pst schPst;
-   SchSliceCfgReq *schSliceReCfgReq;
+   SchSliceRecfgReq *schSliceRecfgReq;
 
    DU_LOG("\nINFO  -->  MAC : Received Slice ReCfg request from DU APP");
-   if(macSliceReCfgReq)
+   if(macSliceRecfgReq)
    {
-      MAC_ALLOC(schSliceReCfgReq, sizeof(SchSliceCfgReq));
-      if(schSliceReCfgReq == NULLP)
+      MAC_ALLOC(schSliceRecfgReq, sizeof(SchSliceRecfgReq));
+      if(schSliceRecfgReq == NULLP)
       {
-         DU_LOG("\nERROR -->  MAC : Memory allocation failed in MacProcSliceReCfgReq");
+         DU_LOG("\nERROR -->  MAC : Memory allocation failed in MacProcSliceRecfgReq");
          ret = RFAILED;
       }
       else
       {
-         if(fillSliceCfgInfo(schSliceReCfgReq, macSliceReCfgReq) == ROK)
+         if(fillSliceCfgInfo(schSliceRecfgReq, macSliceRecfgReq) == ROK)
          {
             FILL_PST_MAC_TO_SCH(schPst, EVENT_SLICE_RECFG_REQ_TO_SCH);
-            ret = (*macSchSliceReCfgReqOpts[schPst.selector])(&schPst, schSliceReCfgReq);
+            ret = (*macSchSliceRecfgReqOpts[schPst.selector])(&schPst, schSliceRecfgReq);
          }
 
       }
-      freeMacSliceCfgReq(macSliceReCfgReq, pst);
+      freeMacSliceCfgReq(macSliceRecfgReq, pst);
    }
    else
    {
-      DU_LOG("\nINFO  -->  MAC : Received MacSliceCfgReq is NULL");
+      DU_LOG("\nINFO  -->  MAC : Received MacSliceRecfgReq is NULL");
    }
    return ret;
 }