[Epic-ID: ODUHIGH-405][Task-ID: ODUHIGH-443] Contention Free RA by UE in handover
[o-du/l2.git] / src / phy_stub / phy_stub_msg_hdl.c
index b5fb1ac..717e47c 100644 (file)
 #include "du_app_mac_inf.h"
 #include "mac_sch_interface.h"
 #include "lwr_mac.h"
+#include "lwr_mac_fsm.h"
 #include "lwr_mac_phy.h"
 #ifdef INTEL_FAPI
 #include "fapi.h"
 #include "fapi_vendor_extension.h"
 #endif
-#include "lphy_stub.h"
 #include "lwr_mac_upr_inf.h"
 #include "mac_utils.h"
 #include "phy_stub.h"
+#include "phy_stub_utils.h"
+#include "lwr_mac_phy_stub_inf.h"
 
 /*******************************************************************
  *
@@ -243,6 +245,12 @@ void l1HdlParamReq(uint32_t msgLen, void *msg)
 
 void l1HdlConfigReq(uint32_t msgLen, void *msg)
 {
+   memset(&phyDb.ueDb, 0, sizeof(UeDb));
+   cmInetAddr((char *)SOURCE_DU_IPV4_ADDR, &phyDb.ipCfgInfo.sourceDu);
+   cmInetAddr((char *)DESTINATION_DU_IPV4_ADDR, &phyDb.ipCfgInfo.destinationDu);
+   phyDb.ipCfgInfo.portNumber = PORT_NUMBER;
+   phyDb.isServer = true;
+
 #ifdef INTEL_FAPI
    p_fapi_api_queue_elem_t configReqElem = (p_fapi_api_queue_elem_t)msg;
    fapi_config_req_t *configReq = (fapi_config_req_t *)(configReqElem +1);
@@ -337,7 +345,7 @@ uint16_t l1BuildAndSendCrcInd(uint16_t slot, uint16_t sfn)
  * ****************************************************************/
 uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_t puschPdu)
 {
-   uint8_t idx = 0;
+   uint8_t idx = 0, ueId = 0;
    fapi_rx_data_indication_t *rxDataInd =NULLP;
    fapi_pdu_ind_info_t       *pduInfo =NULLP;
    uint8_t  *pdu = NULLP;
@@ -345,39 +353,54 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
    uint32_t msgLen = 0;
    MsgType type = 0;
 
-   if(!msg3Sent)
-   {
-      msg3Sent = true;
-      type = MSG_TYPE_MSG3;
-      sleep(2);
-   }
-   else if(!msg5ShortBsrSent)
-   {
-      msg5ShortBsrSent = true;
-      type = MSG_TYPE_SHORT_BSR;
-   }
-   else if(!msg5Sent)
-   {
-      msg5Sent = true;
-      type = MSG_TYPE_MSG5;
-   }
-   else if(!msgRegistrationComp)
+   GET_UE_ID(puschPdu.rnti, ueId);
+   if(phyDb.ueDb.ueCb[ueId-1].isCFRA)
    {
-      msgRegistrationComp = true;
-      type = MSG_TYPE_REGISTRATION_COMPLETE; 
-   }
-   else if(!msgSecurityModeComp)
-   {
-      msgSecurityModeComp = true;
-      type = MSG_TYPE_SECURITY_MODE_COMPLETE;
-   }
-   else if(!msgRrcReconfiguration)
-   {
-      msgRrcReconfiguration = true;
+      /* In CF-RA in case of handover, RRC Reconfiguration Complete is sent
+       * by UE once RAR is received from DU */
+      phyDb.ueDb.ueCb[ueId-1].ueId = ueId;
+      phyDb.ueDb.ueCb[ueId-1].crnti = puschPdu.rnti;
+      phyDb.ueDb.ueCb[ueId-1].msgRrcReconfigComp = true;
       type = MSG_TYPE_RRC_RECONFIG_COMPLETE;
    }
    else
-      return RFAILED;
+   {
+      if(!phyDb.ueDb.ueCb[ueId-1].msg3Sent)
+      {
+         phyDb.ueDb.ueCb[ueId-1].ueId = ueId;
+         phyDb.ueDb.ueCb[ueId-1].crnti = puschPdu.rnti;
+         phyDb.ueDb.ueCb[ueId-1].msg3Sent = true;
+         type = MSG_TYPE_MSG3;
+         sleep(2);
+      }
+      else if(!phyDb.ueDb.ueCb[ueId-1].msg5ShortBsrSent)
+      {
+         phyDb.ueDb.ueCb[ueId-1].msg5ShortBsrSent = true;
+         type = MSG_TYPE_SHORT_BSR;
+      }
+      else if(!phyDb.ueDb.ueCb[ueId-1].msg5Sent)
+      {
+         phyDb.ueDb.ueCb[ueId-1].msg5Sent = true;
+         type = MSG_TYPE_MSG5;
+      }
+      else if(!phyDb.ueDb.ueCb[ueId-1].msgRegistrationComp)
+      {
+         phyDb.ueDb.ueCb[ueId-1].msgRegistrationComp = true;
+         type = MSG_TYPE_REGISTRATION_COMPLETE; 
+      }
+      else if(!phyDb.ueDb.ueCb[ueId-1].msgSecurityModeComp)
+      {
+         phyDb.ueDb.ueCb[ueId-1].msgSecurityModeComp = true;
+         type = MSG_TYPE_SECURITY_MODE_COMPLETE;
+      }
+      else if(!phyDb.ueDb.ueCb[ueId-1].msgRrcReconfigComp)
+      {
+         phyDb.ueDb.ueCb[ueId-1].msgRrcReconfigComp = true;
+         type = MSG_TYPE_RRC_RECONFIG_COMPLETE;
+      }
+      else
+         return RFAILED;
+   }
 
    MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
    if(!rxDataInd)
@@ -416,132 +439,154 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
    switch(type)
    {
       case MSG_TYPE_MSG3: 
-        {
-           DU_LOG("\nDEBUG  -->  PHY_STUB: Forming MSG3 PDU ");
-           /* For Initial RRC setup Request,
-              MAC subheader format is R/R/LCId (1byte)
-              LCId is CCCH(0)
-              From 38.321 section 6.1.1
-            */
-           pdu[byteIdx++] = 0;
-           /* Hardcoding MAC PDU */
-           pdu[byteIdx++] = 16;
-           pdu[byteIdx++] = 00;
-           pdu[byteIdx++] = 00;
-           pdu[byteIdx++] = 00;
-           pdu[byteIdx++] = 00;
-           pdu[byteIdx++] = 103;
-
-           break;
-        }
+         {
+            DU_LOG("\nDEBUG  -->  PHY_STUB: Forming MSG3 PDU ");
+            /* For Initial RRC setup Request,
+               MAC subheader format is R/R/LCId (1byte)
+               LCId is CCCH(0)
+               From 38.321 section 6.1.1
+               */
+            pdu[byteIdx++] = 0;
+            /* Hardcoding MAC PDU */
+            pdu[byteIdx++] = 16;
+            pdu[byteIdx++] = 00;
+            pdu[byteIdx++] = 00;
+            pdu[byteIdx++] = 00;
+            pdu[byteIdx++] = 00;
+            pdu[byteIdx++] = 103;
+
+            break;
+         }
       case MSG_TYPE_SHORT_BSR:
-      {
-        DU_LOG("\nDEBUG  -->  PHY_STUB: Forming SHORT BSR PDU ");
-        uint8_t lcgId = 0;
-        uint8_t bufferSizeIdx = 6;
-
-        /* For Short BSR
-           MAC subheader format is R/R/LcId (1Byte)
-           LCId is 61
-           From 38.321 section 6.1.1
-         */
-        pdu[byteIdx++] = 61;    // LCID
-        pdu[byteIdx++] = (lcgId << 5) | bufferSizeIdx;
-
-        break;
-      }
+         {
+            DU_LOG("\nDEBUG  -->  PHY_STUB: Forming SHORT BSR PDU ");
+            uint8_t lcgId = 0;
+            uint8_t bufferSizeIdx = 6;
+
+            /* For Short BSR
+               MAC subheader format is R/R/LcId (1Byte)
+               LCId is 61
+               From 38.321 section 6.1.1
+               */
+            pdu[byteIdx++] = 61;    // LCID
+            pdu[byteIdx++] = (lcgId << 5) | bufferSizeIdx;
+
+            break;
+         }
 
       case MSG_TYPE_MSG5:
       {
-        DU_LOG("\nDEBUG  -->  PHY_STUB: Forming MSG5 PDU");
-        uint8_t  msg5PduLen = 33;
-        /* For RRC setup complete
-           MAC subheader format is R/F/LCId/L (2/3 bytes)
-           LCId is 1 for SRB1
-           L is length of PDU i.e 6bytes here 
-           From 38.321 section 6.1.1
-         */
-        uint8_t msg5[] = {1, msg5PduLen, 0, 0, 16, 0, 5, 223, 128, 16, 94, \
-           64, 3, 64, 89, 61, 138, 64, 0, 0, 0, 4, 0, 0, 4, 68, 11, 128, \
-              184, 56, 0, 0, 0, 0, 0};
-
-        msg5PduLen += 2;  /* 2bytes of header */
-        memcpy(pdu, &msg5, msg5PduLen);
-        byteIdx += msg5PduLen; /* 2 bytes of header */
-        break;
+         /* For RRC setup complete
+          *
+          * MAC subheader format is R/F/LCId/L (2/3 bytes)
+          * LCId is 1 for SRB1
+          * L is length of PDU i.e 6bytes here 
+          * From 38.321 section 6.1.1
+          *
+          * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN)
+          * From 38.322, section 6.2.2.4
+          */
+         DU_LOG("\nDEBUG  -->  PHY_STUB: Forming MSG5 PDU");
+         uint8_t  msg5PduLen = 33; /* Length of MSG5 */
+         msg5PduLen += 2; /* RLC subheader */
+         uint8_t msg5[] = {1, msg5PduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 16, 0, \
+            5, 223, 128, 16, 94, 64, 3, 64, 68, 252, 97, 0, 0, 0, 0, 4, 0, 0, 4, 68, 11, 128, 184, 56, 0, 0, 0, 0, 0};
+
+         msg5PduLen += 2;  /* 2 bytes of MAC header */
+         memcpy(pdu, &msg5, msg5PduLen);
+         byteIdx += msg5PduLen; /* 4 bytes of header : MAC+RLC */
+         break;
       }
 
       case MSG_TYPE_SECURITY_MODE_COMPLETE:
       {
-        DU_LOG("\nDEBUG  -->  PHY_STUB: Forming SECURITY MODE COMPLETE PDU");
-        uint8_t  pduLen = 12;
-        /* For security mode complete where RRC Container is dummy
-           MAC subheader format is R/F/LCId/L (2/3 bytes)
-           LCId is 1 for SRB1
-           L is length of PDU i.e 6bytes here 
-           From 38.321 section 6.1.1
-         */
-        uint8_t msg[] = {1, pduLen, 0, 3, 0x2a, 0x40, 0, 0, 0, 0, 0, 0, 0, 0};
-
-        pduLen += 2;  /* 2bytes of header */
-        memcpy(pdu, &msg, pduLen);
-        byteIdx += pduLen; /* 2 bytes of header */
-        break;
+         /* For security mode complete where RRC Container is dummy
+          *
+          * MAC subheader format is R/F/LCId/L (2/3 bytes)
+          * LCId is 1 for SRB1
+          * L is length of PDU i.e 6bytes here 
+          * From 38.321 section 6.1.1
+          *
+          * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN)
+          * From 38.322, section 6.2.2.4
+          */
+         DU_LOG("\nDEBUG  -->  PHY_STUB: Forming SECURITY MODE COMPLETE PDU");
+         uint8_t  pduLen = 12; /* Length of PDU */
+         pduLen += 2; /* RLC subheader */
+         uint8_t msg[] = {1, pduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 0x2a, 0x40, \
+            0, 0, 0, 0, 0, 0, 0, 0};
+
+         pduLen += 2;  /* 2 bytes of MAC header */
+         memcpy(pdu, &msg, pduLen);
+         byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */
+         break;
       }
+
       case MSG_TYPE_REGISTRATION_COMPLETE:
       {
-          
-         DU_LOG("\nDEBUG  -->  PHY_STUB: Forming RRC REGISTRATION COMPLETE PDU");
-         uint8_t  pduLen = 12;
-         /* For rrc reconfig complete where RRC Container is dummy
-         MAC subheader format is R/F/LCId/L (2/3 bytes)
-         LCId is 1 for SRB1
-         L is length of PDU i.e 6bytes here
-         From 38.321 section 6.1.1
-         */
-         uint8_t msg[] = {1, pduLen, 0, 0x04, 0x3a, 0x81, 0xbf, 0, 0x21, 0x80, 0, \
-         0, 0, 0};
-       
-         pduLen += 2;  /* 2bytes of header */
-         memcpy(pdu, &msg, pduLen);
-         byteIdx += pduLen; /* 2 bytes of header */
-          break;
+         /* For rrc reconfig complete where RRC Container is dummy
+          *
+          * MAC subheader format is R/F/LCId/L (2/3 bytes)
+          * LCId is 1 for SRB1
+          * L is length of PDU i.e 6bytes here
+          * From 38.321 section 6.1.1
+          * 
+          * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN)
+          * From 38.322, section 6.2.2.4
+          */
+         DU_LOG("\nDEBUG  -->  PHY_STUB: Forming RRC REGISTRATION COMPLETE PDU");
+         uint8_t  pduLen = 12; /* Length of PDU */
+         pduLen += 2; /* RLC subheader */
+         uint8_t msg[] = {1, pduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 0x3a, 0x81, \
+            0xbf, 0, 0x21, 0x80, 0, 0, 0, 0};
+
+         pduLen += 2;  /* 2 bytes of MAC header */
+         memcpy(pdu, &msg, pduLen);
+         byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */
+         break;
       }
+
       case MSG_TYPE_RRC_RECONFIG_COMPLETE:
       {
+         /* For rrc reconfig complete where RRC Container is dummy
+          *
+          * MAC subheader format is R/F/LCId/L (2/3 bytes)
+          * LCId is 1 for SRB1
+          * L is length of PDU i.e 6bytes here
+          * From 38.321 section 6.1.1
+          *
+          * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN)
+          * From 38.322, section 6.2.2.4
+          */
          DU_LOG("\nDEBUG  -->  PHY_STUB: Forming RRC RECONFIGURATION COMPLETE PDU");
-         uint8_t  pduLen = 14;
-        /* For rrc reconfig complete where RRC Container is dummy
-        MAC subheader format is R/F/LCId/L (2/3 bytes)
-        LCId is 1 for SRB1
-        L is length of PDU i.e 6bytes here
-        From 38.321 section 6.1.1
-        */
-        uint8_t msg[] = {1, pduLen, 0, 6, 8, 64, 0, 0, 0, 0, \
-                         0, 0, 0, 0, 0};
-       
-        pduLen += 2;  /* 2bytes of header */
-        memcpy(pdu, &msg, pduLen);
-        byteIdx += pduLen; /* 2 bytes of header */
-        break;
+         uint8_t  pduLen = 13; /* PDU length */
+         pduLen += 2; /* RLC sub header */
+         uint8_t msg[] = {1, pduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 8, 64, 0, 0,\
+            0, 0, 0, 0, 0, 0, 0};
+
+         pduLen += 2;  /* 2bytes of MAC header */
+         memcpy(pdu, &msg, pduLen);
+         byteIdx += pduLen; /* 4 bytes of header : MAC+RLC*/
+         break;
 
       }
-      
+
       default:
-        break;
+      break;
    } /* End of switch(type) */
+
    /* Filling MAC SDU for Padding bytes*/
    if(byteIdx < pduInfo->pdu_length)
    {
       /* For Padding
-        MAC subheader format is R/R/LCId (1byte)
-        LCId is 63 for padding
-        From 38.321 section 6.1.1
-       */
+         MAC subheader format is R/R/LCId (1byte)
+         LCId is 63 for padding
+         From 38.321 section 6.1.1
+         */
       pdu[byteIdx++] = 63;
 
       for(; byteIdx < pduInfo->pdu_length; byteIdx++)
-        pdu[byteIdx] = 0;
+         pdu[byteIdx] = 0;
    }
    msgLen += pduInfo->pdu_length;
 
@@ -575,7 +620,7 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn)
+uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn, uint8_t raPreambleIdx)
 {
 #ifdef INTEL_FAPI
    uint8_t   rachPduIdx = 0; 
@@ -604,7 +649,7 @@ uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn)
    rachPdu->avgSnr = 0;
    rachPdu->numPreamble = 1;
 
