X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fcu_stub%2Fcu_f1ap_msg_hdl.c;h=39b0c1fa48ef91a694d5aa18b4083be7c956ac80;hb=refs%2Fchanges%2F06%2F11806%2F4;hp=a40b865352f2e689f21e49cd9e6feca880883caa;hpb=edf809241b22901ebf97d741f08cd4d5a8f0f81d;p=o-du%2Fl2.git diff --git a/src/cu_stub/cu_f1ap_msg_hdl.c b/src/cu_stub/cu_f1ap_msg_hdl.c index a40b86535..39b0c1fa4 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -9024,14 +9024,17 @@ uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg) uint8_t ret = ROK; uint8_t idx; - /* UE Capabulity RAT Container List */ - CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t)); - if(!rrcMsg->uE_CapabilityRAT_ContainerList) + if((ueCb->state != UE_HANDOVER_IN_PROGRESS) || ((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Inter_DU_HO))) { - DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed"); - return RFAILED; + /* UE Capabulity RAT Container List */ + CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t)); + if(!rrcMsg->uE_CapabilityRAT_ContainerList) + { + DU_LOG("\nERROR --> F1AP : Memory allocation for UE capability RAT container list failed"); + return RFAILED; + } + ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList); } - ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList); #if 0 @@ -9724,7 +9727,7 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *rec return RFAILED; } } - else if(ueCb->state == UE_HANDOVER_IN_PROGRESS) + else { if(ueCb->hoInfo.HOType == Inter_DU_HO) { @@ -9778,7 +9781,7 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, char *rec } else if(ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO) { - BuildAndSendHOReqAck(ueCb, recvBuf, recvBufLen); + BuildAndSendHOReqAck(ueCb, duToCuRrcContainer->buf, duToCuRrcContainer->size); } } @@ -9846,29 +9849,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; @@ -11157,7 +11167,12 @@ uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxt else if(action == RRC_RECONFIG_COMPLETE_IND) elementCnt = 3; else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX)) - elementCnt = 5; + { + if(ueCb->state != UE_HANDOVER_IN_PROGRESS) + elementCnt = 5; + else + elementCnt = 4; + } #ifdef NR_DRX if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent) @@ -11302,11 +11317,14 @@ uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxt } /* RRC delivery status request */ - ieIdx++; - ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest; - ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore; - ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest; - ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true; + if(ueCb->state != UE_HANDOVER_IN_PROGRESS) + { + ieIdx++; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest; + ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true; + } } #ifdef NR_DRX @@ -11968,7 +11986,13 @@ uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg, ch duUeF1apId = ueCtxtModRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID; ueCb = &duDb->ueCb[duUeF1apId-1]; - if((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO)) + /* In case UE context modification response is received at source GNB CU from source GNB DU + * for a UE in handover, send HO request to target GNB only if not sent already. + * If HO Req is already sent to target GNB, and an HO Req Ack is received, then + * ueCb->hoInfo.cuUeF1apIdTgt will be non-zero + */ + if((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Xn_Based_Inter_CU_HO) && \ + (ueCb->hoInfo.cuUeF1apIdTgt == 0)) { BuildAndSendHOReq(ueCb, recvBuf, recvBufLen); }