X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fphy_stub%2Fphy_stub_msg_hdl.c;h=e0869827920648e2b4fd5227d725559c94f122a4;hb=a6fdf00681f781fbccf7aa4bf95582f20e3039bb;hp=324ca8e1ecbf5699c02b81c05469676e67375f4c;hpb=64580b61ab517a3c1fc09b3e0dc32109b913b726;p=o-du%2Fl2.git diff --git a/src/phy_stub/phy_stub_msg_hdl.c b/src/phy_stub/phy_stub_msg_hdl.c index 324ca8e1e..e08698279 100644 --- a/src/phy_stub/phy_stub_msg_hdl.c +++ b/src/phy_stub/phy_stub_msg_hdl.c @@ -27,7 +27,7 @@ #include "lwr_mac_fsm.h" #include "lwr_mac_phy.h" #ifdef INTEL_FAPI -#include "fapi.h" +#include "nr5g_fapi_internal.h" #include "fapi_vendor_extension.h" #endif #include "lwr_mac_upr_inf.h" @@ -36,6 +36,37 @@ #include "phy_stub_utils.h" #include "lwr_mac_phy_stub_inf.h" +/******************************************************************* + * + * @brief start the uplink data + * + * @details + * + * Function : startUlData + * + * Functionality: start the uplink data + * + * @params[in] + * + * @return void + * + * ****************************************************************/ + +void startUlData() +{ + uint8_t ueIdx=0, drbIdx=0; + + /* Start Pumping data from PHY stub to DU */ + for(ueIdx=0; ueIdx < phyDb.ueDb.numActvUe; ueIdx++) + { + for(drbIdx = 0; drbIdx < NUM_DRB_TO_PUMP_DATA; drbIdx++) //Number of DRB times the loop will run + { + DU_LOG("\nDEBUG --> PHY STUB: Sending UL User Data[DrbId:%d] for UEIdx %d\n",drbIdx,ueIdx); + l1SendUlUserData(drbIdx,ueIdx); + } + } +} + /******************************************************************* * * @brief Builds and sends param response to MAC CL @@ -285,10 +316,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)); @@ -304,12 +361,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; @@ -317,12 +379,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 @@ -354,41 +416,63 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ MsgType type = 0; GET_UE_ID(puschPdu.rnti, ueId); - if(!phyDb.ueDb.ueCb[ueId-1].msg3Sent) + if(phyDb.ueDb.ueCb[ueId-1].isCFRA) { - 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; + 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(!phyDb.ueDb.ueCb[ueId-1].msgRrcReconfiguration) + else { - phyDb.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].msgNasSecurityModeComp) + { + phyDb.ueDb.ueCb[ueId-1].msgNasSecurityModeComp = true; + type = MSG_TYPE_NAS_SECURITY_MODE_COMPLETE; + } + else if(!phyDb.ueDb.ueCb[ueId-1].msgRrcSecurityModeComp) + { + phyDb.ueDb.ueCb[ueId-1].msgRrcSecurityModeComp = true; + type = MSG_TYPE_RRC_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) @@ -485,8 +569,35 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ byteIdx += msg5PduLen; /* 4 bytes of header : MAC+RLC */ break; } + + case MSG_TYPE_NAS_SECURITY_MODE_COMPLETE: + { + /* For NAS 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 NAS SECURITY MODE COMPLETE PDU"); + uint8_t pduLen = 93; /* 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, 0x2a, 0x3f, + 0x02, 0x75, 0xa0, 0xa0, 0xc0, 0x80, 0x3f, 0x00, 0x2f, 0x3b, 0x80, 0x04, 0x9a, 0xa2, 0x81, 0x09, 0x80, 0xc0, + 0x28, 0x04, 0xf8, 0xb8, 0x80, 0x1d, 0xbf, 0x00, 0x20, 0x8c, 0x80, 0x05, 0xf9, 0x00, 0x78, 0x88, 0x7a, 0x88, + 0xd9, 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x81, 0x97, 0x02, 0x78, 0x38, 0x78, 0x38, 0x17, 0x82, 0x82, 0x00, + 0x80, 0x00, 0x00, 0xa9, 0x00, 0x78, 0x88, 0x00, 0x00, 0x00, 0x8b, 0x83, 0xf8, 0x38, 0x60, 0x20, 0x0c, 0xc0, + 0x50, 0x0c, 0x00, 0x80, 0x3a, 0x00, 0x00, 0x48, 0x29, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00}; - case MSG_TYPE_SECURITY_MODE_COMPLETE: + pduLen += 2; /* 2 bytes of MAC header */ + memcpy(pdu, &msg, pduLen); + byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */ +break; + } + case MSG_TYPE_RRC_SECURITY_MODE_COMPLETE: { /* For security mode complete where RRC Container is dummy * @@ -498,7 +609,7 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ * 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"); + DU_LOG("\nDEBUG --> PHY_STUB: Forming RRC 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, \ @@ -587,6 +698,13 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ if(pduInfo->pdu_length) MAC_FREE(pduInfo->pduData, pduInfo->pdu_length); MAC_FREE(rxDataInd, sizeof(fapi_rx_data_indication_t)); + +#ifdef START_DL_UL_DATA + if(phyDb.ueDb.ueCb[ueId-1].msgRrcReconfigComp == true) + { + startUlData(); + } +#endif return ROK; } #endif @@ -608,7 +726,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; @@ -637,7 +755,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; @@ -652,6 +770,7 @@ uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn) return ROK; } + /******************************************************************* * * @brief Builds and Send the Slot Indication message to MAC @@ -719,6 +838,7 @@ uint16_t l1BuildAndSendSlotIndication() } CMCHKPK(oduPackPointer, (PTR)slotIndMsg, mBuf); ODU_POST_TASK(&pst, mBuf); + } #endif return ROK; @@ -878,9 +998,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; @@ -888,8 +1034,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) { @@ -897,7 +1046,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; @@ -1045,54 +1197,58 @@ 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"); + + /* Send RACH Ind to L2 for first UE */ + if(phyDb.ueDb.ueCb[UE_IDX_0].rachIndSent == false) + { + 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 && phyDb.ueDb.ueCb[UE_IDX_0].msgRrcReconfigComp == true) + { + 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 && phyDb.ueDb.ueCb[UE_IDX_1].msgRrcReconfigComp == true) + { + 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 } 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; - ADD_DELTA_TO_TIME(ulTtiSlotInd, ulTtiSlotInd, SLOT_DELAY); - l1BuildAndSendUciInd(ulTtiSlotInd.slot, ulTtiSlotInd.sfn, \ - ulTtiReq->pdus[numPdus-1].pdu.pucch_pdu); + 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, MAX_SLOTS); + l1BuildAndSendUciInd(ulTtiSlotInd.slot, ulTtiSlotInd.sfn, ulTtiReq->pdus[numPdus-1].pdu.pucch_pdu); } numPdus--; } - /* 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].rachIndSent = true; - l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn); - 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) - { - phyDb.ueDb.ueCb[UE_IDX_1].rachIndSent = true; - l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn); - 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_2].rachIndSent = true; - l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn); - phyDb.ueDb.numActvUe++; - } -#endif MAC_FREE(msg, msgLen); #endif return ROK; @@ -1326,7 +1482,7 @@ S16 l1HdlUlDciReq(uint16_t msgLen, void *msg) { if(ulDciReq->pdus[numPdus-1].pduType == 0) { - DU_LOG("\nINFO --> PHY STUB: Received UL DCI Request for PDCCH PDU"); + DU_LOG("\nINFO --> PHY STUB: Received UL DCI Request for PDCCH PDU"); //l1BuildAndSendMsg5(ulDciReq->sfn, ulDciReq->slot); //msg5Sent = true; }