Fixing the problem of the test program

This commit is contained in:
Sukchan Lee 2020-09-01 23:04:35 -04:00
parent 340ef8cc6f
commit 887a0a10d3
21 changed files with 195 additions and 150 deletions

View File

@ -23,12 +23,16 @@ static ogs_app_context_t self;
static int initialized = 0; static int initialized = 0;
static void app_context_prepare(void);
int ogs_app_context_init(void) int ogs_app_context_init(void)
{ {
ogs_assert(initialized == 0); ogs_assert(initialized == 0);
memset(&self, 0, sizeof(ogs_app_context_t)); memset(&self, 0, sizeof(ogs_app_context_t));
app_context_prepare();
initialized = 1; initialized = 1;
return OGS_OK; return OGS_OK;
@ -164,7 +168,7 @@ static void regenerate_all_timer_duration(void)
#endif #endif
} }
static int app_context_prepare(void) static void app_context_prepare(void)
{ {
#define USRSCTP_LOCAL_UDP_PORT 9899 #define USRSCTP_LOCAL_UDP_PORT 9899
self.usrsctp.udp_port = USRSCTP_LOCAL_UDP_PORT; self.usrsctp.udp_port = USRSCTP_LOCAL_UDP_PORT;
@ -196,8 +200,6 @@ static int app_context_prepare(void)
self.time.message.duration = ogs_time_from_sec(2); self.time.message.duration = ogs_time_from_sec(2);
regenerate_all_timer_duration(); regenerate_all_timer_duration();
return OGS_OK;
} }
static int app_context_validation(void) static int app_context_validation(void)
@ -230,9 +232,6 @@ int ogs_app_context_parse_config(void)
document = self.document; document = self.document;
ogs_assert(document); ogs_assert(document);
rv = app_context_prepare();
if (rv != OGS_OK) return rv;
ogs_yaml_iter_init(&root_iter, document); ogs_yaml_iter_init(&root_iter, document);
while (ogs_yaml_iter_next(&root_iter)) { while (ogs_yaml_iter_next(&root_iter)) {
const char *root_key = ogs_yaml_iter_key(&root_iter); const char *root_key = ogs_yaml_iter_key(&root_iter);

View File

@ -55,17 +55,13 @@ typedef unsigned int ogs_index_t;
} \ } \
} while (0) } while (0)
#define ogs_pool_final_skip_mem_checks(pool) do { \
free((pool)->free); \
free((pool)->array); \
free((pool)->index); \
} while (0)
#define ogs_pool_final(pool) do { \ #define ogs_pool_final(pool) do { \
if (((pool)->size != (pool)->avail)) \ if (((pool)->size != (pool)->avail)) \
ogs_error("%d in '%s[%d]' were not released.", \ ogs_error("%d in '%s[%d]' were not released.", \
(pool)->size - (pool)->avail, (pool)->name, (pool)->size); \ (pool)->size - (pool)->avail, (pool)->name, (pool)->size); \
ogs_pool_final_skip_mem_checks(pool); \ free((pool)->free); \
free((pool)->array); \
free((pool)->index); \
} while (0) } while (0)
#define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) #define ogs_pool_index(pool, node) (((node) - (pool)->array)+1)
@ -97,6 +93,32 @@ typedef unsigned int ogs_index_t;
#define ogs_pool_size(pool) ((pool)->size) #define ogs_pool_size(pool) ((pool)->size)
#define ogs_pool_avail(pool) ((pool)->avail) #define ogs_pool_avail(pool) ((pool)->avail)
#define ogs_index_init(pool, _size) do { \
int i; \
(pool)->name = #pool; \
(pool)->free = ogs_malloc(sizeof(*(pool)->free) * _size); \
ogs_assert((pool)->free); \
(pool)->array = ogs_malloc(sizeof(*(pool)->array) * _size); \
ogs_assert((pool)->array); \
(pool)->index = ogs_malloc(sizeof(*(pool)->index) * _size); \
ogs_assert((pool)->index); \
(pool)->size = (pool)->avail = _size; \
(pool)->head = (pool)->tail = 0; \
for (i = 0; i < _size; i++) { \
(pool)->free[i] = &((pool)->array[i]); \
(pool)->index[i] = NULL; \
} \
} while (0)
#define ogs_index_final(pool) do { \
if (((pool)->size != (pool)->avail)) \
ogs_error("%d in '%s[%d]' were not released.", \
(pool)->size - (pool)->avail, (pool)->name, (pool)->size); \
ogs_free((pool)->free); \
ogs_free((pool)->array); \
ogs_free((pool)->index); \
} while (0)
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -1505,17 +1505,17 @@ void ogs_pfcp_subnet_remove_all(void)
void ogs_pfcp_pool_init(ogs_pfcp_sess_t *sess) void ogs_pfcp_pool_init(ogs_pfcp_sess_t *sess)
{ {
ogs_pool_init(&sess->pdr_pool, OGS_MAX_NUM_OF_PDR); ogs_index_init(&sess->pdr_pool, OGS_MAX_NUM_OF_PDR);
ogs_pool_init(&sess->far_pool, OGS_MAX_NUM_OF_FAR); ogs_index_init(&sess->far_pool, OGS_MAX_NUM_OF_FAR);
ogs_pool_init(&sess->urr_pool, OGS_MAX_NUM_OF_URR); ogs_index_init(&sess->urr_pool, OGS_MAX_NUM_OF_URR);
ogs_pool_init(&sess->qer_pool, OGS_MAX_NUM_OF_QER); ogs_index_init(&sess->qer_pool, OGS_MAX_NUM_OF_QER);
ogs_pool_init(&sess->bar_pool, OGS_MAX_NUM_OF_BAR); ogs_index_init(&sess->bar_pool, OGS_MAX_NUM_OF_BAR);
} }
void ogs_pfcp_pool_final(ogs_pfcp_sess_t *sess) void ogs_pfcp_pool_final(ogs_pfcp_sess_t *sess)
{ {
ogs_pool_final(&sess->pdr_pool); ogs_index_final(&sess->pdr_pool);
ogs_pool_final(&sess->far_pool); ogs_index_final(&sess->far_pool);
ogs_pool_final(&sess->urr_pool); ogs_index_final(&sess->urr_pool);
ogs_pool_final(&sess->qer_pool); ogs_index_final(&sess->qer_pool);
ogs_pool_final(&sess->bar_pool); ogs_index_final(&sess->bar_pool);
} }

View File

