From fa35b069633961d1d1109b570922bf56375fd1a9 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Fri, 4 Nov 2022 14:58:47 +0900 Subject: [PATCH] Follow-up on #1876 --- lib/sbi/nnrf-build.c | 757 +++++++++++++++++++++++-------------------- src/pcf/nbsf-build.c | 7 +- 2 files changed, 410 insertions(+), 354 deletions(-) diff --git a/lib/sbi/nnrf-build.c b/lib/sbi/nnrf-build.c index 49faa0634..4b218576c 100644 --- a/lib/sbi/nnrf-build.c +++ b/lib/sbi/nnrf-build.c @@ -83,15 +83,20 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile( ogs_sbi_nf_info_t *nf_info = NULL; OpenAPI_nf_profile_t *NFProfile = NULL; + OpenAPI_list_t *Ipv4AddrList = NULL; + OpenAPI_list_t *Ipv6AddrList = NULL; + OpenAPI_list_t *AllowedNfTypeList = NULL; OpenAPI_list_t *NFServiceList = NULL; + OpenAPI_map_t *NFServiceMap = NULL; OpenAPI_list_t *InfoList = NULL; OpenAPI_map_t *InfoMap = NULL; OpenAPI_smf_info_t *SmfInfo = NULL; - OpenAPI_amf_info_t *AmfInfo = NULL; int InfoMapKey; OpenAPI_lnode_t *node = NULL; + OpenAPI_amf_info_t *AmfInfo = NULL; + int i = 0; char *ipstr = NULL; @@ -132,77 +137,82 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile( NFProfile->is_load = true; NFProfile->load = nf_instance->load; - if (nf_instance->num_of_ipv4 > 0) { - OpenAPI_list_t *Ipv4AddrList = NULL; + Ipv4AddrList = OpenAPI_list_create(); + if (!Ipv4AddrList) { + ogs_error("No Ipv4AddrList"); + ogs_nnrf_nfm_free_nf_profile(NFProfile); + return NULL; + } - NFProfile->ipv4_addresses = Ipv4AddrList = OpenAPI_list_create(); - if (!Ipv4AddrList) { - ogs_error("No Ipv4AddrList"); - ogs_nnrf_nfm_free_nf_profile(NFProfile); - return NULL; - } - - for (i = 0; i < nf_instance->num_of_ipv4; i++) { - if (nf_instance->ipv4[i]) { - ogs_trace("IPv4 [family:%d, addr:%x, port:%d]", - nf_instance->ipv4[i]->ogs_sa_family, - htobe32(nf_instance->ipv4[i]->sin.sin_addr.s_addr), - nf_instance->ipv4[i]->ogs_sin_port); - ogs_assert(nf_instance->ipv4[i]->ogs_sa_family == AF_INET); - ipstr = ogs_ipstrdup(nf_instance->ipv4[i]); - if (!ipstr) { - ogs_error("No ipstr"); - ogs_nnrf_nfm_free_nf_profile(NFProfile); - return NULL; - } - OpenAPI_list_add(Ipv4AddrList, ipstr); + for (i = 0; i < nf_instance->num_of_ipv4; i++) { + if (nf_instance->ipv4[i]) { + ogs_trace("IPv4 [family:%d, addr:%x, port:%d]", + nf_instance->ipv4[i]->ogs_sa_family, + htobe32(nf_instance->ipv4[i]->sin.sin_addr.s_addr), + nf_instance->ipv4[i]->ogs_sin_port); + ogs_assert(nf_instance->ipv4[i]->ogs_sa_family == AF_INET); + ipstr = ogs_ipstrdup(nf_instance->ipv4[i]); + if (!ipstr) { + ogs_error("No ipstr"); + ogs_nnrf_nfm_free_nf_profile(NFProfile); + OpenAPI_list_free(Ipv4AddrList); + return NULL; } + OpenAPI_list_add(Ipv4AddrList, ipstr); } } - if (nf_instance->num_of_ipv6 > 0) { - OpenAPI_list_t *Ipv6AddrList = NULL; + if (Ipv4AddrList->count) + NFProfile->ipv4_addresses = Ipv4AddrList; + else + OpenAPI_list_free(Ipv4AddrList); - NFProfile->ipv6_addresses = Ipv6AddrList = OpenAPI_list_create(); - if (!Ipv6AddrList) { - ogs_error("No IPv6AddrList"); - ogs_nnrf_nfm_free_nf_profile(NFProfile); - return NULL; - } + Ipv6AddrList = OpenAPI_list_create(); + if (!Ipv6AddrList) { + ogs_error("No IPv6AddrList"); + ogs_nnrf_nfm_free_nf_profile(NFProfile); + return NULL; + } - for (i = 0; i < nf_instance->num_of_ipv6; i++) { - if (nf_instance->ipv6[i]) { - ogs_trace("IPv6 [family:%d, port:%d]", - nf_instance->ipv6[i]->ogs_sa_family, - nf_instance->ipv6[i]->ogs_sin_port); - ogs_assert(nf_instance->ipv6[i]->ogs_sa_family == AF_INET6); - ipstr = ogs_ipstrdup(nf_instance->ipv6[i]); - if (!ipstr) { - ogs_error("No ipstr"); - ogs_nnrf_nfm_free_nf_profile(NFProfile); - return NULL; - } - OpenAPI_list_add(Ipv6AddrList, ipstr); + for (i = 0; i < nf_instance->num_of_ipv6; i++) { + if (nf_instance->ipv6[i]) { + ogs_trace("IPv6 [family:%d, port:%d]", + nf_instance->ipv6[i]->ogs_sa_family, + nf_instance->ipv6[i]->ogs_sin_port); + ogs_assert(nf_instance->ipv6[i]->ogs_sa_family == AF_INET6); + ipstr = ogs_ipstrdup(nf_instance->ipv6[i]); + if (!ipstr) { + ogs_error("No ipstr"); + ogs_nnrf_nfm_free_nf_profile(NFProfile); + OpenAPI_list_free(Ipv6AddrList); + return NULL; } + OpenAPI_list_add(Ipv6AddrList, ipstr); } } - if (nf_instance->num_of_allowed_nf_type) { - OpenAPI_list_t *AllowedNfTypeList = NULL; + if (Ipv6AddrList->count) + NFProfile->ipv6_addresses = Ipv6AddrList; + else + OpenAPI_list_free(Ipv6AddrList); - NFProfile->allowed_nf_types = AllowedNfTypeList = OpenAPI_list_create(); - if (!AllowedNfTypeList) { - ogs_error("No AllowedNfTypeList"); - ogs_nnrf_nfm_free_nf_profile(NFProfile); - return NULL; - } - - for (i = 0; i < nf_instance->num_of_allowed_nf_type; i++) { - OpenAPI_list_add(AllowedNfTypeList, - (void *)(uintptr_t)nf_instance->allowed_nf_type[i]); - } + AllowedNfTypeList = OpenAPI_list_create(); + if (!AllowedNfTypeList) { + ogs_error("No AllowedNfTypeList"); + ogs_nnrf_nfm_free_nf_profile(NFProfile); + return NULL; } + for (i = 0; i < nf_instance->num_of_allowed_nf_type; i++) { + OpenAPI_list_add(AllowedNfTypeList, + (void *)(uintptr_t)nf_instance->allowed_nf_type[i]); + } + + if (AllowedNfTypeList->count) + NFProfile->allowed_nf_types = AllowedNfTypeList; + else + OpenAPI_list_free(AllowedNfTypeList); + NFServiceList = OpenAPI_list_create(); if (!NFServiceList) { ogs_error("No nf_service_list"); @@ -247,8 +257,6 @@ OpenAPI_nf_profile_t *ogs_nnrf_nfm_build_nf_profile( if (OGS_SBI_FEATURES_IS_SET( supported_features, OGS_SBI_NNRF_NFM_SERVICE_MAP)) { - OpenAPI_map_t *NFServiceMap = NULL; - NFServiceMap = OpenAPI_map_create(nf_service->id, NFService); if (!NFServiceMap) { ogs_error("No NFServiceMap"); @@ -443,7 +451,7 @@ static OpenAPI_nf_service_t *build_nf_service( return NULL; } - NFService->versions = VersionList = OpenAPI_list_create(); + VersionList = OpenAPI_list_create(); if (!VersionList) { ogs_error("No VersionList"); free_nf_service(NFService); @@ -457,6 +465,7 @@ static OpenAPI_nf_service_t *build_nf_service( if (!NFServiceVersion) { ogs_error("No NFServiceVersion"); free_nf_service(NFService); + OpenAPI_list_free(VersionList); return NULL; } if (nf_service->version[i].in_uri) { @@ -467,6 +476,7 @@ static OpenAPI_nf_service_t *build_nf_service( if (NFServiceVersion) ogs_free(NFServiceVersion); free_nf_service(NFService); + OpenAPI_list_free(VersionList); return NULL; } } @@ -481,6 +491,7 @@ static OpenAPI_nf_service_t *build_nf_service( ogs_free(NFServiceVersion); } free_nf_service(NFService); + OpenAPI_list_free(VersionList); return NULL; } } @@ -497,6 +508,7 @@ static OpenAPI_nf_service_t *build_nf_service( ogs_free(NFServiceVersion); } free_nf_service(NFService); + OpenAPI_list_free(VersionList); return NULL; } } @@ -504,13 +516,16 @@ static OpenAPI_nf_service_t *build_nf_service( OpenAPI_list_add(VersionList, NFServiceVersion); } + ogs_assert(VersionList->count); + NFService->versions = VersionList; + NFService->scheme = nf_service->scheme; NFService->nf_service_status = nf_service->status; if (nf_service->fqdn) NFService->fqdn = ogs_strdup(nf_service->fqdn); - NFService->ip_end_points = IpEndPointList = OpenAPI_list_create(); + IpEndPointList = OpenAPI_list_create(); if (!IpEndPointList) { ogs_error("No IpEndPointList"); free_nf_service(NFService); @@ -531,6 +546,7 @@ static OpenAPI_nf_service_t *build_nf_service( if (!IpEndPoint) { ogs_error("No IpEndPoint"); free_nf_service(NFService); + OpenAPI_list_free(IpEndPointList); return NULL; } if (ipv4) { @@ -540,6 +556,7 @@ static OpenAPI_nf_service_t *build_nf_service( if (IpEndPoint) ogs_free(IpEndPoint); free_nf_service(NFService); + OpenAPI_list_free(IpEndPointList); return NULL; } } @@ -553,6 +570,7 @@ static OpenAPI_nf_service_t *build_nf_service( ogs_free(IpEndPoint); } free_nf_service(NFService); + OpenAPI_list_free(IpEndPointList); return NULL; } } @@ -562,20 +580,28 @@ static OpenAPI_nf_service_t *build_nf_service( } } - if (nf_service->num_of_allowed_nf_type > 0) { - NFService->allowed_nf_types = AllowedNfTypeList = OpenAPI_list_create(); - if (!AllowedNfTypeList) { - ogs_error("No AllowedNfTypeList"); - free_nf_service(NFService); - return NULL; - } + if (IpEndPointList->count) + NFService->ip_end_points = IpEndPointList; + else + OpenAPI_list_free(IpEndPointList); - for (i = 0; i < nf_service->num_of_allowed_nf_type; i++) { - OpenAPI_list_add(AllowedNfTypeList, - (void *)(uintptr_t)nf_service->allowed_nf_type[i]); - } + AllowedNfTypeList = OpenAPI_list_create(); + if (!AllowedNfTypeList) { + ogs_error("No AllowedNfTypeList"); + free_nf_service(NFService); + return NULL; } + for (i = 0; i < nf_service->num_of_allowed_nf_type; i++) { + OpenAPI_list_add(AllowedNfTypeList, + (void *)(uintptr_t)nf_service->allowed_nf_type[i]); + } + + if (AllowedNfTypeList->count) + NFService->allowed_nf_types = AllowedNfTypeList; + else + OpenAPI_list_free(AllowedNfTypeList); + NFService->is_priority = true; NFService->priority = nf_service->priority; NFService->is_capacity = true; @@ -630,6 +656,19 @@ static OpenAPI_smf_info_t *build_smf_info(ogs_sbi_nf_info_t *nf_info) int i, j; OpenAPI_smf_info_t *SmfInfo = NULL; + OpenAPI_list_t *sNssaiSmfInfoList = NULL; + OpenAPI_snssai_smf_info_item_t *sNssaiSmfInfoItem = NULL; + OpenAPI_snssai_t *sNssai = NULL; + OpenAPI_list_t *DnnSmfInfoList = NULL; + OpenAPI_dnn_smf_info_item_t *DnnSmfInfoItem = NULL; + + OpenAPI_list_t *TaiList = NULL; + OpenAPI_tai_t *TaiItem = NULL; + OpenAPI_list_t *TaiRangeList = NULL; + OpenAPI_tai_range_t *TaiRangeItem = NULL; + OpenAPI_list_t *TacRangeList = NULL; + OpenAPI_tac_range_t *TacRangeItem = NULL; + ogs_assert(nf_info); SmfInfo = ogs_calloc(1, sizeof(*SmfInfo)); @@ -638,169 +677,166 @@ static OpenAPI_smf_info_t *build_smf_info(ogs_sbi_nf_info_t *nf_info) return NULL; } - - if (nf_info->smf.num_of_slice > 0) { - OpenAPI_list_t *sNssaiSmfInfoList = NULL; - - SmfInfo->s_nssai_smf_info_list = sNssaiSmfInfoList = OpenAPI_list_create(); - if (!sNssaiSmfInfoList) { - ogs_error("No sNssaiSmfInfoList"); - free_smf_info(SmfInfo); - return NULL; - } - for (i = 0; i < nf_info->smf.num_of_slice; i++) { - OpenAPI_list_t *DnnSmfInfoList = NULL; - OpenAPI_snssai_smf_info_item_t *sNssaiSmfInfoItem = NULL; - OpenAPI_snssai_t *sNssai = NULL; - - DnnSmfInfoList = OpenAPI_list_create(); - if (!DnnSmfInfoList) { - ogs_error("No DnnSmfInfoList"); - free_smf_info(SmfInfo); - return NULL; - } - - for (j = 0; j < nf_info->smf.slice[i].num_of_dnn; j++) { - OpenAPI_dnn_smf_info_item_t *DnnSmfInfoItem = NULL; - - DnnSmfInfoItem = ogs_calloc(1, sizeof(*DnnSmfInfoItem)); - ogs_assert(DnnSmfInfoItem); - DnnSmfInfoItem->dnn = nf_info->smf.slice[i].dnn[j]; - - OpenAPI_list_add(DnnSmfInfoList, DnnSmfInfoItem); - } - - if (!DnnSmfInfoList->count) { - ogs_error("CHECK CONFIGURATION: No DNN"); - - OpenAPI_list_free(DnnSmfInfoList); - free_smf_info(SmfInfo); - - return NULL; - } - - sNssaiSmfInfoItem = ogs_calloc(1, sizeof(*sNssaiSmfInfoItem)); - ogs_assert(sNssaiSmfInfoItem); - - sNssaiSmfInfoItem->dnn_smf_info_list = DnnSmfInfoList; - - sNssaiSmfInfoItem->s_nssai = sNssai = ogs_calloc(1, sizeof(*sNssai)); - ogs_assert(sNssai); - sNssai->sst = nf_info->smf.slice[i].s_nssai.sst; - sNssai->sd = - ogs_s_nssai_sd_to_string(nf_info->smf.slice[i].s_nssai.sd); - - OpenAPI_list_add(sNssaiSmfInfoList, sNssaiSmfInfoItem); - } + sNssaiSmfInfoList = OpenAPI_list_create(); + if (!sNssaiSmfInfoList) { + ogs_error("No sNssaiSmfInfoList"); + free_smf_info(SmfInfo); + return NULL; } - if (nf_info->smf.num_of_nr_tai > 0) { - OpenAPI_list_t *TaiList = NULL; - - SmfInfo->tai_list = TaiList = OpenAPI_list_create(); - if (!TaiList) { - ogs_error("No TaiList"); + for (i = 0; i < nf_info->smf.num_of_slice; i++) { + DnnSmfInfoList = OpenAPI_list_create(); + if (!DnnSmfInfoList) { + ogs_error("No DnnSmfInfoList"); free_smf_info(SmfInfo); + OpenAPI_list_free(sNssaiSmfInfoList); return NULL; } - for (i = 0; i < nf_info->smf.num_of_nr_tai; i++) { - OpenAPI_tai_t *TaiItem = NULL; + for (j = 0; j < nf_info->smf.slice[i].num_of_dnn; j++) { + DnnSmfInfoItem = ogs_calloc(1, sizeof(*DnnSmfInfoItem)); + ogs_assert(DnnSmfInfoItem); + DnnSmfInfoItem->dnn = nf_info->smf.slice[i].dnn[j]; - TaiItem = ogs_calloc(1, sizeof(*TaiItem)); - if (!TaiItem) { - ogs_error("No TaiItem"); - free_smf_info(SmfInfo); - return NULL; - } - TaiItem->plmn_id = ogs_sbi_build_plmn_id( - &nf_info->smf.nr_tai[i].plmn_id); - if (!TaiItem->plmn_id) { - ogs_error("No TaiItem->plmn_id"); - if (TaiItem) - ogs_free(TaiItem); - free_smf_info(SmfInfo); - return NULL; - } - TaiItem->tac = - ogs_uint24_to_0string(nf_info->smf.nr_tai[i].tac); - if (!TaiItem->tac) { - ogs_error("No TaiItem->tac"); - if (TaiItem) { - if (TaiItem->plmn_id) - ogs_free(TaiItem->plmn_id); - ogs_free(TaiItem); - } - free_smf_info(SmfInfo); - return NULL; - } - - OpenAPI_list_add(TaiList, TaiItem); + OpenAPI_list_add(DnnSmfInfoList, DnnSmfInfoItem); } - } - if (nf_info->smf.num_of_nr_tai_range > 0) { - OpenAPI_list_t *TaiRangeList = NULL; + if (!DnnSmfInfoList->count) { + ogs_error("CHECK CONFIGURATION: No DNN"); - SmfInfo->tai_range_list = TaiRangeList = OpenAPI_list_create(); - if (!TaiRangeList) { - ogs_error("No TaiRangeList"); + OpenAPI_list_free(DnnSmfInfoList); free_smf_info(SmfInfo); + OpenAPI_list_free(sNssaiSmfInfoList); + return NULL; } - for (i = 0; i < nf_info->smf.num_of_nr_tai_range; i++) { - OpenAPI_list_t *TacRangeList = NULL; - OpenAPI_tai_range_t *TaiRangeItem = NULL; + sNssaiSmfInfoItem = ogs_calloc(1, sizeof(*sNssaiSmfInfoItem)); + ogs_assert(sNssaiSmfInfoItem); - TacRangeList = OpenAPI_list_create(); - if (!TacRangeList) { - ogs_error("No TacRangeList"); - free_smf_info(SmfInfo); - return NULL; - } + sNssaiSmfInfoItem->dnn_smf_info_list = DnnSmfInfoList; - for (j = 0; - j < nf_info->smf.nr_tai_range[i].num_of_tac_range; - j++) { - OpenAPI_tac_range_t *TacRangeItem = NULL; + sNssaiSmfInfoItem->s_nssai = sNssai = ogs_calloc(1, sizeof(*sNssai)); + ogs_assert(sNssai); + sNssai->sst = nf_info->smf.slice[i].s_nssai.sst; + sNssai->sd = + ogs_s_nssai_sd_to_string(nf_info->smf.slice[i].s_nssai.sd); - TacRangeItem = ogs_calloc(1, sizeof(*TacRangeItem)); - ogs_assert(TacRangeItem); - - TacRangeItem->start = ogs_uint24_to_0string( - nf_info->smf.nr_tai_range[i].start[j]); - ogs_assert(TacRangeItem->start); - TacRangeItem->end = - ogs_uint24_to_0string( - nf_info->smf.nr_tai_range[i].end[j]); - ogs_assert(TacRangeItem->end); - - OpenAPI_list_add(TacRangeList, TacRangeItem); - } - - if (!TacRangeList->count) { - ogs_error("CHECK CONFIGURATION: No Start/End in TacRange"); - - OpenAPI_list_free(TacRangeList); - free_smf_info(SmfInfo); - - return NULL; - } - - TaiRangeItem = ogs_calloc(1, sizeof(*TaiRangeItem)); - ogs_assert(TaiRangeItem); - - TaiRangeItem->plmn_id = ogs_sbi_build_plmn_id( - &nf_info->smf.nr_tai_range[i].plmn_id); - ogs_assert(TaiRangeItem->plmn_id); - - TaiRangeItem->tac_range_list = TacRangeList; - - OpenAPI_list_add(TaiRangeList, TaiRangeItem); - } + OpenAPI_list_add(sNssaiSmfInfoList, sNssaiSmfInfoItem); } + if (sNssaiSmfInfoList->count) + SmfInfo->s_nssai_smf_info_list = sNssaiSmfInfoList; + else + OpenAPI_list_free(sNssaiSmfInfoList); + + TaiList = OpenAPI_list_create(); + if (!TaiList) { + ogs_error("No TaiList"); + free_smf_info(SmfInfo); + return NULL; + } + + for (i = 0; i < nf_info->smf.num_of_nr_tai; i++) { + TaiItem = ogs_calloc(1, sizeof(*TaiItem)); + if (!TaiItem) { + ogs_error("No TaiItem"); + free_smf_info(SmfInfo); + OpenAPI_list_free(TaiList); + return NULL; + } + TaiItem->plmn_id = ogs_sbi_build_plmn_id( + &nf_info->smf.nr_tai[i].plmn_id); + if (!TaiItem->plmn_id) { + ogs_error("No TaiItem->plmn_id"); + if (TaiItem) + ogs_free(TaiItem); + free_smf_info(SmfInfo); + OpenAPI_list_free(TaiList); + return NULL; + } + TaiItem->tac = + ogs_uint24_to_0string(nf_info->smf.nr_tai[i].tac); + if (!TaiItem->tac) { + ogs_error("No TaiItem->tac"); + if (TaiItem) { + if (TaiItem->plmn_id) + ogs_free(TaiItem->plmn_id); + ogs_free(TaiItem); + } + free_smf_info(SmfInfo); + OpenAPI_list_free(TaiList); + return NULL; + } + + OpenAPI_list_add(TaiList, TaiItem); + } + + if (TaiList->count) + SmfInfo->tai_list = TaiList; + else + OpenAPI_list_free(TaiList); + + TaiRangeList = OpenAPI_list_create(); + if (!TaiRangeList) { + ogs_error("No TaiRangeList"); + free_smf_info(SmfInfo); + return NULL; + } + + for (i = 0; i < nf_info->smf.num_of_nr_tai_range; i++) { + TacRangeList = OpenAPI_list_create(); + if (!TacRangeList) { + ogs_error("No TacRangeList"); + free_smf_info(SmfInfo); + OpenAPI_list_free(TaiRangeList); + return NULL; + } + + for (j = 0; + j < nf_info->smf.nr_tai_range[i].num_of_tac_range; + j++) { + TacRangeItem = ogs_calloc(1, sizeof(*TacRangeItem)); + ogs_assert(TacRangeItem); + + TacRangeItem->start = ogs_uint24_to_0string( + nf_info->smf.nr_tai_range[i].start[j]); + ogs_assert(TacRangeItem->start); + TacRangeItem->end = + ogs_uint24_to_0string( + nf_info->smf.nr_tai_range[i].end[j]); + ogs_assert(TacRangeItem->end); + + OpenAPI_list_add(TacRangeList, TacRangeItem); + } + + if (!TacRangeList->count) { + ogs_error("CHECK CONFIGURATION: No Start/End in TacRange"); + + OpenAPI_list_free(TacRangeList); + free_smf_info(SmfInfo); + OpenAPI_list_free(TaiRangeList); + + return NULL; + } + + TaiRangeItem = ogs_calloc(1, sizeof(*TaiRangeItem)); + ogs_assert(TaiRangeItem); + + TaiRangeItem->plmn_id = ogs_sbi_build_plmn_id( + &nf_info->smf.nr_tai_range[i].plmn_id); + ogs_assert(TaiRangeItem->plmn_id); + + TaiRangeItem->tac_range_list = TacRangeList; + + OpenAPI_list_add(TaiRangeList, TaiRangeItem); + } + + if (TaiRangeList->count) + SmfInfo->tai_range_list = TaiRangeList; + else + OpenAPI_list_free(TaiRangeList); + return SmfInfo; } @@ -809,6 +845,16 @@ static OpenAPI_amf_info_t *build_amf_info(ogs_sbi_nf_info_t *nf_info) int i, j; OpenAPI_amf_info_t *AmfInfo = NULL; + OpenAPI_list_t *guamiAmfInfoList = NULL; + OpenAPI_guami_t *guamiAmfInfoItem = NULL; + + OpenAPI_list_t *TaiList = NULL; + OpenAPI_tai_t *TaiItem = NULL; + OpenAPI_list_t *TaiRangeList = NULL; + OpenAPI_tai_range_t *TaiRangeItem = NULL; + OpenAPI_list_t *TacRangeList = NULL; + OpenAPI_tac_range_t *TacRangeItem = NULL; + ogs_assert(nf_info); AmfInfo = ogs_calloc(1, sizeof(*AmfInfo)); @@ -830,168 +876,173 @@ static OpenAPI_amf_info_t *build_amf_info(ogs_sbi_nf_info_t *nf_info) return NULL; } - if (nf_info->amf.num_of_guami) { - OpenAPI_list_t *guamiAmfInfoList = NULL; + guamiAmfInfoList = OpenAPI_list_create(); + if (!guamiAmfInfoList) { + ogs_error("No guamiAmfInfoList"); + free_amf_info(AmfInfo); + return NULL; + } - AmfInfo->guami_list = guamiAmfInfoList = OpenAPI_list_create(); - if (!guamiAmfInfoList) { - ogs_error("No guamiAmfInfoList"); + for (i = 0; i < nf_info->amf.num_of_guami; i++) { + + guamiAmfInfoItem = ogs_calloc(1, sizeof(*guamiAmfInfoItem)); + if (!guamiAmfInfoItem) { + ogs_error("guamiAmfInfoItem"); free_amf_info(AmfInfo); + OpenAPI_list_free(guamiAmfInfoList); return NULL; } - for (i = 0; i < nf_info->amf.num_of_guami; i++) { - OpenAPI_guami_t *guamiAmfInfoItem = NULL; - - guamiAmfInfoItem = ogs_calloc(1, sizeof(*guamiAmfInfoItem)); - if (!guamiAmfInfoItem) { - ogs_error("guamiAmfInfoItem"); - free_amf_info(AmfInfo); - return NULL; - } - - guamiAmfInfoItem->plmn_id = - ogs_sbi_build_plmn_id_nid(&nf_info->amf.guami[i].plmn_id); - if (!guamiAmfInfoItem->plmn_id) { - ogs_error("guamiAmfInfoItem->plmn_id"); - if (guamiAmfInfoItem) - ogs_free(guamiAmfInfoItem); - free_amf_info(AmfInfo); - return NULL; - } - guamiAmfInfoItem->amf_id = - ogs_amf_id_to_string(&nf_info->amf.guami[i].amf_id); - if (!guamiAmfInfoItem->amf_id) { - ogs_error("guamiAmfInfoItem->amf_id"); - if (guamiAmfInfoItem) { - if (guamiAmfInfoItem->plmn_id) - ogs_free(guamiAmfInfoItem->plmn_id); - ogs_free(guamiAmfInfoItem); - } - free_amf_info(AmfInfo); - return NULL; - } - - OpenAPI_list_add(guamiAmfInfoList, guamiAmfInfoItem); + guamiAmfInfoItem->plmn_id = + ogs_sbi_build_plmn_id_nid(&nf_info->amf.guami[i].plmn_id); + if (!guamiAmfInfoItem->plmn_id) { + ogs_error("guamiAmfInfoItem->plmn_id"); + if (guamiAmfInfoItem) + ogs_free(guamiAmfInfoItem); + free_amf_info(AmfInfo); + OpenAPI_list_free(guamiAmfInfoList); + return NULL; } + guamiAmfInfoItem->amf_id = + ogs_amf_id_to_string(&nf_info->amf.guami[i].amf_id); + if (!guamiAmfInfoItem->amf_id) { + ogs_error("guamiAmfInfoItem->amf_id"); + if (guamiAmfInfoItem) { + if (guamiAmfInfoItem->plmn_id) + ogs_free(guamiAmfInfoItem->plmn_id); + ogs_free(guamiAmfInfoItem); + } + free_amf_info(AmfInfo); + OpenAPI_list_free(guamiAmfInfoList); + return NULL; + } + + OpenAPI_list_add(guamiAmfInfoList, guamiAmfInfoItem); } - if (nf_info->amf.num_of_nr_tai > 0) { - OpenAPI_list_t *TaiList = NULL; + if (guamiAmfInfoList->count) + AmfInfo->guami_list = guamiAmfInfoList; + else + OpenAPI_list_free(guamiAmfInfoList); - AmfInfo->tai_list = TaiList = OpenAPI_list_create(); + TaiList = OpenAPI_list_create(); + if (!TaiList) { + ogs_error("No TaiList"); + free_amf_info(AmfInfo); + return NULL; + } + + for (i = 0; i < nf_info->amf.num_of_nr_tai; i++) { + TaiItem = ogs_calloc(1, sizeof(*TaiItem)); if (!TaiList) { - ogs_error("No TaiList"); + ogs_error("No TaiItem"); free_amf_info(AmfInfo); + OpenAPI_list_free(TaiList); + return NULL; + } + TaiItem->plmn_id = ogs_sbi_build_plmn_id( + &nf_info->amf.nr_tai[i].plmn_id); + if (!TaiItem->plmn_id) { + ogs_error("No TaiItem->plmn_id"); + if (TaiItem) + ogs_free(TaiItem); + free_amf_info(AmfInfo); + OpenAPI_list_free(TaiList); + return NULL; + } + TaiItem->tac = + ogs_uint24_to_0string(nf_info->amf.nr_tai[i].tac); + if (!TaiItem->tac) { + ogs_error("No TaiItem->tac"); + if (TaiItem) { + if (TaiItem->plmn_id) + ogs_free(TaiItem->plmn_id); + ogs_free(TaiItem); + } + free_amf_info(AmfInfo); + OpenAPI_list_free(TaiList); return NULL; } - for (i = 0; i < nf_info->amf.num_of_nr_tai; i++) { - OpenAPI_tai_t *TaiItem = NULL; - - TaiItem = ogs_calloc(1, sizeof(*TaiItem)); - if (!TaiList) { - ogs_error("No TaiItem"); - free_amf_info(AmfInfo); - return NULL; - } - TaiItem->plmn_id = ogs_sbi_build_plmn_id( - &nf_info->amf.nr_tai[i].plmn_id); - if (!TaiItem->plmn_id) { - ogs_error("No TaiItem->plmn_id"); - if (TaiItem) - ogs_free(TaiItem); - free_amf_info(AmfInfo); - return NULL; - } - TaiItem->tac = - ogs_uint24_to_0string(nf_info->amf.nr_tai[i].tac); - if (!TaiItem->tac) { - ogs_error("No TaiItem->tac"); - if (TaiItem) { - if (TaiItem->plmn_id) - ogs_free(TaiItem->plmn_id); - ogs_free(TaiItem); - } - free_amf_info(AmfInfo); - return NULL; - } - - OpenAPI_list_add(TaiList, TaiItem); - } + OpenAPI_list_add(TaiList, TaiItem); } - if (nf_info->amf.num_of_nr_tai_range > 0) { - OpenAPI_list_t *TaiRangeList = NULL; + if (TaiList->count) + AmfInfo->tai_list = TaiList; + else + OpenAPI_list_free(TaiList); - AmfInfo->tai_range_list = TaiRangeList = OpenAPI_list_create(); - if (!TaiRangeList) { - ogs_error("No TaiRangeList"); + TaiRangeList = OpenAPI_list_create(); + if (!TaiRangeList) { + ogs_error("No TaiRangeList"); + free_amf_info(AmfInfo); + return NULL; + } + + for (i = 0; i < nf_info->amf.num_of_nr_tai_range; i++) { + TacRangeList = OpenAPI_list_create(); + if (!TacRangeList) { + ogs_error("No TacRangeList"); free_amf_info(AmfInfo); + OpenAPI_list_free(TaiRangeList); return NULL; } - for (i = 0; i < nf_info->amf.num_of_nr_tai_range; i++) { - OpenAPI_list_t *TacRangeList = NULL; - OpenAPI_tai_range_t *TaiRangeItem = NULL; + for (j = 0; + j < nf_info->amf.nr_tai_range[i].num_of_tac_range; + j++) { + TacRangeItem = ogs_calloc(1, sizeof(*TacRangeItem)); + ogs_assert(TacRangeItem); - TacRangeList = OpenAPI_list_create(); - if (!TacRangeList) { - ogs_error("No TacRangeList"); - free_amf_info(AmfInfo); - return NULL; - } + TacRangeItem->start = ogs_uint24_to_0string( + nf_info->amf.nr_tai_range[i].start[j]); + ogs_assert(TacRangeItem->start); + TacRangeItem->end = + ogs_uint24_to_0string( + nf_info->amf.nr_tai_range[i].end[j]); + ogs_assert(TacRangeItem->end); - for (j = 0; - j < nf_info->amf.nr_tai_range[i].num_of_tac_range; - j++) { - OpenAPI_tac_range_t *TacRangeItem = NULL; - - TacRangeItem = ogs_calloc(1, sizeof(*TacRangeItem)); - ogs_assert(TacRangeItem); - - TacRangeItem->start = ogs_uint24_to_0string( - nf_info->amf.nr_tai_range[i].start[j]); - ogs_assert(TacRangeItem->start); - TacRangeItem->end = - ogs_uint24_to_0string( - nf_info->amf.nr_tai_range[i].end[j]); - ogs_assert(TacRangeItem->end); - - OpenAPI_list_add(TacRangeList, TacRangeItem); - } - - if (!TacRangeList->count) { - ogs_error("CHECK CONFIGURATION: No Start/End in TacRange"); - - OpenAPI_list_free(TacRangeList); - free_amf_info(AmfInfo); - - return NULL; - } - - TaiRangeItem = ogs_calloc(1, sizeof(*TaiRangeItem)); - if (!TaiRangeItem) { - ogs_error("No TaiRangeItem"); - free_amf_info(AmfInfo); - return NULL; - } - - TaiRangeItem->plmn_id = ogs_sbi_build_plmn_id( - &nf_info->amf.nr_tai_range[i].plmn_id); - if (!TaiRangeItem->plmn_id) { - ogs_error("No TaiRangeItem->plmn_id"); - ogs_free(TaiRangeItem); - free_amf_info(AmfInfo); - return NULL; - } - - TaiRangeItem->tac_range_list = TacRangeList; - - OpenAPI_list_add(TaiRangeList, TaiRangeItem); + OpenAPI_list_add(TacRangeList, TacRangeItem); } + + if (!TacRangeList->count) { + ogs_error("CHECK CONFIGURATION: No Start/End in TacRange"); + + OpenAPI_list_free(TacRangeList); + free_amf_info(AmfInfo); + OpenAPI_list_free(TaiRangeList); + + return NULL; + } + + TaiRangeItem = ogs_calloc(1, sizeof(*TaiRangeItem)); + if (!TaiRangeItem) { + ogs_error("No TaiRangeItem"); + free_amf_info(AmfInfo); + OpenAPI_list_free(TaiRangeList); + return NULL; + } + + TaiRangeItem->plmn_id = ogs_sbi_build_plmn_id( + &nf_info->amf.nr_tai_range[i].plmn_id); + if (!TaiRangeItem->plmn_id) { + ogs_error("No TaiRangeItem->plmn_id"); + ogs_free(TaiRangeItem); + free_amf_info(AmfInfo); + OpenAPI_list_free(TaiRangeList); + return NULL; + } + + TaiRangeItem->tac_range_list = TacRangeList; + + OpenAPI_list_add(TaiRangeList, TaiRangeItem); } + if (TaiRangeList->count) + AmfInfo->tai_range_list = TaiRangeList; + else + OpenAPI_list_free(TaiRangeList); + return AmfInfo; } diff --git a/src/pcf/nbsf-build.c b/src/pcf/nbsf-build.c index 93fdc0509..d86277ab7 100644 --- a/src/pcf/nbsf-build.c +++ b/src/pcf/nbsf-build.c @@ -75,7 +75,7 @@ ogs_sbi_request_t *pcf_nbsf_management_build_register( if (nf_service->fqdn) PcfBinding.pcf_fqdn = ogs_strdup(nf_service->fqdn); - PcfBinding.pcf_ip_end_points = PcfIpEndPointList = OpenAPI_list_create(); + PcfIpEndPointList = OpenAPI_list_create(); if (!PcfIpEndPointList) { ogs_error("No PcfIpEndPointList"); goto end; @@ -127,6 +127,11 @@ ogs_sbi_request_t *pcf_nbsf_management_build_register( ogs_error("No SST"); goto end; } + if (PcfIpEndPointList->count) + PcfBinding.pcf_ip_end_points = PcfIpEndPointList; + else + OpenAPI_list_free(PcfIpEndPointList); + memset(&sNssai, 0, sizeof(sNssai)); sNssai.sst = sess->s_nssai.sst; sNssai.sd = ogs_s_nssai_sd_to_string(sess->s_nssai.sd);