X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fcu_stub%2Fcu_f1ap_msg_hdl.c;h=aef220d44bdaad9badc136feb179d59d01cd0fbe;hb=0bb62f25ad9d8f9ff8724572f96e51a898937f0c;hp=7e1b9ac4245d3509ba3a9261061d0123353b20ab;hpb=bd2905b5f651349abafb7934a952414d7c24e291;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 7e1b9ac42..aef220d44 100644 --- a/src/cu_stub/cu_f1ap_msg_hdl.c +++ b/src/cu_stub/cu_f1ap_msg_hdl.c @@ -129,6 +129,7 @@ #include "RRCReconfiguration-v1530-IEs.h" #include "CNUEPagingIdentity.h" #include "PagingCell-Item.h" +#include "UL-DCCH-Message.h" #include "cu_stub_sctp.h" #include "cu_stub_egtp.h" @@ -188,31 +189,6 @@ S16 SendF1APMsg(Region region, Pool pool, uint32_t duId) return ROK; } /* SendF1APMsg */ -/******************************************************************* - * - * @brief Builds NRCell ID - * - * @details - * - * Function : BuildNrCellId - * - * Functionality: Building the NR Cell ID - * - * @params[in] BIT_STRING_t *nrcell - * @return ROK - success - * RFAILED - failure - * - * ****************************************************************/ - -S16 BuildNrCellId(BIT_STRING_t *nrcell) -{ - memset(nrcell->buf, 0, nrcell->size); - nrcell->buf[4] = 16; - nrcell->bits_unused = 4; - nrcell->size = 5 * sizeof(uint8_t); - return ROK; -} - /******************************************************************** * * @brief Builds and sends the F1SetupResponse @@ -418,10 +394,11 @@ uint8_t BuildAndSendF1SetupRsp(uint32_t duId, BIT_STRING_t *nrcellId) buildPlmnId(cuCb.cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\ Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf); cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\ - nRCGI.nRCellIdentity.size = 5; + nRCGI.nRCellIdentity.size = 5*sizeof(uint8_t); CU_ALLOC(cellToActivate->list.array[0]->value.choice.\ Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\ - 5*sizeof(uint8_t)); + cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\ + nRCGI.nRCellIdentity.size); if(cellToActivate->list.array[0]->value.choice.\ Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP) { @@ -1534,9 +1511,28 @@ uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rr if(ret == RFAILED) DU_LOG("\nERROR --> F1AP: Failed to fill DL-CCCH Msg at RRC SETUP"); } - else if(rrcMsgType == REGISTRATION_ACCEPT) + else if(rrcMsgType == RRC_SETUP_COMPLETE) + { + DU_LOG("\nINFO --> F1AP : Sending Security mode command"); + char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00}; + bufLen =9; + rrcContainer->size = bufLen; + CU_ALLOC(rrcContainer->buf, rrcContainer->size); + if(rrcContainer->buf != NULLP) + { + memset(rrcContainer->buf, 0, bufLen); + memcpy(rrcContainer->buf, secModeBuf, bufLen); + } + else + { + DU_LOG("\nERROR --> F1AP : Memory allocation failure for RRC Container buffer"); + ret = RFAILED; + } + } + else if(rrcMsgType == SECURITY_MODE_COMPLETE) { /*Hardcoded RRC Container from reference logs*/ + DU_LOG("\nINFO --> F1AP : Sending Registration accept"); char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00}; bufLen =14; rrcContainer->size = bufLen; @@ -1552,9 +1548,9 @@ uint8_t BuildDLRRCContainer(CuUeCb *ueCb, uint8_t rrcMsgType, RRCContainer_t *rr ret = RFAILED; } } - else if(rrcMsgType == RRC_RECONFIG) + else if(rrcMsgType == UE_CONTEXT_SETUP_RSP) { - DU_LOG("\nDEBUG --> F1AP : Filling DL DCCH RRC Message "); + DU_LOG("\nINFO --> F1AP : Filling DL DCCH RRC Message for RRC Reconfiguration "); ret = fillDlDcchRrcMsg(ueCb, rrcContainer); if(ret == RFAILED) DU_LOG("\nERROR --> F1AP: Failed to fill DL-DCCH Msg for RRC Reconfiguration"); @@ -1768,24 +1764,21 @@ uint8_t setDlRRCMsgType(CuUeCb *ueCb) case RRC_SETUP: rrcMsgType = RRC_SETUP; break; - case REGISTRATION_ACCEPT: - rrcMsgType = REGISTRATION_ACCEPT; - break; - case UE_CONTEXT_SETUP_REQ: - rrcMsgType = UE_CONTEXT_SETUP_REQ; + case RRC_SETUP_COMPLETE: + rrcMsgType = RRC_SETUP_COMPLETE; break; case SECURITY_MODE_COMPLETE: rrcMsgType = SECURITY_MODE_COMPLETE; break; - case RRC_RECONFIG: - rrcMsgType = RRC_RECONFIG; + case REGISTRATION_COMPLETE: + rrcMsgType = REGISTRATION_COMPLETE; + break; + case UE_CONTEXT_SETUP_RSP: + rrcMsgType = UE_CONTEXT_SETUP_RSP; break; case RRC_RECONFIG_COMPLETE: rrcMsgType = RRC_RECONFIG_COMPLETE; break; - case UE_CONTEXT_MOD_REQ: - rrcMsgType = UE_CONTEXT_MOD_REQ; - break; default: break; } @@ -1960,6 +1953,9 @@ uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont) CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP; asn_dec_rval_t rval; /* Decoder return value */ + /* Copy the received container to UeCb */ + memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t)); + /* Decoding DU to CU RRC container octet string to cell group config */ cellGrpCfgMsg = &cellGrpCfg; memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t)); @@ -2002,9 +1998,10 @@ uint8_t extractDuToCuRrcCont(CuUeCb *ueCb, OCTET_STRING_t rrcCont) uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg) { - uint8_t idx,cellIdx=0, duIdx=0, rrcMsgType, gnbDuUeF1apId; + uint8_t idx = 0, duIdx=0, rrcMsgType=0, gnbDuUeF1apId=0; uint8_t ret =ROK; - uint32_t nrCellId, crnti; + uint16_t cellIdx=0, nrCellId = 0; + uint32_t crnti; DuDb *duDb; CuCellCb *cellCb; CuUeCb *ueCb; @@ -2024,8 +2021,7 @@ uint8_t procInitULRRCMsg(uint32_t duId, F1AP_PDU_t *f1apMsg) break; case ProtocolIE_ID_id_NRCGI: - nrCellId = initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.buf[4] >> - initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity.bits_unused; + bitStringToInt(&initULRRCMsg->protocolIEs.list.array[idx]->value.choice.NRCGI.nRCellIdentity, &nrCellId); SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb); if(cellCb == NULLP) return RFAILED; @@ -7556,7 +7552,7 @@ void freeSrbToAddModList(SRB_ToAddModList_t *srbToAddList) * * @details * - * Function : fillRadioBearerConfig + * Function : freeRadioBearerConfig * * Functionality: Free Radio Bearer config * @@ -7652,12 +7648,6 @@ uint8_t fillSrbToAddModList(CuUeCb *ueCb, SRB_ToAddModList_t *srbToAddList, bool return ROK; } - CU_ALLOC(srbToAddList, sizeof(SRB_ToAddModList_t)); - if(!srbToAddList) - { - DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig"); - return RFAILED; - } srbToAddList->list.count = elementCnt; srbToAddList->list.size = srbToAddList->list.count * sizeof(SRB_ToAddMod_t *); @@ -7751,13 +7741,6 @@ uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool return ROK; } - /* DRB To Add/Mod List */ - CU_ALLOC(drbToAddList, sizeof(DRB_ToAddModList_t)); - if(!drbToAddList) - { - DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig"); - return RFAILED; - } drbToAddList->list.count = elementCnt; drbToAddList->list.size = drbToAddList->list.count * sizeof(DRB_ToAddMod_t *); @@ -7866,13 +7849,28 @@ uint8_t fillDrbToAddModList(CuUeCb *ueCb, DRB_ToAddModList_t *drbToAddList, bool uint8_t fillRadioBearerConfig(CuUeCb *ueCb, RadioBearerConfig_t *radioBearerConfig, bool updateAllRbCfg) { /* SRB To Add/Mod List */ + CU_ALLOC(radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t)); + if(!radioBearerConfig->srb_ToAddModList) + { + DU_LOG("\nERROR --> F1AP: Memory allocation failed for SRB to AddMod List in fillRadioBearerConfig"); + return RFAILED; + } if(fillSrbToAddModList(ueCb, radioBearerConfig->srb_ToAddModList, updateAllRbCfg) != ROK) { + DU_LOG("\nERROR --> F1AP: failed to fill SRB to AddMod List"); return RFAILED; } + /* DRB To Add/Mod List */ + CU_ALLOC(radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t)); + if(!radioBearerConfig->drb_ToAddModList) + { + DU_LOG("\nERROR --> F1AP: Memory allocation failed for DRB to AddMod List in fillRadioBearerConfig"); + return RFAILED; + } if(fillDrbToAddModList(ueCb, radioBearerConfig->drb_ToAddModList, updateAllRbCfg) != ROK) { + DU_LOG("\nERROR --> F1AP: failed to fill DRB to AddMod List "); return RFAILED; } @@ -8442,13 +8440,28 @@ uint8_t fillRrcReconfigNonCriticalExt(CuUeCb *ueCb, RRCReconfiguration_v1530_IEs CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t)); if(!rrcRecfg->masterCellGroup) { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt"); return RFAILED; } + rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size; + CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size); + if(!rrcRecfg->masterCellGroup->buf) + { + DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt"); + return RFAILED; + } + memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size); + +#if 0 + /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer + * received from DU */ if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK) { + DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt"); return RFAILED; } +#endif return ROK; } @@ -8876,7 +8889,7 @@ void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg) * RFAILED - failure * * ****************************************************************/ -uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcContLen, uint8_t *rrcContainer) +uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb) { uint8_t Nrcgiret, SplCellListret, SrbSetupret; uint8_t ret= RFAILED, ret1; @@ -8917,7 +8930,7 @@ uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcC if(ueCb->state == UE_HANDOVER_IN_PROGRESS) elementCnt = 7; else - elementCnt = 12; + elementCnt = 11; ueSetReq->protocolIEs.list.count = elementCnt; ueSetReq->protocolIEs.list.size = elementCnt * sizeof(UEContextSetupRequestIEs_t *); @@ -9043,25 +9056,6 @@ uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb, uint16_t rrcC if(ueCb->state != UE_HANDOVER_IN_PROGRESS) { - /* RRC Container for security mode */ - idx++; - ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer; - ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject; - ueSetReq->protocolIEs.list.array[idx]->value.present = UEContextSetupRequestIEs__value_PR_RRCContainer; - - char secModeBuf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00}; - bufLen =9; - ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen; - CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, - ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size); - if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf) - { - DU_LOG("\nERROR --> F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed"); - break; - } - memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, bufLen); - memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, secModeBuf, bufLen); - /* RRC delivery status request */ idx++; ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest; @@ -9265,11 +9259,12 @@ uint8_t procDrbSetupList(uint32_t duId, DRBs_Setup_List_t *drbSetupList) * ****************************************************************/ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) { - uint8_t duIdx = 0, idx = 0, ueIdx = 0; + uint8_t duIdx = 0, idx = 0, ueIdx = 0, rrcMsgType=0; uint8_t duUeF1apId = 0, cuUeF1apId = 0; DuDb *duDb = NULLP; CuUeCb *ueCb = NULLP; UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP; + OCTET_STRING_t *duToCuRrcContainer; SEARCH_DU_DB(duIdx, duId, duDb); ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse; @@ -9320,6 +9315,8 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_DUtoCURRCInformation: { DU_LOG("\nINFO --> Received Du to Cu RRC Information "); + duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\ + DUtoCURRCInformation.cellGroupConfig; if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\ DUtoCURRCInformation.cellGroupConfig)) != ROK) { @@ -9330,9 +9327,7 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) } } } - - ueCb->f1apMsgDb.dlRrcMsgCount++; /* keeping DL RRC Msg Count */ - + /* If the UE is in handover, UE context modification request is to be sent to * source DU once UE context setup response is received from target DU */ if(ueCb->state == UE_HANDOVER_IN_PROGRESS) @@ -9365,6 +9360,10 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) /* Store source DU info in the new UE context created in * tareget DU */ ueCb->hoInfo.sourceDuId = srcDuDb->duId; + + /* Copy the received container to UeCb */ + memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t)); + if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK) { DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()"); @@ -9378,6 +9377,19 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) break; } } + else + { + ueCb->f1apMsgDb.dlRrcMsgCount++; + rrcMsgType = setDlRRCMsgType(ueCb); + + DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC reconfiguration"); + if(BuildAndSendDLRRCMessageTransfer(duId, ueCb, SRB1, rrcMsgType) != ROK) + { + DU_LOG("\nINFO --> F1AP: Failed to build and send DL RRC MSG for RRC reconfiguration"); + return RFAILED; + } + } + return ROK; } @@ -9399,12 +9411,12 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg) { - uint8_t idx, ret, srbId, rrcMsgType, duIdx=0; - uint8_t cuUeF1apId, duUeF1apId; - uint8_t *rrcContainer = NULLP; - uint16_t rrcContLen; - DuDb *duDb; - CuUeCb *ueCb; + uint8_t idx = 0, ret = ROK, srbId = 0, rrcMsgType = 0, duIdx=0; + uint8_t *rrcContainer = NULLP; + uint16_t rrcContLen = 0; + uint32_t cuUeF1apId = 0, duUeF1apId = 0; + DuDb *duDb = NULLP; + CuUeCb *ueCb = NULLP; ULRRCMessageTransfer_t *ulRrcMsg = NULLP; ret = ROK; @@ -9439,6 +9451,34 @@ uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg) return RFAILED; } memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, rrcContLen); + + if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS) + { + uint8_t ueIdx = 0; + uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId; + 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(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId) + { + 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; + } + } + return ret; + } break; } @@ -9453,37 +9493,25 @@ uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg) ueCb = &duDb->ueCb[duUeF1apId-1]; ueCb->f1apMsgDb.dlRrcMsgCount++; rrcMsgType = setDlRRCMsgType(ueCb); - if(rrcMsgType == REGISTRATION_ACCEPT) + if(rrcMsgType == RRC_SETUP_COMPLETE) { - DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept"); + DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for Security Mode Command"); ret = BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType); } - if(rrcMsgType == UE_CONTEXT_SETUP_REQ) + else if(rrcMsgType == SECURITY_MODE_COMPLETE) { - DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Req"); - ret = BuildAndSendUeContextSetupReq(duId, ueCb, rrcContLen, rrcContainer); + DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Registration Accept"); + BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType); } - if(rrcMsgType == SECURITY_MODE_COMPLETE) + else if(rrcMsgType == REGISTRATION_COMPLETE) { - /* To trigger the DL RRC Msg for RRC Reconfig */ - ueCb->f1apMsgDb.dlRrcMsgCount++; - rrcMsgType = setDlRRCMsgType(ueCb); - if(rrcMsgType == RRC_RECONFIG) - { - DU_LOG("\nINFO --> F1AP: Sending DL RRC MSG for RRC Reconfig"); - BuildAndSendDLRRCMessageTransfer(duId, ueCb, srbId, rrcMsgType); - } + DU_LOG("\nINFO --> F1AP: Sending Ue Context Setup Request"); + ret = BuildAndSendUeContextSetupReq(duId, ueCb); } - if(rrcMsgType == RRC_RECONFIG_COMPLETE) + else if(rrcMsgType == RRC_RECONFIG_COMPLETE) { - ueCb->state = UE_ACTIVE; - ueCb->f1apMsgDb.dlRrcMsgCount++; - rrcMsgType = setDlRRCMsgType(ueCb); - if(rrcMsgType == UE_CONTEXT_MOD_REQ) - { - DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request"); - BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND); - } + DU_LOG("\nINFO --> F1AP: Sending UE Context Modification Request"); + BuildAndSendUeContextModificationReq(duId, ueCb, RRC_RECONFIG_COMPLETE_IND); } } return ret; @@ -10718,6 +10746,7 @@ uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxt ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \ TransmissionActionIndicator_restart; } + ieIdx++; ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer; ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; @@ -10754,10 +10783,15 @@ uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxt else { DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n"); +#if 0 + /* This for loop was going into an infinite loop even though encBufSize + * has a small value. Hence commented this + */ for(ieIdx=0; ieIdx< encBufSize; ieIdx++) { DU_LOG("%x",encBuf[ieIdx]); } +#endif } /* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */ @@ -11068,8 +11102,7 @@ uint8_t procGnbDuUpdate(uint32_t duId, F1AP_PDU_t *f1apMsg) struct Served_Cells_To_Delete_ItemIEs *deleteItemIe = \ (struct Served_Cells_To_Delete_ItemIEs *)duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\ Served_Cells_To_Delete_List.list.array[0]; - nrCellId = deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.buf[4] >>\ - deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity.bits_unused; + bitStringToInt(&deleteItemIe->value.choice.Served_Cells_To_Delete_Item.oldNRCGI.nRCellIdentity, &nrCellId); cellToBeDelete = true; break; } @@ -11419,7 +11452,7 @@ uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) * request */ if(ueCbInTgtDu == NULLP) { - if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb, 0, NULLP)) != ROK) + if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK) { DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextSetupReq"); return RFAILED; @@ -11450,7 +11483,8 @@ uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg) void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg) { uint8_t ieIdx = 0, plmnidx=0, duIdx = 0, ret=ROK, cellIdx = 0; - uint32_t duId = 0, nrCellId = 0; + uint32_t duId = 0; + uint64_t nrCellId = 0; DuDb *duDb = NULLP; CuCellCb *cellCb = NULLP; BIT_STRING_t nrcellIdentity; @@ -11500,8 +11534,8 @@ void procF1SetupReq(uint32_t *destDuId, F1AP_PDU_t *f1apMsg) srvCellItem = &duServedCell->list.array[plmnidx]->value.choice.GNB_DU_Served_Cells_Item; ret = procServedCellPlmnList(&srvCellItem->served_Cell_Information.servedPLMNs); memcpy(&nrcellIdentity, &srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity, sizeof(BIT_STRING_t)); - - nrCellId = nrcellIdentity.buf[4] >> nrcellIdentity.bits_unused; + + bitStringToInt(&nrcellIdentity, &nrCellId); SEARCH_CELL_DB(cellIdx, duDb, nrCellId, cellCb); if(cellCb == NULLP) { @@ -11583,7 +11617,7 @@ void procUeContextReleaseComplete(uint32_t duId, F1AP_PDU_t *f1apMsg) { ueCb->cellCb->ueCb[ueIdx] = NULLP; ueCb->cellCb->numUe--; - if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus = CELL_DELETION_IN_PROGRESS)) + if((ueCb->cellCb->numUe == 0) && (ueCb->cellCb->cellStatus == CELL_DELETION_IN_PROGRESS)) { memset(ueCb->cellCb, 0, sizeof(CuCellCb)); duDb->numCells--;