From d6b8cf5c9afbba0fada62efd626d56cb59c1e839 Mon Sep 17 00:00:00 2001 From: "lal.harshita" Date: Tue, 9 May 2023 19:15:10 +0530 Subject: [PATCH] [Epic-ID: ODUHIGH-463][Task-ID: ODUHIGH-508] UE context release at Source GNB after Inter-CU Handover Change-Id: Ifb6eb6444edc7f9b0385ea0f11a8baae4e74a297 Signed-off-by: lal.harshita --- src/cu_stub/cu_f1ap_msg_hdl.c | 41 +++++++++++--------- src/cu_stub/cu_stub.h | 3 +- src/cu_stub/cu_xnap_msg_hdl.c | 88 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 18 deletions(-) diff --git a/src/cu_stub/cu_f1ap_msg_hdl.c b/src/cu_stub/cu_f1ap_msg_hdl.c index 5da21750b..573c3f024 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -9846,29 +9846,36 @@ uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg) if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS) { - uint8_t ueIdx = 0; - uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.srcNodeId; - DuDb *srcDuDb = NULLP; - - /* In target DU DB, mark UE as active and delete HO info */ - duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE; - memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo)); - - /* Release UE context in source DU because the UE is now - * attached to target DU */ - SEARCH_DU_DB(duIdx, srcDuId, srcDuDb); - for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++) + if(duDb->ueCb[duUeF1apId-1].hoInfo.HOType == Inter_DU_HO) { - if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) + uint8_t ueIdx = 0; + uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.srcNodeId; + DuDb *srcDuDb = NULLP; + + /* Release UE context in source DU because the UE is now + * attached to target DU */ + SEARCH_DU_DB(duIdx, srcDuId, srcDuDb); + for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++) { - ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId); - if(ret != ROK) + if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) { - DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId); + ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId); + if(ret != ROK) + { + DU_LOG("\nINFO --> F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId); + } + break; } - break; } } + else + { + BuildAndSendUeContextRelease(&duDb->ueCb[duUeF1apId-1]); + } + + /* In target DU DB, mark UE as active and delete HO info */ + duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE; + memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo)); return ret; } break; diff --git a/src/cu_stub/cu_stub.h b/src/cu_stub/cu_stub.h index b80998137..5b764af85 100644 --- a/src/cu_stub/cu_stub.h +++ b/src/cu_stub/cu_stub.h @@ -117,7 +117,8 @@ typedef enum XN_SETUP_REQ, XN_SETUP_RSP, HO_REQ, - HO_REQ_ACK + HO_REQ_ACK, + UE_CTXT_REL }XnEventType; typedef enum diff --git a/src/cu_stub/cu_xnap_msg_hdl.c b/src/cu_stub/cu_xnap_msg_hdl.c index c3e01aa00..8033c9940 100644 --- a/src/cu_stub/cu_xnap_msg_hdl.c +++ b/src/cu_stub/cu_xnap_msg_hdl.c @@ -401,6 +401,89 @@ void XNAPProcHandoverReqAck(uint32_t destId, Buffer *mBuf) } } +/******************************************************************* + * + * @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(oduUnpackUInt8, ueCb->hoInfo.cuUeF1apIdSrc, mBuf); + CMCHKPK(oduUnpackUInt8, 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(oduPackUInt8, &(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 @@ -449,6 +532,11 @@ void XNAPMsgHdlr(uint32_t *destId, Buffer *mBuf) 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; -- 2.16.6