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;
uint32_t msgLen = 0;
MsgType type = 0;
- GET_UE_IDX(puschPdu.rnti, ueId);
- if(!ueDb.ueCb[ueId-1].msg3Sent)
+ GET_UE_ID(puschPdu.rnti, ueId);
+ 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)
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;
* 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;
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;
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)
{
{
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--;
}
/* 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
+#endif
MAC_FREE(msg, msgLen);
#endif
return ROK;
/* 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);
* 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;
/* 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 */
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 */
#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
**********************************************************************/