forked from acouzens/open5gs
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:
parent
b116630fe8
commit
6c5a8a135a
|
@ -27,6 +27,7 @@ static ogs_diam_config_t g_diam_conf;
|
||||||
int __smf_log_domain;
|
int __smf_log_domain;
|
||||||
int __gsm_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_ue_pool, smf_ue_t);
|
||||||
static OGS_POOL(smf_sess_pool, smf_sess_t);
|
static OGS_POOL(smf_sess_pool, smf_sess_t);
|
||||||
static OGS_POOL(smf_bearer_pool, smf_bearer_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(&__smf_log_domain, "smf", ogs_core()->log.level);
|
||||||
ogs_log_install_domain(&__gsm_log_domain, "gsm", 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_ue_pool, ogs_app()->max.ue);
|
||||||
ogs_pool_init(&smf_sess_pool, ogs_app()->pool.sess);
|
ogs_pool_init(&smf_sess_pool, ogs_app()->pool.sess);
|
||||||
ogs_pool_init(&smf_bearer_pool, ogs_app()->pool.bearer);
|
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_gtp_node_remove(&self.sgw_s5c_list, gnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ogs_pool_final(&smf_gtp_node_pool);
|
||||||
|
|
||||||
context_initialized = 0;
|
context_initialized = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,10 +376,11 @@ int smf_context_parse_config(void)
|
||||||
const char *ctf_key = ogs_yaml_iter_key(&ctf_iter);
|
const char *ctf_key = ogs_yaml_iter_key(&ctf_iter);
|
||||||
ogs_assert(ctf_key);
|
ogs_assert(ctf_key);
|
||||||
if (!strcmp(ctf_key, "enabled")) {
|
if (!strcmp(ctf_key, "enabled")) {
|
||||||
yaml_node_t *ctf_node =
|
yaml_node_t *ctf_node = yaml_document_get_node(
|
||||||
yaml_document_get_node(document, ctf_iter.pair->value);
|
document, ctf_iter.pair->value);
|
||||||
ogs_assert(ctf_node->type == YAML_SCALAR_NODE);
|
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"))
|
if (!strcmp(enabled, "auto"))
|
||||||
self.ctf_config.enabled = SMF_CTF_ENABLED_AUTO;
|
self.ctf_config.enabled = SMF_CTF_ENABLED_AUTO;
|
||||||
else if (!strcmp(enabled, "yes"))
|
else if (!strcmp(enabled, "yes"))
|
||||||
|
@ -383,7 +388,8 @@ int smf_context_parse_config(void)
|
||||||
else if (!strcmp(enabled, "no"))
|
else if (!strcmp(enabled, "no"))
|
||||||
self.ctf_config.enabled = SMF_CTF_ENABLED_NO;
|
self.ctf_config.enabled = SMF_CTF_ENABLED_NO;
|
||||||
else
|
else
|
||||||
ogs_warn("unknown 'enabled' value `%s`", enabled);
|
ogs_warn("unknown 'enabled' value `%s`",
|
||||||
|
enabled);
|
||||||
} else
|
} else
|
||||||
ogs_warn("unknown key `%s`", ctf_key);
|
ogs_warn("unknown key `%s`", ctf_key);
|
||||||
}
|
}
|
||||||
|
@ -828,6 +834,35 @@ int smf_context_parse_config(void)
|
||||||
return OGS_OK;
|
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)
|
static smf_ue_t *smf_ue_add(void)
|
||||||
{
|
{
|
||||||
smf_ue_t *smf_ue = NULL;
|
smf_ue_t *smf_ue = NULL;
|
||||||
|
|
|
@ -99,6 +99,11 @@ typedef struct smf_context_s {
|
||||||
ogs_list_t smf_ue_list;
|
ogs_list_t smf_ue_list;
|
||||||
} smf_context_t;
|
} 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 {
|
typedef struct smf_ue_s {
|
||||||
ogs_lnode_t lnode;
|
ogs_lnode_t lnode;
|
||||||
|
|
||||||
|
@ -419,6 +424,9 @@ int smf_context_parse_config(void);
|
||||||
|
|
||||||
int smf_use_gy_iface(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_supi(char *supi);
|
||||||
smf_ue_t *smf_ue_add_by_imsi(uint8_t *imsi, int imsi_len);
|
smf_ue_t *smf_ue_add_by_imsi(uint8_t *imsi, int imsi_len);
|
||||||
void smf_ue_remove(smf_ue_t *smf_ue);
|
void smf_ue_remove(smf_ue_t *smf_ue);
|
||||||
|
|
|
@ -41,8 +41,6 @@
|
||||||
#include "s5c-build.h"
|
#include "s5c-build.h"
|
||||||
#include "gn-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 bool check_if_router_solicit(ogs_pkbuf_t *pkbuf);
|
||||||
static void send_router_advertisement(smf_sess_t *sess, uint8_t *ip6_dst);
|
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_gtp_self()->link_local_addr =
|
||||||
ogs_link_local_addr_by_sa(ogs_gtp_self()->gtpu_addr6);
|
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;
|
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()->gtpc_list6);
|
||||||
|
|
||||||
ogs_socknode_remove_all(&ogs_gtp_self()->gtpu_list);
|
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(
|
int smf_gtp1_send_create_pdp_context_response(
|
||||||
|
|
|
@ -29,15 +29,6 @@ extern "C" {
|
||||||
int smf_gtp_open(void);
|
int smf_gtp_open(void);
|
||||||
void smf_gtp_close(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(
|
int smf_gtp1_send_create_pdp_context_response(
|
||||||
smf_sess_t *sess, ogs_gtp_xact_t *xact);
|
smf_sess_t *sess, ogs_gtp_xact_t *xact);
|
||||||
int smf_gtp1_send_delete_pdp_context_response(
|
int smf_gtp1_send_delete_pdp_context_response(
|
||||||
|
|
Loading…
Reference in New Issue