diff --git a/src/mme/emm_handler.c b/src/mme/emm_handler.c index 645784e05..d8eef5dbc 100644 --- a/src/mme/emm_handler.c +++ b/src/mme/emm_handler.c @@ -31,6 +31,7 @@ static void event_emm_to_esm( c_uint8_t pti = NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED; c_uint8_t ebi = NAS_EPS_BEARER_IDENTITY_UNASSIGNED; mme_bearer_t *bearer = NULL; + mme_sess_t *sess = NULL; d_assert(mme_ue, return, "Null param"); d_assert(esm_message_container, return, "Null param"); @@ -41,13 +42,18 @@ static void event_emm_to_esm( pti = h->procedure_transaction_identity; ebi = h->eps_bearer_identity; - if (pti == NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED && ebi) - bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi); - else if (ebi == NAS_EPS_BEARER_IDENTITY_UNASSIGNED && pti) - bearer = mme_bearer_find_by_ue_pti(mme_ue, pti); - if (!bearer) - bearer = mme_sess_add(mme_ue, pti); + if (ebi != NAS_EPS_BEARER_IDENTITY_UNASSIGNED) + sess = mme_sess_find_by_ebi(mme_ue, ebi); + else if (pti != NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) + sess = mme_sess_find_by_pti(mme_ue, pti); + else + d_assert(0, return, "Invalid pti(%d) and ebi(%d)\n", pti, ebi); + + if (!sess) + sess = mme_sess_add(mme_ue, pti); + d_assert(sess, return, "Null param"); + bearer = mme_default_bearer_in_sess(sess); d_assert(bearer, return, "No Bearer Context"); /* The Packet Buffer(pkbuf_t) for NAS message MUST make a HEADROOM. @@ -58,7 +64,7 @@ static void event_emm_to_esm( esm_message_container->data, esm_message_container->len); event_set(&e, MME_EVT_ESM_MESSAGE); - event_set_param1(&e, (c_uintptr_t)bearer->index); + event_set_param1(&e, (c_uintptr_t)sess->index); event_set_param3(&e, (c_uintptr_t)esmbuf); mme_event_send(&e); } @@ -162,7 +168,6 @@ void emm_handle_attach_accept(mme_sess_t *sess) status_t rv; enb_ue_t *enb_ue = NULL; mme_ue_t *mme_ue = NULL; - mme_bearer_t *bearer = NULL; pkbuf_t *esmbuf = NULL, *emmbuf = NULL, *s1apbuf = NULL; d_assert(sess, return, "Null param"); @@ -170,14 +175,12 @@ void emm_handle_attach_accept(mme_sess_t *sess) d_assert(mme_ue, return, "Null param"); enb_ue = mme_ue->enb_ue; d_assert(enb_ue, return, "Null param"); - bearer = mme_default_bearer_in_sess(sess); - d_assert(bearer, return, "Null param"); - rv = esm_build_activate_default_bearer_context(&esmbuf, bearer); + rv = esm_build_activate_default_bearer_context(&esmbuf, sess); d_assert(rv == CORE_OK && esmbuf, return, "esm build error"); d_trace(3, "[NAS] Activate default bearer context request : " - "EMM <-- ESM[%d]\n", bearer->ebi); + "EMM <-- ESM[%d]\n", sess->ebi); rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf); d_assert(rv == CORE_OK && emmbuf, @@ -185,7 +188,7 @@ void emm_handle_attach_accept(mme_sess_t *sess) d_trace(3, "[NAS] Attach accept : UE[%s] <-- EMM\n", mme_ue->imsi_bcd); - rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, emmbuf); + rv = s1ap_build_initial_context_setup_request(&s1apbuf, sess, emmbuf); d_assert(rv == CORE_OK && s1apbuf, pkbuf_free(emmbuf); return, "s1ap build error"); @@ -554,17 +557,14 @@ void emm_handle_service_request( pkbuf_t *s1apbuf = NULL; enb_ue_t *enb_ue = NULL; mme_sess_t *sess = NULL; - mme_bearer_t *bearer = NULL; d_assert(mme_ue, return, "Null param"); enb_ue = mme_ue->enb_ue; d_assert(enb_ue, return, "Null param"); sess = mme_sess_first(mme_ue); d_assert(sess, return, "Null param"); - bearer = mme_default_bearer_in_sess(sess); - d_assert(bearer, return, "Null param"); - rv = s1ap_build_initial_context_setup_request(&s1apbuf, bearer, NULL); + rv = s1ap_build_initial_context_setup_request(&s1apbuf, sess, NULL); d_assert(rv == CORE_OK && s1apbuf, return, "s1ap build error"); d_assert(nas_send_to_enb(enb_ue, s1apbuf) == CORE_OK,, "s1ap send error"); diff --git a/src/mme/esm_build.c b/src/mme/esm_build.c index d1090b9c8..3a5d7915a 100644 --- a/src/mme/esm_build.c +++ b/src/mme/esm_build.c @@ -28,13 +28,13 @@ status_t esm_build_pdn_connectivity_reject( return CORE_OK; } -status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer) +status_t esm_build_information_request(pkbuf_t **pkbuf, mme_sess_t *sess) { nas_message_t message; mme_ue_t *mme_ue = NULL; - d_assert(bearer, return CORE_ERROR, "Null param"); - mme_ue = bearer->mme_ue; + d_assert(sess, return CORE_ERROR, "Null param"); + mme_ue = sess->mme_ue; d_assert(mme_ue, return CORE_ERROR, "Null param"); memset(&message, 0, sizeof(message)); @@ -43,7 +43,7 @@ status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer) message.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_EMM; message.esm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_ESM; - message.esm.h.procedure_transaction_identity = bearer->pti; + message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.message_type = NAS_ESM_INFORMATION_REQUEST; d_assert(nas_security_encode(pkbuf, mme_ue, &message) == CORE_OK && @@ -53,7 +53,7 @@ status_t esm_build_information_request(pkbuf_t **pkbuf, mme_bearer_t *bearer) } status_t esm_build_activate_default_bearer_context( - pkbuf_t **pkbuf, mme_bearer_t *bearer) + pkbuf_t **pkbuf, mme_sess_t *sess) { nas_message_t message; nas_activate_default_eps_bearer_context_request_t @@ -72,11 +72,8 @@ status_t esm_build_activate_default_bearer_context( ->protocol_configuration_options; mme_ue_t *mme_ue = NULL; - mme_sess_t *sess = NULL; pdn_t *pdn = NULL; - d_assert(bearer, return CORE_ERROR, "Null param"); - sess = bearer->sess; d_assert(sess, return CORE_ERROR, "Null param"); mme_ue = sess->mme_ue; d_assert(mme_ue, return CORE_ERROR, "Null param"); @@ -84,9 +81,9 @@ status_t esm_build_activate_default_bearer_context( d_assert(pdn, return CORE_ERROR, "Null param"); memset(&message, 0, sizeof(message)); - message.esm.h.eps_bearer_identity = bearer->ebi; + message.esm.h.eps_bearer_identity = sess->ebi; message.esm.h.protocol_discriminator = NAS_PROTOCOL_DISCRIMINATOR_ESM; - message.esm.h.procedure_transaction_identity = bearer->pti; + message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.message_type = NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST; @@ -116,13 +113,13 @@ status_t esm_build_activate_default_bearer_context( apn_ambr_build(apn_ambr, pdn->ambr.downlink, pdn->ambr.uplink); } - if (bearer->pgw_pco_len) + if (sess->pgw_pco_len) { activate_default_eps_bearer_context_request->presencemask |= NAS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT; - protocol_configuration_options->length = bearer->pgw_pco_len; + protocol_configuration_options->length = sess->pgw_pco_len; memcpy(protocol_configuration_options->buffer, - bearer->pgw_pco, protocol_configuration_options->length); + sess->pgw_pco, protocol_configuration_options->length); } d_assert(nas_plain_encode(pkbuf, &message) == CORE_OK && *pkbuf,,); diff --git a/src/mme/esm_build.h b/src/mme/esm_build.h index 37b948667..8e95ae2d1 100644 --- a/src/mme/esm_build.h +++ b/src/mme/esm_build.h @@ -11,10 +11,10 @@ CORE_DECLARE(status_t) esm_build_pdn_connectivity_reject(pkbuf_t **pkbuf, c_uint8_t pti, nas_esm_cause_t esm_cause); CORE_DECLARE(status_t) esm_build_information_request(pkbuf_t **pkbuf, - mme_bearer_t *bearer); + mme_sess_t *sess); CORE_DECLARE(status_t) esm_build_activate_default_bearer_context( - pkbuf_t **pkbuf, mme_bearer_t *bearer); + pkbuf_t **pkbuf, mme_sess_t *sess); #ifdef __cplusplus } diff --git a/src/mme/esm_handler.c b/src/mme/esm_handler.c index b85200225..e6ad429d2 100644 --- a/src/mme/esm_handler.c +++ b/src/mme/esm_handler.c @@ -11,19 +11,21 @@ #include "s1ap_path.h" #include "nas_path.h" -void esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, +void esm_handle_pdn_connectivity_request(mme_sess_t *sess, nas_pdn_connectivity_request_t *pdn_connectivity_request) { + d_assert(sess, return, "Null param"); + if (pdn_connectivity_request->presencemask & NAS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT) { nas_protocol_configuration_options_t *protocol_configuration_options = &pdn_connectivity_request->protocol_configuration_options; - bearer->ue_pco_len = protocol_configuration_options->length; - d_assert(bearer->ue_pco_len <= MAX_PCO_LEN, return, - "length(%d) exceeds MAX:%d", bearer->ue_pco_len, MAX_PCO_LEN); - memcpy(bearer->ue_pco, protocol_configuration_options->buffer, - bearer->ue_pco_len); + sess->ue_pco_len = protocol_configuration_options->length; + d_assert(sess->ue_pco_len <= MAX_PCO_LEN, return, + "length(%d) exceeds MAX:%d", sess->ue_pco_len, MAX_PCO_LEN); + memcpy(sess->ue_pco, protocol_configuration_options->buffer, + sess->ue_pco_len); } } @@ -32,31 +34,25 @@ void esm_handle_information_request(mme_sess_t *sess) status_t rv; pkbuf_t *esmbuf = NULL; mme_ue_t *mme_ue = NULL; - mme_bearer_t *bearer = NULL; d_assert(sess, return, "Null param"); mme_ue = sess->mme_ue; d_assert(mme_ue, return, "Null param"); - bearer = mme_default_bearer_in_sess(sess); - d_assert(bearer, return, "Null param"); - rv = esm_build_information_request(&esmbuf, bearer); + rv = esm_build_information_request(&esmbuf, sess); d_assert(rv == CORE_OK && esmbuf, return, "esm_build failed"); d_assert(nas_send_to_downlink_nas_transport(mme_ue, esmbuf) == CORE_OK,,); } -void esm_handle_information_response(mme_bearer_t *bearer, +void esm_handle_information_response(mme_sess_t *sess, nas_esm_information_response_t *esm_information_response) { mme_ue_t *mme_ue = NULL; - mme_sess_t *sess = NULL; - d_assert(bearer, return, "Null param"); - mme_ue = bearer->mme_ue; - d_assert(mme_ue, return, "Null param"); - sess = bearer->sess; d_assert(sess, return, "Null param"); + mme_ue = sess->mme_ue; + d_assert(mme_ue, return, "Null param"); if (esm_information_response->presencemask & NAS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT) @@ -72,10 +68,10 @@ void esm_handle_information_response(mme_bearer_t *bearer, { nas_protocol_configuration_options_t *protocol_configuration_options = &esm_information_response->protocol_configuration_options; - bearer->ue_pco_len = protocol_configuration_options->length; - d_assert(bearer->ue_pco_len <= MAX_PCO_LEN, return, - "length(%d) exceeds MAX:%d", bearer->ue_pco_len, MAX_PCO_LEN); - memcpy(bearer->ue_pco, protocol_configuration_options->buffer, - bearer->ue_pco_len); + sess->ue_pco_len = protocol_configuration_options->length; + d_assert(sess->ue_pco_len <= MAX_PCO_LEN, return, + "length(%d) exceeds MAX:%d", sess->ue_pco_len, MAX_PCO_LEN); + memcpy(sess->ue_pco, protocol_configuration_options->buffer, + sess->ue_pco_len); } } diff --git a/src/mme/esm_handler.h b/src/mme/esm_handler.h index 2c8618dc7..5d040fd75 100644 --- a/src/mme/esm_handler.h +++ b/src/mme/esm_handler.h @@ -9,10 +9,10 @@ extern "C" { #endif /* __cplusplus */ -CORE_DECLARE(void) esm_handle_pdn_connectivity_request(mme_bearer_t *bearer, +CORE_DECLARE(void) esm_handle_pdn_connectivity_request(mme_sess_t *sess, nas_pdn_connectivity_request_t *pdn_connectivity_request); CORE_DECLARE(void) esm_handle_information_request(mme_sess_t *sess); -CORE_DECLARE(void) esm_handle_information_response(mme_bearer_t *bearer, +CORE_DECLARE(void) esm_handle_information_response(mme_sess_t *sess, nas_esm_information_response_t *bearer_information_response); #ifdef __cplusplus diff --git a/src/mme/esm_sm.c b/src/mme/esm_sm.c index 8fed4b7d1..ea75687a5 100644 --- a/src/mme/esm_sm.c +++ b/src/mme/esm_sm.c @@ -47,15 +47,12 @@ void esm_state_operational(fsm_t *s, event_t *e) case MME_EVT_ESM_MESSAGE: { index_t index = event_get_param1(e); - mme_bearer_t *bearer = NULL; mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; nas_message_t *message = NULL; d_assert(index, return, "Null param"); - bearer = mme_bearer_find(index); - d_assert(bearer, return, "Null param"); - sess = bearer->sess; + sess = mme_sess_find(index); d_assert(sess, return, "Null param"); mme_ue = sess->mme_ue; d_assert(mme_ue, return, "Null param"); @@ -70,10 +67,10 @@ void esm_state_operational(fsm_t *s, event_t *e) case NAS_PDN_CONNECTIVITY_REQUEST: { esm_handle_pdn_connectivity_request( - bearer, &message->esm.pdn_connectivity_request); + sess, &message->esm.pdn_connectivity_request); d_trace(3, "[NAS] PDN connectivity request : " "UE[%s] --> ESM[%d]\n", - mme_ue->imsi_bcd, bearer->pti); + mme_ue->imsi_bcd, sess->pti); if (!MME_UE_HAVE_IMSI(mme_ue)) { @@ -117,9 +114,9 @@ void esm_state_operational(fsm_t *s, event_t *e) { d_trace(3, "[NAS] ESM information response : " "UE[%s] --> ESM[%d]\n", - mme_ue->imsi_bcd, bearer->pti); + mme_ue->imsi_bcd, sess->pti); esm_handle_information_response( - bearer, &message->esm.esm_information_response); + sess, &message->esm.esm_information_response); mme_s11_handle_create_session_request(sess); break; @@ -128,7 +125,7 @@ void esm_state_operational(fsm_t *s, event_t *e) { d_trace(3, "[NAS] Activate default eps bearer " "context accept : UE[%s] --> ESM[%d]\n", - mme_ue->imsi_bcd, bearer->pti); + mme_ue->imsi_bcd, sess->pti); break; } default: diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index d085306e6..b25ca5f30 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -1405,14 +1405,21 @@ status_t mme_ue_reset_ebi(mme_ue_t *mme_ue) return CORE_OK; } -mme_bearer_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti) +mme_sess_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti) { mme_sess_t *sess = NULL; mme_bearer_t *bearer = NULL; + d_assert(mme_ue, return NULL, "Null param"); + d_assert(pti != NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, + return NULL, "Invalid PTI(%d)", pti); + index_alloc(&mme_sess_pool, &sess); d_assert(sess, return NULL, "Null param"); + sess->pti = pti; + sess->ebi = NEXT_ID(mme_ue->ebi, MIN_EPS_BEARER_ID, MAX_EPS_BEARER_ID); + sess->mme_s11_teid = sess->index; sess->mme_s11_addr = mme_self()->s11_addr; @@ -1422,11 +1429,14 @@ mme_bearer_t *mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti) sess->mme_ue = mme_ue; sess->sgw = mme_sgw_first(); - bearer = mme_bearer_add(sess, pti); + bearer = mme_bearer_add(sess); d_assert(bearer, mme_sess_remove(sess); return NULL, "Can't add default bearer context"); - return bearer; + fsm_create(&sess->sm, esm_state_initial, esm_state_final); + fsm_init(&sess->sm, 0); + + return sess; } status_t mme_sess_remove(mme_sess_t *sess) @@ -1434,6 +1444,9 @@ status_t mme_sess_remove(mme_sess_t *sess) d_assert(sess, return CORE_ERROR, "Null param"); d_assert(sess->mme_ue, return CORE_ERROR, "Null param"); + fsm_final(&sess->sm, 0); + fsm_clear(&sess->sm); + mme_bearer_remove_all(sess); list_remove(&sess->mme_ue->sess_list, sess); @@ -1470,22 +1483,31 @@ mme_sess_t* mme_sess_find_by_teid(c_uint32_t teid) return mme_sess_find(teid); } -mme_sess_t* mme_sess_find_by_ebi(mme_ue_t *mme_ue, c_uint8_t ebi) +mme_sess_t* mme_sess_find_by_pti(mme_ue_t *mme_ue, c_uint8_t pti) { mme_sess_t *sess = NULL; - mme_bearer_t *bearer = NULL; sess = mme_sess_first(mme_ue); while (sess) { - bearer = mme_bearer_first(sess); - while (bearer) - { - if (ebi == bearer->ebi) - return sess; + if (pti == sess->pti) + return sess; - bearer = mme_bearer_next(bearer); - } + sess = mme_sess_next(sess); + } + + return NULL; +} + +mme_sess_t* mme_sess_find_by_ebi(mme_ue_t *mme_ue, c_uint8_t ebi) +{ + mme_sess_t *sess = NULL; + + sess = mme_sess_first(mme_ue); + while (sess) + { + if (ebi == sess->ebi) + return sess; sess = mme_sess_next(sess); } @@ -1495,7 +1517,6 @@ mme_sess_t* mme_sess_find_by_ebi(mme_ue_t *mme_ue, c_uint8_t ebi) mme_sess_t* mme_sess_find_by_last_esm_message(mme_ue_t *mme_ue) { - mme_bearer_t *bearer = NULL; mme_sess_t *sess = NULL; nas_message_t *message = NULL; @@ -1507,11 +1528,9 @@ mme_sess_t* mme_sess_find_by_last_esm_message(mme_ue_t *mme_ue) { case NAS_PDN_CONNECTIVITY_REQUEST: { - bearer = mme_bearer_find_by_ue_pti(mme_ue, + sess = mme_sess_find_by_pti(mme_ue, message->esm.h.procedure_transaction_identity); - if (bearer) sess = bearer->sess; - break; } default: @@ -1533,7 +1552,7 @@ mme_sess_t* mme_sess_next(mme_sess_t *sess) return list_next(sess); } -mme_bearer_t* mme_bearer_add(mme_sess_t *sess, c_uint8_t pti) +mme_bearer_t* mme_bearer_add(mme_sess_t *sess) { mme_bearer_t *bearer = NULL; mme_ue_t *mme_ue = NULL; @@ -1545,17 +1564,11 @@ mme_bearer_t* mme_bearer_add(mme_sess_t *sess, c_uint8_t pti) index_alloc(&mme_bearer_pool, &bearer); d_assert(bearer, return NULL, "Null param"); - bearer->pti = pti; - bearer->ebi = NEXT_ID(mme_ue->ebi, MIN_EPS_BEARER_ID, MAX_EPS_BEARER_ID); - list_append(&sess->bearer_list, bearer); bearer->mme_ue = mme_ue; bearer->sess = sess; - fsm_create(&bearer->sm, esm_state_initial, esm_state_final); - fsm_init(&bearer->sm, 0); - return bearer; } @@ -1564,9 +1577,6 @@ status_t mme_bearer_remove(mme_bearer_t *bearer) d_assert(bearer, return CORE_ERROR, "Null param"); d_assert(bearer->sess, return CORE_ERROR, "Null param"); - fsm_final(&bearer->sm, 0); - fsm_clear(&bearer->sm); - list_remove(&bearer->sess->bearer_list, bearer); index_free(&mme_bearer_pool, bearer); @@ -1598,74 +1608,6 @@ mme_bearer_t* mme_bearer_find(index_t index) return index_find(&mme_bearer_pool, index); } -mme_bearer_t* mme_bearer_find_by_ue_pti(mme_ue_t *mme_ue, c_uint8_t pti) -{ - mme_sess_t *sess = NULL; - mme_bearer_t *bearer = NULL; - - d_assert(mme_ue, return NULL, "Null param"); - - sess = mme_sess_first(mme_ue); - while (sess) - { - bearer = mme_bearer_first(sess); - while (bearer) - { - if (pti == bearer->pti) - return bearer; - - bearer = mme_bearer_next(bearer); - } - - sess = mme_sess_next(sess); - } - - return NULL; -} - -mme_bearer_t* mme_bearer_find_by_ue_ebi(mme_ue_t *mme_ue, c_uint8_t ebi) -{ - mme_sess_t *sess = NULL; - mme_bearer_t *bearer = NULL; - - d_assert(mme_ue, return NULL, "Null param"); - - sess = mme_sess_first(mme_ue); - while (sess) - { - bearer = mme_bearer_first(sess); - while (bearer) - { - if (ebi == bearer->ebi) - return bearer; - - bearer = mme_bearer_next(bearer); - } - - sess = mme_sess_next(sess); - } - - return NULL; -} - -mme_bearer_t* mme_bearer_find_by_sess_ebi(mme_sess_t *sess, c_uint8_t ebi) -{ - mme_bearer_t *bearer = NULL; - - d_assert(sess, return NULL, "Null param"); - - bearer = mme_bearer_first(sess); - while (bearer) - { - if (ebi == bearer->ebi) - return bearer; - - bearer = mme_bearer_next(bearer); - } - - return NULL; -} - mme_bearer_t* mme_default_bearer_in_sess(mme_sess_t *sess) { return mme_bearer_first(sess); diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index f98c2a8f8..5be481014 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -229,6 +229,10 @@ struct _mme_ue_t { typedef struct _mme_sess_t { lnode_t node; /* A node of list_t */ index_t index; /* An index of this node */ + fsm_t sm; /* State Machine */ + + c_uint8_t pti; /* Procedure Trasaction Identity */ + c_uint8_t ebi; /* EPS Bearer ID */ /* IMPORTANT! * MME-S11-TEID is same with an index */ @@ -246,6 +250,12 @@ typedef struct _mme_sess_t { c_uint32_t sgw_s11_teid; c_uint32_t sgw_s11_addr; + /* Protocol Configuration Options */ + c_uint8_t ue_pco[MAX_PCO_LEN]; + int ue_pco_len; + c_uint8_t pgw_pco[MAX_PCO_LEN]; + int pgw_pco_len; + /* mme_bearer_first(sess) : Default Bearer Context */ list_t bearer_list; @@ -261,22 +271,12 @@ typedef struct _mme_sess_t { typedef struct _mme_bearer_t { lnode_t node; /* A node of list_t */ index_t index; /* An index of this node */ - fsm_t sm; /* State Machine */ - - c_uint8_t pti; /* Procedure Trasaction Identity */ - c_uint8_t ebi; /* EPS Bearer ID */ c_uint32_t enb_s1u_teid; c_uint32_t enb_s1u_addr; c_uint32_t sgw_s1u_teid; c_uint32_t sgw_s1u_addr; - /* Protocol Configuration Options */ - c_uint8_t ue_pco[MAX_PCO_LEN]; - int ue_pco_len; - c_uint8_t pgw_pco[MAX_PCO_LEN]; - int pgw_pco_len; - /* Related Context */ mme_ue_t *mme_ue; mme_sess_t *sess; @@ -325,27 +325,23 @@ CORE_DECLARE(hash_index_t *) mme_ue_first(); CORE_DECLARE(hash_index_t *) mme_ue_next(hash_index_t *hi); CORE_DECLARE(mme_ue_t *) mme_ue_this(hash_index_t *hi); -CORE_DECLARE(mme_bearer_t*) mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti); +CORE_DECLARE(mme_sess_t*) mme_sess_add(mme_ue_t *mme_ue, c_uint8_t pti); CORE_DECLARE(status_t ) mme_sess_remove(mme_sess_t *sess); CORE_DECLARE(status_t ) mme_sess_remove_all(mme_ue_t *mme_ue); CORE_DECLARE(mme_sess_t*) mme_sess_find(index_t index); CORE_DECLARE(mme_sess_t*) mme_sess_find_by_teid(c_uint32_t teid); +CORE_DECLARE(mme_sess_t*) mme_sess_find_by_pti( + mme_ue_t *mme_ue, c_uint8_t pti); CORE_DECLARE(mme_sess_t*) mme_sess_find_by_ebi( mme_ue_t *mme_ue, c_uint8_t ebi); CORE_DECLARE(mme_sess_t*) mme_sess_find_by_last_esm_message(mme_ue_t *mme_ue); CORE_DECLARE(mme_sess_t*) mme_sess_first(mme_ue_t *mme_ue); CORE_DECLARE(mme_sess_t*) mme_sess_next(mme_sess_t *sess); -CORE_DECLARE(mme_bearer_t*) mme_bearer_add(mme_sess_t *sess, c_uint8_t pti); +CORE_DECLARE(mme_bearer_t*) mme_bearer_add(mme_sess_t *sess); CORE_DECLARE(status_t) mme_bearer_remove(mme_bearer_t *bearer); CORE_DECLARE(status_t) mme_bearer_remove_all(mme_sess_t *sess); CORE_DECLARE(mme_bearer_t*) mme_bearer_find(index_t index); -CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_ue_pti( - mme_ue_t *mme_ue, c_uint8_t pti); -CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_ue_ebi( - mme_ue_t *mme_ue, c_uint8_t ebi); -CORE_DECLARE(mme_bearer_t*) mme_bearer_find_by_sess_ebi( - mme_sess_t *sess, c_uint8_t ebi); CORE_DECLARE(mme_bearer_t*) mme_default_bearer_in_sess(mme_sess_t *sess); CORE_DECLARE(mme_bearer_t*) mme_bearer_first(mme_sess_t *sess); CORE_DECLARE(mme_bearer_t*) mme_bearer_next(mme_bearer_t *bearer); diff --git a/src/mme/mme_s11_build.c b/src/mme/mme_s11_build.c index 4aa9cfc0d..144d27d02 100644 --- a/src/mme/mme_s11_build.c +++ b/src/mme/mme_s11_build.c @@ -14,7 +14,6 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess) pdn_t *pdn = NULL; mme_sgw_t *sgw = NULL; mme_ue_t *mme_ue = NULL; - mme_bearer_t *bearer = NULL; gtp_message_t gtp_message; gtp_create_session_request_t *req = >p_message.create_session_request; @@ -30,8 +29,6 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess) d_assert(sess, return CORE_ERROR, "Null param"); sgw = sess->sgw; d_assert(sgw, return CORE_ERROR, "Null param"); - bearer = mme_default_bearer_in_sess(sess); - d_assert(bearer, return CORE_ERROR, "Null param"); pdn = sess->pdn; d_assert(pdn, return CORE_ERROR, "Null param"); mme_ue = sess->mme_ue; @@ -117,16 +114,16 @@ status_t mme_s11_build_create_session_request(pkbuf_t **pkbuf, mme_sess_t *sess) req->aggregate_maximum_bit_rate.len = sizeof(ambr); } - if (bearer->ue_pco_len) + if (sess->ue_pco_len) { req->protocol_configuration_options.presence = 1; - req->protocol_configuration_options.data = bearer->ue_pco; - req->protocol_configuration_options.len = bearer->ue_pco_len; + req->protocol_configuration_options.data = sess->ue_pco; + req->protocol_configuration_options.len = sess->ue_pco_len; } 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 = sess->ebi; memset(&bearer_qos, 0, sizeof(bearer_qos)); bearer_qos.qci = pdn->qos.qci; @@ -164,13 +161,19 @@ status_t mme_s11_build_modify_bearer_request( gtp_message_t gtp_message; gtp_modify_bearer_request_t *req = >p_message.modify_bearer_request; + mme_sess_t *sess = NULL; + gtp_f_teid_t enb_s1u_teid; + d_assert(bearer, return CORE_ERROR, "Null param"); + sess = bearer->sess; + d_assert(sess, return CORE_ERROR, "Null param"); + memset(>p_message, 0, sizeof(gtp_message_t)); 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 = sess->ebi; /* Send Data Plane(DL) : ENB-S1U */ memset(&enb_s1u_teid, 0, sizeof(gtp_f_teid_t)); @@ -194,7 +197,6 @@ status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_sess_t *sess) status_t rv; mme_ue_t *mme_ue = NULL; gtp_message_t gtp_message; - mme_bearer_t *bearer; gtp_delete_session_request_t *req = >p_message.delete_session_request; gtp_uli_t uli; @@ -207,12 +209,8 @@ status_t mme_s11_build_delete_session_request(pkbuf_t **pkbuf, mme_sess_t *sess) memset(>p_message, 0, sizeof(gtp_message_t)); - bearer = mme_default_bearer_in_sess(sess); - if (bearer) - { - req->linked_eps_bearer_id.presence = 1; - req->linked_eps_bearer_id.u8 = bearer->ebi; - } + req->linked_eps_bearer_id.presence = 1; + req->linked_eps_bearer_id.u8 = sess->ebi; memset(&uli, 0, sizeof(gtp_uli_t)); uli.flags.e_cgi = 1; diff --git a/src/mme/mme_s11_handler.c b/src/mme/mme_s11_handler.c index a32fe9529..2c31fec4d 100644 --- a/src/mme/mme_s11_handler.c +++ b/src/mme/mme_s11_handler.c @@ -41,8 +41,12 @@ void mme_s11_handle_create_session_response( mme_bearer_t *bearer = NULL; pdn_t *pdn = NULL; - d_assert(sess, return, "Null param"); d_assert(rsp, return, "Null param"); + d_assert(sess, return, "Null param"); + bearer = mme_default_bearer_in_sess(sess); + d_assert(bearer, return, "Null param"); + pdn = sess->pdn; + d_assert(pdn, return, "Null param"); if (rsp->sender_f_teid_for_control_plane.presence == 0) { @@ -70,12 +74,6 @@ void mme_s11_handle_create_session_response( return; } - bearer = mme_bearer_find_by_sess_ebi( - sess, rsp->bearer_contexts_created.eps_bearer_id.u8); - d_assert(bearer, return, "No ESM Context"); - pdn = sess->pdn; - d_assert(pdn, return, "No PDN Context"); - /* Receive Control Plane(UL) : SGW-S11 */ sgw_s11_teid = rsp->sender_f_teid_for_control_plane.data; sess->sgw_s11_teid = ntohl(sgw_s11_teid->teid); @@ -86,9 +84,9 @@ void mme_s11_handle_create_session_response( if (rsp->protocol_configuration_options.presence) { - bearer->pgw_pco_len = rsp->protocol_configuration_options.len; - memcpy(bearer->pgw_pco, rsp->protocol_configuration_options.data, - bearer->pgw_pco_len); + sess->pgw_pco_len = rsp->protocol_configuration_options.len; + memcpy(sess->pgw_pco, rsp->protocol_configuration_options.data, + sess->pgw_pco_len); } /* Receive Data Plane(UL) : SGW-S1U */ @@ -143,7 +141,6 @@ void mme_s11_handle_downlink_data_notification( gtp_downlink_data_notification_t *noti) { status_t rv; - mme_bearer_t *bearer = NULL; pkbuf_t *s11buf = NULL; d_assert(xact, return, "Null param"); @@ -153,9 +150,6 @@ void mme_s11_handle_downlink_data_notification( d_trace(3, "[GTP] Downlink Data Notification : " "MME[%d] <-- SGW[%d]\n", sess->mme_s11_teid, sess->sgw_s11_teid); - bearer = mme_bearer_find_by_sess_ebi(sess, noti->eps_bearer_id.u8); - d_assert(bearer, return, "No ESM Context"); - /* Build Downlink data notification ack */ rv = mme_s11_build_downlink_data_notification_ack(&s11buf, sess); d_assert(rv == CORE_OK, return, "S11 build error"); diff --git a/src/mme/mme_sm.c b/src/mme/mme_sm.c index b95ce689a..4615a47f2 100644 --- a/src/mme/mme_sm.c +++ b/src/mme/mme_sm.c @@ -236,32 +236,26 @@ void mme_state_operational(fsm_t *s, event_t *e) { nas_message_t message; index_t index = event_get_param1(e); - mme_bearer_t *bearer = NULL; + mme_sess_t *sess = NULL; mme_ue_t *mme_ue = NULL; pkbuf_t *pkbuf = NULL; d_assert(index, break, "Null param"); - bearer = mme_bearer_find(index); - d_assert(bearer, break, "No ESM context"); - d_assert(mme_ue = bearer->mme_ue, break, "No UE context"); - d_assert(FSM_STATE(&bearer->sm), break, "No ESM State Machine"); + sess = mme_sess_find(index); + d_assert(sess, break, "No Session context"); + d_assert(mme_ue = sess->mme_ue, break, "No UE context"); + d_assert(FSM_STATE(&sess->sm), break, "No ESM State Machine"); - if (event_get(e) == MME_EVT_ESM_MESSAGE) - { - pkbuf = (pkbuf_t *)event_get_param3(e); - d_assert(pkbuf, break, "Null param"); - d_assert(nas_esm_decode(&message, pkbuf) == CORE_OK, - pkbuf_free(pkbuf); break, "Can't decode NAS_ESM"); + pkbuf = (pkbuf_t *)event_get_param3(e); + d_assert(pkbuf, break, "Null param"); + d_assert(nas_esm_decode(&message, pkbuf) == CORE_OK, + pkbuf_free(pkbuf); break, "Can't decode NAS_ESM"); - event_set_param4(e, (c_uintptr_t)&message); - } + event_set_param4(e, (c_uintptr_t)&message); - fsm_dispatch(&bearer->sm, (fsm_event_t*)e); + fsm_dispatch(&sess->sm, (fsm_event_t*)e); - if (event_get(e) == MME_EVT_ESM_MESSAGE) - { - pkbuf_free(pkbuf); - } + pkbuf_free(pkbuf); break; } diff --git a/src/mme/s1ap_build.c b/src/mme/s1ap_build.c index 176d1ab89..61fb3b38c 100644 --- a/src/mme/s1ap_build.c +++ b/src/mme/s1ap_build.c @@ -148,7 +148,7 @@ status_t s1ap_build_downlink_nas_transport( } status_t s1ap_build_initial_context_setup_request( - pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *emmbuf) + pkbuf_t **s1apbuf, mme_sess_t *sess, pkbuf_t *emmbuf) { char buf[INET_ADDRSTRLEN]; @@ -163,13 +163,13 @@ status_t s1ap_build_initial_context_setup_request( S1ap_NAS_PDU_t *nasPdu = NULL; mme_ue_t *mme_ue = NULL; enb_ue_t *enb_ue = NULL; - mme_sess_t *sess = NULL; + mme_bearer_t *bearer = NULL; s6a_subscription_data_t *subscription_data = NULL; pdn_t *pdn = NULL; - d_assert(bearer, return CORE_ERROR, "Null param"); - sess = bearer->sess; d_assert(sess, return CORE_ERROR, "Null param"); + bearer = mme_default_bearer_in_sess(sess); + d_assert(bearer, return CORE_ERROR, "Null param"); mme_ue = sess->mme_ue; d_assert(mme_ue, return CORE_ERROR, "Null param"); enb_ue = mme_ue->enb_ue; @@ -193,7 +193,7 @@ status_t s1ap_build_initial_context_setup_request( e_rab = (S1ap_E_RABToBeSetupItemCtxtSUReq_t *) core_calloc(1, sizeof(S1ap_E_RABToBeSetupItemCtxtSUReq_t)); - e_rab->e_RAB_ID = bearer->ebi; + e_rab->e_RAB_ID = sess->ebi; e_rab->e_RABlevelQoSParameters.qCI = pdn->qos.qci; e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. diff --git a/src/mme/s1ap_build.h b/src/mme/s1ap_build.h index e0e2fad34..0ad19820f 100644 --- a/src/mme/s1ap_build.h +++ b/src/mme/s1ap_build.h @@ -14,7 +14,7 @@ CORE_DECLARE(status_t) s1ap_build_setup_failure( CORE_DECLARE(status_t) s1ap_build_downlink_nas_transport( pkbuf_t **s1apbuf, enb_ue_t *enb_ue, pkbuf_t *emmbuf); CORE_DECLARE(status_t) s1ap_build_initial_context_setup_request( - pkbuf_t **s1apbuf, mme_bearer_t *bearer, pkbuf_t *emmbuf); + pkbuf_t **s1apbuf, mme_sess_t *sess, pkbuf_t *emmbuf); CORE_DECLARE(status_t) s1ap_build_ue_context_release_commmand( pkbuf_t **s1apbuf, enb_ue_t *enb_ue, S1ap_Cause_t *cause); CORE_DECLARE(status_t) s1ap_build_paging(pkbuf_t **s1apbuf, mme_ue_t *mme_ue); diff --git a/src/mme/s1ap_handler.c b/src/mme/s1ap_handler.c index 50bbb6f68..2182c8b8c 100644 --- a/src/mme/s1ap_handler.c +++ b/src/mme/s1ap_handler.c @@ -92,7 +92,7 @@ static void event_s1ap_to_nas(enb_ue_t *enb_ue, S1ap_NAS_PDU_t *nasPdu) } else if (h->protocol_discriminator == NAS_PROTOCOL_DISCRIMINATOR_ESM) { - mme_bearer_t *bearer = NULL; + mme_sess_t *sess = NULL; mme_ue_t *mme_ue = enb_ue->mme_ue; if (!mme_ue) @@ -102,12 +102,11 @@ static void event_s1ap_to_nas(enb_ue_t *enb_ue, S1ap_NAS_PDU_t *nasPdu) return; } - bearer = mme_bearer_find_by_ue_pti(mme_ue, - h->procedure_transaction_identity); - if (bearer) + sess = mme_sess_find_by_pti(mme_ue, h->procedure_transaction_identity); + if (sess) { event_set(&e, MME_EVT_ESM_MESSAGE); - event_set_param1(&e, (c_uintptr_t)bearer->index); + event_set_param1(&e, (c_uintptr_t)sess->index); event_set_param2(&e, (c_uintptr_t)security_header_type.type); event_set_param3(&e, (c_uintptr_t)nasbuf); mme_event_send(&e); @@ -406,7 +405,9 @@ void s1ap_handle_initial_context_setup_response( ies->e_RABSetupListCtxtSURes.s1ap_E_RABSetupItemCtxtSURes.array[i]; d_assert(e_rab, return, "Null param"); - bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID); + sess = mme_sess_find_by_ebi(mme_ue, e_rab->e_RAB_ID); + d_assert(sess, return, "Null param"); + bearer = mme_default_bearer_in_sess(sess); d_assert(bearer, return, "Null param"); memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf, sizeof(bearer->enb_s1u_teid)); @@ -414,9 +415,6 @@ void s1ap_handle_initial_context_setup_response( memcpy(&bearer->enb_s1u_addr, e_rab->transportLayerAddress.buf, sizeof(bearer->enb_s1u_addr)); - sess = bearer->sess; - d_assert(sess, return, "Null param"); - rv = mme_s11_build_modify_bearer_request(&pkbuf, bearer); d_assert(rv == CORE_OK, return, "S11 build error"); diff --git a/src/pgw/pgw_context.c b/src/pgw/pgw_context.c index e10f1e74f..d6d496148 100644 --- a/src/pgw/pgw_context.c +++ b/src/pgw/pgw_context.c @@ -484,7 +484,7 @@ static void *sess_hash_keygen(c_uint8_t *out, int *out_len, return out; } -pgw_bearer_t *pgw_sess_add( +pgw_sess_t *pgw_sess_add( c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id) { pgw_sess_t *sess = NULL; @@ -521,7 +521,7 @@ pgw_bearer_t *pgw_sess_add( imsi, imsi_len, apn); hash_set(self.sess_hash, sess->hash_keybuf, sess->hash_keylen, sess); - return bearer; + return sess; } status_t pgw_sess_remove(pgw_sess_t *sess) @@ -600,11 +600,9 @@ pgw_sess_t *pgw_sess_find_or_add_by_message(gtp_message_t *gtp_message) sess = pgw_sess_find_by_imsi_apn(req->imsi.data, req->imsi.len, apn); if (!sess) { - pgw_bearer_t *bearer = NULL; - bearer = pgw_sess_add(req->imsi.data, req->imsi.len, apn, + sess = pgw_sess_add(req->imsi.data, req->imsi.len, apn, req->bearer_contexts_to_be_created.eps_bearer_id.u8); - d_assert(bearer, return NULL, "No Bearer Context"); - sess = bearer->sess; + d_assert(sess, return NULL, "No Session Context"); } return sess; diff --git a/src/pgw/pgw_context.h b/src/pgw/pgw_context.h index 984ae129c..58ebe24de 100644 --- a/src/pgw/pgw_context.h +++ b/src/pgw/pgw_context.h @@ -119,7 +119,7 @@ CORE_DECLARE(pgw_context_t*) pgw_self(void); CORE_DECLARE(status_t) pgw_context_parse_config(void); CORE_DECLARE(status_t) pgw_context_setup_trace_module(void); -CORE_DECLARE(pgw_bearer_t*) pgw_sess_add( +CORE_DECLARE(pgw_sess_t*) pgw_sess_add( c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id); CORE_DECLARE(status_t ) pgw_sess_remove(pgw_sess_t *sess); CORE_DECLARE(status_t ) pgw_sess_remove_all(); diff --git a/src/sgw/sgw_context.c b/src/sgw/sgw_context.c index 7f19408cb..2d5b5c107 100644 --- a/src/sgw/sgw_context.c +++ b/src/sgw/sgw_context.c @@ -445,7 +445,7 @@ static void *sess_hash_keygen(c_uint8_t *out, int *out_len, return out; } -sgw_bearer_t *sgw_sess_add( +sgw_sess_t *sgw_sess_add( c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id) { sgw_sess_t *sess = NULL; @@ -481,7 +481,7 @@ sgw_bearer_t *sgw_sess_add( imsi, imsi_len, apn); hash_set(self.sess_hash, sess->hash_keybuf, sess->hash_keylen, sess); - return bearer; + return sess; } status_t sgw_sess_remove(sgw_sess_t *sess) @@ -558,11 +558,9 @@ sgw_sess_t *sgw_sess_find_or_add_by_message(gtp_message_t *gtp_message) sess = sgw_sess_find_by_imsi_apn(req->imsi.data, req->imsi.len, apn); if (!sess) { - sgw_bearer_t *bearer = NULL; - bearer = sgw_sess_add(req->imsi.data, req->imsi.len, apn, + sess = sgw_sess_add(req->imsi.data, req->imsi.len, apn, req->bearer_contexts_to_be_created.eps_bearer_id.u8); - d_assert(bearer, return NULL, "No Bearer Context"); - sess = bearer->sess; + d_assert(sess, return NULL, "No Session Context"); } return sess; diff --git a/src/sgw/sgw_context.h b/src/sgw/sgw_context.h index f86ec7f7d..864467ff8 100644 --- a/src/sgw/sgw_context.h +++ b/src/sgw/sgw_context.h @@ -126,7 +126,7 @@ CORE_DECLARE(sgw_context_t*) sgw_self(void); CORE_DECLARE(status_t) sgw_context_parse_config(void); CORE_DECLARE(status_t) sgw_context_setup_trace_module(void); -CORE_DECLARE(sgw_bearer_t*) sgw_sess_add( +CORE_DECLARE(sgw_sess_t*) sgw_sess_add( c_uint8_t *imsi, int imsi_len, c_int8_t *apn, c_uint8_t id); CORE_DECLARE(status_t) sgw_sess_remove(sgw_sess_t *sess); CORE_DECLARE(status_t) sgw_sess_remove_all();