-   rachPdu->preambleInfo[preamIdx].preambleIndex = 3;
+   rachPdu->preambleInfo[preamIdx].preambleIndex = raPreambleIdx;
    rachPdu->preambleInfo[preamIdx].timingAdvance = 0;
    rachPdu->preambleInfo[preamIdx].preamblePwr = 0;
 
@@ -638,10 +683,13 @@ uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn)
  * ****************************************************************/
 uint16_t l1BuildAndSendSlotIndication()
 {
+   Pst pst;
+   Buffer *mBuf;
+
 #ifdef INTEL_FAPI
    fapi_slot_ind_t *slotIndMsg;
 
-   MAC_ALLOC(slotIndMsg, sizeof(fapi_slot_ind_t));
+   MAC_ALLOC_SHRABL_BUF(slotIndMsg, sizeof(fapi_slot_ind_t));
    if(!slotIndMsg)
    {
       DU_LOG("\nERROR  -->  PHY_STUB: Memory allocation failed for slot Indication Message");
@@ -654,24 +702,35 @@ uint16_t l1BuildAndSendSlotIndication()
       slotIndMsg->slot = slotValue;
 
 #ifdef ODU_SLOT_IND_DEBUG_LOG
-      DU_LOG("\n\nDEBUG  -->  PHY_STUB: SLOT indication [%d:%d]",sfnValue,slotValue);
+      DU_LOG("\n\nDEBUG  -->  PHY_STUB: Sending Slot Indication [%d : %d] to MAC", sfnValue, slotValue);
 #endif
+
       /* increment for the next TTI */
       slotValue++;
       if(sfnValue >= MAX_SFN_VALUE && slotValue > MAX_SLOT_VALUE)
       {
-        sfnValue = 0;
-        slotValue = 0;
+         sfnValue = 0;
+         slotValue = 0;
       }
       else if(slotValue > MAX_SLOT_VALUE)
       {
-        sfnValue++;
-        slotValue = 0;
+         sfnValue++;
+         slotValue = 0;
       }
       fillMsgHeader(&slotIndMsg->header, FAPI_SLOT_INDICATION, \
-           sizeof(fapi_slot_ind_t) - sizeof(fapi_msg_t));
-      procPhyMessages(slotIndMsg->header.msg_id, sizeof(fapi_slot_ind_t), (void*)slotIndMsg);
-      MAC_FREE(slotIndMsg, sizeof(fapi_slot_ind_t));
+            sizeof(fapi_slot_ind_t) - sizeof(fapi_msg_t));
+
+      memset(&pst, 0, sizeof(Pst));
+      FILL_PST_PHY_STUB_TO_LWR_MAC(pst, EVT_PHY_STUB_SLOT_IND);
+      ODU_GET_MSG_BUF(pst.region, pst.pool, &mBuf);
+      if(!mBuf)
+      {
+         DU_LOG("\nERROR  --> PHY_STUB: Failed to allocate memory for slot indication buffer");
+         MAC_FREE_SHRABL_BUF(pst.region, pst.pool, slotIndMsg, sizeof(fapi_slot_ind_t));
+         return RFAILED;
+      }
+      CMCHKPK(oduPackPointer, (PTR)slotIndMsg, mBuf);
+      ODU_POST_TASK(&pst, mBuf);
    }
 #endif
    return ROK;
