forked from acouzens/open5gs
[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:
parent
610b998038
commit
b7386284a7
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue