{
if(ODU_GET_MSG_BUF(1, 1, &mBuf) == ROK)
{
- CMCHKPK(oduUnpackUInt8,(Data *)CU_ID, mBuf);
- CMCHKPK(oduUnpackUInt8,XN_SETUP_REQ, mBuf);
+ CMCHKPK(oduPackUInt8,(Data *)CU_ID, mBuf);
+ CMCHKPK(oduPackUInt8,XN_SETUP_REQ, mBuf);
ODU_PRINT_MSG(mBuf, 0,0);
if(sendOnSctpAssoc(assocCb, mBuf) != ROK)
{
uint8_t cuId;
DU_LOG("\nINFO --> CU STUB : Received XN Setup Request");
- CMCHKUNPK(oduPackUInt8, &(cuId), mBuf)
+ CMCHKUNPK(oduUnpackUInt8, &(cuId), mBuf)
*destId = cuId;
BuildAndSendXnSetupRsp(*destId);
if(ODU_GET_MSG_BUF(1, 1, &mBuf) == ROK)
{
- CMCHKPK(oduUnpackUInt8, CU_ID, mBuf);
- CMCHKPK(oduUnpackUInt8, XN_SETUP_RSP, mBuf);
+ CMCHKPK(oduPackUInt8, CU_ID, mBuf);
+ CMCHKPK(oduPackUInt8, XN_SETUP_RSP, mBuf);
if(sctpSend(XN_INTERFACE, destId, mBuf))
{
DU_LOG("\nERROR --> CU_STUB: Failed to send XN setup response to peer CU");
uint8_t cuId;
DU_LOG("\nINFO --> CU STUB : Received XN Setup Response");
- CMCHKUNPK(oduPackUInt8, &(cuId), mBuf)
+ CMCHKUNPK(oduUnpackUInt8, &(cuId), mBuf)
*destId = cuId;
}
{
if(ODU_ADD_POST_MSG_MULT((Data *)xnMsg, xnMsgLen, mBuf) == ROK)
{
- CMCHKPK(oduUnpackUInt8, ueCb->hoInfo.cuUeF1apIdSrc, mBuf);
- CMCHKPK(oduUnpackUInt32, ueCb->hoInfo.tgtCellId, mBuf);
- CMCHKPK(oduUnpackUInt8, HO_REQ, mBuf);
+ CMCHKPK(oduPackUInt8, ueCb->hoInfo.cuUeF1apIdSrc, mBuf);
+ CMCHKPK(oduPackUInt32, ueCb->hoInfo.tgtCellId, mBuf);
+ CMCHKPK(oduPackUInt8, HO_REQ, mBuf);
if(sctpSend(XN_INTERFACE, ueCb->hoInfo.tgtNodeId, mBuf) != ROK)
{
DU_LOG("\nERROR --> CU_STUB: Failed to send handover request to peer CU");
DU_LOG("\nINFO --> CU STUB : Received Handover Request");
/* Find DU Db and Cell Cb from cellId */
- CMCHKUNPK(oduPackUInt32, &(cellId), mBuf);
+ CMCHKUNPK(oduUnpackUInt32, &(cellId), mBuf);
for(duIdx = 0; duIdx < cuCb.numDu; duIdx++)
{
duDb = &cuCb.duInfo[duIdx];
}
/* Fetch CU UE F1AP ID of UE in handover assigned by source CU */
- CMCHKUNPK(oduPackUInt8, &(cuUeF1apIdSrc), mBuf);
+ CMCHKUNPK(oduUnpackUInt8, &(cuUeF1apIdSrc), mBuf);
/* Filling temporary UE context which will be used to create actual UE context at
* CU later */
{
if(ODU_ADD_POST_MSG_MULT((Data *)xnMsg, xnMsgLen, mBuf) == ROK)
{
- CMCHKPK(oduUnpackUInt8, ueCb->gnbCuUeF1apId, mBuf);
- CMCHKPK(oduUnpackUInt8, ueCb->hoInfo.cuUeF1apIdSrc, mBuf);
- CMCHKPK(oduUnpackUInt8, HO_REQ_ACK, mBuf);
+ CMCHKPK(oduPackUInt8, ueCb->gnbCuUeF1apId, mBuf);
+ CMCHKPK(oduPackUInt8, ueCb->hoInfo.cuUeF1apIdSrc, mBuf);
+ CMCHKPK(oduPackUInt8, HO_REQ_ACK, mBuf);
if(sctpSend(XN_INTERFACE, ueCb->hoInfo.srcNodeId, mBuf) != ROK)
{
DU_LOG("\nERROR --> CU_STUB: Failed to send handover request ack to peer CU");
DU_LOG("\nINFO --> CU STUB : Received Handover Request Acknowledgement");
/* Fetch UE CB and DU DB in Source CU for UE under Inter-CU Handover */
- CMCHKUNPK(oduPackUInt8, &(cuUeF1apIdSrc), mBuf);
+ CMCHKUNPK(oduUnpackUInt8, &(cuUeF1apIdSrc), mBuf);
for(duIdx = 0; duIdx < cuCb.numDu; duIdx++)
{
for(ueIdx = 0; ueIdx < MAX_NUM_CELL * MAX_NUM_UE; ueIdx++)
/* Decode CU UE F1AP ID assigned by Target CU to UE in handover and store
* this in hoInfo block for use during future message exchange between the
* two CUs */
- CMCHKUNPK(oduPackUInt8, &(cuUeF1apIdTgt), mBuf);
+ CMCHKUNPK(oduUnpackUInt8, &(cuUeF1apIdTgt), mBuf);
ueCb->hoInfo.cuUeF1apIdTgt = cuUeF1apIdTgt;
/* Decode DU to CU RRC Container received in Xn Msg */
}
}
+/*******************************************************************
+ *
+ * @brief Build And send dummy UE Context Release to Peer CU
+ *
+ * @details
+ *
+ * Function : BuildAndSendUeContextRelease
+ *
+ * Functionality:
+ * Build And send dummy UE Context Release to Peer CU
+ *
+ * @params[in] Pointer to UE Cb
+ * @return void
+ *
+ ******************************************************************/
+void BuildAndSendUeContextRelease(CuUeCb *ueCb)
+{
+ Buffer *mBuf = NULLP;
+
+ if(ODU_GET_MSG_BUF(1, 1, &mBuf) == ROK)
+ {
+ CMCHKPK(oduPackUInt8, ueCb->hoInfo.cuUeF1apIdSrc, mBuf);
+ CMCHKPK(oduPackUInt8, UE_CTXT_REL, mBuf);
+ if(sctpSend(XN_INTERFACE, ueCb->hoInfo.srcNodeId, mBuf) != ROK)
+ {
+ DU_LOG("\nERROR --> CU_STUB: Failed to send UE context release to peer CU");
+ }
+ }
+
+ return;
+}
+
+/*******************************************************************
+ * @brief Process received UE Context Release
+ *
+ * @details
+ *
+ * Function : XNAPProcUeContextRel
+ *
+ * Functionality:
+ * 1. Unpack CU UE F1AP ID (by SCU) and fetch UE CB and
+ * the corresponding DU DB (SDU)
+ * 2. Send UE Context release command to SDU
+ *
+ * @params[in] Destination Id
+ * Pointer to message buffer
+ * @return void
+ *
+ ******************************************************************/
+void XNAPProcUeContextRel(uint32_t destId, Buffer *mBuf)
+{
+ uint8_t duIdx, duId, ueIdx;
+ uint8_t cuUeF1apIdSrc;
+ DuDb *duDb;
+ CuUeCb *ueCb;
+
+ DU_LOG("\nINFO --> CU STUB : Received UE Context Release");
+
+ /* Fetch UE CB and DU DB in Source CU for UE under Inter-CU Handover */
+ CMCHKUNPK(oduUnpackUInt8, &(cuUeF1apIdSrc), mBuf);
+ for(duIdx = 0; duIdx < cuCb.numDu; duIdx++)
+ {
+ for(ueIdx = 0; ueIdx < MAX_NUM_CELL * MAX_NUM_UE; ueIdx++)
+ {
+ if(cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apIdSrc)
+ {
+ duDb = &cuCb.duInfo[duIdx];
+ ueCb = &duDb->ueCb[ueIdx];
+ break;
+ }
+ }
+ if(duDb && ueCb)
+ break;
+ }
+ if(!duDb || !ueCb)
+ {
+ DU_LOG("\nERROR --> CU STUB : UE CB not found for CU UE F1AP ID [%d]", cuUeF1apIdSrc);
+ return;
+ }
+
+ BuildAndSendUeContextReleaseCommand(duDb->duId, ueCb->gnbCuUeF1apId, ueCb->gnbDuUeF1apId);
+}
+
/*******************************************************************
*
* @brief Handle incoming messages at Xn interface
{
XnEventType event;
- CMCHKUNPK(oduPackUInt8, &event, mBuf);
+ CMCHKUNPK(oduUnpackUInt8, &event, mBuf);
switch(event)
{
XNAPProcHandoverReqAck(*destId, mBuf);
break;
}
+ case UE_CTXT_REL:
+ {
+ XNAPProcUeContextRel(*destId, mBuf);
+ break;
+ }
default:
DU_LOG("\nERROR --> CU_STUB : Invalid event [%d] received at XN interface", event);
break;