@@ -759,12 +818,7 @@ S16 l1HdlDlTtiReq(uint16_t msgLen, void *msg)
       }
       else if(dlTtiReq->pdus[pduCount].pduType == 0)
       {
-        DU_LOG("\nINFO   -->  PHY_STUB: PDCCH PDU");
-        if(dlTtiReq->pdus[pduCount].pdu.pdcch_pdu.\
-           coreSetType == 1)
-        {
-           dlDedMsg = true;
-        }
+         DU_LOG("\nINFO   -->  PHY_STUB: PDCCH PDU");
       }
       else if(dlTtiReq->pdus[pduCount].pduType == 1)
       {
@@ -803,11 +857,13 @@ S16 l1HdlTxDataReq(uint16_t msgLen, void *msg)
    fapi_tx_data_req_t *txDataReq = (fapi_tx_data_req_t *)(txDataElem +1);
 
    DU_LOG("\nINFO   -->  PHY STUB: TX DATA Request at sfn=%d slot=%d",txDataReq->sfn,txDataReq->slot);
+/*
    if(dlDedMsg)
    {
       DU_LOG("\nINFO   -->  PHY_STUB: TxDataPdu for DED MSG sent");
       dlDedMsg = false;
    }
+*/
    MAC_FREE(msg, msgLen);
 #endif
    return ROK;
@@ -1001,34 +1057,56 @@ S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg)
    {
       if(ulTtiReq->pdus[numPdus-1].pduType == 0)
       {
-        DU_LOG("\nINFO   -->  PHY STUB: PRACH PDU");
+         DU_LOG("\nINFO   -->  PHY STUB: PRACH PDU");
       }
       if(ulTtiReq->pdus[numPdus-1].pduType == 1)
       {
-        DU_LOG("\nINFO   -->  PHY STUB: PUSCH PDU");
-        l1BuildAndSendRxDataInd(ulTtiReq->slot, ulTtiReq->sfn, \
-              ulTtiReq->pdus[numPdus-1].pdu.pusch_pdu); 
+         DU_LOG("\nINFO   -->  PHY STUB: PUSCH PDU");
+         l1BuildAndSendRxDataInd(ulTtiReq->slot, ulTtiReq->sfn, ulTtiReq->pdus[numPdus-1].pdu.pusch_pdu); 
       }
       if(ulTtiReq->pdus[numPdus-1].pduType == 2)
       {
-        DU_LOG("\nINFO   -->  PHY STUB: PUCCH PDU");
+         DU_LOG("\nINFO   -->  PHY STUB: PUCCH PDU");
+
          fapi_ul_tti_req_t ulTtiSlotInd;
-        memset(&ulTtiSlotInd, 0, sizeof(fapi_ul_tti_req_t));
-        ulTtiSlotInd.slot = ulTtiReq->slot;
-        ulTtiSlotInd.sfn  = ulTtiReq->sfn;
+         memset(&ulTtiSlotInd, 0, sizeof(fapi_ul_tti_req_t));
+         ulTtiSlotInd.slot = ulTtiReq->slot;
+         ulTtiSlotInd.sfn  = ulTtiReq->sfn;
          ADD_DELTA_TO_TIME(ulTtiSlotInd, ulTtiSlotInd, SLOT_DELAY);
-        l1BuildAndSendUciInd(ulTtiSlotInd.slot, ulTtiSlotInd.sfn, \
-              ulTtiReq->pdus[numPdus-1].pdu.pucch_pdu);
+         l1BuildAndSendUciInd(ulTtiSlotInd.slot, ulTtiSlotInd.sfn, ulTtiReq->pdus[numPdus-1].pdu.pucch_pdu);
       }
       numPdus--;
    }
 
