X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fphy_stub%2Fphy_stub_msg_hdl.c;h=2e8378d3d54b7587110b7a3bad9c933c22785ed5;hb=6dc8a4c17da24847b3a3aee91b37151f77a8a5bc;hp=168ea65e41f010c5a93c72d95dd28679e2af2a6f;hpb=ab583728b1581b9d4d9536fdfc3fd34b6596781f;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 168ea65e4..2e8378d3d 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 @@ -245,7 +276,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 +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)); @@ -300,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; @@ -313,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 @@ -349,42 +415,69 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ uint32_t msgLen = 0; MsgType type = 0; - GET_UE_IDX(puschPdu.rnti, ueId); - if(!ueDb.ueCb[ueId-1].msg3Sent) - { - 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) + GET_UE_ID(puschPdu.rnti, ueId); + if(phyDb.ueDb.ueCb[ueId-1].isCFRA) { - 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].msgNasAuthenticationComp) + { + phyDb.ueDb.ueCb[ueId-1].msgNasAuthenticationComp = true; + type = MSG_TYPE_NAS_AUTHENTICATION_COMPLETE; + } + 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) @@ -423,132 +516,207 @@ 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; + } + + case MSG_TYPE_MSG5: { - 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; + /* 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_MSG5: + case MSG_TYPE_NAS_AUTHENTICATION_COMPLETE: + { + /* For Authentication response 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 AUTHENTICATION RESPONSE PDU"); + uint8_t pduLen = 37; /* 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, \ + 0x0e, 0x3f, 0x00, 0xca, 0x95, 0xe9, 0x19, 0x41, 0x3f, 0x00, 0x2b, 0x96, 0x88, 0x06, 0xd7, 0x16, 0xc6, \ + 0x8b, 0xea, 0xae, 0x45, 0xd1, 0x01, 0xfd, 0x34, 0xd4, 0xfd, 0xd5, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00}; + + pduLen += 2; /* 2 bytes of MAC header */ + memcpy(pdu, &msg, pduLen); + byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */ + break; + } + + case MSG_TYPE_NAS_SECURITY_MODE_COMPLETE: { - 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 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}; + + pduLen += 2; /* 2 bytes of MAC header */ + memcpy(pdu, &msg, pduLen); + byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */ + break; } - case MSG_TYPE_SECURITY_MODE_COMPLETE: + case MSG_TYPE_RRC_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 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, \ + 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; @@ -561,6 +729,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 @@ -582,7 +757,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 +786,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; @@ -626,6 +801,7 @@ uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn) return ROK; } + /******************************************************************* * * @brief Builds and Send the Slot Indication message to MAC @@ -684,7 +860,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) { @@ -694,6 +869,7 @@ uint16_t l1BuildAndSendSlotIndication() } CMCHKPK(oduPackPointer, (PTR)slotIndMsg, mBuf); ODU_POST_TASK(&pst, mBuf); + } #endif return ROK; @@ -853,9 +1029,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 +1065,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 +1077,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,45 +1228,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--; } - if(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++; - } - - //Following can be enabled to test with a second UE -#if 0 - if(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++; - } -#endif - MAC_FREE(msg, msgLen); #endif return ROK; @@ -1142,7 +1363,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); @@ -1292,7 +1513,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; } @@ -1319,7 +1540,7 @@ S16 l1HdlUlDciReq(uint16_t msgLen, void *msg) * RFAILED - failure * * ****************************************************************/ -uint8_t l1SendUlUserData(uint8_t drbId) +uint8_t l1SendUlUserData(uint8_t drbId, uint8_t ueIdx) { uint8_t cnt = 0; fapi_rx_data_indication_t *rxDataInd; @@ -1345,8 +1566,8 @@ uint8_t l1SendUlUserData(uint8_t drbId) /* 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 */ @@ -1482,10 +1703,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 */ @@ -1577,6 +1815,150 @@ void l1ProcessFapiRequest(uint8_t msgType, uint32_t msgLen, void *msg) #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 **********************************************************************/