X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fcu_stub%2Fcu_xnap_msg_hdl.c;fp=src%2Fcu_stub%2Fcu_xnap_msg_hdl.c;h=c3e01aa005cc15a927ae7c82a1ca6196d619be93;hb=a3d6ee5b748b9591315cede5c78a14b290b1ca9a;hp=436809a51eb3e966436abcf36c254fc93ae3ebf4;hpb=f1f384a125521129ec29c1589b8499010cc4685c;p=o-du%2Fl2.git diff --git a/src/cu_stub/cu_xnap_msg_hdl.c b/src/cu_stub/cu_xnap_msg_hdl.c index 436809a51..c3e01aa00 100644 --- a/src/cu_stub/cu_xnap_msg_hdl.c +++ b/src/cu_stub/cu_xnap_msg_hdl.c @@ -316,23 +316,89 @@ void BuildAndSendHOReqAck(CuUeCb *ueCb, char *xnMsg, MsgLen xnMsgLen) * Function : XNAPProcHandoverReqAck * * Functionality: - * 1. Unpack CU UE F1AP ID (by SCU) and search for UE CB and + * 1. Unpack CU UE F1AP ID (by SCU) and fetch UE CB and * the corresponding DU DB (SDU) * 2. Unpack CU UE F1AP ID (by TCU) and fill in UEcb->hoInfo - * 3. Decode the F1AP UE context setup response msg received in - * XNAP message buffer and extract UE configurations - * 4. Create RRC reconfig msg with these configurations - * 5. Send RRC Reconfig msg and Transmission Action = DO NOT TRANSMIT - * in UE context modification request to S DU + * 3. Decode DU to CU RRC Container received in XNAP message + * buffer and extract UE configurations. + * 4. Send UE Context modification response to SDU conatining + * RRC Reconfig Message and command to stop transmission + * to UE in handover. * - * @params[in] Pointer to destination Id + * @params[in] Destination Id * Pointer to message buffer * @return void * ******************************************************************/ void XNAPProcHandoverReqAck(uint32_t destId, Buffer *mBuf) { + uint8_t duIdx, duId, ueIdx; + uint8_t cuUeF1apIdSrc; + uint8_t cuUeF1apIdTgt; + DuDb *duDb; + CuUeCb *ueCb; + 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); + 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 = &cuCb.duInfo[duIdx].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; + } + + /* 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); + ueCb->hoInfo.cuUeF1apIdTgt = cuUeF1apIdTgt; + + /* Decode DU to CU RRC Container received in Xn Msg */ + OCTET_STRING_t rrcCont; + MsgLen copyCnt; + + /* Copy mBuf into char array to decode it */ + memset(&rrcCont, 0, sizeof(OCTET_STRING_t)); + ODU_GET_MSG_LEN(mBuf, &rrcCont.size); + CU_ALLOC(rrcCont.buf, rrcCont.size); + if(rrcCont.buf == NULLP) + { + DU_LOG("\nERROR --> XNAP : Memory allocation failed"); + return; + } + if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, rrcCont.size, (Data *)rrcCont.buf, ©Cnt) != ROK) + { + DU_LOG("\nERROR --> F1AP : Failed while copying %d", copyCnt); + return; + } + + /* Extract DU to CU RRC container information and store in UE CB */ + extractDuToCuRrcCont(ueCb, rrcCont); + + CU_FREE(rrcCont.buf, rrcCont.size); + + /* Send UE Context Modification request after filling it using the information received in + * Xn Handover Request Ack */ + if(BuildAndSendUeContextModificationReq(duDb->duId, ueCb, STOP_DATA_TX) != ROK) + { + DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()"); + return; + } } /*******************************************************************