X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_f1ap_msg_hdl.c;h=31b432b998ad44c857a14cb3cfea18c450542e55;hb=cbb4a6f503471e0f923b080a3add21f933b76e95;hp=01068a8d7f6e84b3d161487292f6aa8e2188ada1;hpb=d74291a3d7dadc783460e134b0e24f2b9ae07b2a;p=o-du%2Fl2.git diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index 01068a8d7..31b432b99 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -22,6 +22,7 @@ #include "legtp.h" #include "lkw.x" #include "lrg.x" +#include "F1AP-PDU.h" #include "du_app_mac_inf.h" #include "du_cfg.h" #include "du_app_rlc_inf.h" @@ -91,7 +92,6 @@ #include "SchedulingRequestResourceConfig.h" #include #include "ProtocolExtensionField.h" -#include "F1AP-PDU.h" #include "odu_common_codec.h" #include "du_mgr.h" #include "du_cell_mgr.h" @@ -103,13 +103,12 @@ #include "GTPTunnel.h" #ifdef O1_ENABLE - -#include "Config.h" +#include "ConfigInterface.h" extern StartupConfig g_cfg; - #endif DuCfgParams duCfgParam; + /************************************************************************ * * @brief Converts enum values into actual value of Poll retransmit timer @@ -599,6 +598,109 @@ int16_t getStatProhTmr(uint8_t statProhTmrCfg) return statProhTmr; } +/******************************************************************* +* +* @brief Adding F1AP pdu to reserved pdu list +* +* @details +* +* Function : addToReservedF1apPduList +* +* Functionality: Adding F1AP pdu to reserved pdu list. +* These pdu are awaiting aknowledgment from CU +* +* @params[in] uint8_t transId, F1AP_PDU_t *f1apMsg +* +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +void addToReservedF1apPduList(uint8_t transId, F1AP_PDU_t *f1apPdu) +{ + CmLList *node = NULLP; + ReservedF1apPduInfo *pduInfo = NULLP; + DU_ALLOC(pduInfo, sizeof(ReservedF1apPduInfo)); + if(pduInfo) + { + DU_ALLOC(node, sizeof(CmLList)); + if(node) + { + pduInfo->transId = transId; + pduInfo->f1apMsg = (void*) f1apPdu; + + node->node = (PTR)pduInfo; + cmLListAdd2Tail(&duCb.reservedF1apPduList, node); + } + } +} + +/******************************************************************* +* +* @brief searching for F1AP pdu from ReservedF1apPduList +* +* @details +* +* Function : searchFromReservedF1apPduList +* +* Functionality: searching for F1AP pdu information +* +* @params[in] uint8_t transId +* +* @return pointer to F1AP_PDU_t +* +* ****************************************************************/ + +CmLList *searchFromReservedF1apPduList(uint8_t transId) +{ + CmLList *node; + ReservedF1apPduInfo *f1apPdu; + if(duCb.reservedF1apPduList.count) + { + CM_LLIST_FIRST_NODE(&duCb.reservedF1apPduList, node); + while(node) + { + f1apPdu = (ReservedF1apPduInfo*)node->node; + if(f1apPdu->transId == transId) + { + return node; + } + node = node->next; + } + } + return NULL; +} + +/******************************************************************* +* +* @brief deleting F1AP pdu information from ReservedF1apPduList +* +* @details +* +* Function : deleteFromReservedF1apPduList +* +* Functionality: deleting pdu information from ReservedF1apPduList +* +* @params[in] CmLList *node +* +* @return void +* +* ****************************************************************/ + +void deleteFromReservedF1apPduList(CmLList *node) +{ + ReservedF1apPduInfo *f1apPdu; + + if(node != NULL) + { + f1apPdu = (ReservedF1apPduInfo *)node->node; + cmLListDelFrm(&duCb.reservedF1apPduList, node); + DU_FREE(f1apPdu, sizeof(ReservedF1apPduInfo)); + DU_FREE(node, sizeof(CmLList)); + node = NULL; + } +} + /******************************************************************* * * @brief Builds Uplink Info for NR @@ -1710,6 +1812,203 @@ uint8_t BuildAndSendF1SetupReq() return ret; }/* End of BuildAndSendF1SetupReq */ +/******************************************************************* + * + * @brief Deallocating memory allocated for Served_Cells_To_Modify_Item_t + * + * @details + * + * Function : freeCellsToModifyItem + * + * Functionality: Deallocating memory of variables allocated in + * BuildAndSendDUConfigUpdate function + * + * @params[in] Served_Cells_To_Modify_Item_t *modifyItem + * + * @return ROK - void + * + * ****************************************************************/ + +void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem) +{ + uint8_t arrIdx=0,i=0; + if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP) + { + if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP) + { + if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP) + { + if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf + != NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.array\ + != NULLP) + { + if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->pLMN_Identity.buf != NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions!= NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions->list.array != NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions->list.array[arrIdx]) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ + list.array !=NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ + list.array[arrIdx]!=NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ + list.array[arrIdx]->sNSSAI.sST.buf!=NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.\ + SliceSupportList.\ + list.array[arrIdx]->sNSSAI.sD != NULLP) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.\ + choice.SliceSupportList.\ + list.array[arrIdx]->sNSSAI.sD->buf!=NULLP) + { + if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD + !=NULLP) + { + if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ + fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP) + { + if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ + fDD->uL_NRFreqInfo.freqBandListNr.list.array[arrIdx]!=NULLP) + { + if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ + fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP) + { + if(modifyItem->served_Cell_Information.nR_Mode_Info.\ + choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\ + array[arrIdx]!= NULLP) + { + if(modifyItem->served_Cell_Information.\ + measurementTimingConfiguration.buf !=NULLP) + { + DU_FREE(modifyItem->served_Cell_Information.\ + measurementTimingConfiguration.\ + buf,modifyItem->served_Cell_Information.\ + measurementTimingConfiguration.size); + } + DU_FREE(modifyItem->served_Cell_Information.\ + nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\ + freqBandListNr.\ + list.array[arrIdx],sizeof(FreqBandNrItem_t)); + } + DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\ + .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\ + modifyItem->served_Cell_Information.nR_Mode_Info.\ + choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size); + } + DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\ + choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\ + array[arrIdx],sizeof(FreqBandNrItem_t)); + } + DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\ + choice.\ + fDD->uL_NRFreqInfo.freqBandListNr.list.\ + array,modifyItem->served_Cell_Information.nR_Mode_Info.\ + choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size); + } + DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ + fDD,sizeof(FDD_Info_t)); + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions->list.array[arrIdx]->extensionValue.\ + choice.SliceSupportList.\ + list.array[arrIdx]->sNSSAI.sD->buf,modifyItem->\ + served_Cell_Information.\ + servedPLMNs.list.array[arrIdx]->iE_Extensions->list.\ + array[arrIdx]->\ + extensionValue.choice.SliceSupportList.list.array[arrIdx]->\ + sNSSAI.sD->size); + + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.\ + SliceSupportList.\ + list.array[arrIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t)); + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.\ + SliceSupportList.\ + list.array[arrIdx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\ + servedPLMNs.\ + list.array[arrIdx]->iE_Extensions->list.array[arrIdx]->\ + extensionValue.choice.\ + SliceSupportList.list.array[arrIdx]->sNSSAI.sST.size); + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ + list.array[arrIdx],sizeof(SliceSupportItem_t)); + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\ + list.array,\ + modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\ + iE_Extensions->list.array[arrIdx]->extensionValue.choice.\ + SliceSupportList.list.size); + } + } + for(i=0;iserved_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions->list.count;i++) + { + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions->list.array[i],\ + sizeof(ServedPLMNs_ItemExtIEs_t )); + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.\ + servedPLMNs.list.array[arrIdx]->iE_Extensions->list.size); + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t)); + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ + array[arrIdx]->pLMN_Identity.buf, + modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->pLMN_Identity.size); + } + } + for(i=0;iserved_Cell_Information.servedPLMNs.list.count;i++) + { + if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i] + != NULLP) + { + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\ + sizeof(ServedPLMNs_Item_t)); + } + } + DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\ + modifyItem->served_Cell_Information.servedPLMNs.list.size); + } + DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\ + modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size); + } + DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\ + modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size); + } + DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\ + modifyItem->oldNRCGI.nRCellIdentity.size); + } + DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\ + modifyItem->oldNRCGI.pLMN_Identity.size); + } +} /******************************************************************* * * @brief Deallocating memory of BuildAndSendDUConfigUpdate @@ -1728,231 +2027,87 @@ uint8_t BuildAndSendF1SetupReq() * ****************************************************************/ void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg) { - uint8_t i; - uint8_t idx; + uint8_t ieIdx=0, cellModifyIdx=0, cellDeleteIdx=0; GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP; - Served_Cells_To_Modify_List_t *cellsToModify; - Served_Cells_To_Modify_Item_t *modifyItem; - idx=0; - i=1; + Served_Cells_To_Modify_List_t *cellsToModify=NULLP; + Served_Cells_To_Delete_List_t *cellsToDelete=NULLP; + Served_Cells_To_Delete_Item_t *deleteItem = NULLP; + Served_Cells_To_Delete_ItemIEs_t *deleteItemIe = NULLP; + if(f1apDuCfg != NULLP) { if(f1apDuCfg->choice.initiatingMessage != NULLP) { - duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\ - value.choice.GNBDUConfigurationUpdate; - if(duCfgUpdate->protocolIEs.list.array != NULLP) - { - if(duCfgUpdate->protocolIEs.list.array[i] != NULLP) - { - cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\ - value.choice.Served_Cells_To_Modify_List; - if(cellsToModify->list.array != NULLP) - { - if(cellsToModify->list.array[idx] != NULLP) - { - modifyItem=&cellsToModify->list.array[idx]->value.choice.\ - Served_Cells_To_Modify_Item; - if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP) - { - if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP) - { - if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP) - { - if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf - != NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.array\ - != NULLP) - { - if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->pLMN_Identity.buf != NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions!= NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions->list.array != NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions->list.array[idx]) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array !=NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[idx]!=NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[idx]->sNSSAI.sST.buf!=NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[idx]->sNSSAI.sD != NULLP) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[idx]->sNSSAI.sD->buf!=NULLP) - { - if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD - !=NULLP) - { - if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ - fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP) - { - if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ - fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP) - { - if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ - fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP) - { - if(modifyItem->served_Cell_Information.nR_Mode_Info.\ - choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\ - array[idx]!= NULLP) - { - if(modifyItem->served_Cell_Information.\ - measurementTimingConfiguration.buf !=NULLP) - { - idx=2; - if(duCfgUpdate->protocolIEs.list.array[idx]->value.\ - choice.GNB_DU_ID.buf!=NULLP) - { - DU_FREE(duCfgUpdate->protocolIEs.list.\ - array[idx]->value.choice.GNB_DU_ID.buf,\ - duCfgUpdate->protocolIEs.list.array[idx]->\ - value.choice.GNB_DU_ID.size); - } - idx=0; - DU_FREE(modifyItem->served_Cell_Information.\ - measurementTimingConfiguration.\ - buf,modifyItem->served_Cell_Information.\ - measurementTimingConfiguration.size); - } - DU_FREE(modifyItem->served_Cell_Information.\ - nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\ - list.array[idx],sizeof(FreqBandNrItem_t)); - } - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\ - .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\ - modifyItem->served_Cell_Information.nR_Mode_Info.\ - choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size); - } - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\ - choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\ - array[idx],sizeof(FreqBandNrItem_t)); - } - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\ - choice.\ - fDD->uL_NRFreqInfo.freqBandListNr.list.\ - array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ - fDD->uL_NRFreqInfo.freqBandListNr.list.size); - } - DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\ - fDD,sizeof(FDD_Info_t)); - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\ - SliceSupportList.\ - list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\ - servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\ - extensionValue.choice.SliceSupportList.list.array[idx]->\ - sNSSAI.sD->size); + duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\ + value.choice.GNBDUConfigurationUpdate; + if(duCfgUpdate->protocolIEs.list.array != NULLP) + { + for(ieIdx=0; ieIdxprotocolIEs.list.count; ieIdx++) + { + if(duCfgUpdate->protocolIEs.list.array[ieIdx] != NULLP) + { + switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_Served_Cells_To_Modify_List: + { + cellsToModify = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\ + value.choice.Served_Cells_To_Modify_List; + if(cellsToModify->list.array != NULLP) + { + for(cellModifyIdx=0; cellModifyIdxlist.count ;cellModifyIdx++) + { + if(cellsToModify->list.array[cellModifyIdx] != NULLP) + { + freeCellsToModifyItem(&cellsToModify->list.array[cellModifyIdx]->value.choice.\ + Served_Cells_To_Modify_Item); + DU_FREE(cellsToModify->list.array[cellModifyIdx],\ + sizeof(Served_Cells_To_Modify_ItemIEs_t)); + } + } + DU_FREE(cellsToModify->list.array,cellsToModify->list.size); + } + break; + } + case ProtocolIE_ID_id_Served_Cells_To_Delete_List: + { + cellsToDelete = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\ + value.choice.Served_Cells_To_Delete_List; + if(cellsToDelete->list.array != NULLP) + { + for(cellDeleteIdx=0; cellDeleteIdxlist.count ;cellDeleteIdx++) + { + if(cellsToDelete->list.array[cellDeleteIdx] != NULLP) + { + deleteItemIe = ((Served_Cells_To_Delete_ItemIEs_t*)\ + cellsToDelete->list.array[cellDeleteIdx]); + deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item; + DU_FREE(deleteItem->oldNRCGI.pLMN_Identity.buf,\ + deleteItem->oldNRCGI.pLMN_Identity.size); + DU_FREE(deleteItem->oldNRCGI.nRCellIdentity.buf,\ + deleteItem->oldNRCGI.nRCellIdentity.size); + DU_FREE(cellsToDelete->list.array[cellDeleteIdx],\ + sizeof(Served_Cells_To_Delete_ItemIEs_t)); + } + } + DU_FREE(cellsToDelete->list.array,cellsToDelete->list.size); + } - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t)); - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\ - servedPLMNs.\ - list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\ - SliceSupportList.list.array[idx]->sNSSAI.sST.size); - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array[idx],sizeof(SliceSupportItem_t)); - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\ - list.array,\ - modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\ - iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size); - } - } - for(i=0;iserved_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions->list.count;i++) - { - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions->list.array[i],\ - sizeof(ServedPLMNs_ItemExtIEs_t )); - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs. - list.array[idx]->iE_Extensions->list.size); - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t)); - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\ - array[idx]->pLMN_Identity.buf, - modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size); - } - } - for(i=0;iserved_Cell_Information.servedPLMNs.list.count;i++) - { - if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i] - != NULLP) - { - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\ - sizeof(ServedPLMNs_Item_t)); - } - } - DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\ - modifyItem->served_Cell_Information.servedPLMNs.list.size); - } - DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\ - modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size); - } - DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\ - modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size); - } - DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\ - modifyItem->oldNRCGI.nRCellIdentity.size); - } - DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\ - modifyItem->oldNRCGI.pLMN_Identity.size); - } - } - for(i=0; ilist.count ;i++) - { - if(cellsToModify->list.array[i] != NULLP) - { - DU_FREE(cellsToModify->list.array[i],\ - sizeof(Served_Cells_To_Modify_ItemIEs_t)); - } - } - DU_FREE(cellsToModify->list.array,cellsToModify->list.size); - } - } - for(i=0;iprotocolIEs.list.count;i++) - { - if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP) - { - DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\ - sizeof(GNBDUConfigurationUpdateIEs_t)); - } - } - DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size); - } - DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t)); + break; + } + case GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID: + { + DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\ + duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); + break; + } + } + DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx],\ + sizeof(GNBDUConfigurationUpdateIEs_t)); + } + } + DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size); + } + DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t)); } DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t)); } @@ -2365,113 +2520,248 @@ uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify) else return ROK; } - /******************************************************************* * - * @brief Builds and sends the DUConfigUpdate + * @brief filling the DeleteItemList * * @details * - * Function : BuildAndSendDUConfigUpdate + * Function : fillCellToDeleteItem * - * Functionality: Constructs the DU Update message and sends - * it to the CU through SCTP. + * Functionality: Filling the DeleteItemIe * - * @params[in] void **buf,Buffer to which encoded pattern is written into - * @params[in] int *size,size of buffer + * @params[in] Pointer to Served_Cells_To_Delete_ItemIEs_t * * @return ROK - success * RFAILED - failure * - * ****************************************************************/ -uint8_t BuildAndSendDUConfigUpdate() + *****************************************************************/ +uint8_t fillCellToDeleteItem(struct Served_Cells_To_Delete_ItemIEs *deleteItemIe) { - uint8_t ret, ieIdx, elementCnt; - F1AP_PDU_t *f1apDuCfg = NULLP; - GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP; - asn_enc_rval_t encRetVal; /* Encoder return value */ - memset(&encRetVal, 0, sizeof(asn_enc_rval_t)); - ret= RFAILED; + uint8_t arrIdx; + Served_Cells_To_Delete_Item_t *deleteItem=NULLP; + + deleteItemIe->id = ProtocolIE_ID_id_Served_Cells_To_Delete_Item; + deleteItemIe->criticality = Criticality_reject; + deleteItemIe->value.present =\ + Served_Cells_To_Delete_ItemIEs__value_PR_Served_Cells_To_Delete_Item; + deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item; - while(true) + /*pLMN_Identity*/ + deleteItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t); + DU_ALLOC(deleteItem->oldNRCGI.pLMN_Identity.buf,deleteItem->oldNRCGI.pLMN_Identity.size); + if(deleteItem->oldNRCGI.pLMN_Identity.buf == NULLP) { - DU_LOG("\nINFO --> F1AP : Building DU config update\n"); - /* Allocate the memory for F1DuCfg */ - DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t)); - if(f1apDuCfg == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed"); - break; - } - - f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage; - DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t)); - if(f1apDuCfg->choice.initiatingMessage == NULLP) - { - DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed"); - break; - } - - f1apDuCfg->choice.initiatingMessage->procedureCode = \ - ProcedureCode_id_gNBDUConfigurationUpdate; - f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject; - f1apDuCfg->choice.initiatingMessage->value.present = \ - InitiatingMessage__value_PR_GNBDUConfigurationUpdate; - duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\ - choice.GNBDUConfigurationUpdate; - elementCnt = 3; - duCfgUpdate->protocolIEs.list.count = elementCnt; - duCfgUpdate->protocolIEs.list.size = \ - elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*); + DU_LOG("ERROR --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory"); + return RFAILED; + } + buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\ + deleteItem->oldNRCGI.pLMN_Identity.buf); - /* Initialize the F1Setup members */ - DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size); - if(duCfgUpdate->protocolIEs.list.array == NULLP) - { - DU_LOG("ERROR --> F1AP : Memory allocation for F1RequestIEs failed"); - break; + /*nRCellIdentity*/ + deleteItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t); + DU_ALLOC(deleteItem->oldNRCGI.nRCellIdentity.buf,\ + deleteItem->oldNRCGI.nRCellIdentity.size); + if(deleteItem->oldNRCGI.nRCellIdentity.buf == NULLP) + { + DU_LOG("ERROR --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory"); + return RFAILED; + } + for(arrIdx = 0; arrIdx < deleteItem->oldNRCGI.nRCellIdentity.size-1; arrIdx++) + { + deleteItem->oldNRCGI.nRCellIdentity.buf[arrIdx] = 0; + } + deleteItem->oldNRCGI.nRCellIdentity.buf[4] = 16; + deleteItem->oldNRCGI.nRCellIdentity.bits_unused = 4; + return ROK; +} +/******************************************************************* + * + * @brief Builds ServCellToDeleteList + * + * @details + * + * Function : buildServCellToDeleteList + * + * Functionality: Builds the serv cell to delete List + * + * @params[in] Pointer to Served_Cells_To_Delete_List_t * + * + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ + +uint8_t buildServCellToDeleteList(Served_Cells_To_Delete_List_t *cellsToDelete) +{ + uint8_t ieListCnt, arrIdx; + + ieListCnt = 1; + cellsToDelete->list.count = ieListCnt; + cellsToDelete->list.size = ieListCnt*sizeof(Served_Cells_To_Delete_ItemIEs_t *); + + DU_ALLOC(cellsToDelete->list.array,cellsToDelete->list.size); + if(cellsToDelete->list.array == NULLP) + { + DU_LOG("\nERROR --> F1AP : buildServCellToDeleteList(): Memory allocation failed"); + return RFAILED; + } + + for(arrIdx=0; arrIdx< ieListCnt; arrIdx++) + { + DU_ALLOC(cellsToDelete->list.array[arrIdx],sizeof(Served_Cells_To_Delete_ItemIEs_t)); + if(cellsToDelete->list.array[arrIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : buildServCellToDeleteList(): Memory allocation failed"); + return RFAILED; } - for(ieIdx=0; ieIdxlist.array[arrIdx]) !=ROK) + { + DU_LOG("\nERROR --> F1AP: buildServCellToDeleteList(): failed to fill Served_Cells_To_Delete_ItemIEs"); + return RFAILED; + } + return ROK; +} + +/******************************************************************* + * + * @brief Builds and sends the DUConfigUpdate + * + * @details + * + * Function : BuildAndSendDUConfigUpdate + * + * Functionality: Constructs the DU Update message and sends + * it to the CU through SCTP. + * + * @params[in] void **buf,Buffer to which encoded pattern is written into + * @params[in] int *size,size of buffer + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t BuildAndSendDUConfigUpdate(ServCellAction servCellAction) +{ + uint8_t ret =0, ieIdx=0, elementCnt=0; + bool memAlloctionFailure = false; + F1AP_PDU_t *f1apDuCfg = NULLP; + GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP; + asn_enc_rval_t encRetVal; /* Encoder return value */ + + memset(&encRetVal, 0, sizeof(asn_enc_rval_t)); + ret= RFAILED; + + while(true) + { + DU_LOG("\nINFO --> F1AP : Building DU config update\n"); + /* Allocate the memory for F1DuCfg */ + DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t)); + if(f1apDuCfg == NULLP) { - DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t)); - if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP) - { - break; - } + DU_LOG("\nERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed"); + break; + } + + f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage; + DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t)); + if(f1apDuCfg->choice.initiatingMessage == NULLP) + { + DU_LOG("\nERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed"); + break; } + f1apDuCfg->choice.initiatingMessage->procedureCode = \ + ProcedureCode_id_gNBDUConfigurationUpdate; + f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject; + f1apDuCfg->choice.initiatingMessage->value.present = \ + InitiatingMessage__value_PR_GNBDUConfigurationUpdate; + duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\ + choice.GNBDUConfigurationUpdate; + elementCnt = 3; + duCfgUpdate->protocolIEs.list.count = elementCnt; + duCfgUpdate->protocolIEs.list.size = \ + elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*); + + /* Initialize the F1Setup members */ + DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size); + if(duCfgUpdate->protocolIEs.list.array == NULLP) + { + DU_LOG("ERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed"); + break; + } + for(ieIdx=0; ieIdxprotocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t)); + if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP) + { + DU_LOG("ERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed"); + memAlloctionFailure = true; + break; + } + } + + if(memAlloctionFailure == true) + { + break; + } /*TransactionID*/ ieIdx = 0; duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID; duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject; duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \ - GNBDUConfigurationUpdateIEs__value_PR_TransactionID; + GNBDUConfigurationUpdateIEs__value_PR_TransactionID; duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID; - - /*Served Cell to Modify */ + ieIdx++; - duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \ - ProtocolIE_ID_id_Served_Cells_To_Modify_List; - duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject; - duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \ - GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List; - if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\ - Served_Cells_To_Modify_List)) - break; - + if(servCellAction == SERV_CELL_TO_MODIFY) + { + /*Served Cell to Modify */ + duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \ + ProtocolIE_ID_id_Served_Cells_To_Modify_List; + duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject; + duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \ + GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List; + if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\ + Served_Cells_To_Modify_List)) + { + DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToModList"); + break; + } + } + else + { + /*Served Cell to Delete */ + duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \ + ProtocolIE_ID_id_Served_Cells_To_Delete_List; + duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject; + duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \ + GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Delete_List; + if(buildServCellToDeleteList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\ + Served_Cells_To_Delete_List)!=ROK) + { + DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToDeleteList"); + break; + } + + } // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE /*GNB DU ID */ ieIdx++; duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID; duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject; duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \ - GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID; + GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID; duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t); DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\ - duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); + duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size); if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP) { - break; + DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): Memory allocation failed for GNB_DU_ID"); + break; } duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId; @@ -2485,30 +2775,30 @@ uint8_t BuildAndSendDUConfigUpdate() /* Checking encode results */ if(encRetVal.encoded == ENCODE_FAIL) { - DU_LOG("ERROR --> F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\ - encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); - break; + DU_LOG("ERROR --> F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; } else { - DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DUConfigUpdate\n"); - for(ieIdx =0; ieIdx < encBufSize; ieIdx++) - { - printf("%x",encBuf[ieIdx]); - } + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DUConfigUpdate\n"); + for(ieIdx =0; ieIdx < encBufSize; ieIdx++) + { + printf("%x",encBuf[ieIdx]); + } } /* Sending msg */ if(sendF1APMsg() != ROK) { - DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update failed"); - break; + DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update failed"); + break; } ret = ROK; break; } - FreeDUConfigUpdate(f1apDuCfg); - + + addToReservedF1apPduList(TRANS_ID,f1apDuCfg); return ret; } @@ -9291,93 +9581,100 @@ uint8_t procUeReCfgCellInfo(MacUeCfg *macUeCfg, void *cellInfo) * ****************************************************************/ void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap) { - UE_NR_Capability_t *ueNrCap; + UE_NR_Capability_t *ueNrCap=NULLP; - if(ueCap) + if(!ueCap) + { + memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); + memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); + } + else + { ueNrCap = (UE_NR_Capability_t *)ueCap; - /* Filling DL modulation info */ - if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \ + /* Filling DL modulation info */ + if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \ ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \ ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL) - { - switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)) { - case ModulationOrder_qpsk: - { - ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK; - break; - } - case ModulationOrder_qam16: - { - ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16; - break; - } - case ModulationOrder_qam64: - { - ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64; - ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX; - ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64; - break; - } - case ModulationOrder_qam256: - { - ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256; - break; - } - default: - { - DU_LOG("\nERROR --> DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration"); - memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); - break; - } + switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)) + { + case ModulationOrder_qpsk: + { + ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK; + break; + } + case ModulationOrder_qam16: + { + ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16; + break; + } + case ModulationOrder_qam64: + { + ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64; + ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX; + ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64; + break; + } + case ModulationOrder_qam256: + { + ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256; + break; + } + default: + { + DU_LOG("\nERROR --> DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration"); + memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); + break; + } + } + } + else + { + memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); } - } - else - { - memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo)); - } - /* Filling UL modulation info */ - if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \ + /* Filling UL modulation info */ + if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \ ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \ ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL) - { - switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)) { - case ModulationOrder_qpsk: - { - ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK; - break; - } - case ModulationOrder_qam16: - { - ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16; - ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX; - ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64; - break; - } - case ModulationOrder_qam64: - { - ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64; - break; - } - case ModulationOrder_qam256: - { - ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256; - break; - } - default: - { - DU_LOG("\nERROR --> DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration"); - memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); - break; - } + switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)) + { + case ModulationOrder_qpsk: + { + ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK; + break; + } + case ModulationOrder_qam16: + { + ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16; + ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX; + ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64; + break; + } + case ModulationOrder_qam64: + { + ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64; + break; + } + case ModulationOrder_qam256: + { + ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256; + break; + } + default: + { + DU_LOG("\nERROR --> DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration"); + memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); + break; + } + } + } + else + { + memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); } - } - else - { - memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo)); } } @@ -10068,7 +10365,7 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) if(ret == RFAILED) { /*TODO : Negative case*/ - // BuildAndSendUeContextSetupRsp(ueIdx, cellId); + // BuildAndSendUeContextSetupRsp(cellId,ueIdx); DU_LOG("\nERROR --> F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()"); } else @@ -10415,13 +10712,13 @@ uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg) * Functionality: Constructs the UE Setup Response and sends * it to the DU through SCTP. * - * @params[in] + * @params[in] uint8_t cellId,uint8_t ueIdx * * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId) +uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx) { uint8_t idx, ret, cellIdx, elementCnt; uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */ @@ -10616,7 +10913,7 @@ uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId) * failure = RFAILED * * ****************************************************************/ -uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId) +uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueIdx) { uint8_t cellIdx = 0, actionType = 0; @@ -10626,11 +10923,15 @@ uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId) switch(actionType) { case UE_CTXT_SETUP: - BuildAndSendUeContextSetupRsp(ueIdx, cellId); - break; + { + BuildAndSendUeContextSetupRsp(cellId,ueIdx); + break; + } case UE_CTXT_MOD: - BuildAndSendUeContextModResp(ueIdx, cellId); - break; + { + BuildAndSendUeContextModRsp(cellId, ueIdx); + break; + } default: DU_LOG("ERROR --> F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType); break; @@ -11475,44 +11776,149 @@ void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck) free(gnbDuAck->protocolIEs.list.array); } } + /******************************************************************* * -* @brief Processes GNB DU config update ack +* @brief Building result of gnb-du config update ack output * * @details * -* Function : procF1GNBDUCfgUpdAck +* Function : duProcGnbDuCfgUpdAckMsg * -* Functionality: added free part for the memory allocated by aper_decoder +* Functionality: +* Building output of gnb-du config update ack * -* @params[in] F1AP_PDU_t *f1apMsg -* @return void +* @params[in] transId +* @return void * * ****************************************************************/ -uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg) + +uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId) { - uint8_t ieIdx; - GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP; - - DU_LOG("\nINFO --> F1AP : GNB-DU config update acknowledgment"); - gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge; - - for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++) + uint8_t ueId =0 , ueIdx =0, ieIdx=0,arrIdx=0; + uint8_t cellId =0, cellIdx =0, crnti=0; + CmLList *f1apPduNode; + ReservedF1apPduInfo *f1apPduInfo; + F1AP_PDU_t *f1apMsgPdu = NULLP; + GNBDUConfigurationUpdate_t *gnbDuConfigUpdate = NULLP; + BIT_STRING_t *cellIdentity; + struct Served_Cells_To_Delete_ItemIEs *deleteItemIe; + Served_Cells_To_Delete_List_t *cellsToDelete; + Served_Cells_To_Delete_Item_t *deleteItem=NULLP; + + DU_LOG("\nINFO --> DU APP: GNB-DU config update Ack received "); + f1apPduNode = searchFromReservedF1apPduList(transId); + f1apPduInfo = (ReservedF1apPduInfo *)f1apPduNode->node; + f1apMsgPdu = (F1AP_PDU_t *)f1apPduInfo->f1apMsg; + + if(f1apMsgPdu) { - switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id) + if(f1apMsgPdu->choice.initiatingMessage) + { + gnbDuConfigUpdate = &f1apMsgPdu->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate; + for(ieIdx=0; ieIdx < gnbDuConfigUpdate->protocolIEs.list.count; ieIdx++) + { + switch(gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_Served_Cells_To_Delete_List: + { + cellsToDelete = &gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.\ + Served_Cells_To_Delete_List; + if(cellsToDelete->list.array) + { + if(cellsToDelete->list.array[arrIdx]) + { + deleteItemIe = (Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx]; + deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item; + if(deleteItem->oldNRCGI.nRCellIdentity.buf) + { + cellIdentity = &deleteItem->oldNRCGI.nRCellIdentity; + bitStringToInt(cellIdentity, &cellId); + } + } + } + + GET_CELL_IDX(cellId, cellIdx); + if(duCb.actvCellLst[cellIdx] != NULLP) + { + for(ueIdx = 0; ueIdx < duCb.numUe; ueIdx++) + { + crnti = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti; + GET_UE_IDX(crnti,ueId); + BuildAndSendUeContextReleaseReq(cellId, ueId); + } + } + else + { + DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId); + return RFAILED; + } + + break; + } + + default: + break; + } + } + } + } + + FreeDUConfigUpdate(f1apMsgPdu); + deleteFromReservedF1apPduList(f1apPduNode); + return ROK; +} + +/******************************************************************* +* +* @brief Processes GNB DU config update ack +* +* @details +* +* Function : procF1GNBDUCfgUpdAck +* +* Functionality: added free part for the memory allocated by aper_decoder +* +* @params[in] F1AP_PDU_t *f1apMsg +* @return void +* +* ****************************************************************/ +uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg) +{ + uint8_t ieIdx=0,transId=0; + GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP; + + DU_LOG("\nINFO --> F1AP : GNB-DU config update acknowledgment"); + gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge; + + for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++) + { + switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id) { case ProtocolIE_ID_id_TransactionID: - break; + { + transId = gnbDuAck->protocolIEs.list.array[ieIdx]->value.choice.TransactionID; + break; + } case ProtocolIE_ID_id_Cells_to_be_Activated_List: - break; + { + break; + } default : - DU_LOG("\nERROR --> F1AP: Invalid IE Received: %ld, at procF1GNBDUCfgUpdAck()", \ - gnbDuAck->protocolIEs.list.array[ieIdx]->id); - break; + { + DU_LOG("\nERROR --> F1AP: procF1GNBDUCfgUpdAck(): Invalid IE Received: %ld", \ + gnbDuAck->protocolIEs.list.array[ieIdx]->id); + break; + } } } - duProcGnbDuCfgUpdAckMsg(); + + duProcGnbDuCfgUpdAckMsg(transId); + #if 0 + /* presently we are not supporting F1 Reset from DU to CU , we are only + * supporting F1 Reset from CU to DU */ + if(BuildAndSendF1ResetReq() != ROK) { return RFAILED; @@ -11808,17 +12214,17 @@ void FreeUeContextModResp(F1AP_PDU_t *f1apMsg) * * @details * -* Function : BuildAndSendUeContextModResp +* Function : BuildAndSendUeContextModRsp * * Functionality: * - Creating the ue context modifcation response * -* @params[in] +* @params[in] uint8_t cellId,uint8_t ueIdx * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t BuildAndSendUeContextModResp(uint8_t ueIdx, uint8_t cellId) +uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx) { uint8_t ieIdx = 0; uint8_t cellIdx =0; @@ -11950,7 +12356,6 @@ uint8_t BuildAndSendUeContextModResp(uint8_t ueIdx, uint8_t cellId) } FreeUeContextModResp(f1apMsg); return ret; - } /******************************************************************* * @@ -12473,6 +12878,363 @@ uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueIdx) FreeUeContextReleaseReq(f1apMsg); return ret; } +/*****************************************************************i + * + * @brief Free memory allocated for UE Context Release Complete + * + * @details + * + * Function : FreeUeContextReleaseComplete + * + * Functionality: + * - Free memory allocated for UE Context Release Complete + * + * @params[in] F1AP_PDU_t *f1apMsg + * @return void + * + * *************************************************************/ +void FreeUeContextReleaseComplete(F1AP_PDU_t *f1apMsg) +{ + uint8_t ieIdx; + UEContextReleaseComplete_t *ueReleaseComplete = NULLP; + + if(f1apMsg) + { + if(f1apMsg->choice.successfulOutcome) + { + ueReleaseComplete =&f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete; + if(ueReleaseComplete->protocolIEs.list.array) + { + for(ieIdx=0 ; ieIdxprotocolIEs.list.count; ieIdx++) + { + DU_FREE(ueReleaseComplete->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseComplete_t)); + } + DU_FREE(ueReleaseComplete->protocolIEs.list.array, ueReleaseComplete->protocolIEs.list.size); + } + DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); + } + DU_FREE(f1apMsg, sizeof(F1AP_PDU_t)); + } + +} +/*****************************************************************i + * + * @brief Build and Send UE Context Release Complete + * + * @details + * + * Function : BuildAndSendUeContextReleaseComplete + * + * Functionality: + * - Build and Send UE Context Release Complete + * + * @params[in] cellId, gnbCuUeF1apId, gnbDuUeF1apId + * @return ROK - success + * RFAILED - failure + * + * *************************************************************/ +uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1apId, uint32_t gnbDuUeF1apId) +{ + bool memAllocFail = false; + uint8_t ieIdx =0, ret = RFAILED, elementCnt = 0; + asn_enc_rval_t encRetVal; + F1AP_PDU_t *f1apMsg = NULLP; + UEContextReleaseComplete_t *ueReleaseComplete = NULLP; + + DU_LOG("\nINFO --> Building the UE Context Release Complete"); + do + { + DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t)); + if(f1apMsg == NULLP) + { + DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for f1apMsg"); + break; + } + + f1apMsg->present = F1AP_PDU_PR_successfulOutcome; + DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t)); + if(f1apMsg->choice.successfulOutcome == NULLP) + { + DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for\ + successfulOutcome"); + break; + } + f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextRelease; + f1apMsg->choice.successfulOutcome->criticality = Criticality_reject; + f1apMsg->choice.successfulOutcome->value.present = \ + SuccessfulOutcome__value_PR_UEContextReleaseComplete; + + ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete; + + elementCnt = 2; + ueReleaseComplete->protocolIEs.list.count = elementCnt; + ueReleaseComplete->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseComplete_t *); + + /* Initialize the UE Release Complete members */ + DU_ALLOC(ueReleaseComplete->protocolIEs.list.array,ueReleaseComplete->protocolIEs.list.size); + if(ueReleaseComplete->protocolIEs.list.array == NULLP) + { + DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE array"); + break; + } + for(ieIdx=0; ieIdxprotocolIEs.list.array[ieIdx],\ + sizeof(UEContextReleaseComplete_t)); + if(ueReleaseComplete->protocolIEs.list.array[ieIdx] == NULLP) + { + DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE\ + elements"); + memAllocFail = true; + break; + } + } + if(memAllocFail == true) + break; + + + ieIdx=0; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present = \ + UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId; + + ieIdx++; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present =\ + UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID; + ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId; + + xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg); + + /* Encode the F1SetupComplete type as APER */ + memset(encBuf, 0, ENC_BUF_MAX_LEN); + encBufSize = 0; + encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf); + /* Encode results */ + if(encRetVal.encoded == ENCODE_FAIL) + { + DU_LOG("\nERROR --> F1AP : Could not encode UEContextReleaseComplete structure (at %s)\n",\ + encRetVal.failed_type ? encRetVal.failed_type->name : "unknown"); + break; + } + else + { + DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UEContextReleaseComplete\n"); + for(ieIdx=0; ieIdx< encBufSize; ieIdx++) + { + printf("%x",encBuf[ieIdx]); + } + } + + /* Sending msg */ + if(sendF1APMsg() != ROK) + { + DU_LOG("\nERROR --> F1AP : Sending UE Context Release Complete failed"); + break; + } + ret = ROK; + break; + }while(true); + + if(ret == ROK) + { + duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS; + ret = duSendCellDeletReq(cellId); + if(ret != ROK) + { + DU_LOG("\nERROR --> F1AP: BuildAndSendUeContextReleaseComplete(): Failed to process cell\ + Delete req for CellId"); + } + } + FreeUeContextReleaseComplete(f1apMsg); + return ret; + +} + +/******************************************************************* +* +* @brief added free part for the memory allocated by aper_decoder +* +* @details +* +* Function : freeAperDecodeUeContextReleaseCommand +* +* Functionality: added free part for the memory allocated by aper_decoder +* +* @params[in] F1AP_PDU_t *f1apMsg +* @return void +* +* ****************************************************************/ +void freeAperDecodeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg) +{ + uint8_t ieIdx=0; + UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP; + + ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand; + + if(ueContextReleaseCommand->protocolIEs.list.array) + { + for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++) + { + if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]) + { + switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + break; + case ProtocolIE_ID_id_Cause: + break; + case ProtocolIE_ID_id_RRCContainer: + { + if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf) + { + free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf); + } + break; + } + default : + DU_LOG("\nERROR --> F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\ + ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id); + break; + } + } + free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]); + } + free(ueContextReleaseCommand->protocolIEs.list.array); + } +} +/******************************************************************* +* +* @brief processing of UE Context Release Command +* +* @details +* +* Function : procF1UeContextReleaseCommand +* +* Functionality: processing of UE Context Release Command +* +* @params[in] F1AP_PDU_t *f1apMsg +* @return void +* +* ****************************************************************/ +uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) +{ + uint8_t ieIdx=0, ret=ROK, ueIdx=0; + uint16_t cellIdx =0; + bool ueIdxFound; + uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0; + DuUeCb *duUeCb = NULLP; + UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP; + + ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand; + + if(ueContextReleaseCommand->protocolIEs.list.array) + { + for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++) + { + if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]) + { + switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id) + { + case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID: + { + gnbCuUeF1apId= ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\ + value.choice.GNB_CU_UE_F1AP_ID; + break; + } + + case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: + { + gnbDuUeF1apId = ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\ + value.choice.GNB_DU_UE_F1AP_ID; + break; + } + + case ProtocolIE_ID_id_Cause: + { + break; + } + + case ProtocolIE_ID_id_RRCContainer: + { + for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++) + { + for(ueIdx = 0; ueIdx < duCb.numUe; ueIdx++) + { + if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ + (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) + { + duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; + DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); + if(duUeCb->f1UeDb) + { + memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb)); + duUeCb->f1UeDb->actionType = UE_CTXT_RELEASE; + duUeCb->f1UeDb->cellIdx = cellIdx; + /* Filling Dl RRC Msg Info */ + DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); + if(!duUeCb->f1UeDb->dlRrcMsg) + { + DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \ + Memory allocation failed "); + ret = RFAILED; + } + else + { + duUeCb->f1UeDb->dlRrcMsgPres = true; + memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg)); + ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\ + &ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\ + value.choice.RRCContainer); + } + + } + else + { + DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \ + Memory allocation failed "); + ret = RFAILED; + + } + + ueIdxFound = true; + break; + } + } + if(ueIdxFound == true) + { + break; + } + } + if(!ueIdxFound) + { + DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextSetupReq()"); + ret = RFAILED; + } + + + break; + } + default : + DU_LOG("\nERROR --> F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\ + ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id); + break; + } + } + } + } + if(ret != RFAILED) + { + duProcUeContextReleaseCommand(duUeCb); + } + freeAperDecodeUeContextReleaseCommand(f1apMsg); + return ret; +} /************************************************************** * * @brief Handles received F1AP message and sends back response @@ -12597,6 +13359,11 @@ void F1APMsgHdlr(Buffer *mBuf) procF1UeContextModificationReq(f1apMsg); break; } + case InitiatingMessage__value_PR_UEContextReleaseCommand: + { + procF1UeContextReleaseCommand(f1apMsg); + break; + } default: { DU_LOG("\nERROR --> F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",