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=5e462f4bc1aaf977a829228d56a0f2038964e2cb;hpb=e0ab592152182a8a00aa8e7968209d2c4152e1e9;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 5e462f4bc..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 @@ -419,10 +450,20 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ phyDb.ueDb.ueCb[ueId-1].msg5Sent = true; type = MSG_TYPE_MSG5; } - else if(!phyDb.ueDb.ueCb[ueId-1].msgSecurityModeComp) + 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].msgSecurityModeComp = true; - type = MSG_TYPE_SECURITY_MODE_COMPLETE; + 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) { @@ -534,7 +575,60 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ break; } - case MSG_TYPE_SECURITY_MODE_COMPLETE: + 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: + { + /* 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_RRC_SECURITY_MODE_COMPLETE: { /* For security mode complete where RRC Container is dummy * @@ -546,7 +640,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, \ @@ -635,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 @@ -700,6 +801,7 @@ uint16_t l1BuildAndSendRachInd(uint16_t slot, uint16_t sfn, uint8_t raPreambleId return ROK; } + /******************************************************************* * * @brief Builds and Send the Slot Indication message to MAC @@ -767,6 +869,7 @@ uint16_t l1BuildAndSendSlotIndication() } CMCHKPK(oduPackPointer, (PTR)slotIndMsg, mBuf); ODU_POST_TASK(&pst, mBuf); + } #endif return ROK; @@ -1126,6 +1229,34 @@ S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg) if(ulTtiReq->pdus[numPdus-1].pduType == 0) { 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) { @@ -1143,42 +1274,12 @@ S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg) 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); + 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].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) - { - 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; @@ -1412,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; }