[NRF] Fixed a crash during NRF discovery (#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.
This commit is contained in:
Sukchan Lee 2023-01-29 11:22:45 +09:00
parent 610b998038
commit b7386284a7
27 changed files with 60 additions and 52 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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;

View File

@ -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;

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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,

View File

@ -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();

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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;

View File

@ -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);