@ -404,7 +404,7 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue)
while (sess) { while (sess) {
mme_bearer_t *bearer = mme_bearer_first(sess); mme_bearer_t *bearer = mme_bearer_first(sess);
while (bearer) { while (bearer) {
switch (*(bearer->ebi)) { switch (bearer->ebi) {
case 5: tau_accept->eps_bearer_context_status.ebi5 = 1; break; case 5: tau_accept->eps_bearer_context_status.ebi5 = 1; break;
case 6: tau_accept->eps_bearer_context_status.ebi6 = 1; break; case 6: tau_accept->eps_bearer_context_status.ebi6 = 1; break;
case 7: tau_accept->eps_bearer_context_status.ebi7 = 1; break; case 7: tau_accept->eps_bearer_context_status.ebi7 = 1; break;

View File

@ -80,6 +80,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
*/ */
CLEAR_MME_UE_ALL_TIMERS(mme_ue); CLEAR_MME_UE_ALL_TIMERS(mme_ue);
CLEAR_EPS_BEARER_ID(mme_ue);
CLEAR_SERVICE_INDICATOR(mme_ue); CLEAR_SERVICE_INDICATOR(mme_ue);
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { if (SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb);

View File

@ -74,7 +74,7 @@ ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer)
ogs_debug("[ESM] ESM information request"); ogs_debug("[ESM] ESM information request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
message.h.security_header_type = message.h.security_header_type =
@ -130,7 +130,7 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request(
ogs_debug("[ESM] Activate default bearer context request"); ogs_debug("[ESM] Activate default bearer context request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) { if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) {
@ -138,7 +138,7 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request(
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
} }
message.esm.h.eps_bearer_identity = *(bearer->ebi); message.esm.h.eps_bearer_identity = bearer->ebi;
message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM;
message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.procedure_transaction_identity = sess->pti;
message.esm.h.message_type = message.esm.h.message_type =
@ -278,19 +278,19 @@ ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request(
ogs_debug("[ESM] Activate dedicated bearer context request"); ogs_debug("[ESM] Activate dedicated bearer context request");
ogs_debug(" IMSI[%s] EBI[%d] Linked-EBI[%d]", ogs_debug(" IMSI[%s] EBI[%d] Linked-EBI[%d]",
mme_ue->imsi_bcd, *(bearer->ebi), *(linked_bearer->ebi)); mme_ue->imsi_bcd, bearer->ebi, linked_bearer->ebi);
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
message.h.security_header_type = message.h.security_header_type =
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.esm.h.eps_bearer_identity = *(bearer->ebi); message.esm.h.eps_bearer_identity = bearer->ebi;
message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM;
message.esm.h.procedure_transaction_identity = 0; message.esm.h.procedure_transaction_identity = 0;
message.esm.h.message_type = message.esm.h.message_type =
OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST; OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST;
linked_ebi->eps_bearer_identity = *(linked_bearer->ebi); linked_ebi->eps_bearer_identity = linked_bearer->ebi;
eps_qos_build(eps_qos, bearer->qos.qci, eps_qos_build(eps_qos, bearer->qos.qci,
bearer->qos.mbr.downlink, bearer->qos.mbr.uplink, bearer->qos.mbr.downlink, bearer->qos.mbr.uplink,
bearer->qos.gbr.downlink, bearer->qos.gbr.uplink); bearer->qos.gbr.downlink, bearer->qos.gbr.uplink);
@ -326,13 +326,13 @@ ogs_pkbuf_t *esm_build_modify_bearer_context_request(
ogs_debug("[ESM] Modify bearer context request"); ogs_debug("[ESM] Modify bearer context request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
message.h.security_header_type = message.h.security_header_type =
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.esm.h.eps_bearer_identity = *(bearer->ebi); message.esm.h.eps_bearer_identity = bearer->ebi;
message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM;
message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.procedure_transaction_identity = sess->pti;
message.esm.h.message_type = OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST; message.esm.h.message_type = OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST;
@ -376,14 +376,14 @@ ogs_pkbuf_t *esm_build_deactivate_bearer_context_request(
ogs_debug("[ESM] Deactivate bearer context request"); ogs_debug("[ESM] Deactivate bearer context request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
ogs_debug(" Cause[%d]", esm_cause); ogs_debug(" Cause[%d]", esm_cause);
memset(&message, 0, sizeof(message)); memset(&message, 0, sizeof(message));
message.h.security_header_type = message.h.security_header_type =
OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED;
message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM;
message.esm.h.eps_bearer_identity = *(bearer->ebi); message.esm.h.eps_bearer_identity = bearer->ebi;
message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM;
message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.procedure_transaction_identity = sess->pti;
message.esm.h.message_type = message.esm.h.message_type =

View File

@ -81,7 +81,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST:
ogs_debug("[ESM] PDN Connectivity request"); ogs_debug("[ESM] PDN Connectivity request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request( rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request); bearer, &message->esm.pdn_connectivity_request);
if (rv != OGS_OK) { if (rv != OGS_OK) {
@ -92,7 +92,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE: case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE:
ogs_debug("[ESM] ESM information response"); ogs_debug("[ESM] ESM information response");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
CLEAR_BEARER_TIMER(bearer->t3489); CLEAR_BEARER_TIMER(bearer->t3489);
rv = esm_handle_information_response( rv = esm_handle_information_response(
@ -106,7 +106,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_debug("[ESM] Activate default EPS bearer " ogs_debug("[ESM] Activate default EPS bearer "
"context accept"); "context accept");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
/* Check if Initial Context Setup Response or /* Check if Initial Context Setup Response or
* E-RAB Setup Response is received */ * E-RAB Setup Response is received */
if (MME_HAVE_ENB_S1U_PATH(bearer)) { if (MME_HAVE_ENB_S1U_PATH(bearer)) {
@ -120,7 +120,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_debug("[ESM] Activate dedicated EPS bearer " ogs_debug("[ESM] Activate dedicated EPS bearer "
"context accept"); "context accept");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
/* Check if Initial Context Setup Response or /* Check if Initial Context Setup Response or
* E-RAB Setup Response is received */ * E-RAB Setup Response is received */
if (MME_HAVE_ENB_S1U_PATH(bearer)) { if (MME_HAVE_ENB_S1U_PATH(bearer)) {
@ -197,7 +197,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST:
ogs_debug("[ESM] PDN Connectivity request"); ogs_debug("[ESM] PDN Connectivity request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request( rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request); bearer, &message->esm.pdn_connectivity_request);
if (rv != OGS_OK) { if (rv != OGS_OK) {
@ -210,7 +210,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_PDN_DISCONNECT_REQUEST: case OGS_NAS_EPS_PDN_DISCONNECT_REQUEST:
ogs_debug("[ESM] PDN disconnect request"); ogs_debug("[ESM] PDN disconnect request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
if (MME_HAVE_SGW_S1U_PATH(sess)) { if (MME_HAVE_SGW_S1U_PATH(sess)) {
mme_gtp_send_delete_session_request(sess); mme_gtp_send_delete_session_request(sess);
} else { } else {
@ -221,7 +221,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT: case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT:
ogs_debug("[ESM] Modify EPS bearer context accept"); ogs_debug("[ESM] Modify EPS bearer context accept");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
mme_gtp_send_update_bearer_response(bearer); mme_gtp_send_update_bearer_response(bearer);
break; break;
@ -229,20 +229,20 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
ogs_debug("[ESM] Deactivate EPS bearer " ogs_debug("[ESM] Deactivate EPS bearer "
"context accept"); "context accept");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
mme_gtp_send_delete_bearer_response(bearer); mme_gtp_send_delete_bearer_response(bearer);
OGS_FSM_TRAN(s, esm_state_bearer_deactivated); OGS_FSM_TRAN(s, esm_state_bearer_deactivated);
break; break;
case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST: case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST:
ogs_debug("[ESM] Bearer resource allocation request"); ogs_debug("[ESM] Bearer resource allocation request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
esm_handle_bearer_resource_allocation_request(bearer, message); esm_handle_bearer_resource_allocation_request(bearer, message);
break; break;
case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST: case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST:
ogs_debug("[ESM] Bearer resource modification request"); ogs_debug("[ESM] Bearer resource modification request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
esm_handle_bearer_resource_modification_request(bearer, message); esm_handle_bearer_resource_modification_request(bearer, message);
break; break;
default: default:
@ -290,7 +290,7 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e)
ogs_debug("[ESM] [D] Deactivate EPS bearer " ogs_debug("[ESM] [D] Deactivate EPS bearer "
"context accept"); "context accept");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
OGS_FSM_TRAN(s, esm_state_pdn_did_disconnect); OGS_FSM_TRAN(s, esm_state_pdn_did_disconnect);
break; break;
default: default:

View File

@ -2333,7 +2333,7 @@ void mme_ue_remove(mme_ue_t *mme_ue)
mme_sess_remove_all(mme_ue); mme_sess_remove_all(mme_ue);
mme_pdn_remove_all(mme_ue); mme_pdn_remove_all(mme_ue);
ogs_pool_final(&mme_ue->ebi_pool); mme_ebi_pool_final(mme_ue);
ogs_pool_free(&mme_ue_pool, mme_ue); ogs_pool_free(&mme_ue_pool, mme_ue);
} }
@ -2782,11 +2782,13 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess)
ogs_assert(bearer); ogs_assert(bearer);
memset(bearer, 0, sizeof *bearer); memset(bearer, 0, sizeof *bearer);
ogs_pool_alloc(&mme_ue->ebi_pool, &bearer->ebi); ogs_pool_alloc(&mme_ue->ebi_pool, &bearer->ebi_node);
ogs_assert(bearer->ebi); ogs_assert(bearer->ebi_node);
ogs_assert(*(bearer->ebi) >= MIN_EPS_BEARER_ID && bearer->ebi = *(bearer->ebi_node);
*(bearer->ebi) <= MAX_EPS_BEARER_ID);
ogs_assert(bearer->ebi >= MIN_EPS_BEARER_ID &&
bearer->ebi <= MAX_EPS_BEARER_ID);
bearer->mme_ue = mme_ue; bearer->mme_ue = mme_ue;
bearer->sess = sess; bearer->sess = sess;
@ -2825,8 +2827,8 @@ void mme_bearer_remove(mme_bearer_t *bearer)
OGS_TLV_CLEAR_DATA(&bearer->tft); OGS_TLV_CLEAR_DATA(&bearer->tft);
ogs_assert(bearer->ebi); ogs_assert(bearer->ebi_node);
ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi); ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi_node);
ogs_pool_free(&mme_bearer_pool, bearer); ogs_pool_free(&mme_bearer_pool, bearer);
} }
@ -2855,7 +2857,7 @@ mme_bearer_t *mme_bearer_find_by_sess_ebi(mme_sess_t *sess, uint8_t ebi)
bearer = mme_bearer_first(sess); bearer = mme_bearer_first(sess);
while (bearer) { while (bearer) {
if (ebi == *(bearer->ebi)) if (ebi == bearer->ebi)
return bearer; return bearer;
bearer = mme_bearer_next(bearer); bearer = mme_bearer_next(bearer);
@ -3238,7 +3240,7 @@ void mme_ebi_pool_init(mme_ue_t *mme_ue)
ogs_assert(mme_ue); ogs_assert(mme_ue);
ogs_pool_init(&mme_ue->ebi_pool, MAX_EPS_BEARER_ID - MIN_EPS_BEARER_ID + 1); ogs_index_init(&mme_ue->ebi_pool, MAX_EPS_BEARER_ID-MIN_EPS_BEARER_ID+1);
for (i = MIN_EPS_BEARER_ID, index = 0; for (i = MIN_EPS_BEARER_ID, index = 0;
i <= MAX_EPS_BEARER_ID; i++, index++) { i <= MAX_EPS_BEARER_ID; i++, index++) {
@ -3248,7 +3250,20 @@ void mme_ebi_pool_init(mme_ue_t *mme_ue)
void mme_ebi_pool_final(mme_ue_t *mme_ue) void mme_ebi_pool_final(mme_ue_t *mme_ue)
{ {
ogs_pool_final_skip_mem_checks(&mme_ue->ebi_pool); ogs_assert(mme_ue);
ogs_index_final(&mme_ue->ebi_pool);
}
void mme_ebi_pool_clear(mme_ue_t *mme_ue)
{
ogs_assert(mme_ue);
ogs_free(mme_ue->ebi_pool.free);
ogs_free(mme_ue->ebi_pool.array);
ogs_free(mme_ue->ebi_pool.index);
mme_ebi_pool_init(mme_ue);
} }
uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue) uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue)

View File

@ -397,8 +397,7 @@ struct mme_ue_s {
#define CLEAR_EPS_BEARER_ID(__mME) \ #define CLEAR_EPS_BEARER_ID(__mME) \
do { \ do { \
ogs_assert((__mME)); \ ogs_assert((__mME)); \
mme_ebi_pool_final(__mME); \ mme_ebi_pool_clear(__mME); \
mme_ebi_pool_init(__mME); \
} while(0) } while(0)
OGS_POOL(ebi_pool, uint8_t); OGS_POOL(ebi_pool, uint8_t);
@ -523,7 +522,6 @@ struct mme_ue_s {
ogs_assert((__mME)); \ ogs_assert((__mME)); \
(__mME)->sgw_s11_teid = 0; \ (__mME)->sgw_s11_teid = 0; \
(__mME)->session_context_will_deleted = 0; \ (__mME)->session_context_will_deleted = 0; \
CLEAR_EPS_BEARER_ID((__mME)); \
} while(0) } while(0)
typedef struct mme_sess_s { typedef struct mme_sess_s {
ogs_lnode_t lnode; ogs_lnode_t lnode;
@ -585,7 +583,8 @@ typedef struct mme_bearer_s {
uint32_t index; uint32_t index;
ogs_fsm_t sm; /* State Machine */ ogs_fsm_t sm; /* State Machine */
uint8_t *ebi; /* EPS Bearer ID */ uint8_t *ebi_node; /* Pool-Node for EPS Bearer ID */
uint8_t ebi; /* EPS Bearer ID */
uint32_t enb_s1u_teid; uint32_t enb_s1u_teid;
ogs_ip_t enb_s1u_ip; ogs_ip_t enb_s1u_ip;
@ -789,6 +788,7 @@ int mme_m_tmsi_free(mme_m_tmsi_t *tmsi);
void mme_ebi_pool_init(mme_ue_t *mme_ue); void mme_ebi_pool_init(mme_ue_t *mme_ue);
void mme_ebi_pool_final(mme_ue_t *mme_ue); void mme_ebi_pool_final(mme_ue_t *mme_ue);
void mme_ebi_pool_clear(mme_ue_t *mme_ue);
uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue); uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue);
uint8_t mme_selected_enc_algorithm(mme_ue_t *mme_ue); uint8_t mme_selected_enc_algorithm(mme_ue_t *mme_ue);

View File

@ -267,7 +267,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue)
if (bearer && if (bearer &&
OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_will_disconnect)) { OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_will_disconnect)) {
ogs_warn("PDN will disconnect[EBI:%d]", *(bearer->ebi)); ogs_warn("PDN will disconnect[EBI:%d]", bearer->ebi);
} else { } else {
mme_gtp_send_delete_session_request(sess); mme_gtp_send_delete_session_request(sess);
} }

View File

@ -230,7 +230,7 @@ ogs_pkbuf_t *mme_s11_build_create_session_request(
req->bearer_contexts_to_be_created.presence = 1; req->bearer_contexts_to_be_created.presence = 1;
req->bearer_contexts_to_be_created.eps_bearer_id.presence = 1; req->bearer_contexts_to_be_created.eps_bearer_id.presence = 1;
req->bearer_contexts_to_be_created.eps_bearer_id.u8 = *(bearer->ebi); req->bearer_contexts_to_be_created.eps_bearer_id.u8 = bearer->ebi;
memset(&bearer_qos, 0, sizeof(bearer_qos)); memset(&bearer_qos, 0, sizeof(bearer_qos));
bearer_qos.qci = pdn->qos.qci; bearer_qos.qci = pdn->qos.qci;
@ -297,7 +297,7 @@ ogs_pkbuf_t *mme_s11_build_modify_bearer_request(
/* Bearer Context : EBI */ /* Bearer Context : EBI */
req->bearer_contexts_to_be_modified.presence = 1; req->bearer_contexts_to_be_modified.presence = 1;
req->bearer_contexts_to_be_modified.eps_bearer_id.presence = 1; req->bearer_contexts_to_be_modified.eps_bearer_id.presence = 1;
req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = *(bearer->ebi); req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = bearer->ebi;
/* Data Plane(DL) : ENB-S1U */ /* Data Plane(DL) : ENB-S1U */
memset(&enb_s1u_teid, 0, sizeof(ogs_gtp_f_teid_t)); memset(&enb_s1u_teid, 0, sizeof(ogs_gtp_f_teid_t));
@ -354,7 +354,7 @@ ogs_pkbuf_t *mme_s11_build_delete_session_request(
memset(&gtp_message, 0, sizeof(ogs_gtp_message_t)); memset(&gtp_message, 0, sizeof(ogs_gtp_message_t));
req->linked_eps_bearer_id.presence = 1; req->linked_eps_bearer_id.presence = 1;
req->linked_eps_bearer_id.u8 = *(bearer->ebi); req->linked_eps_bearer_id.u8 = bearer->ebi;
/* User Location Information(ULI) */ /* User Location Information(ULI) */
memset(&uli, 0, sizeof(ogs_gtp_uli_t)); memset(&uli, 0, sizeof(ogs_gtp_uli_t));
@ -416,7 +416,7 @@ ogs_pkbuf_t *mme_s11_build_create_bearer_response(
/* Bearer Context : EBI */ /* Bearer Context : EBI */
rsp->bearer_contexts.presence = 1; rsp->bearer_contexts.presence = 1;
rsp->bearer_contexts.eps_bearer_id.presence = 1; rsp->bearer_contexts.eps_bearer_id.presence = 1;
rsp->bearer_contexts.eps_bearer_id.u8 = *(bearer->ebi); rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi;
/* Data Plane(DL) : ENB-S1U */ /* Data Plane(DL) : ENB-S1U */
memset(&enb_s1u_teid, 0, sizeof(ogs_gtp_f_teid_t)); memset(&enb_s1u_teid, 0, sizeof(ogs_gtp_f_teid_t));
@ -511,7 +511,7 @@ ogs_pkbuf_t *mme_s11_build_update_bearer_response(
/* Bearer Context : EBI */ /* Bearer Context : EBI */
rsp->bearer_contexts.presence = 1; rsp->bearer_contexts.presence = 1;
rsp->bearer_contexts.eps_bearer_id.presence = 1; rsp->bearer_contexts.eps_bearer_id.presence = 1;
rsp->bearer_contexts.eps_bearer_id.u8 = *(bearer->ebi); rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi;
/* Bearer Context : Cause */ /* Bearer Context : Cause */
rsp->bearer_contexts.cause.presence = 1; rsp->bearer_contexts.cause.presence = 1;
@ -586,7 +586,7 @@ ogs_pkbuf_t *mme_s11_build_delete_bearer_response(
/* Bearer Context : EBI */ /* Bearer Context : EBI */
rsp->bearer_contexts.presence = 1; rsp->bearer_contexts.presence = 1;
rsp->bearer_contexts.eps_bearer_id.presence = 1; rsp->bearer_contexts.eps_bearer_id.presence = 1;
rsp->bearer_contexts.eps_bearer_id.u8 = *(bearer->ebi); rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi;
/* Bearer Context : Cause */ /* Bearer Context : Cause */
rsp->bearer_contexts.cause.presence = 1; rsp->bearer_contexts.cause.presence = 1;
@ -725,7 +725,7 @@ ogs_pkbuf_t *mme_s11_build_create_indirect_data_forwarding_tunnel_request(
MME_HAVE_ENB_UL_INDIRECT_TUNNEL(bearer)) { MME_HAVE_ENB_UL_INDIRECT_TUNNEL(bearer)) {
req->bearer_contexts[i].presence = 1; req->bearer_contexts[i].presence = 1;
req->bearer_contexts[i].eps_bearer_id.presence = 1; req->bearer_contexts[i].eps_bearer_id.presence = 1;
req->bearer_contexts[i].eps_bearer_id.u8 = *(bearer->ebi); req->bearer_contexts[i].eps_bearer_id.u8 = bearer->ebi;
i++; i++;
} }
@ -795,7 +795,7 @@ ogs_pkbuf_t *mme_s11_build_bearer_resource_command(
/* Linked Bearer Context : EBI */ /* Linked Bearer Context : EBI */
cmd->linked_eps_bearer_id.presence = 1; cmd->linked_eps_bearer_id.presence = 1;
cmd->linked_eps_bearer_id.u8 = *(bearer->ebi); cmd->linked_eps_bearer_id.u8 = bearer->ebi;
/* Procedure Transaction ID(PTI) */ /* Procedure Transaction ID(PTI) */
cmd->procedure_transaction_id.presence = 1; cmd->procedure_transaction_id.presence = 1;

View File

@ -364,7 +364,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_fsm_dispatch(&bearer->sm, e); ogs_fsm_dispatch(&bearer->sm, e);
if (OGS_FSM_CHECK(&bearer->sm, esm_state_bearer_deactivated)) { if (OGS_FSM_CHECK(&bearer->sm, esm_state_bearer_deactivated)) {
if (*(default_bearer->ebi) == *(bearer->ebi)) { if (default_bearer->ebi == bearer->ebi) {
/* if the bearer is a default bearer, /* if the bearer is a default bearer,
* remove all session context linked the default bearer */ * remove all session context linked the default bearer */
mme_sess_remove(sess); mme_sess_remove(sess);
@ -375,7 +375,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
} }
} else if (OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_did_disconnect)) { } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_did_disconnect)) {
ogs_assert(*(default_bearer->ebi) == *(bearer->ebi)); ogs_assert(default_bearer->ebi == bearer->ebi);
mme_sess_remove(sess); mme_sess_remove(sess);
} else if (OGS_FSM_CHECK(&bearer->sm, esm_state_exception)) { } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_exception)) {

View File

@ -377,11 +377,11 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request(
e_rab = &item->value.choice.E_RABToBeSetupItemCtxtSUReq; e_rab = &item->value.choice.E_RABToBeSetupItemCtxtSUReq;
e_rab->e_RAB_ID = *(bearer->ebi); e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci; e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci;
ogs_debug(" EBI[%d] QCI[%d] SGW-S1U-TEID[%d]", ogs_debug(" EBI[%d] QCI[%d] SGW-S1U-TEID[%d]",
*(bearer->ebi), bearer->qos.qci, bearer->sgw_s1u_teid); bearer->ebi, bearer->qos.qci, bearer->sgw_s1u_teid);
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level; priorityLevel = bearer->qos.arp.priority_level;
@ -887,10 +887,10 @@ ogs_pkbuf_t *s1ap_build_e_rab_setup_request(
e_rab = &item->value.choice.E_RABToBeSetupItemBearerSUReq; e_rab = &item->value.choice.E_RABToBeSetupItemBearerSUReq;
e_rab->e_RAB_ID = *(bearer->ebi); e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci; e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci;
ogs_debug(" EBI[%d] QCI[%d]", *(bearer->ebi), bearer->qos.qci); ogs_debug(" EBI[%d] QCI[%d]", bearer->ebi, bearer->qos.qci);
e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. e_rab->e_RABlevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level; priorityLevel = bearer->qos.arp.priority_level;
@ -1024,10 +1024,10 @@ ogs_pkbuf_t *s1ap_build_e_rab_modify_request(
e_rab = &item->value.choice.E_RABToBeModifiedItemBearerModReq; e_rab = &item->value.choice.E_RABToBeModifiedItemBearerModReq;
e_rab->e_RAB_ID = *(bearer->ebi); e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABLevelQoSParameters.qCI = bearer->qos.qci; e_rab->e_RABLevelQoSParameters.qCI = bearer->qos.qci;
ogs_debug(" EBI[%d] QCI[%d]", *(bearer->ebi), bearer->qos.qci); ogs_debug(" EBI[%d] QCI[%d]", bearer->ebi, bearer->qos.qci);
e_rab->e_RABLevelQoSParameters.allocationRetentionPriority. e_rab->e_RABLevelQoSParameters.allocationRetentionPriority.
priorityLevel = bearer->qos.arp.priority_level; priorityLevel = bearer->qos.arp.priority_level;
@ -1184,12 +1184,12 @@ ogs_pkbuf_t *s1ap_build_e_rab_release_command(
e_rab = &item->value.choice.E_RABItem; e_rab = &item->value.choice.E_RABItem;
e_rab->e_RAB_ID = *(bearer->ebi); e_rab->e_RAB_ID = bearer->ebi;
e_rab->cause.present = group; e_rab->cause.present = group;
e_rab->cause.choice.radioNetwork = cause; e_rab->cause.choice.radioNetwork = cause;
ogs_debug(" EBI[%d] Gruop[%d] Cause[%d]", ogs_debug(" EBI[%d] Gruop[%d] Cause[%d]",
*(bearer->ebi), group, (int)cause); bearer->ebi, group, (int)cause);
nasPdu->size = esmbuf->len; nasPdu->size = esmbuf->len;
nasPdu->buf = CALLOC(nasPdu->size, sizeof(uint8_t)); nasPdu->buf = CALLOC(nasPdu->size, sizeof(uint8_t));
@ -1636,7 +1636,7 @@ ogs_pkbuf_t *s1ap_build_handover_command(enb_ue_t *source_ue)
e_rab = &item->value.choice.E_RABDataForwardingItem; e_rab = &item->value.choice.E_RABDataForwardingItem;
ogs_assert(e_rab); ogs_assert(e_rab);
e_rab->e_RAB_ID = *(bearer->ebi); e_rab->e_RAB_ID = bearer->ebi;
} }
if (MME_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer)) { if (MME_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer)) {
@ -1930,7 +1930,7 @@ ogs_pkbuf_t *s1ap_build_handover_request(
e_rab = &item->value.choice.E_RABToBeSetupItemHOReq; e_rab = &item->value.choice.E_RABToBeSetupItemHOReq;
e_rab->e_RAB_ID = *(bearer->ebi); e_rab->e_RAB_ID = bearer->ebi;
e_rab->e_RABlevelQosParameters.qCI = bearer->qos.qci; e_rab->e_RABlevelQosParameters.qCI = bearer->qos.qci;
e_rab->e_RABlevelQosParameters.allocationRetentionPriority. e_rab->e_RABlevelQosParameters.allocationRetentionPriority.

View File

@ -520,7 +520,7 @@ void s1ap_handle_initial_context_setup_response(
ogs_assert(rv == OGS_OK); ogs_assert(rv == OGS_OK);
ogs_debug(" EBI[%d] ENB-S1U-TEID[%d]", ogs_debug(" EBI[%d] ENB-S1U-TEID[%d]",
*(bearer->ebi), bearer->enb_s1u_teid); bearer->ebi, bearer->enb_s1u_teid);
if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) { if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) {
ogs_debug(" NAS_EPS Type[%d]", mme_ue->nas_eps.type); ogs_debug(" NAS_EPS Type[%d]", mme_ue->nas_eps.type);
@ -815,14 +815,14 @@ void s1ap_handle_e_rab_setup_response(
&e_rab->transportLayerAddress, &bearer->enb_s1u_ip); &e_rab->transportLayerAddress, &bearer->enb_s1u_ip);
ogs_assert(rv == OGS_OK); ogs_assert(rv == OGS_OK);
ogs_debug(" EBI[%d]", *(bearer->ebi)); ogs_debug(" EBI[%d]", bearer->ebi);
if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) { if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) {
mme_bearer_t *linked_bearer = mme_linked_bearer(bearer); mme_bearer_t *linked_bearer = mme_linked_bearer(bearer);
ogs_assert(linked_bearer); ogs_assert(linked_bearer);
ogs_debug(" Linked-EBI[%d]", *(linked_bearer->ebi)); ogs_debug(" Linked-EBI[%d]", linked_bearer->ebi);
if (*(bearer->ebi) == *(linked_bearer->ebi)) { if (bearer->ebi == linked_bearer->ebi) {
mme_gtp_send_modify_bearer_request(bearer, 0); mme_gtp_send_modify_bearer_request(bearer, 0);
} else { } else {
mme_gtp_send_create_bearer_response(bearer); mme_gtp_send_create_bearer_response(bearer);

View File

@ -668,12 +668,7 @@ smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn)
} }
memset(sess, 0, sizeof *sess); memset(sess, 0, sizeof *sess);
ogs_pool_init(&sess->pfcp.pdr_pool, OGS_MAX_NUM_OF_PDR); ogs_pfcp_pool_init(&sess->pfcp);
ogs_pool_init(&sess->pfcp.far_pool, OGS_MAX_NUM_OF_FAR);
ogs_pool_init(&sess->pfcp.urr_pool, OGS_MAX_NUM_OF_URR);
ogs_pool_init(&sess->pfcp.qer_pool, OGS_MAX_NUM_OF_QER);
ogs_pool_init(&sess->pfcp.bar_pool, OGS_MAX_NUM_OF_BAR);
smf_qfi_pool_init(sess); smf_qfi_pool_init(sess);
sess->index = ogs_pool_index(&smf_sess_pool, sess); sess->index = ogs_pool_index(&smf_sess_pool, sess);
@ -980,7 +975,7 @@ void smf_sess_remove(smf_sess_t *sess)
smf_bearer_remove_all(sess); smf_bearer_remove_all(sess);
ogs_pfcp_pool_final(&sess->pfcp); ogs_pfcp_pool_final(&sess->pfcp);
ogs_pool_final(&sess->qfi_pool); smf_qfi_pool_final(sess);
ogs_pool_free(&smf_sess_pool, sess); ogs_pool_free(&smf_sess_pool, sess);
} }
@ -1150,10 +1145,10 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess)
ogs_pfcp_pdr_associate_qer(ul_pdr, qer); ogs_pfcp_pdr_associate_qer(ul_pdr, qer);
/* Allocate QFI */ /* Allocate QFI */
ogs_pool_alloc(&sess->qfi_pool, &qos_flow->qfi); ogs_pool_alloc(&sess->qfi_pool, &qos_flow->qfi_node);
ogs_assert(qos_flow->qfi); ogs_assert(qos_flow->qfi_node);
ul_pdr->qfi = qer->qfi = *(qos_flow->qfi); qos_flow->qfi = ul_pdr->qfi = qer->qfi = *(qos_flow->qfi_node);
qos_flow->sess = sess; qos_flow->sess = sess;
@ -1168,7 +1163,7 @@ smf_bearer_t *smf_qos_flow_find_by_qfi(smf_sess_t *sess, uint8_t qfi)
ogs_assert(sess); ogs_assert(sess);
ogs_list_for_each(&sess->bearer_list, qos_flow) { ogs_list_for_each(&sess->bearer_list, qos_flow) {
if (*(qos_flow->qfi) == qfi) if (qos_flow->qfi == qfi)
return qos_flow; return qos_flow;
} }
@ -1191,7 +1186,7 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess)
ogs_assert(bearer); ogs_assert(bearer);
memset(bearer, 0, sizeof *bearer); memset(bearer, 0, sizeof *bearer);
ogs_pool_init(&bearer->pf_pool, OGS_MAX_NUM_OF_PF); ogs_index_init(&bearer->pf_pool, OGS_MAX_NUM_OF_PF);
bearer->index = ogs_pool_index(&smf_bearer_pool, bearer); bearer->index = ogs_pool_index(&smf_bearer_pool, bearer);
ogs_assert(bearer->index > 0 && bearer->index <= ogs_assert(bearer->index > 0 && bearer->index <=
@ -1308,10 +1303,10 @@ int smf_bearer_remove(smf_bearer_t *bearer)
smf_pf_remove_all(bearer); smf_pf_remove_all(bearer);
ogs_pool_final(&bearer->pf_pool); ogs_index_final(&bearer->pf_pool);
if (bearer->qfi) if (bearer->qfi_node)
ogs_pool_free(&bearer->sess->qfi_pool, bearer->qfi); ogs_pool_free(&bearer->sess->qfi_pool, bearer->qfi_node);
ogs_pool_free(&smf_bearer_pool, bearer); ogs_pool_free(&smf_bearer_pool, bearer);
@ -1679,7 +1674,7 @@ void smf_qfi_pool_init(smf_sess_t *sess)
ogs_assert(sess); ogs_assert(sess);
ogs_pool_init(&sess->qfi_pool, OGS_MAX_QOS_FLOW_ID); ogs_index_init(&sess->qfi_pool, OGS_MAX_QOS_FLOW_ID);
for (i = 1; i <= OGS_MAX_QOS_FLOW_ID; i++) { for (i = 1; i <= OGS_MAX_QOS_FLOW_ID; i++) {
sess->qfi_pool.array[i-1] = i; sess->qfi_pool.array[i-1] = i;
@ -1688,5 +1683,5 @@ void smf_qfi_pool_init(smf_sess_t *sess)
void smf_qfi_pool_final(smf_sess_t *sess) void smf_qfi_pool_final(smf_sess_t *sess)
{ {
ogs_pool_final_skip_mem_checks(&sess->qfi_pool); ogs_index_final(&sess->qfi_pool);
} }

View File

@ -158,8 +158,9 @@ typedef struct smf_bearer_s {
ogs_pfcp_far_t *ul_far; ogs_pfcp_far_t *ul_far;
ogs_pfcp_qer_t *qer; ogs_pfcp_qer_t *qer;
uint8_t *qfi; /* 5GC */ uint8_t *qfi_node; /* Pool-Node for 5GC-QFI */
uint8_t ebi; /* EPC */ uint8_t qfi; /* 5G Core QFI */
uint8_t ebi; /* EPC EBI */
uint32_t pgw_s5u_teid; /* PGW-S5U TEID */ uint32_t pgw_s5u_teid; /* PGW-S5U TEID */
ogs_sockaddr_t *pgw_s5u_addr; /* PGW-S5U IPv4 */ ogs_sockaddr_t *pgw_s5u_addr; /* PGW-S5U IPv4 */

View File

@ -127,7 +127,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess)
*/ */
qos_rule[0].precedence = 255; /* lowest precedence */ qos_rule[0].precedence = 255; /* lowest precedence */
qos_rule[0].flow.segregation = 0; qos_rule[0].flow.segregation = 0;
qos_rule[0].flow.identifier = *(qos_flow->qfi); qos_rule[0].flow.identifier = qos_flow->qfi;
ogs_nas_build_qos_rules(authorized_qos_rules, qos_rule, 1); ogs_nas_build_qos_rules(authorized_qos_rules, qos_rule, 1);
@ -180,7 +180,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess)
/* QoS flow descriptions */ /* QoS flow descriptions */
memset(&qos_flow_description, 0, sizeof(qos_flow_description)); memset(&qos_flow_description, 0, sizeof(qos_flow_description));
qos_flow_description.identifier = *(qos_flow->qfi); qos_flow_description.identifier = qos_flow->qfi;
qos_flow_description.code = OGS_NAS_CREATE_NEW_QOS_FLOW_DESCRIPTION; qos_flow_description.code = OGS_NAS_CREATE_NEW_QOS_FLOW_DESCRIPTION;
qos_flow_description.E = 1; qos_flow_description.E = 1;
qos_flow_description.num_of_parameter = 1; qos_flow_description.num_of_parameter = 1;

View File

@ -132,7 +132,7 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_setup_request_transfer(
qosCharacteristics->choice.nonDynamic5QI = nonDynamic5QI; qosCharacteristics->choice.nonDynamic5QI = nonDynamic5QI;
qosCharacteristics->present = NGAP_QosCharacteristics_PR_nonDynamic5QI; qosCharacteristics->present = NGAP_QosCharacteristics_PR_nonDynamic5QI;
*qosFlowIdentifier = *(qos_flow->qfi); *qosFlowIdentifier = qos_flow->qfi;
nonDynamic5QI->fiveQI = sess->pdn.qos.qci; nonDynamic5QI->fiveQI = sess->pdn.qos.qci;

View File

@ -49,23 +49,23 @@ int app_initialize(const char *const argv[])
if (ogs_app()->parameter.no_nrf == 0) if (ogs_app()->parameter.no_nrf == 0)
nrf_thread = test_child_create("nrf", argv_out); nrf_thread = test_child_create("nrf", argv_out);
if (ogs_app()->parameter.no_amf == 0)
amf_thread = test_child_create("amf", argv_out);
if (ogs_app()->parameter.no_smf == 0)
smf_thread = test_child_create("smf", argv_out);
if (ogs_app()->parameter.no_upf == 0)
upf_thread = test_child_create("upf", argv_out);
if (ogs_app()->parameter.no_ausf == 0)
ausf_thread = test_child_create("ausf", argv_out);
if (ogs_app()->parameter.no_udm == 0)
udm_thread = test_child_create("udm", argv_out);
if (ogs_app()->parameter.no_udr == 0) if (ogs_app()->parameter.no_udr == 0)
udr_thread = test_child_create("udr", argv_out); udr_thread = test_child_create("udr", argv_out);
if (ogs_app()->parameter.no_udm == 0)
udm_thread = test_child_create("udm", argv_out);
if (ogs_app()->parameter.no_ausf == 0)
ausf_thread = test_child_create("ausf", argv_out);
if (ogs_app()->parameter.no_upf == 0)
upf_thread = test_child_create("upf", argv_out);
if (ogs_app()->parameter.no_smf == 0)
smf_thread = test_child_create("smf", argv_out);
if (ogs_app()->parameter.no_amf == 0)
amf_thread = test_child_create("amf", argv_out);
/* /*
* Wait for all sockets listening * Wait for all sockets listening
* *
* If freeDiameter is not used, we can use a delay of less than 1 second. * If freeDiameter is not used, it uses a delay of less than 1 second.
*/ */
ogs_msleep(500); ogs_msleep(500);
@ -74,11 +74,13 @@ int app_initialize(const char *const argv[])
void app_terminate(void) void app_terminate(void)
{ {
if (smf_thread) ogs_thread_destroy(smf_thread); ogs_msleep(300);
if (udm_thread) ogs_thread_destroy(udm_thread);
if (ausf_thread) ogs_thread_destroy(ausf_thread);
if (amf_thread) ogs_thread_destroy(amf_thread); if (amf_thread) ogs_thread_destroy(amf_thread);
if (smf_thread) ogs_thread_destroy(smf_thread);
if (upf_thread) ogs_thread_destroy(upf_thread); if (upf_thread) ogs_thread_destroy(upf_thread);
if (ausf_thread) ogs_thread_destroy(ausf_thread);
if (udm_thread) ogs_thread_destroy(udm_thread);
if (udr_thread) ogs_thread_destroy(udr_thread); if (udr_thread) ogs_thread_destroy(udr_thread);
if (nrf_thread) ogs_thread_destroy(nrf_thread); if (nrf_thread) ogs_thread_destroy(nrf_thread);
} }

View File

@ -54,28 +54,31 @@ int app_initialize(const char *const argv[])
if (ogs_app()->parameter.no_nrf == 0) if (ogs_app()->parameter.no_nrf == 0)
nrf_thread = test_child_create("nrf", argv_out); nrf_thread = test_child_create("nrf", argv_out);
if (ogs_app()->parameter.no_mme == 0)
mme_thread = test_child_create("mme", argv_out);
if (ogs_app()->parameter.no_sgwc == 0)
sgwc_thread = test_child_create("sgwc", argv_out);
if (ogs_app()->parameter.no_smf == 0)
smf_thread = test_child_create("smf", argv_out);
if (ogs_app()->parameter.no_amf == 0)
amf_thread = test_child_create("amf", argv_out);
if (ogs_app()->parameter.no_sgwu == 0)
sgwu_thread = test_child_create("sgwu", argv_out);
if (ogs_app()->parameter.no_upf == 0)
upf_thread = test_child_create("upf", argv_out);
if (ogs_app()->parameter.no_hss == 0) if (ogs_app()->parameter.no_hss == 0)
hss_thread = test_child_create("hss", argv_out); hss_thread = test_child_create("hss", argv_out);
if (ogs_app()->parameter.no_pcrf == 0) if (ogs_app()->parameter.no_pcrf == 0)
pcrf_thread = test_child_create("pcrf", argv_out); pcrf_thread = test_child_create("pcrf", argv_out);
if (ogs_app()->parameter.no_ausf == 0)
ausf_thread = test_child_create("ausf", argv_out);
if (ogs_app()->parameter.no_udm == 0)
udm_thread = test_child_create("udm", argv_out);
if (ogs_app()->parameter.no_udr == 0) if (ogs_app()->parameter.no_udr == 0)
udr_thread = test_child_create("udr", argv_out); udr_thread = test_child_create("udr", argv_out);
if (ogs_app()->parameter.no_udm == 0)
udm_thread = test_child_create("udm", argv_out);
if (ogs_app()->parameter.no_ausf == 0)
ausf_thread = test_child_create("ausf", argv_out);
if (ogs_app()->parameter.no_upf == 0)
upf_thread = test_child_create("upf", argv_out);
if (ogs_app()->parameter.no_sgwu == 0)
sgwu_thread = test_child_create("sgwu", argv_out);
if (ogs_app()->parameter.no_smf == 0)
smf_thread = test_child_create("smf", argv_out);
if (ogs_app()->parameter.no_sgwc == 0)
sgwc_thread = test_child_create("sgwc", argv_out);
if (ogs_app()->parameter.no_mme == 0)
mme_thread = test_child_create("mme", argv_out);
if (ogs_app()->parameter.no_amf == 0)
amf_thread = test_child_create("amf", argv_out);
/* /*
* Wait for all sockets listening * Wait for all sockets listening
@ -89,20 +92,23 @@ int app_initialize(const char *const argv[])
void app_terminate(void) void app_terminate(void)
{ {
if (udr_thread) ogs_thread_destroy(udr_thread); ogs_msleep(300);
if (udm_thread) ogs_thread_destroy(udm_thread);
if (ausf_thread) ogs_thread_destroy(ausf_thread);
if (amf_thread) ogs_thread_destroy(amf_thread); if (amf_thread) ogs_thread_destroy(amf_thread);
if (mme_thread) ogs_thread_destroy(mme_thread); if (mme_thread) ogs_thread_destroy(mme_thread);
if (sgwc_thread) ogs_thread_destroy(sgwc_thread);
if (smf_thread) ogs_thread_destroy(smf_thread); if (smf_thread) ogs_thread_destroy(smf_thread);
if (sgwc_thread) ogs_thread_destroy(sgwc_thread);
if (sgwu_thread) ogs_thread_destroy(sgwu_thread); if (sgwu_thread) ogs_thread_destroy(sgwu_thread);
if (upf_thread) ogs_thread_destroy(upf_thread); if (upf_thread) ogs_thread_destroy(upf_thread);
if (ausf_thread) ogs_thread_destroy(ausf_thread);
if (udm_thread) ogs_thread_destroy(udm_thread);
if (udr_thread) ogs_thread_destroy(udr_thread);
if (hss_thread) ogs_thread_destroy(hss_thread); if (hss_thread) ogs_thread_destroy(hss_thread);
if (pcrf_thread) ogs_thread_destroy(pcrf_thread); if (pcrf_thread) ogs_thread_destroy(pcrf_thread);
if (nrf_thread) ogs_thread_destroy(nrf_thread); if (nrf_thread) ogs_thread_destroy(nrf_thread);
} }

View File

@ -50,21 +50,23 @@ int app_initialize(const char *const argv[])
if (ogs_app()->parameter.no_nrf == 0) if (ogs_app()->parameter.no_nrf == 0)
nrf_thread = test_child_create("nrf", argv_out); nrf_thread = test_child_create("nrf", argv_out);
if (ogs_app()->parameter.no_mme == 0)
mme_thread = test_child_create("mme", argv_out);
if (ogs_app()->parameter.no_sgwc == 0)
sgwc_thread = test_child_create("sgwc", argv_out);
if (ogs_app()->parameter.no_smf == 0)
smf_thread = test_child_create("smf", argv_out);
if (ogs_app()->parameter.no_sgwu == 0)
sgwu_thread = test_child_create("sgwu", argv_out);
if (ogs_app()->parameter.no_upf == 0)
upf_thread = test_child_create("upf", argv_out);
if (ogs_app()->parameter.no_hss == 0) if (ogs_app()->parameter.no_hss == 0)
hss_thread = test_child_create("hss", argv_out); hss_thread = test_child_create("hss", argv_out);
if (ogs_app()->parameter.no_pcrf == 0) if (ogs_app()->parameter.no_pcrf == 0)
pcrf_thread = test_child_create("pcrf", argv_out); pcrf_thread = test_child_create("pcrf", argv_out);
if (ogs_app()->parameter.no_upf == 0)
upf_thread = test_child_create("upf", argv_out);
if (ogs_app()->parameter.no_sgwu == 0)
sgwu_thread = test_child_create("sgwu", argv_out);
if (ogs_app()->parameter.no_smf == 0)
smf_thread = test_child_create("smf", argv_out);
if (ogs_app()->parameter.no_sgwc == 0)
sgwc_thread = test_child_create("sgwc", argv_out);
if (ogs_app()->parameter.no_mme == 0)
mme_thread = test_child_create("mme", argv_out);
/* /*
* Wait for all sockets listening * Wait for all sockets listening
* *
@ -77,6 +79,8 @@ int app_initialize(const char *const argv[])
void app_terminate(void) void app_terminate(void)
{ {
ogs_msleep(300);
if (mme_thread) ogs_thread_destroy(mme_thread); if (mme_thread) ogs_thread_destroy(mme_thread);
if (sgwc_thread) ogs_thread_destroy(sgwc_thread); if (sgwc_thread) ogs_thread_destroy(sgwc_thread);
if (smf_thread) ogs_thread_destroy(smf_thread); if (smf_thread) ogs_thread_destroy(smf_thread);