diff --git a/lib/sbi/context.c b/lib/sbi/context.c index c04736e1c..fe586b278 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -31,10 +31,12 @@ static OGS_POOL(subscription_data_pool, ogs_sbi_subscription_data_t); static OGS_POOL(smf_info_pool, ogs_sbi_smf_info_t); static OGS_POOL(nf_info_pool, ogs_sbi_nf_info_t); -void ogs_sbi_context_init(void) +void ogs_sbi_context_init(OpenAPI_nf_type_e nf_type) { char nf_instance_id[OGS_UUID_FORMATTED_LENGTH + 1]; + ogs_assert(nf_type); + ogs_assert(context_initialized == 0); /* Initialize SBI context */ @@ -62,18 +64,21 @@ void ogs_sbi_context_init(void) ogs_pool_init(&nf_info_pool, ogs_app()->pool.nf * OGS_MAX_NUM_OF_NF_INFO); - /* Add AELF NF-Instance */ + /* Add SELF NF-Instance */ self.nf_instance = ogs_sbi_nf_instance_add(); ogs_assert(self.nf_instance); ogs_uuid_get(&self.uuid); ogs_uuid_format(nf_instance_id, &self.uuid); ogs_sbi_nf_instance_set_id(self.nf_instance, nf_instance_id); + ogs_sbi_nf_instance_set_type(self.nf_instance, nf_type); /* Add NRF NF-Instance */ - self.nrf_instance = ogs_sbi_nf_instance_add(); - ogs_assert(self.nrf_instance); - ogs_sbi_nf_instance_set_type(self.nrf_instance, OpenAPI_nf_type_NRF); + if (nf_type != OpenAPI_nf_type_NRF) { + self.nrf_instance = ogs_sbi_nf_instance_add(); + ogs_assert(self.nrf_instance); + ogs_sbi_nf_instance_set_type(self.nrf_instance, OpenAPI_nf_type_NRF); + } /* Add SCP NF-Instance */ self.scp_instance = ogs_sbi_nf_instance_add(); @@ -1409,16 +1414,13 @@ ogs_sbi_nf_info_t *ogs_sbi_nf_info_find( return NULL; } -void ogs_sbi_nf_instance_build_default( - ogs_sbi_nf_instance_t *nf_instance, OpenAPI_nf_type_e nf_type) +void ogs_sbi_nf_instance_build_default(ogs_sbi_nf_instance_t *nf_instance) { ogs_sbi_server_t *server = NULL; char *hostname = NULL; ogs_assert(nf_instance); - ogs_assert(nf_type); - ogs_sbi_nf_instance_set_type(nf_instance, nf_type); ogs_sbi_nf_instance_set_status(nf_instance, OpenAPI_nf_status_REGISTERED); hostname = NULL; @@ -1685,6 +1687,9 @@ bool ogs_sbi_discovery_param_is_matched( ogs_assert(target_nf_type); ogs_assert(requester_nf_type); + if (NF_INSTANCE_EXCLUDED_FROM_DISCOVERY(nf_instance)) + return false; + if (!OGS_FSM_CHECK(&nf_instance->sm, ogs_sbi_nf_state_registered)) return false; diff --git a/lib/sbi/context.h b/lib/sbi/context.h index 5ef71f648..9d7aea286 100644 --- a/lib/sbi/context.h +++ b/lib/sbi/context.h @@ -109,6 +109,21 @@ typedef struct ogs_sbi_nf_instance_s { ogs_timer_t *t_no_heartbeat; /* check heartbeat */ ogs_timer_t *t_validity; /* check validation */ + /* + * Issues #2034 + * + * Other NF instances are obtained through NRF + * or created directly through configuration files. + * + * Other NFs created by the config file should not be passed + * through NRF discovery or anything like that. + * + * Since self-created NF Instances do not have an ID, + * they are implemented to exclude them from NRF Discovery. + */ +#define NF_INSTANCE_EXCLUDED_FROM_DISCOVERY(__nFInstance) \ + (!(__nFInstance) || !((__nFInstance)->id)) + #define NF_INSTANCE_ID(__nFInstance) \ ((__nFInstance) ? ((__nFInstance)->id) : NULL) #define NF_INSTANCE_ID_IS_SELF(_iD) \ @@ -329,7 +344,7 @@ typedef struct ogs_sbi_nf_info_s { }; } ogs_sbi_nf_info_t; -void ogs_sbi_context_init(void); +void ogs_sbi_context_init(OpenAPI_nf_type_e nf_type); void ogs_sbi_context_final(void); ogs_sbi_context_t *ogs_sbi_self(void); int ogs_sbi_context_parse_config( @@ -385,8 +400,7 @@ void ogs_sbi_nf_info_remove_all(ogs_list_t *list); ogs_sbi_nf_info_t *ogs_sbi_nf_info_find( ogs_list_t *list, OpenAPI_nf_type_e nf_type); -void ogs_sbi_nf_instance_build_default( - ogs_sbi_nf_instance_t *nf_instance, OpenAPI_nf_type_e nf_type); +void ogs_sbi_nf_instance_build_default(ogs_sbi_nf_instance_t *nf_instance); ogs_sbi_nf_service_t *ogs_sbi_nf_service_build_default( ogs_sbi_nf_instance_t *nf_instance, const char *name); diff --git a/lib/sbi/path.c b/lib/sbi/path.c index bf0c5a5c8..d10afedf7 100644 --- a/lib/sbi/path.c +++ b/lib/sbi/path.c @@ -339,15 +339,7 @@ bool ogs_sbi_discover_only(ogs_sbi_xact_t *xact) discovery_option = xact->discovery_option; /* NRF NF-Instance */ - nf_instance = sbi_object->nf_type_array[OpenAPI_nf_type_NRF].nf_instance; - if (!nf_instance) { - nf_instance = ogs_sbi_nf_instance_find_by_discovery_param( - OpenAPI_nf_type_NRF, requester_nf_type, NULL); - if (nf_instance) - OGS_SBI_SETUP_NF_INSTANCE( - sbi_object->nf_type_array[OpenAPI_nf_type_NRF], nf_instance); - } - + nf_instance = ogs_sbi_self()->nrf_instance; if (nf_instance) { bool rc; ogs_sbi_client_t *client = NULL; diff --git a/src/amf/init.c b/src/amf/init.c index f3026a637..4c5ca0771 100644 --- a/src/amf/init.c +++ b/src/amf/init.c @@ -31,7 +31,7 @@ int amf_initialize() amf_metrics_init(); - ogs_sbi_context_init(); + ogs_sbi_context_init(OpenAPI_nf_type_AMF); amf_context_init(); rv = ogs_sbi_context_parse_config("amf", "nrf", "scp"); diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index 45ee4c4d9..7f380420e 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -33,7 +33,7 @@ int amf_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_AMF); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); diff --git a/src/ausf/init.c b/src/ausf/init.c index a69a529d3..d5770642d 100644 --- a/src/ausf/init.c +++ b/src/ausf/init.c @@ -27,8 +27,7 @@ int ausf_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_AUSF); ausf_context_init(); rv = ogs_sbi_context_parse_config("ausf", "nrf", "scp"); diff --git a/src/ausf/sbi-path.c b/src/ausf/sbi-path.c index c1df8a04e..f05666409 100644 --- a/src/ausf/sbi-path.c +++ b/src/ausf/sbi-path.c @@ -30,7 +30,7 @@ int ausf_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_AUSF); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); diff --git a/src/bsf/init.c b/src/bsf/init.c index 63aa84481..5a2408621 100644 --- a/src/bsf/init.c +++ b/src/bsf/init.c @@ -29,8 +29,7 @@ int bsf_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_BSF); bsf_context_init(); rv = ogs_sbi_context_parse_config("bsf", "nrf", "scp"); diff --git a/src/bsf/sbi-path.c b/src/bsf/sbi-path.c index 0575e8610..a5c8309e1 100644 --- a/src/bsf/sbi-path.c +++ b/src/bsf/sbi-path.c @@ -30,7 +30,7 @@ int bsf_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_BSF); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_PCF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); diff --git a/src/nrf/init.c b/src/nrf/init.c index 782772850..b4758b0f8 100644 --- a/src/nrf/init.c +++ b/src/nrf/init.c @@ -27,8 +27,7 @@ int nrf_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_NRF); nrf_context_init(); rv = ogs_sbi_context_parse_config("nrf", NULL, "scp"); diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index aabd6b67c..2926723c0 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -353,6 +353,8 @@ bool nrf_nnrf_handle_nf_list_retrieval( i = 0; ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { + if (NF_INSTANCE_EXCLUDED_FROM_DISCOVERY(nf_instance)) + continue; if (recvmsg->param.nf_type && recvmsg->param.nf_type != nf_instance->nf_type) @@ -499,6 +501,9 @@ bool nrf_nnrf_handle_nf_discover( i = 0; ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { + if (NF_INSTANCE_EXCLUDED_FROM_DISCOVERY(nf_instance)) + continue; + if (nf_instance->nf_type != recvmsg->param.target_nf_type) continue; diff --git a/src/nrf/sbi-path.c b/src/nrf/sbi-path.c index 0e9dbcf28..e2641d624 100644 --- a/src/nrf/sbi-path.c +++ b/src/nrf/sbi-path.c @@ -59,7 +59,7 @@ int nrf_sbi_open(void) ogs_assert(nf_instance); /* Build NF instance information. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_NRF); + ogs_sbi_nf_instance_build_default(nf_instance); if (ogs_sbi_server_start_all(ogs_sbi_server_handler) != OGS_OK) return OGS_ERROR; diff --git a/src/nssf/init.c b/src/nssf/init.c index e5b01e78e..3f3071cf5 100644 --- a/src/nssf/init.c +++ b/src/nssf/init.c @@ -27,8 +27,7 @@ int nssf_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_NSSF); nssf_context_init(); rv = ogs_sbi_context_parse_config("nssf", "nrf", "scp"); diff --git a/src/nssf/sbi-path.c b/src/nssf/sbi-path.c index 7e3fc9166..6553d4e57 100644 --- a/src/nssf/sbi-path.c +++ b/src/nssf/sbi-path.c @@ -30,7 +30,7 @@ int nssf_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_NSSF); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); diff --git a/src/pcf/init.c b/src/pcf/init.c index 2227b1004..787508514 100644 --- a/src/pcf/init.c +++ b/src/pcf/init.c @@ -30,7 +30,7 @@ int pcf_initialize() pcf_metrics_init(); - ogs_sbi_context_init(); + ogs_sbi_context_init(OpenAPI_nf_type_PCF); pcf_context_init(); rv = ogs_sbi_context_parse_config("pcf", "nrf", "scp"); diff --git a/src/pcf/sbi-path.c b/src/pcf/sbi-path.c index d167e4542..22768d46d 100644 --- a/src/pcf/sbi-path.c +++ b/src/pcf/sbi-path.c @@ -33,7 +33,7 @@ int pcf_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_PCF); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); diff --git a/src/scp/init.c b/src/scp/init.c index 83f25c52c..9644d3341 100644 --- a/src/scp/init.c +++ b/src/scp/init.c @@ -29,8 +29,7 @@ int scp_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_SCP); scp_context_init(); rv = ogs_sbi_context_parse_config("scp", "nrf", "next_scp"); diff --git a/src/scp/sbi-path.c b/src/scp/sbi-path.c index ad2883631..4f4b6f1f0 100644 --- a/src/scp/sbi-path.c +++ b/src/scp/sbi-path.c @@ -40,7 +40,7 @@ int scp_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_SCP); + ogs_sbi_nf_instance_build_default(nf_instance); /* * If the SCP is running in Model D, diff --git a/src/smf/init.c b/src/smf/init.c index 310a88f1a..1e8809a4e 100644 --- a/src/smf/init.c +++ b/src/smf/init.c @@ -37,7 +37,7 @@ int smf_initialize() ogs_gtp_context_init(ogs_app()->pool.nf * OGS_MAX_NUM_OF_GTPU_RESOURCE); ogs_pfcp_context_init(); - ogs_sbi_context_init(); + ogs_sbi_context_init(OpenAPI_nf_type_SMF); smf_context_init(); diff --git a/src/smf/sbi-path.c b/src/smf/sbi-path.c index 0b048f318..847d810a1 100644 --- a/src/smf/sbi-path.c +++ b/src/smf/sbi-path.c @@ -41,7 +41,7 @@ int smf_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_SMF); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); diff --git a/src/udm/init.c b/src/udm/init.c index 2cb9cc941..adb29359b 100644 --- a/src/udm/init.c +++ b/src/udm/init.c @@ -27,8 +27,7 @@ int udm_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_UDM); udm_context_init(); rv = ogs_sbi_context_parse_config("udm", "nrf", "scp"); diff --git a/src/udm/sbi-path.c b/src/udm/sbi-path.c index cd4d01305..769922b8e 100644 --- a/src/udm/sbi-path.c +++ b/src/udm/sbi-path.c @@ -30,7 +30,7 @@ int udm_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_UDM); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SMF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_AUSF); diff --git a/src/udr/init.c b/src/udr/init.c index 0e4403a48..8e346485f 100644 --- a/src/udr/init.c +++ b/src/udr/init.c @@ -27,8 +27,7 @@ int udr_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_UDR); udr_context_init(); rv = ogs_sbi_context_parse_config("udr", "nrf", "scp"); diff --git a/src/udr/sbi-path.c b/src/udr/sbi-path.c index 7eb77c0ee..e8fcfd331 100644 --- a/src/udr/sbi-path.c +++ b/src/udr/sbi-path.c @@ -30,7 +30,7 @@ int udr_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_UDR); + ogs_sbi_nf_instance_build_default(nf_instance); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_PCF); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_UDM); ogs_sbi_nf_instance_add_allowed_nf_type(nf_instance, OpenAPI_nf_type_SCP); diff --git a/tests/af/init.c b/tests/af/init.c index 59685e864..02619725d 100644 --- a/tests/af/init.c +++ b/tests/af/init.c @@ -29,8 +29,7 @@ int af_initialize() { int rv; - ogs_sbi_context_init(); - + ogs_sbi_context_init(OpenAPI_nf_type_AF); af_context_init(); rv = ogs_sbi_context_parse_config("af", "nrf", "scp"); diff --git a/tests/af/sbi-path.c b/tests/af/sbi-path.c index 5b49318ea..254393594 100644 --- a/tests/af/sbi-path.c +++ b/tests/af/sbi-path.c @@ -29,7 +29,7 @@ int af_sbi_open(void) ogs_sbi_nf_fsm_init(nf_instance); /* Build NF instance information. It will be transmitted to NRF. */ - ogs_sbi_nf_instance_build_default(nf_instance, OpenAPI_nf_type_AF); + ogs_sbi_nf_instance_build_default(nf_instance); /* Initialize NRF NF Instance */ nf_instance = ogs_sbi_self()->nrf_instance; diff --git a/tests/registration/abts-main.c b/tests/registration/abts-main.c index 51c5f0dcb..37435de57 100644 --- a/tests/registration/abts-main.c +++ b/tests/registration/abts-main.c @@ -76,7 +76,7 @@ static void initialize(const char *const argv[]) test_5gc_init(); - ogs_sbi_context_init(); + ogs_sbi_context_init(OpenAPI_nf_type_AMF); ogs_assert(ogs_sbi_context_parse_config(NULL, "nrf", "scp") == OGS_OK); rv = app_initialize(argv);