-   if(rachIndSent == false && ulTtiReq->sfn == 2 && ulTtiReq->slot == 6)
+   /* TODO: [SFN:SLOT] at which RACH Indication is sent should be calculated
+    * based on PRACH cfg index */
+   /* Send RACH Ind to L2 for first UE */
+   if(phyDb.ueDb.ueCb[UE_IDX_0].rachIndSent == false && ulTtiReq->sfn == 16 && ulTtiReq->slot == 6)
+   {
+      phyDb.ueDb.ueCb[UE_IDX_0].isCFRA = false;
+      phyDb.ueDb.ueCb[UE_IDX_0].rachIndSent = true;
+      l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn, CB_RA_PREAMBLE_IDX);
+      phyDb.ueDb.numActvUe++;
+   }
+#if 0
+   /* Send RACH Ind to L2 for second UE */
+   if(phyDb.ueDb.ueCb[UE_IDX_1].rachIndSent == false && ulTtiReq->sfn == 304 && ulTtiReq->slot == 0)
    {
-      rachIndSent = true;
-      l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
+      phyDb.ueDb.ueCb[UE_IDX_0].isCFRA = false;
+      phyDb.ueDb.ueCb[UE_IDX_1].rachIndSent = true;
+      l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn, CB_RA_PREAMBLE_IDX);
+      phyDb.ueDb.numActvUe++;
    }
 
