diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 6cddf5d1a..334650f20 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -1341,6 +1341,26 @@ void ogs_sbi_select_nf( } } +void ogs_sbi_select_nf_by_instanceid( + ogs_sbi_object_t *sbi_object, OpenAPI_nf_type_e nf_type, void *state, + char *nf_instance_id) +{ + ogs_sbi_nf_instance_t *nf_instance = NULL; + + ogs_assert(sbi_object); + ogs_assert(nf_type); + ogs_assert(state); + + ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { + if (OGS_FSM_CHECK(&nf_instance->sm, state) && + (nf_instance->nf_type == nf_type) && + (!(strcmp(nf_instance->id, nf_instance_id)))) { + OGS_SBI_SETUP_NF(sbi_object, nf_type, nf_instance); + break; + } + } +} + bool ogs_sbi_client_associate(ogs_sbi_nf_instance_t *nf_instance) { ogs_sbi_client_t *client = NULL; diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 455d6282e..ccd947fc7 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -339,6 +339,9 @@ OpenAPI_uri_scheme_e ogs_sbi_default_uri_scheme(void); void ogs_sbi_select_nf( ogs_sbi_object_t *sbi_object, OpenAPI_nf_type_e nf_type, void *state); +void ogs_sbi_select_nf_by_instanceid( + ogs_sbi_object_t *sbi_object, OpenAPI_nf_type_e nf_type, void *state, + char *nf_instance_id); void ogs_sbi_object_free(ogs_sbi_object_t *sbi_object); diff --git a/lib/sbi/nnrf-build.c b/lib/sbi/nnrf-build.c index ea98a81e5..029634065 100644 --- a/lib/sbi/nnrf-build.c +++ b/lib/sbi/nnrf-build.c @@ -480,6 +480,26 @@ ogs_sbi_request_t *ogs_nnrf_nfm_build_status_unsubscribe( return request; } +ogs_sbi_request_t *ogs_nnrf_nfm_build_profile_retrieve(char *nf_instance_id) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + ogs_assert(nf_instance_id); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_GET; + message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NNRF_NFM; + message.h.api.version = (char *)OGS_SBI_API_V1; + message.h.resource.component[0] = + (char *)OGS_SBI_RESOURCE_NAME_NF_INSTANCES; + message.h.resource.component[1] = nf_instance_id; + + request = ogs_sbi_build_request(&message); + + return request; +} + ogs_sbi_request_t *ogs_nnrf_disc_build_discover( OpenAPI_nf_type_e target_nf_type, OpenAPI_nf_type_e requester_nf_type) { diff --git a/lib/sbi/nnrf-build.h b/lib/sbi/nnrf-build.h index 44cedcfe0..7c22fef80 100644 --- a/lib/sbi/nnrf-build.h +++ b/lib/sbi/nnrf-build.h @@ -34,6 +34,7 @@ ogs_sbi_request_t *ogs_nnrf_nfm_build_status_subscribe( ogs_sbi_subscription_t *subscription); ogs_sbi_request_t *ogs_nnrf_nfm_build_status_unsubscribe( ogs_sbi_subscription_t *subscription); +ogs_sbi_request_t *ogs_nnrf_nfm_build_profile_retrieve(char *nf_instance_id); ogs_sbi_request_t *ogs_nnrf_disc_build_discover( OpenAPI_nf_type_e target_nf_type, OpenAPI_nf_type_e requester_nf_type); diff --git a/lib/sbi/path.c b/lib/sbi/path.c index 328514b4d..84f94cc57 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -141,6 +141,51 @@ bool ogs_nnrf_nfm_send_nf_register( return ogs_sbi_scp_send_request(client, client->cb, request, nf_instance); } +bool ogs_sbi_discover_by_nf_instanceid_and_send(ogs_sbi_xact_t *xact, + ogs_fsm_handler_t nf_state_registered, ogs_sbi_client_cb_f client_cb, + char *nf_instance_id) +{ + ogs_sbi_nf_instance_t *nf_instance = NULL; + + ogs_assert(xact); + ogs_assert(xact->sbi_object); + ogs_assert(xact->target_nf_type); + ogs_assert(nf_state_registered); + ogs_assert(client_cb); + ogs_assert(nf_instance_id); + + /* Target NF-Instance - search by NF Instance Id */ + ogs_assert(xact->target_nf_type != OpenAPI_nf_type_NRF); + ogs_sbi_select_nf_by_instanceid( + xact->sbi_object, xact->target_nf_type, nf_state_registered, + nf_instance_id); + + nf_instance = OGS_SBI_NF_INSTANCE( + xact->sbi_object, xact->target_nf_type); + + if (nf_instance) { + return ogs_sbi_send(nf_instance, client_cb, xact); + } + + /* NRF NF-Instance */ + nf_instance = OGS_SBI_NF_INSTANCE(xact->sbi_object, OpenAPI_nf_type_NRF); + if (!nf_instance) { + ogs_sbi_select_nf( + xact->sbi_object, OpenAPI_nf_type_NRF, nf_state_registered); + nf_instance = OGS_SBI_NF_INSTANCE( + xact->sbi_object, OpenAPI_nf_type_NRF); + } + + if (nf_instance) { + ogs_warn("Try to retrieve [%s]", nf_instance_id); + return ogs_nnrf_nfm_send_nf_profile_retrieve(nf_instance, + nf_instance_id, xact); + } + + ogs_error("Cannot retrieve [%s]", nf_instance_id); + return false; +} + bool ogs_nnrf_nfm_send_nf_update(ogs_sbi_nf_instance_t *nf_instance) { ogs_sbi_request_t *request = NULL; @@ -171,6 +216,24 @@ bool ogs_nnrf_nfm_send_nf_de_register(ogs_sbi_nf_instance_t *nf_instance) return ogs_sbi_scp_send_request(client, client->cb, request, nf_instance); } +bool ogs_nnrf_nfm_send_nf_profile_retrieve(ogs_sbi_nf_instance_t *nf_instance, + char *nf_instance_id, void *data) +{ + ogs_sbi_request_t *request = NULL; + ogs_sbi_client_t *client = NULL; + + ogs_assert(nf_instance); + client = nf_instance->client; + ogs_assert(client); + ogs_assert(nf_instance_id); + + request = ogs_nnrf_nfm_build_profile_retrieve(nf_instance_id); + ogs_expect_or_return_val(request, false); + + return ogs_sbi_client_send_request( + client, client->cb, request, data); +} + bool ogs_nnrf_nfm_send_nf_status_subscribe(ogs_sbi_client_t *client, OpenAPI_nf_type_e req_nf_type, char *req_nf_instance_id, OpenAPI_nf_type_e subscr_cond_nf_type) diff --git a/lib/sbi/path.h b/lib/sbi/path.h index 396948f21..9edfca182 100644 --- a/lib/sbi/path.h +++ b/lib/sbi/path.h @@ -30,11 +30,16 @@ bool ogs_sbi_send(ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_client_cb_f client_cb, ogs_sbi_xact_t *xact); bool ogs_sbi_discover_and_send(ogs_sbi_xact_t *xact, ogs_fsm_handler_t nf_state_registered, ogs_sbi_client_cb_f client_cb); +bool ogs_sbi_discover_by_nf_instanceid_and_send(ogs_sbi_xact_t *xact, + ogs_fsm_handler_t nf_state_registered, ogs_sbi_client_cb_f client_cb, + char *nf_instance_id); bool ogs_nnrf_nfm_send_nf_register( ogs_sbi_nf_instance_t *nf_instance, ogs_sbi_request_t *(*build)(void)); bool ogs_nnrf_nfm_send_nf_update(ogs_sbi_nf_instance_t *nf_instance); bool ogs_nnrf_nfm_send_nf_de_register(ogs_sbi_nf_instance_t *nf_instance); +bool ogs_nnrf_nfm_send_nf_profile_retrieve(ogs_sbi_nf_instance_t *nf_instance, + char *nf_instance_id, void *data); bool ogs_nnrf_nfm_send_nf_status_subscribe(ogs_sbi_client_t *client, OpenAPI_nf_type_e req_nf_type, char *req_nf_instance_id,