forked from acouzens/open5gs
Instead of OGS_NEXT_ID, Use memory pool-index
This commit is contained in:
parent
015a462ce9
commit
bc476c2e0e
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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[])
|
||||
|
|
Loading…
Reference in New Issue