+   /* Send RACH Ind to L2 for third UE */
+   if(phyDb.ueDb.ueCb[UE_IDX_2].rachIndSent == false && ulTtiReq->sfn == 526 && ulTtiReq->slot == 0)
+   {
+      phyDb.ueDb.ueCb[UE_IDX_0].isCFRA = false;
+      phyDb.ueDb.ueCb[UE_IDX_2].rachIndSent = true;
+      l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn, CB_RA_PREAMBLE_IDX);
+      phyDb.ueDb.numActvUe++;
+   }
+#endif
    MAC_FREE(msg, msgLen);
 #endif
    return ROK;
@@ -1052,10 +1130,12 @@ S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg)
 uint16_t l1BuildAndSendStopInd()
 {
 #ifdef INTEL_FAPI
+   Pst pst;
+   Buffer *mBuf = NULLP;
    fapi_stop_ind_t *stopIndMsg = NULLP;
    uint32_t msgLen = 0;
 
-   MAC_ALLOC(stopIndMsg, sizeof(fapi_stop_ind_t));
+   MAC_ALLOC_SHRABL_BUF(stopIndMsg, sizeof(fapi_stop_ind_t));
    if(!stopIndMsg)
    {
       DU_LOG("\nERROR  -->  PHY_STUB: Memory allocation failed for stop Indication Message");
@@ -1065,9 +1145,18 @@ uint16_t l1BuildAndSendStopInd()
    {
       fillMsgHeader(&stopIndMsg->header, FAPI_STOP_INDICATION, msgLen);
       DU_LOG("\n\nINFO   -->  PHY_STUB: Processing Stop indication to MAC");
-      procPhyMessages(stopIndMsg->header.msg_id,\
-           sizeof(fapi_stop_ind_t), (void*)stopIndMsg);
-      MAC_FREE(stopIndMsg, sizeof(fapi_stop_ind_t));
+
+      memset(&pst, 0, sizeof(Pst));
+      FILL_PST_PHY_STUB_TO_LWR_MAC(pst, EVT_PHY_STUB_STOP_IND);
+      ODU_GET_MSG_BUF(pst.region, pst.pool, &mBuf);
+      if(!mBuf)
+      {
+         DU_LOG("\nERROR  --> PHY_STUB: Failed to allocate memory for slot indication buffer");
+         MAC_FREE_SHRABL_BUF(pst.region, pst.pool, stopIndMsg, sizeof(fapi_stop_ind_t));
+         return RFAILED;
+      }
+      CMCHKPK(oduPackPointer, (PTR)stopIndMsg, mBuf);
+      ODU_POST_TASK(&pst, mBuf);
    }
 #endif
    return ROK;
@@ -1097,8 +1186,13 @@ S16 l1HdlStopReq(uint32_t msgLen, void *msg)
    if(lwrMacCb.phyState == PHY_STATE_RUNNING)
    {
       l1HdlSlotIndicaion(TRUE);
+
+      /* Initialize all global variables */
+      sfnValue = 0;
+      slotValue = 0;
+      memset(&phyDb.ueDb, 0, sizeof(UeDb));
+
       DU_LOG("\nINFO   -->  PHY_STUB: Slot Indication is stopped successfully");
-      l1BuildAndSendStopInd();
       MAC_FREE(msg, msgLen);
    }
    else
@@ -1111,6 +1205,7 @@ S16 l1HdlStopReq(uint32_t msgLen, void *msg)
    return ROK;
 }
 
+#if 0
 /*******************************************************************
  *
  * @brief Build And Send Rx Data Ind for Msg5
@@ -1214,6 +1309,7 @@ uint8_t l1BuildAndSendMsg5(uint16_t sfn, uint16_t slot)
 #endif
    return ROK;
 }
+#endif
 
 /*******************************************************************
  *
@@ -1271,7 +1367,7 @@ S16 l1HdlUlDciReq(uint16_t msgLen, void *msg)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t l1SendUlUserData()
+uint8_t l1SendUlUserData(uint8_t drbId, uint8_t ueIdx)
 {
    uint8_t cnt = 0;
    fapi_rx_data_indication_t *rxDataInd;
@@ -1280,6 +1376,7 @@ uint8_t l1SendUlUserData()
    uint16_t byteIdx = 0;
    uint32_t msgLen = 0;
    uint8_t idx = 0;
+   uint8_t lcId = 0;
 
    MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
    if(!rxDataInd)
@@ -1296,8 +1393,8 @@ uint8_t l1SendUlUserData()
 
    /* TODO : Fill pduInfo using PUSCH PDU. Currently hardcoding */
    pduInfo = &rxDataInd->pdus[idx];
-   pduInfo->handle = 100;
-   pduInfo->rnti = 100;
+   pduInfo->handle = ueIdx + ODU_START_CRNTI;
+   pduInfo->rnti = ueIdx + ODU_START_CRNTI;
    pduInfo->harqId = 1;
    /* Since user data size = 50bytes and 2 bytes of MAC header and 3 byte of RLC header, 
     * setting tbsize = 56 from Table 5.1.3.2-1 spec 38.214 */
@@ -1317,20 +1414,24 @@ uint8_t l1SendUlUserData()
 
    /* Filling PDU */
    pdu = (uint8_t *)pduInfo->pduData;
-   msgLen = 51;
+   msgLen = 52;
 
    /* For UL User data
       MAC subheader format is R/F/LCId/L (2/3 bytes)
       LCId is 4 for DRB1
       L is length of PDU i.e 50 bytes
       From 38.321 section 6.1.1
+      From 38.322 section 6.2.2.4, 6.2.2.3 for AM, UM Header
     */
-   uint8_t ulMsg[] = {4, msgLen, 0, 69, 0, 0, 50, 0, 0, 0, 0, 0, 1, 0, 0, 192, 168, 130, 81, 192, 168, 130, 82, 84, 104,
-   105, 115, 32, 105, 115, 32, 69, 71, 84, 80, 32, 100, 97, 116, 97, 32, 102, 114, 111, 109, 32, 68, 85, 0, 0, 0, 0, 0};
-   msgLen += 2;  /* 2bytes of header */
-   memcpy(pdu, &ulMsg, msgLen);
-   byteIdx += msgLen; /* 2 bytes of header */
 
+    /* Below ulMsg supports 12bit SN for UM mode */
+                               /*  SI  SN */
+    lcId = MIN_DRB_LCID + drbId;
+    uint8_t ulMsg[] = {lcId, msgLen,   0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 1, 0, 0, 192, 168, 130, 81, 192, 168, 130, 82, 84, 104,
+    105, 115, 32, 105, 115, 32, 69, 71, 84, 80, 32, 100, 97, 116, 97, 32, 102, 114, 111, 109, 32, 68, 85, 0, 0, 0, 0, 0};
+    msgLen += 2;  /* 2bytes of header */
+    memcpy(pdu, &ulMsg, msgLen);
+    byteIdx += msgLen; /* 2 bytes of header */
 
    /* Filling MAC SDU for Padding bytes*/
    if(byteIdx < pduInfo->pdu_length)
@@ -1350,9 +1451,9 @@ uint8_t l1SendUlUserData()
    fillMsgHeader(&rxDataInd->header, FAPI_RX_DATA_INDICATION, msgLen);
 
     /* Send Message to peer */
-    while(cnt < 200)
+    while(cnt < NUM_UL_PACKETS)
     {
-       DU_LOG("\nDEBUG  -->  PHY STUB : Sending UL User Data[%d] at sfn %d slot %d", cnt+1, sfnValue, slotValue);
+       DU_LOG("\nDEBUG  -->  PHY STUB : Sending UL User Data[%d][LCID:%d] at sfn %d slot %d", cnt+1, lcId, sfnValue, slotValue);
        /* Sending Rx data indication to MAC */
        rxDataInd->sfn = sfnValue;
        rxDataInd->slot = slotValue;
@@ -1366,6 +1467,127 @@ uint8_t l1SendUlUserData()
     return ROK;
 }
 
+/*******************************************************************
+ *
+ * @brief Sends RLC Status PDU to DU
+ *
+ * @details
+ *
+ *    Function : l1SendStatusPdu
+ *
+ *    Functionality: Send RLC Status PDU to DU
+ *
+ * @params[in]
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t l1SendStatusPdu()
+{
+   fapi_rx_data_indication_t *rxDataInd;
+   fapi_pdu_ind_info_t       *pduInfo;
+   uint8_t  *pdu = NULLP;
+   uint16_t byteIdx = 0;
+   uint32_t msgLen = 0;
+   uint8_t idx = 0;
+
+   MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
+   if(!rxDataInd)
+   {
+      printf("\nERROR  -->  PHY_STUB: Memory allocation failed for Rx Data Indication");
+      return RFAILED;
+   }
+   memset(rxDataInd, 0, sizeof(fapi_rx_data_indication_t));
+
+   msgLen = sizeof(fapi_rx_data_indication_t) - sizeof(fapi_msg_t);
+   rxDataInd->sfn = 0;
+   rxDataInd->slot = 0;
+   rxDataInd->numPdus = 1;
+
+   /* TODO : Fill pduInfo using PUSCH PDU. Currently hardcoding */
+   pduInfo = &rxDataInd->pdus[idx];
+   pduInfo->handle = 100;
+   pduInfo->rnti = 100;
+   pduInfo->harqId = 1;
+   /* Since status pdu size = 3bytes and 2 bytes of MAC header,
+    * setting tbsize = 24 from Table 5.1.3.2-1 spec 38.214 */
+   pduInfo->pdu_length = 24;
+   pduInfo->ul_cqi = 0;
+   pduInfo->timingAdvance = 0;
+   pduInfo->rssi = 0;
+
+   /* Filling pdu with random values for testing */
+   pduInfo->pduData = NULL;
+   MAC_ALLOC(pduInfo->pduData, pduInfo->pdu_length);
+   if(!pduInfo->pduData)
+   {
+      printf("\nERROR  -->  PHY_STUB: Memory allocation failed for Rx Data Pdu");
+      return RFAILED;
+   }
+
+   /* Filling PDU */
+   pdu = (uint8_t *)pduInfo->pduData;
+   msgLen = 3;
+
+   /* For RLC Status PDU
+    * MAC subheader format is R/F/LCId/L (2/3 bytes)
+    * LCId is 4 for DRB1
+    * L is length of Status PDU i.e 3 bytes
+    * From 38.321 section 6.1.1
+    *
+    * RLC Status PDU format :
+    * ---------------------------------
+    * |D/C|CPT|    ACK_SN             |
+    * ---------------------------------
+    * |            ACK_SN             |
+    * ---------------------------------
+    * |E1 | R | R | R | R | R | R | R |
+    * ---------------------------------
+    *  
+    * Here, D/C bit = 0 for Control PDU
+    * CPT bit = 0 since control pdu type is Status PDU
+    * ACK_SN = 0 as of now, this can be changed based on the 
+    * scenario being tested
+    * E1 = 0 because no NACK_SN, E1, E2 and E3 follows it
+    * R = 0 i.e. reserved bits
+    * From Spec 38.322 section 6.2.2.5
+    */
+   uint8_t statusPdu[] = {4, msgLen, 0, 0, 0};
+   msgLen += 2;  /* 2bytes of header */
+   memcpy(pdu, &statusPdu, msgLen);
+   byteIdx += msgLen; /* 2 bytes of header */
+
+
+   /* Filling MAC SDU for Padding bytes*/
+   if(byteIdx < pduInfo->pdu_length)
+   {
+      /* For Padding
+         MAC subheader format is R/R/LCId (1byte)
+         LCId is 63 for padding
+         From 38.321 section 6.1.1
+       */
+      pdu[byteIdx++] = 63;
+
+      for(; byteIdx < pduInfo->pdu_length; byteIdx++)
+         pdu[byteIdx] = 0;
+   }
+   msgLen += pduInfo->pdu_length;
+
+   fillMsgHeader(&rxDataInd->header, FAPI_RX_DATA_INDICATION, msgLen);
+
+    /* Send Message to peer */
+    DU_LOG("\nDEBUG  -->  PHY STUB : Sending RLC status pdu at sfn %d slot %d", sfnValue, slotValue);
+    /* Sending Rx data indication to MAC */
+    rxDataInd->sfn = sfnValue;
+    rxDataInd->slot = slotValue;
+    procPhyMessages(rxDataInd->header.msg_id, sizeof(fapi_rx_data_indication_t), (void *)rxDataInd);
+
+    if(pduInfo->pdu_length)
+       MAC_FREE(pduInfo->pduData, pduInfo->pdu_length);
+    MAC_FREE(rxDataInd, sizeof(fapi_rx_data_indication_t));
+    return ROK;
+}
+
 /*******************************************************************
  *
  * @brief Receives message from MAC
@@ -1391,35 +1613,179 @@ void l1ProcessFapiRequest(uint8_t msgType, uint32_t msgLen, void *msg)
    {
 #ifdef INTEL_FAPI
       case FAPI_PARAM_REQUEST:
-        l1HdlParamReq(msgLen, msg);
-        break;
+         l1HdlParamReq(msgLen, msg);
+         break;
       case FAPI_CONFIG_REQUEST:
-        l1HdlConfigReq(msgLen, msg);
-        break;
+         l1HdlConfigReq(msgLen, msg);
+         break;
       case FAPI_START_REQUEST:
-        l1HdlStartReq(msgLen, msg);
-        break;
+         l1HdlStartReq(msgLen, msg);
+         break;
       case FAPI_DL_TTI_REQUEST:
-        l1HdlDlTtiReq(msgLen, msg);
-        break;
+         l1HdlDlTtiReq(msgLen, msg);
+         break;
       case FAPI_TX_DATA_REQUEST:
-        l1HdlTxDataReq(msgLen, msg);
-        break;
+         l1HdlTxDataReq(msgLen, msg);
+         break;
       case FAPI_UL_TTI_REQUEST:
-        l1HdlUlTtiReq(msgLen, msg);
-        break;
+         l1HdlUlTtiReq(msgLen, msg);
+         break;
       case FAPI_STOP_REQUEST:
-        l1HdlStopReq(msgLen, msg);
-        break;
+         l1HdlStopReq(msgLen, msg);
+         break;
       case FAPI_UL_DCI_REQUEST:
-        l1HdlUlDciReq(msgLen, msg);
-        break;
+         l1HdlUlDciReq(msgLen, msg);
+         break;
       default:
-        DU_LOG("\nERROR  -->  PHY_STUB: Invalid message type[%x] received at PHY", msgType);
-        break;
+         DU_LOG("\nERROR  -->  PHY_STUB: Invalid message type[%x] received at PHY", msgType);
+         break;
 #endif
    }
 }
+
+#ifdef INTEL_FAPI
+/*******************************************************************
+ *
+ * @brief Builds and Send the BSR message to MAC
+ *
+ * @details
+ *
+ *    Function : l1BuildAndSendBSR
+ *
+ *   Functionality:
+ *          -Send the BSR Message to MAC
+ *
+ * @params[in]  BSR type 
+ *              array of LCGID and BSIdx
+ * @return void
+ *
+ *****************************************************************/
+uint16_t l1BuildAndSendBSR(uint8_t ueIdx, BsrType bsrType,\
+             LcgBufferSize lcgBsIdx[MAX_NUM_LOGICAL_CHANNEL_GROUPS])
+{
+   fapi_rx_data_indication_t *rxDataInd;
+   fapi_pdu_ind_info_t       *pduInfo;
+   uint8_t  *pdu = NULLP;
+   uint16_t byteIdx = 0;
+   uint32_t msgLen = 0;
+   uint8_t pduIdx = 0, lcgIdx = 0, lcgIdxPos = 0;
+
+   MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
+   if(!rxDataInd)
+   {
+      DU_LOG("\nERROR  -->  PHY_STUB: Memory allocation failed for Rx Data Indication");
+      return RFAILED;
+   }
+   memset(rxDataInd, 0, sizeof(fapi_rx_data_indication_t));
+
+   msgLen = sizeof(fapi_rx_data_indication_t) - sizeof(fapi_msg_t);
+   rxDataInd->sfn = 0;
+   rxDataInd->slot = 0;
+   rxDataInd->numPdus = 1;
+
+   pduInfo = &rxDataInd->pdus[pduIdx];
+   pduInfo->handle = (ODU_START_CRNTI + ueIdx);
+   pduInfo->rnti = (ODU_START_CRNTI + ueIdx);
+   pduInfo->harqId = 1;
+
+   /* Since status pdu size = 3bytes and 2 bytes of MAC header,
+    * setting tbsize = 24 from Table 5.1.3.2-1 spec 38.214 */
+   pduInfo->pdu_length = 24;
+   pduInfo->ul_cqi = 0;
+   pduInfo->timingAdvance = 0;
+   pduInfo->rssi = 0;
+
+   /* Filling pdu with random values for testing */
+   pduInfo->pduData = NULL;
+   MAC_ALLOC(pduInfo->pduData, pduInfo->pdu_length);
+   if(!pduInfo->pduData)
+   {
+      DU_LOG("\nERROR  -->  PHY_STUB: Memory allocation failed for Rx Data Pdu");
+      MAC_FREE(rxDataInd, sizeof(fapi_rx_data_indication_t));
+      return RFAILED;
+   }
+
+   /* Filling PDU */
+   pdu = (uint8_t *)pduInfo->pduData;
+
+   switch(bsrType)
+   {
+      case SHORT_BSR:
+         {
+            DU_LOG("\nDEBUG  -->  PHY_STUB: Forming SHORT BSR PDU ");
+
+            /* For Short BSR
+             * MAC subheader format is R/R/LcId (1Byte)
+             * LCId is 61
+             * From 38.321 section 6.1.1
+             */
+            pdu[byteIdx++] = 61;    // LCID
+            pdu[byteIdx++] = (lcgBsIdx[0].lcgId << 5) | lcgBsIdx[0].bsIdx;
+            break;
+         }
+
+      case LONG_BSR:
+         {
+            DU_LOG("\nDEBUG  -->  PHY_STUB: Forming LONG BSR PDU ");
+
+            /* For Long BSR
+             * MAC subheader format is R/R/LcId (1Byte)
+             * LCId is 62
+             * From 38.321 section 6.1.1
+             */
+            pdu[byteIdx++] = 62;    // LCID
+
+            /*Octet where lcgId bitmap will be present*/
+            lcgIdxPos = byteIdx;
+            byteIdx++;
+            for(lcgIdx = 0; lcgIdx < MAX_NUM_LOGICAL_CHANNEL_GROUPS; lcgIdx++)
+            {
+               if(lcgBsIdx[lcgIdx].bsIdx > 0)
+               {
+                  pdu[lcgIdxPos] |= 1 << lcgBsIdx[lcgIdx].lcgId;
+                  pdu[byteIdx++] = lcgBsIdx[lcgIdx].bsIdx;
+               }
+            }
+
+            break;
+         }
+
+      default:
+         {
+            DU_LOG("\nERROR  -->  PHY_STUB: Incorrect BSR type:%d!", bsrType);
+            if(pduInfo->pdu_length)
+               MAC_FREE(pduInfo->pduData, pduInfo->pdu_length);
+            MAC_FREE(rxDataInd, sizeof(fapi_rx_data_indication_t));
+            return RFAILED;
+         }
+   }
+   /* Filling MAC SDU for Padding bytes*/
+   if(byteIdx < pduInfo->pdu_length)
+   {
+      /* For Padding
+       * MAC subheader format is R/R/LCId (1byte)
+       * LCId is 63 for padding
+       * From 38.321 section 6.1.1
+       */
+      pdu[byteIdx++] = 63;
+
+      for(; byteIdx < pduInfo->pdu_length; byteIdx++)
+         pdu[byteIdx] = 0;
+   }
+   msgLen += pduInfo->pdu_length;
+   fillMsgHeader(&rxDataInd->header, FAPI_RX_DATA_INDICATION, msgLen);
+
+   /* Sending Rx data indication to MAC */
+   DU_LOG("\nINFO   -->  PHY STUB: Sending Rx data Indication to MAC");
+   procPhyMessages(rxDataInd->header.msg_id, sizeof(fapi_rx_data_indication_t), (void *)rxDataInd);
+
+   if(pduInfo->pdu_length)
+      MAC_FREE(pduInfo->pduData, pduInfo->pdu_length);
+   MAC_FREE(rxDataInd, sizeof(fapi_rx_data_indication_t));
+   return ROK;
+}
+#endif
+
 /**********************************************************************
   End of file
  **********************************************************************/