Merge "[Issue Id-ODUHIGH-457] Fixes related to slice configuration in Ue Context...
[o-du/l2.git] / src / phy_stub / phy_stub_msg_hdl.c
index 89c58fd..5e462f4 100644 (file)
@@ -245,7 +245,11 @@ void l1HdlParamReq(uint32_t msgLen, void *msg)
 
 void l1HdlConfigReq(uint32_t msgLen, void *msg)
 {
-   memset(&ueDb, 0, sizeof(UeDb));
+   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;
@@ -281,10 +285,36 @@ void l1HdlConfigReq(uint32_t msgLen, void *msg)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint16_t l1BuildAndSendCrcInd(uint16_t slot, uint16_t sfn)
+uint16_t l1BuildAndSendCrcInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_t puschPdu)
 {
+   uint8_t result[]={0,//MSG3
+                     0,//BSR
+                     0,//MSG5 RRC Setup Complete
+                     0,//Security Mode Complete
+                     0,//Registraion Complete
+                     0,//RRC Reconfiguration Complete
+                     0,//UL DATA -1
+                     0,//UL DATA -2
+                     0,//UL DATA -3
+                     0,//UL DATA -4
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
 #ifdef INTEL_FAPI
    uint8_t idx = 0;
+   static uint8_t ind=0;
+   uint16_t ret = ROK;
    fapi_crc_ind_t  *crcInd;
 
    MAC_ALLOC(crcInd, sizeof(fapi_crc_ind_t));
@@ -300,12 +330,17 @@ uint16_t l1BuildAndSendCrcInd(uint16_t slot, uint16_t sfn)
    crcInd->slot = slot;
    crcInd->numCrcs = 1;
 
-   crcInd->crc[idx].handle = 0;
-   crcInd->crc[idx].rnti = 0;
-   crcInd->crc[idx].harqId = 0;
+   crcInd->crc[idx].handle = puschPdu.handle;
+   crcInd->crc[idx].rnti = puschPdu.rnti;
+   crcInd->crc[idx].harqId = puschPdu.puschData.harqProcessId;
    crcInd->crc[idx].tbCrcStatus = 0;
    crcInd->crc[idx].numCb = 1;
-   crcInd->crc[idx].cbCrcStatus[0] = 0;
+   crcInd->crc[idx].cbCrcStatus[0] = result[ind%50];
+   ret = (0== crcInd->crc[idx].cbCrcStatus[0])?ROK:RFAILED;
+   /*TBD: To use crc ind with random number and percentage */
+   //crcInd->crc[idx].cbCrcStatus[0] = (crcPassPer >= rand()%(100))?0:1;
+   
+   ind++;
    crcInd->crc[idx].ul_cqi = 0;
    crcInd->crc[idx].timingAdvance = 0;
    crcInd->crc[idx].rssi = 0;
@@ -313,12 +348,12 @@ uint16_t l1BuildAndSendCrcInd(uint16_t slot, uint16_t sfn)
    fillMsgHeader(&crcInd->header, FAPI_CRC_INDICATION, \
         sizeof(fapi_crc_ind_t) - sizeof(fapi_msg_t));
 
-   /* Sending RACH indication to MAC */
+   /* Sending CRC indication to MAC */
    DU_LOG("\nINFO   -->  PHY STUB: Sending CRC Indication to MAC");
    procPhyMessages(crcInd->header.msg_id, sizeof(fapi_crc_ind_t), (void *)crcInd);
    MAC_FREE(crcInd, sizeof(fapi_crc_ind_t));
 #endif
-   return ROK;
+   return ret;
 } /* l1BuildAndSendCrcInd */
 
 #ifdef INTEL_FAPI
@@ -350,41 +385,58 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
    MsgType type = 0;
 
    GET_UE_ID(puschPdu.rnti, ueId);
-   if(!ueDb.ueCb[ueId-1].msg3Sent)
+   if(phyDb.ueDb.ueCb[ueId-1].isCFRA)
    {
-      ueDb.ueCb[ueId-1].ueId = ueId;
-      ueDb.ueCb[ueId-1].crnti = puschPdu.rnti;
-      ueDb.ueCb[ueId-1].msg3Sent = true;
-      type = MSG_TYPE_MSG3;
-      sleep(2);
-   }
-   else if(!ueDb.ueCb[ueId-1].msg5ShortBsrSent)
-   {
-      ueDb.ueCb[ueId-1].msg5ShortBsrSent = true;
-      type = MSG_TYPE_SHORT_BSR;
-   }
-   else if(!ueDb.ueCb[ueId-1].msg5Sent)
-   {
-      ueDb.ueCb[ueId-1].msg5Sent = true;
-      type = MSG_TYPE_MSG5;
-   }
-   else if(!ueDb.ueCb[ueId-1].msgRegistrationComp)
-   {
-      ueDb.ueCb[ueId-1].msgRegistrationComp = true;
-      type = MSG_TYPE_REGISTRATION_COMPLETE; 
-   }
-   else if(!ueDb.ueCb[ueId-1].msgSecurityModeComp)
-   {
-      ueDb.ueCb[ueId-1].msgSecurityModeComp = true;
-      type = MSG_TYPE_SECURITY_MODE_COMPLETE;
+      if(!phyDb.ueDb.ueCb[ueId-1].msgRrcReconfigComp)
+      {
+         /* 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 ROK; 
    }
-   else if(!ueDb.ueCb[ueId-1].msgRrcReconfiguration)
+   else
    {
-      ueDb.ueCb[ueId-1].msgRrcReconfiguration = true;
-      type = MSG_TYPE_RRC_RECONFIG_COMPLETE;
+      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].msgSecurityModeComp)
+      {
+         phyDb.ueDb.ueCb[ueId-1].msgSecurityModeComp = true;
+         type = MSG_TYPE_SECURITY_MODE_COMPLETE;
+      }
+      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].msgRrcReconfigComp)
+      {
+         phyDb.ueDb.ueCb[ueId-1].msgRrcReconfigComp = true;
+         type = MSG_TYPE_RRC_RECONFIG_COMPLETE;
+      }
+      else
+         return ROK;
    }
-   else
-      return RFAILED;
 
    MAC_ALLOC(rxDataInd, sizeof(fapi_rx_data_indication_t));
    if(!rxDataInd)
@@ -423,132 +475,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, 68, 252, 97, 0, 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;
 
@@ -582,7 +656,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; 
@@ -611,7 +685,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;
 
@@ -684,7 +758,6 @@ uint16_t l1BuildAndSendSlotIndication()
 
       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)
       {
@@ -853,9 +926,35 @@ S16 l1HdlTxDataReq(uint16_t msgLen, void *msg)
 uint8_t fillPucchF0F1PduInfo(fapi_uci_o_pucch_f0f1_t *pduInfo, fapi_ul_pucch_pdu_t pucchPdu)
 {
    uint8_t idx = 0;
+   static uint8_t ind=0;
+   uint8_t result[]={0,//msg4
+                     0,//Security Mode Command
+                     0,//Registration Accept
+                     0,//RRC Reconfiguration
+                     0,//Data 1
+                     0,//Data 2
+                     0,//Data 3
+                     0,//Data 4
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,
+                     0,0,0,0,0,};
 
    pduInfo->handle = pucchPdu.handle;
    pduInfo->pduBitmap = 1;  //hardcoded for SR
+   if (pucchPdu.bitLenHarq)
+   {
+      pduInfo->pduBitmap |= HARQ_PDU_BITMASK;
+   }
    pduInfo->pucchFormat = pucchPdu.formatType;
    pduInfo->ul_cqi = 0;
    pduInfo->rnti = pucchPdu.rnti;
@@ -863,8 +962,11 @@ uint8_t fillPucchF0F1PduInfo(fapi_uci_o_pucch_f0f1_t *pduInfo, fapi_ul_pucch_pdu
    pduInfo->rssi = 0;
    if(pduInfo->pduBitmap & SR_PDU_BITMASK)
    {
-      pduInfo->srInfo.srIndication = SR_DETECTED;
-      pduInfo->srInfo.srConfidenceLevel = CONFDC_LEVEL_GOOD;
+      if (result[ind%50] == 0)
+      {
+         pduInfo->srInfo.srIndication = SR_DETECTED;
+         pduInfo->srInfo.srConfidenceLevel = CONFDC_LEVEL_GOOD;
+      }
    }
    if(pduInfo->pduBitmap & HARQ_PDU_BITMASK)
    {
@@ -872,7 +974,10 @@ uint8_t fillPucchF0F1PduInfo(fapi_uci_o_pucch_f0f1_t *pduInfo, fapi_ul_pucch_pdu
       pduInfo->harqInfo.harqConfidenceLevel = CONFDC_LEVEL_GOOD;
       for(idx = 0; idx < pduInfo->harqInfo.numHarq; idx++)
       {
-         pduInfo->harqInfo.harqValue[idx] = HARQ_PASS;
+         pduInfo->harqInfo.harqValue[idx] = result[ind%50];
+         ind++;
+         /*TBD: To use harq ind with random number and percentage*/
+         //pduInfo->harqInfo.harqValue[idx] = (dlHqPassPer >= rand()%(100))?HARQ_PASS:HARQ_FAIL;
       }
    }
    return ROK;
@@ -1020,24 +1125,26 @@ 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");
+         if (ROK == l1BuildAndSendCrcInd(ulTtiReq->slot, ulTtiReq->sfn,ulTtiReq->pdus[numPdus-1].pdu.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--;
    }
@@ -1045,27 +1152,31 @@ S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg)
    /* 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(ueDb.ueCb[UE_IDX_0].rachIndSent == false && ulTtiReq->sfn == 16 && ulTtiReq->slot == 6)
+   if(phyDb.ueDb.ueCb[UE_IDX_0].rachIndSent == false && ulTtiReq->sfn == 16 && ulTtiReq->slot == 6)
    {
-      ueDb.ueCb[UE_IDX_0].rachIndSent = true;
-      l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
-      ueDb.numActvUe++;
+      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(ueDb.ueCb[UE_IDX_1].rachIndSent == false && ulTtiReq->sfn == 304 && ulTtiReq->slot == 0)
+   if(phyDb.ueDb.ueCb[UE_IDX_1].rachIndSent == false && ulTtiReq->sfn == 304 && ulTtiReq->slot == 0)
    {
-      ueDb.ueCb[UE_IDX_1].rachIndSent = true;
-      l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
-      ueDb.numActvUe++;
+      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(ueDb.ueCb[UE_IDX_2].rachIndSent == false && ulTtiReq->sfn == 526 && ulTtiReq->slot == 0)
+   if(phyDb.ueDb.ueCb[UE_IDX_2].rachIndSent == false && ulTtiReq->sfn == 526 && ulTtiReq->slot == 0)
    {
-      ueDb.ueCb[UE_IDX_2].rachIndSent = true;
-      l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
-      ueDb.numActvUe++;
+      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);
@@ -1151,7 +1262,7 @@ S16 l1HdlStopReq(uint32_t msgLen, void *msg)
       /* Initialize all global variables */
       sfnValue = 0;
       slotValue = 0;
-      memset(&ueDb, 0, sizeof(UeDb));
+      memset(&phyDb.ueDb, 0, sizeof(UeDb));
 
       DU_LOG("\nINFO   -->  PHY_STUB: Slot Indication is stopped successfully");
       MAC_FREE(msg, msgLen);
@@ -1491,10 +1602,27 @@ uint8_t l1SendStatusPdu()
    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
+    * 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 */