diff --git a/src/smf/context.c b/src/smf/context.c index 40734eab4..ed20dcccd 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -27,6 +27,7 @@ static ogs_diam_config_t g_diam_conf; int __smf_log_domain; int __gsm_log_domain; +static OGS_POOL(smf_gtp_node_pool, smf_gtp_node_t); static OGS_POOL(smf_ue_pool, smf_ue_t); static OGS_POOL(smf_sess_pool, smf_sess_t); static OGS_POOL(smf_bearer_pool, smf_bearer_t); @@ -79,6 +80,7 @@ void smf_context_init(void) ogs_log_install_domain(&__smf_log_domain, "smf", ogs_core()->log.level); ogs_log_install_domain(&__gsm_log_domain, "gsm", ogs_core()->log.level); + ogs_pool_init(&smf_gtp_node_pool, ogs_app()->pool.gtp_node); ogs_pool_init(&smf_ue_pool, ogs_app()->max.ue); ogs_pool_init(&smf_sess_pool, ogs_app()->pool.sess); ogs_pool_init(&smf_bearer_pool, ogs_app()->pool.bearer); @@ -132,6 +134,8 @@ void smf_context_final(void) ogs_gtp_node_remove(&self.sgw_s5c_list, gnode); } + ogs_pool_final(&smf_gtp_node_pool); + context_initialized = 0; } @@ -372,10 +376,11 @@ int smf_context_parse_config(void) const char *ctf_key = ogs_yaml_iter_key(&ctf_iter); ogs_assert(ctf_key); if (!strcmp(ctf_key, "enabled")) { - yaml_node_t *ctf_node = - yaml_document_get_node(document, ctf_iter.pair->value); + yaml_node_t *ctf_node = yaml_document_get_node( + document, ctf_iter.pair->value); ogs_assert(ctf_node->type == YAML_SCALAR_NODE); - const char* enabled = ogs_yaml_iter_value(&ctf_iter); + const char* enabled = + ogs_yaml_iter_value(&ctf_iter); if (!strcmp(enabled, "auto")) self.ctf_config.enabled = SMF_CTF_ENABLED_AUTO; else if (!strcmp(enabled, "yes")) @@ -383,7 +388,8 @@ int smf_context_parse_config(void) else if (!strcmp(enabled, "no")) self.ctf_config.enabled = SMF_CTF_ENABLED_NO; else - ogs_warn("unknown 'enabled' value `%s`", enabled); + ogs_warn("unknown 'enabled' value `%s`", + enabled); } else ogs_warn("unknown key `%s`", ctf_key); } @@ -828,6 +834,35 @@ int smf_context_parse_config(void) return OGS_OK; } +smf_gtp_node_t *smf_gtp_node_new(ogs_gtp_node_t *gnode) +{ + smf_gtp_node_t *smf_gnode = NULL; + char addr[OGS_ADDRSTRLEN]; + + ogs_pool_alloc(&smf_gtp_node_pool, &smf_gnode); + ogs_expect_or_return_val(smf_gnode, NULL); + memset(smf_gnode, 0, sizeof(smf_gtp_node_t)); + + addr[0] = '\0'; + ogs_assert(gnode->sa_list); + ogs_inet_ntop(&gnode->sa_list[0].sa, addr, sizeof(addr)); + ogs_assert(smf_metrics_init_inst_gtp_node(smf_gnode->metrics, addr) + == OGS_OK); + + smf_gnode->gnode = gnode; + gnode->data_ptr = smf_gnode; /* Set backpointer */ + return smf_gnode; +} + +void smf_gtp_node_free(smf_gtp_node_t *smf_gnode) +{ + ogs_assert(smf_gnode); + if (smf_gnode->gnode) + smf_gnode->gnode->data_ptr = NULL; /* Drop backpointer */ + smf_metrics_free_inst_gtp_node(smf_gnode->metrics); + ogs_pool_free(&smf_gtp_node_pool, smf_gnode); +} + static smf_ue_t *smf_ue_add(void) { smf_ue_t *smf_ue = NULL; diff --git a/src/smf/context.h b/src/smf/context.h index bc3e937aa..62b95c7fc 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -99,6 +99,11 @@ typedef struct smf_context_s { ogs_list_t smf_ue_list; } smf_context_t; +typedef struct smf_gtp_node_s { + ogs_gtp_node_t *gnode; + ogs_metrics_inst_t *metrics[_SMF_METR_GTP_NODE_MAX]; +} smf_gtp_node_t; + typedef struct smf_ue_s { ogs_lnode_t lnode; @@ -419,6 +424,9 @@ int smf_context_parse_config(void); int smf_use_gy_iface(void); +smf_gtp_node_t *smf_gtp_node_new(ogs_gtp_node_t *gnode); +void smf_gtp_node_free(smf_gtp_node_t *smf_gnode); + smf_ue_t *smf_ue_add_by_supi(char *supi); smf_ue_t *smf_ue_add_by_imsi(uint8_t *imsi, int imsi_len); void smf_ue_remove(smf_ue_t *smf_ue); diff --git a/src/smf/gtp-path.c b/src/smf/gtp-path.c index 12abdf5df..ef705e535 100644 --- a/src/smf/gtp-path.c +++ b/src/smf/gtp-path.c @@ -41,8 +41,6 @@ #include "s5c-build.h" #include "gn-build.h" -static OGS_POOL(smf_gtp_node_pool, smf_gtp_node_t); - static bool check_if_router_solicit(ogs_pkbuf_t *pkbuf); static void send_router_advertisement(smf_sess_t *sess, uint8_t *ip6_dst); @@ -298,8 +296,6 @@ int smf_gtp_open(void) ogs_gtp_self()->link_local_addr = ogs_link_local_addr_by_sa(ogs_gtp_self()->gtpu_addr6); - ogs_pool_init(&smf_gtp_node_pool, ogs_app()->pool.gtp_node); - return OGS_OK; } @@ -312,37 +308,6 @@ void smf_gtp_close(void) ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6); ogs_socknode_remove_all(&ogs_gtp_self()->gtpu_list); - - ogs_pool_final(&smf_gtp_node_pool); -} - -smf_gtp_node_t *smf_gtp_node_new(ogs_gtp_node_t *gnode) -{ - smf_gtp_node_t *smf_gnode = NULL; - char addr[OGS_ADDRSTRLEN]; - - ogs_pool_alloc(&smf_gtp_node_pool, &smf_gnode); - ogs_expect_or_return_val(smf_gnode, NULL); - memset(smf_gnode, 0, sizeof(smf_gtp_node_t)); - - addr[0] = '\0'; - ogs_assert(gnode->sa_list); - ogs_inet_ntop(&gnode->sa_list[0].sa, addr, sizeof(addr)); - ogs_assert(smf_metrics_init_inst_gtp_node(smf_gnode->metrics, addr) - == OGS_OK); - - smf_gnode->gnode = gnode; - gnode->data_ptr = smf_gnode; /* Set backpointer */ - return smf_gnode; -} - -void smf_gtp_node_free(smf_gtp_node_t *smf_gnode) -{ - ogs_assert(smf_gnode); - if (smf_gnode->gnode) - smf_gnode->gnode->data_ptr = NULL; /*Drop backpointer */ - smf_metrics_free_inst_gtp_node(smf_gnode->metrics); - ogs_pool_free(&smf_gtp_node_pool, smf_gnode); } int smf_gtp1_send_create_pdp_context_response( diff --git a/src/smf/gtp-path.h b/src/smf/gtp-path.h index 78c298c09..4b3874fc2 100644 --- a/src/smf/gtp-path.h +++ b/src/smf/gtp-path.h @@ -29,15 +29,6 @@ extern "C" { int smf_gtp_open(void); void smf_gtp_close(void); -typedef struct smf_gtp_node_s { - ogs_gtp_node_t *gnode; - ogs_metrics_inst_t *metrics[_SMF_METR_GTP_NODE_MAX]; -} smf_gtp_node_t; - -smf_gtp_node_t *smf_gtp_node_new(ogs_gtp_node_t *gnode); -void smf_gtp_node_free(smf_gtp_node_t *smf_gnode); - - int smf_gtp1_send_create_pdp_context_response( smf_sess_t *sess, ogs_gtp_xact_t *xact); int smf_gtp1_send_delete_pdp_context_response(