Reorder smf_gtp_node objects free (#1593)

smf_gtp_node_pool were properly freed.

However, the seqence was wrong, so we got a warning message.

To solve this problem, I've moved smf_gtp_node_alloc/free
from gtp_path.[ch] to context.[ch]
This commit is contained in:
Sukchan Lee 2022-06-10 21:08:15 +09:00
parent b116630fe8
commit 6c5a8a135a
4 changed files with 47 additions and 48 deletions

View File

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

View File

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

View File

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

View File

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