diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index 88f2da2d7..cdc12852e 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -55,13 +55,17 @@ typedef unsigned int ogs_index_t; } \ } 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 { \ if (((pool)->size != (pool)->avail)) \ ogs_error("%d in '%s[%d]' were not released.", \ (pool)->size - (pool)->avail, (pool)->name, (pool)->size); \ - free((pool)->free); \ - free((pool)->array); \ - free((pool)->index); \ + ogs_pool_final_skip_mem_checks(pool); \ } while (0) #define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) diff --git a/src/amf/context.c b/src/amf/context.c index b09c59277..3cda22a86 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -59,7 +59,6 @@ void amf_context_init(void) self.gnb_addr_hash = ogs_hash_make(); self.gnb_id_hash = ogs_hash_make(); - self.amf_ue_ngap_id_hash = ogs_hash_make(); self.guti_ue_hash = ogs_hash_make(); self.suci_hash = ogs_hash_make(); self.supi_hash = ogs_hash_make(); @@ -79,8 +78,6 @@ void amf_context_final(void) ogs_assert(self.gnb_id_hash); ogs_hash_destroy(self.gnb_id_hash); - ogs_assert(self.amf_ue_ngap_id_hash); - ogs_hash_destroy(self.amf_ue_ngap_id_hash); ogs_assert(self.guti_ue_hash); ogs_hash_destroy(self.guti_ue_hash); ogs_assert(self.suci_hash); @@ -945,15 +942,17 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id) { ran_ue_t *ran_ue = NULL; - ogs_assert(self.amf_ue_ngap_id_hash); ogs_assert(gnb); ogs_pool_alloc(&ran_ue_pool, &ran_ue); ogs_assert(ran_ue); memset(ran_ue, 0, sizeof *ran_ue); + ran_ue->index = ogs_pool_index(&ran_ue_pool, ran_ue); + ogs_assert(ran_ue->index > 0 && ran_ue->index <= ogs_app()->max.ue); + ran_ue->ran_ue_ngap_id = ran_ue_ngap_id; - ran_ue->amf_ue_ngap_id = OGS_NEXT_ID(self.amf_ue_ngap_id, 1, 0xffffffff); + ran_ue->amf_ue_ngap_id = ran_ue->index; /* * SCTP output stream identification @@ -966,22 +965,13 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id) ran_ue->gnb = gnb; - ogs_hash_set(self.amf_ue_ngap_id_hash, &ran_ue->amf_ue_ngap_id, - sizeof(ran_ue->amf_ue_ngap_id), ran_ue); ogs_list_add(&gnb->ran_ue_list, ran_ue); return ran_ue; } -unsigned int ran_ue_count() -{ - ogs_assert(self.amf_ue_ngap_id_hash); - return ogs_hash_count(self.amf_ue_ngap_id_hash); -} - void ran_ue_remove(ran_ue_t *ran_ue) { - ogs_assert(self.amf_ue_ngap_id_hash); ogs_assert(ran_ue); ogs_assert(ran_ue->gnb); @@ -989,8 +979,6 @@ void ran_ue_remove(ran_ue_t *ran_ue) ran_ue_deassociate(ran_ue); ogs_list_remove(&ran_ue->gnb->ran_ue_list, ran_ue); - ogs_hash_set(self.amf_ue_ngap_id_hash, &ran_ue->amf_ue_ngap_id, - sizeof(ran_ue->amf_ue_ngap_id), NULL); ogs_pool_free(&ran_ue_pool, ran_ue); } @@ -1041,11 +1029,15 @@ ran_ue_t *ran_ue_find_by_ran_ue_ngap_id( return ran_ue; } +ran_ue_t *ran_ue_find(uint32_t index) +{ + ogs_assert(index); + return ogs_pool_find(&ran_ue_pool, index); +} + ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id) { - ogs_assert(self.amf_ue_ngap_id_hash); - return ogs_hash_get(self.amf_ue_ngap_id_hash, - &amf_ue_ngap_id, sizeof(amf_ue_ngap_id)); + return ran_ue_find(amf_ue_ngap_id); } ran_ue_t *ran_ue_first_in_gnb(amf_gnb_t *gnb) diff --git a/src/amf/context.h b/src/amf/context.h index ef5b74c13..f3791d986 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -101,7 +101,6 @@ typedef struct amf_context_s { ogs_hash_t *gnb_addr_hash; /* hash table for GNB Address */ ogs_hash_t *gnb_id_hash; /* hash table for GNB-ID */ - ogs_hash_t *amf_ue_ngap_id_hash; /* hash table for AMF-UE-NGAP-ID */ ogs_hash_t *guti_ue_hash; /* hash table (GUTI : AMF_UE) */ ogs_hash_t *suci_hash; /* hash table (SUCI) */ ogs_hash_t *supi_hash; /* hash table (SUPI) */ @@ -151,6 +150,7 @@ typedef struct amf_gnb_s { struct ran_ue_s { ogs_lnode_t lnode; + uint32_t index; /* UE identity */ #define INVALID_UE_NGAP_ID 0xffffffff /* Initial value of ran_ue_ngap_id */ @@ -471,12 +471,12 @@ int amf_gnb_set_gnb_id(amf_gnb_t *gnb, uint32_t gnb_id); int amf_gnb_sock_type(ogs_sock_t *sock); ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id); -unsigned int ran_ue_count(void); void ran_ue_remove(ran_ue_t *ran_ue); void ran_ue_remove_in_gnb(amf_gnb_t *gnb); void ran_ue_switch_to_gnb(ran_ue_t *ran_ue, amf_gnb_t *new_gnb); ran_ue_t *ran_ue_find_by_ran_ue_ngap_id( amf_gnb_t *gnb, uint32_t ran_ue_ngap_id); +ran_ue_t *ran_ue_find(uint32_t index); ran_ue_t *ran_ue_find_by_amf_ue_ngap_id(uint64_t amf_ue_ngap_id); ran_ue_t *ran_ue_first_in_gnb(amf_gnb_t *gnb); ran_ue_t *ran_ue_next_in_gnb(ran_ue_t *ran_ue); diff --git a/src/mme/emm-build.c b/src/mme/emm-build.c index 0dde516db..b05b6e0ce 100644 --- a/src/mme/emm-build.c +++ b/src/mme/emm-build.c @@ -404,7 +404,7 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue) while (sess) { mme_bearer_t *bearer = mme_bearer_first(sess); while (bearer) { - switch (bearer->ebi) { + switch (*(bearer->ebi)) { case 5: tau_accept->eps_bearer_context_status.ebi5 = 1; break; case 6: tau_accept->eps_bearer_context_status.ebi6 = 1; break; case 7: tau_accept->eps_bearer_context_status.ebi7 = 1; break; diff --git a/src/mme/esm-build.c b/src/mme/esm-build.c index 03c900e7d..f44e5aa15 100644 --- a/src/mme/esm-build.c +++ b/src/mme/esm-build.c @@ -74,7 +74,7 @@ ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer) ogs_debug("[ESM] ESM information request"); 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)); 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(" 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)); 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; 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.procedure_transaction_identity = sess->pti; 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(" 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)); message.h.security_header_type = OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; 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.procedure_transaction_identity = 0; message.esm.h.message_type = 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, bearer->qos.mbr.downlink, bearer->qos.mbr.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(" 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)); message.h.security_header_type = OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; 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.procedure_transaction_identity = sess->pti; 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(" 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); memset(&message, 0, sizeof(message)); message.h.security_header_type = OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; 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.procedure_transaction_identity = sess->pti; message.esm.h.message_type = diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index d2fc0d878..e5e7746f9 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -81,7 +81,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("[ESM] PDN Connectivity request"); 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( bearer, &message->esm.pdn_connectivity_request); 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: ogs_debug("[ESM] ESM information response"); 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); 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 " "context accept"); 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 * E-RAB Setup Response is received */ 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 " "context accept"); 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 * E-RAB Setup Response is received */ 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: ogs_debug("[ESM] PDN Connectivity request"); 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( bearer, &message->esm.pdn_connectivity_request); 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: ogs_debug("[ESM] PDN disconnect request"); 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)) { mme_gtp_send_delete_session_request(sess); } 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: ogs_debug("[ESM] Modify EPS bearer context accept"); 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); break; @@ -229,20 +229,20 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_debug("[ESM] Deactivate EPS bearer " "context accept"); 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); OGS_FSM_TRAN(s, esm_state_bearer_deactivated); break; case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST: ogs_debug("[ESM] Bearer resource allocation request"); 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); break; case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST: ogs_debug("[ESM] Bearer resource modification request"); 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); break; 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 " "context accept"); 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); break; default: diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index be3f86887..bf6445a26 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -45,6 +45,7 @@ static OGS_POOL(mme_enb_pool, mme_enb_t); static OGS_POOL(mme_ue_pool, mme_ue_t); static OGS_POOL(enb_ue_pool, enb_ue_t); static OGS_POOL(mme_sess_pool, mme_sess_t); +static OGS_POOL(mme_bearer_pool, mme_bearer_t); static int context_initialized = 0; @@ -129,11 +130,11 @@ void mme_context_init() ogs_pool_init(&mme_ue_pool, ogs_app()->max.ue); ogs_pool_init(&enb_ue_pool, ogs_app()->max.ue); ogs_pool_init(&mme_sess_pool, ogs_app()->pool.sess); + ogs_pool_init(&mme_bearer_pool, ogs_app()->pool.bearer); ogs_pool_init(&self.m_tmsi, ogs_app()->max.ue); self.enb_addr_hash = ogs_hash_make(); self.enb_id_hash = ogs_hash_make(); - self.mme_ue_s1ap_id_hash = ogs_hash_make(); self.imsi_ue_hash = ogs_hash_make(); self.guti_ue_hash = ogs_hash_make(); @@ -159,14 +160,13 @@ void mme_context_final() ogs_assert(self.enb_id_hash); ogs_hash_destroy(self.enb_id_hash); - ogs_assert(self.mme_ue_s1ap_id_hash); - ogs_hash_destroy(self.mme_ue_s1ap_id_hash); ogs_assert(self.imsi_ue_hash); ogs_hash_destroy(self.imsi_ue_hash); ogs_assert(self.guti_ue_hash); ogs_hash_destroy(self.guti_ue_hash); ogs_pool_final(&self.m_tmsi); + ogs_pool_final(&mme_bearer_pool); ogs_pool_final(&mme_sess_pool); ogs_pool_final(&mme_ue_pool); ogs_pool_final(&enb_ue_pool); @@ -2029,15 +2029,17 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id) { enb_ue_t *enb_ue = NULL; - ogs_assert(self.mme_ue_s1ap_id_hash); ogs_assert(enb); ogs_pool_alloc(&enb_ue_pool, &enb_ue); ogs_assert(enb_ue); memset(enb_ue, 0, sizeof *enb_ue); + enb_ue->index = ogs_pool_index(&enb_ue_pool, enb_ue); + ogs_assert(enb_ue->index > 0 && enb_ue->index <= ogs_app()->max.ue); + enb_ue->enb_ue_s1ap_id = enb_ue_s1ap_id; - enb_ue->mme_ue_s1ap_id = OGS_NEXT_ID(self.mme_ue_s1ap_id, 1, 0xffffffff); + enb_ue->mme_ue_s1ap_id = enb_ue->index; /* * SCTP output stream identification @@ -2050,8 +2052,6 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id) enb_ue->enb = enb; - ogs_hash_set(self.mme_ue_s1ap_id_hash, &enb_ue->mme_ue_s1ap_id, - sizeof(enb_ue->mme_ue_s1ap_id), enb_ue); ogs_list_add(&enb->enb_ue_list, enb_ue); stats_add_ue(); @@ -2059,15 +2059,8 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id) return enb_ue; } -unsigned int enb_ue_count() -{ - ogs_assert(self.mme_ue_s1ap_id_hash); - return ogs_hash_count(self.mme_ue_s1ap_id_hash); -} - void enb_ue_remove(enb_ue_t *enb_ue) { - ogs_assert(self.mme_ue_s1ap_id_hash); ogs_assert(enb_ue); ogs_assert(enb_ue->enb); @@ -2075,8 +2068,6 @@ void enb_ue_remove(enb_ue_t *enb_ue) enb_ue_deassociate(enb_ue); ogs_list_remove(&enb_ue->enb->enb_ue_list, enb_ue); - ogs_hash_set(self.mme_ue_s1ap_id_hash, &enb_ue->mme_ue_s1ap_id, - sizeof(enb_ue->mme_ue_s1ap_id), NULL); stats_remove_ue(); @@ -2129,11 +2120,15 @@ enb_ue_t *enb_ue_find_by_enb_ue_s1ap_id( return enb_ue; } +enb_ue_t *enb_ue_find(uint32_t index) +{ + ogs_assert(index); + return ogs_pool_find(&enb_ue_pool, index); +} + enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id) { - ogs_assert(self.mme_ue_s1ap_id_hash); - return ogs_hash_get(self.mme_ue_s1ap_id_hash, - &mme_ue_s1ap_id, sizeof(mme_ue_s1ap_id)); + return enb_ue_find(mme_ue_s1ap_id); } enb_ue_t *enb_ue_first_in_enb(mme_enb_t *enb) @@ -2235,8 +2230,8 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) ogs_assert(mme_ue); memset(mme_ue, 0, sizeof *mme_ue); - ogs_pool_init(&mme_ue->bearer_pool, - MAX_EPS_BEARER_ID - MIN_EPS_BEARER_ID + 1); + mme_ebi_pool_init(mme_ue); + ogs_list_init(&mme_ue->sess_list); mme_ue->mme_s11_teid = ogs_pool_index(&mme_ue_pool, mme_ue); @@ -2338,7 +2333,7 @@ void mme_ue_remove(mme_ue_t *mme_ue) mme_sess_remove_all(mme_ue); mme_pdn_remove_all(mme_ue); - ogs_pool_final(&mme_ue->bearer_pool); + ogs_pool_final(&mme_ue->ebi_pool); ogs_pool_free(&mme_ue_pool, mme_ue); } @@ -2783,14 +2778,15 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess) mme_ue = sess->mme_ue; ogs_assert(mme_ue); - ogs_pool_alloc(&mme_ue->bearer_pool, &bearer); + ogs_pool_alloc(&mme_bearer_pool, &bearer); ogs_assert(bearer); memset(bearer, 0, sizeof *bearer); - bearer->index = ogs_pool_index(&mme_ue->bearer_pool, bearer); - bearer->ebi = bearer->index + MIN_EPS_BEARER_ID - 1; - ogs_assert(bearer->ebi >= MIN_EPS_BEARER_ID && - bearer->ebi <= MAX_EPS_BEARER_ID); + ogs_pool_alloc(&mme_ue->ebi_pool, &bearer->ebi); + ogs_assert(bearer->ebi); + + ogs_assert(*(bearer->ebi) >= MIN_EPS_BEARER_ID && + *(bearer->ebi) <= MAX_EPS_BEARER_ID); bearer->mme_ue = mme_ue; bearer->sess = sess; @@ -2828,15 +2824,11 @@ void mme_bearer_remove(mme_bearer_t *bearer) ogs_list_remove(&bearer->sess->bearer_list, bearer); OGS_TLV_CLEAR_DATA(&bearer->tft); - - ogs_pool_free(&bearer->mme_ue->bearer_pool, bearer); - if (ogs_pool_size(&bearer->mme_ue->bearer_pool) == - ogs_pool_avail(&bearer->mme_ue->bearer_pool)) { - ogs_pool_final(&bearer->mme_ue->bearer_pool); - ogs_pool_init(&bearer->mme_ue->bearer_pool, - MAX_EPS_BEARER_ID - MIN_EPS_BEARER_ID + 1); - } + ogs_assert(bearer->ebi); + ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi); + + ogs_pool_free(&mme_bearer_pool, bearer); } void mme_bearer_remove_all(mme_sess_t *sess) @@ -2863,7 +2855,7 @@ mme_bearer_t *mme_bearer_find_by_sess_ebi(mme_sess_t *sess, uint8_t ebi) bearer = mme_bearer_first(sess); while (bearer) { - if (ebi == bearer->ebi) + if (ebi == *(bearer->ebi)) return bearer; bearer = mme_bearer_next(bearer); @@ -3240,6 +3232,25 @@ int mme_m_tmsi_free(mme_m_tmsi_t *m_tmsi) return OGS_OK; } +void mme_ebi_pool_init(mme_ue_t *mme_ue) +{ + int i, index; + + ogs_assert(mme_ue); + + ogs_pool_init(&mme_ue->ebi_pool, MAX_EPS_BEARER_ID - MIN_EPS_BEARER_ID + 1); + + for (i = MIN_EPS_BEARER_ID, index = 0; + i <= MAX_EPS_BEARER_ID; i++, index++) { + mme_ue->ebi_pool.array[index] = i; + } +} + +void mme_ebi_pool_final(mme_ue_t *mme_ue) +{ + ogs_pool_final_skip_mem_checks(&mme_ue->ebi_pool); +} + uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue) { int i; diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index c2a323ad0..a0a2a28c8 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -148,7 +148,6 @@ typedef struct mme_context_s { ogs_hash_t *enb_addr_hash; /* hash table for ENB Address */ ogs_hash_t *enb_id_hash; /* hash table for ENB-ID */ - ogs_hash_t *mme_ue_s1ap_id_hash; /* hash table for MME-UE-S1AP-ID */ ogs_hash_t *imsi_ue_hash; /* hash table (IMSI : MME_UE) */ ogs_hash_t *guti_ue_hash; /* hash table (GUTI : MME_UE) */ @@ -232,6 +231,7 @@ typedef struct mme_enb_s { struct enb_ue_s { ogs_lnode_t lnode; + uint32_t index; /* UE identity */ #define INVALID_UE_S1AP_ID 0xffffffff /* Initial value of enb_ue_s1ap_id */ @@ -268,89 +268,6 @@ struct enb_ue_s { mme_ue_t *mme_ue; }; -#define BEARER_CONTEXT_IS_ACTIVE(__mME) \ - (mme_bearer_is_inactive(__mME) == 0) -#define CLEAR_BEARER_CONTEXT(__mME) \ - mme_bearer_set_inactive(__mME) - -#define MME_HAVE_ENB_S1U_PATH(__bEARER) \ - ((__bEARER) && ((__bEARER)->enb_s1u_teid)) -#define CLEAR_ENB_S1U_PATH(__bEARER) \ - do { \ - ogs_assert((__bEARER)); \ - (__bEARER)->enb_s1u_teid = 0; \ - } while(0) - -#define MME_HAVE_ENB_DL_INDIRECT_TUNNEL(__bEARER) \ - ((__bEARER) && ((__bEARER)->enb_dl_teid)) -#define MME_HAVE_ENB_UL_INDIRECT_TUNNEL(__bEARER) \ - ((__bEARER) && ((__bEARER)->enb_ul_teid)) -#define MME_HAVE_SGW_DL_INDIRECT_TUNNEL(__bEARER) \ - ((__bEARER) && ((__bEARER)->sgw_dl_teid)) -#define MME_HAVE_SGW_UL_INDIRECT_TUNNEL(__bEARER) \ - ((__bEARER) && ((__bEARER)->sgw_ul_teid)) -#define CLEAR_INDIRECT_TUNNEL(__bEARER) \ - do { \ - ogs_assert((__bEARER)); \ - (__bEARER)->enb_dl_teid = 0; \ - (__bEARER)->enb_ul_teid = 0; \ - (__bEARER)->sgw_dl_teid = 0; \ - (__bEARER)->sgw_ul_teid = 0; \ - } while(0) -typedef struct mme_bearer_s { - ogs_lnode_t lnode; - uint32_t index; - ogs_fsm_t sm; /* State Machine */ - - uint8_t ebi; /* EPS Bearer ID */ - - uint32_t enb_s1u_teid; - ogs_ip_t enb_s1u_ip; - uint32_t sgw_s1u_teid; - ogs_ip_t sgw_s1u_ip; - - uint32_t target_s1u_teid; /* Target S1U TEID from HO-Req-Ack */ - ogs_ip_t target_s1u_ip; /* Target S1U ADDR from HO-Req-Ack */ - - uint32_t enb_dl_teid; - ogs_ip_t enb_dl_ip; - uint32_t enb_ul_teid; - ogs_ip_t enb_ul_ip; - - uint32_t sgw_dl_teid; - ogs_ip_t sgw_dl_ip; - uint32_t sgw_ul_teid; - ogs_ip_t sgw_ul_ip; - - ogs_qos_t qos; - ogs_tlv_octet_t tft; /* Saved TFT */ - -#define CLEAR_BEARER_ALL_TIMERS(__bEARER) \ - do { \ - CLEAR_BEARER_TIMER((__bEARER)->t3489); \ - } while(0); -#define CLEAR_BEARER_TIMER(__bEARER_TIMER) \ - do { \ - ogs_timer_stop((__bEARER_TIMER).timer); \ - if ((__bEARER_TIMER).pkbuf) \ - { \ - ogs_pkbuf_free((__bEARER_TIMER).pkbuf); \ - (__bEARER_TIMER).pkbuf = NULL; \ - } \ - (__bEARER_TIMER).retry_count = 0; \ - } while(0); - struct { - ogs_pkbuf_t *pkbuf; - ogs_timer_t *timer; - uint32_t retry_count;; - } t3489; - - /* Related Context */ - mme_ue_t *mme_ue; - mme_sess_t *sess; - ogs_gtp_xact_t *xact; -} mme_bearer_t; - struct mme_ue_s { ogs_lnode_t lnode; ogs_fsm_t sm; /* A state machine */ @@ -476,7 +393,14 @@ struct mme_ue_s { #define MIN_EPS_BEARER_ID 5 #define MAX_EPS_BEARER_ID 15 - OGS_POOL(bearer_pool, mme_bearer_t); + +#define CLEAR_EPS_BEARER_ID(__mME) \ + do { \ + ogs_assert((__mME)); \ + mme_ebi_pool_final(__mME); \ + mme_ebi_pool_init(__mME); \ + } while(0) + OGS_POOL(ebi_pool, uint8_t); #define ECM_CONNECTED(__mME) \ ((__mME) && ((__mME)->enb_ue != NULL)) @@ -599,6 +523,7 @@ struct mme_ue_s { ogs_assert((__mME)); \ (__mME)->sgw_s11_teid = 0; \ (__mME)->session_context_will_deleted = 0; \ + CLEAR_EPS_BEARER_ID((__mME)); \ } while(0) typedef struct mme_sess_s { ogs_lnode_t lnode; @@ -626,6 +551,89 @@ typedef struct mme_sess_s { ogs_tlv_octet_t pgw_pco; } mme_sess_t; +#define BEARER_CONTEXT_IS_ACTIVE(__mME) \ + (mme_bearer_is_inactive(__mME) == 0) +#define CLEAR_BEARER_CONTEXT(__mME) \ + mme_bearer_set_inactive(__mME) + +#define MME_HAVE_ENB_S1U_PATH(__bEARER) \ + ((__bEARER) && ((__bEARER)->enb_s1u_teid)) +#define CLEAR_ENB_S1U_PATH(__bEARER) \ + do { \ + ogs_assert((__bEARER)); \ + (__bEARER)->enb_s1u_teid = 0; \ + } while(0) + +#define MME_HAVE_ENB_DL_INDIRECT_TUNNEL(__bEARER) \ + ((__bEARER) && ((__bEARER)->enb_dl_teid)) +#define MME_HAVE_ENB_UL_INDIRECT_TUNNEL(__bEARER) \ + ((__bEARER) && ((__bEARER)->enb_ul_teid)) +#define MME_HAVE_SGW_DL_INDIRECT_TUNNEL(__bEARER) \ + ((__bEARER) && ((__bEARER)->sgw_dl_teid)) +#define MME_HAVE_SGW_UL_INDIRECT_TUNNEL(__bEARER) \ + ((__bEARER) && ((__bEARER)->sgw_ul_teid)) +#define CLEAR_INDIRECT_TUNNEL(__bEARER) \ + do { \ + ogs_assert((__bEARER)); \ + (__bEARER)->enb_dl_teid = 0; \ + (__bEARER)->enb_ul_teid = 0; \ + (__bEARER)->sgw_dl_teid = 0; \ + (__bEARER)->sgw_ul_teid = 0; \ + } while(0) +typedef struct mme_bearer_s { + ogs_lnode_t lnode; + uint32_t index; + ogs_fsm_t sm; /* State Machine */ + + uint8_t *ebi; /* EPS Bearer ID */ + + uint32_t enb_s1u_teid; + ogs_ip_t enb_s1u_ip; + uint32_t sgw_s1u_teid; + ogs_ip_t sgw_s1u_ip; + + uint32_t target_s1u_teid; /* Target S1U TEID from HO-Req-Ack */ + ogs_ip_t target_s1u_ip; /* Target S1U ADDR from HO-Req-Ack */ + + uint32_t enb_dl_teid; + ogs_ip_t enb_dl_ip; + uint32_t enb_ul_teid; + ogs_ip_t enb_ul_ip; + + uint32_t sgw_dl_teid; + ogs_ip_t sgw_dl_ip; + uint32_t sgw_ul_teid; + ogs_ip_t sgw_ul_ip; + + ogs_qos_t qos; + ogs_tlv_octet_t tft; /* Saved TFT */ + +#define CLEAR_BEARER_ALL_TIMERS(__bEARER) \ + do { \ + CLEAR_BEARER_TIMER((__bEARER)->t3489); \ + } while(0); +#define CLEAR_BEARER_TIMER(__bEARER_TIMER) \ + do { \ + ogs_timer_stop((__bEARER_TIMER).timer); \ + if ((__bEARER_TIMER).pkbuf) \ + { \ + ogs_pkbuf_free((__bEARER_TIMER).pkbuf); \ + (__bEARER_TIMER).pkbuf = NULL; \ + } \ + (__bEARER_TIMER).retry_count = 0; \ + } while(0); + struct { + ogs_pkbuf_t *pkbuf; + ogs_timer_t *timer; + uint32_t retry_count;; + } t3489; + + /* Related Context */ + mme_ue_t *mme_ue; + mme_sess_t *sess; + ogs_gtp_xact_t *xact; +} mme_bearer_t; + void mme_context_init(void); void mme_context_final(void); mme_context_t *mme_self(void); @@ -665,12 +673,12 @@ int mme_enb_set_enb_id(mme_enb_t *enb, uint32_t enb_id); int mme_enb_sock_type(ogs_sock_t *sock); enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id); -unsigned int enb_ue_count(void); void enb_ue_remove(enb_ue_t *enb_ue); void enb_ue_remove_in_enb(mme_enb_t *enb); void enb_ue_switch_to_enb(enb_ue_t *enb_ue, mme_enb_t *new_enb); enb_ue_t *enb_ue_find_by_enb_ue_s1ap_id( mme_enb_t *enb, uint32_t enb_ue_s1ap_id); +enb_ue_t *enb_ue_find(uint32_t index); enb_ue_t *enb_ue_find_by_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id); enb_ue_t *enb_ue_first_in_enb(mme_enb_t *enb); enb_ue_t *enb_ue_next_in_enb(enb_ue_t *enb_ue); @@ -779,6 +787,9 @@ int mme_m_tmsi_pool_generate(void); mme_m_tmsi_t *mme_m_tmsi_alloc(void); int mme_m_tmsi_free(mme_m_tmsi_t *tmsi); +void mme_ebi_pool_init(mme_ue_t *mme_ue); +void mme_ebi_pool_final(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); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 6dbc8c39f..71566c100 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -267,7 +267,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue) if (bearer && 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 { mme_gtp_send_delete_session_request(sess); } diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index 815aee237..ba1c121eb 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -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.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)); bearer_qos.qci = pdn->qos.qci; @@ -297,7 +297,7 @@ ogs_pkbuf_t *mme_s11_build_modify_bearer_request( /* Bearer Context : EBI */ 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.u8 = bearer->ebi; + req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = *(bearer->ebi); /* Data Plane(DL) : ENB-S1U */ 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(>p_message, 0, sizeof(ogs_gtp_message_t)); 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) */ memset(&uli, 0, sizeof(ogs_gtp_uli_t)); @@ -416,7 +416,7 @@ ogs_pkbuf_t *mme_s11_build_create_bearer_response( /* Bearer Context : EBI */ rsp->bearer_contexts.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 */ 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 */ rsp->bearer_contexts.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 */ rsp->bearer_contexts.cause.presence = 1; @@ -586,7 +586,7 @@ ogs_pkbuf_t *mme_s11_build_delete_bearer_response( /* Bearer Context : EBI */ rsp->bearer_contexts.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 */ 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)) { req->bearer_contexts[i].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++; } @@ -795,7 +795,7 @@ ogs_pkbuf_t *mme_s11_build_bearer_resource_command( /* Linked Bearer Context : EBI */ 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) */ cmd->procedure_transaction_id.presence = 1; diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index a2f08ba5d..534ce5a2f 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -364,7 +364,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_fsm_dispatch(&bearer->sm, e); 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, * remove all session context linked the default bearer */ 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)) { - ogs_assert(default_bearer->ebi == bearer->ebi); + ogs_assert(*(default_bearer->ebi) == *(bearer->ebi)); mme_sess_remove(sess); } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_exception)) { diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index 9881f0c56..1295a0fab 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -377,11 +377,11 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( 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; 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. 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->e_RAB_ID = bearer->ebi; + e_rab->e_RAB_ID = *(bearer->ebi); 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. 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->e_RAB_ID = bearer->ebi; + e_rab->e_RAB_ID = *(bearer->ebi); 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. 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->e_RAB_ID = bearer->ebi; + e_rab->e_RAB_ID = *(bearer->ebi); e_rab->cause.present = group; e_rab->cause.choice.radioNetwork = cause; ogs_debug(" EBI[%d] Gruop[%d] Cause[%d]", - bearer->ebi, group, (int)cause); + *(bearer->ebi), group, (int)cause); nasPdu->size = esmbuf->len; 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; 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)) { @@ -1930,7 +1930,7 @@ ogs_pkbuf_t *s1ap_build_handover_request( 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.allocationRetentionPriority. diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 64787f44b..20c90557e 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -520,7 +520,7 @@ void s1ap_handle_initial_context_setup_response( ogs_assert(rv == OGS_OK); 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)) { 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); 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)) { mme_bearer_t *linked_bearer = mme_linked_bearer(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); } else { mme_gtp_send_create_bearer_response(bearer); diff --git a/src/smf/context.c b/src/smf/context.c index 847005b55..b92905db3 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -674,6 +674,8 @@ smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn) 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); + sess->index = ogs_pool_index(&smf_sess_pool, sess); ogs_assert(sess->index > 0 && sess->index <= ogs_app()->pool.sess); @@ -781,6 +783,8 @@ smf_sess_t *smf_sess_add_by_psi(smf_ue_t *smf_ue, uint8_t psi) 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); + sess->index = ogs_pool_index(&smf_sess_pool, sess); ogs_assert(sess->index > 0 && sess->index <= ogs_app()->pool.sess); @@ -986,6 +990,8 @@ void smf_sess_remove(smf_sess_t *sess) ogs_pool_final(&sess->pfcp.qer_pool); ogs_pool_final(&sess->pfcp.bar_pool); + ogs_pool_final(&sess->qfi_pool); + ogs_pool_free(&smf_sess_pool, sess); } @@ -1154,9 +1160,10 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) ogs_pfcp_pdr_associate_qer(ul_pdr, qer); /* Allocate QFI */ - qer->qfi = OGS_NEXT_ID(sess->qos_flow_identifier, 1, OGS_MAX_QOS_FLOW_ID+1); + ogs_pool_alloc(&sess->qfi_pool, &qos_flow->qfi); + ogs_assert(qos_flow->qfi); - qos_flow->qfi = ul_pdr->qfi = qer->qfi; + ul_pdr->qfi = qer->qfi = *(qos_flow->qfi); qos_flow->sess = sess; @@ -1171,7 +1178,7 @@ smf_bearer_t *smf_qos_flow_find_by_qfi(smf_sess_t *sess, uint8_t qfi) ogs_assert(sess); ogs_list_for_each(&sess->bearer_list, qos_flow) { - if (qos_flow->qfi == qfi) + if (*(qos_flow->qfi) == qfi) return qos_flow; } @@ -1313,6 +1320,9 @@ int smf_bearer_remove(smf_bearer_t *bearer) ogs_pool_final(&bearer->pf_pool); + if (bearer->qfi) + ogs_pool_free(&bearer->sess->qfi_pool, bearer->qfi); + ogs_pool_free(&smf_bearer_pool, bearer); return OGS_OK; @@ -1672,3 +1682,21 @@ int smf_pco_build(uint8_t *pco_buf, uint8_t *buffer, int length) size = ogs_pco_build(pco_buf, OGS_MAX_PCO_LEN, &smf); return size; } + +void smf_qfi_pool_init(smf_sess_t *sess) +{ + int i; + + ogs_assert(sess); + + ogs_pool_init(&sess->qfi_pool, OGS_MAX_QOS_FLOW_ID); + + for (i = 1; i <= OGS_MAX_QOS_FLOW_ID; i++) { + sess->qfi_pool.array[i-1] = i; + } +} + +void smf_qfi_pool_final(smf_sess_t *sess) +{ + ogs_pool_final_skip_mem_checks(&sess->qfi_pool); +} diff --git a/src/smf/context.h b/src/smf/context.h index a933114e1..85f5c61b7 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -158,7 +158,7 @@ typedef struct smf_bearer_s { ogs_pfcp_far_t *ul_far; ogs_pfcp_qer_t *qer; - uint8_t qfi; /* 5GC */ + uint8_t *qfi; /* 5GC */ uint8_t ebi; /* EPC */ uint32_t pgw_s5u_teid; /* PGW-S5U TEID */ @@ -204,7 +204,13 @@ typedef struct smf_sess_s { char *gx_sid; /* Gx Session ID */ - uint8_t qos_flow_identifier; /* ID Generator(1~OGS_MAX_QOS_FLOW_ID) */ +#define CLEAR_QOS_FLOW_ID(__sESS) \ + do { \ + ogs_assert((__sESS)); \ + smf_qfi_pool_final(__sESS); \ + smf_qfi_pool_init(__sESS); \ + } while(0) + OGS_POOL(qfi_pool, uint8_t); char *sm_context_ref; /* smContextRef */ uint8_t psi; /* PDU session identity */ @@ -340,6 +346,9 @@ smf_pf_t *smf_pf_next(smf_pf_t *pf); int smf_pco_build(uint8_t *pco_buf, uint8_t *buffer, int length); +void smf_qfi_pool_init(smf_sess_t *sess); +void smf_qfi_pool_final(smf_sess_t *sess); + #ifdef __cplusplus } #endif diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index 1934103c1..7a644804c 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -25,7 +25,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) { ogs_pkbuf_t *pkbuf = NULL; - smf_bearer_t *bearer = NULL; + smf_bearer_t *qos_flow = NULL; ogs_nas_5gs_message_t message; ogs_nas_5gs_pdu_session_establishment_accept_t * @@ -74,8 +74,8 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) ogs_assert(dnn); ogs_assert(sess); - bearer = smf_default_bearer_in_sess(sess); - ogs_assert(bearer); + qos_flow = smf_default_bearer_in_sess(sess); + ogs_assert(qos_flow); memset(&message, 0, sizeof(message)); message.gsm.h.extended_protocol_discriminator = @@ -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].flow.segregation = 0; - qos_rule[0].flow.identifier = bearer->qfi; + qos_rule[0].flow.identifier = *(qos_flow->qfi); 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 */ memset(&qos_flow_description, 0, sizeof(qos_flow_description)); - qos_flow_description.identifier = bearer->qfi; + qos_flow_description.identifier = *(qos_flow->qfi); qos_flow_description.code = OGS_NAS_CREATE_NEW_QOS_FLOW_DESCRIPTION; qos_flow_description.E = 1; qos_flow_description.num_of_parameter = 1; diff --git a/src/smf/ngap-build.c b/src/smf/ngap-build.c index 47e5529c9..f3d4d0819 100644 --- a/src/smf/ngap-build.c +++ b/src/smf/ngap-build.c @@ -132,7 +132,7 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_setup_request_transfer( qosCharacteristics->choice.nonDynamic5QI = nonDynamic5QI; qosCharacteristics->present = NGAP_QosCharacteristics_PR_nonDynamic5QI; - *qosFlowIdentifier = qos_flow->qfi; + *qosFlowIdentifier = *(qos_flow->qfi); nonDynamic5QI->fiveQI = sess->pdn.qos.qci; diff --git a/tests/handover/abts-main.c b/tests/handover/abts-main.c index 5595cffa7..88d3db6c0 100644 --- a/tests/handover/abts-main.c +++ b/tests/handover/abts-main.c @@ -51,6 +51,14 @@ static void initialize(const char *const argv[]) rv = app_initialize(argv); ogs_assert(rv == OGS_OK); + + /* + * To avoid freeDiameter error + * + * ROUTING ERROR + * 'No remaining suitable candidate to route the message to' for: + */ + ogs_msleep(500); } int main(int argc, const char *const argv[])