diff --git a/src/mme/emm_sm.c b/src/mme/emm_sm.c index b5f33998b9..1e94ec43fe 100644 --- a/src/mme/emm_sm.c +++ b/src/mme/emm_sm.c @@ -13,8 +13,8 @@ #include "emm_handler.h" #include "emm_build.h" #include "esm_handler.h" -#include "mme_s11_handler.h" #include "nas_path.h" +#include "mme_gtp_path.h" static void emm_state_attach_request(fsm_t *s, event_t *e, mme_ue_t *mme_ue, nas_message_t *message); @@ -82,6 +82,7 @@ void emm_state_detached(fsm_t *s, event_t *e) void emm_state_identity(fsm_t *s, event_t *e) { + status_t rv; mme_ue_t *mme_ue = NULL; d_assert(s, return, "Null param"); @@ -96,7 +97,6 @@ void emm_state_identity(fsm_t *s, event_t *e) { case FSM_ENTRY_SIG: { - status_t rv; pkbuf_t *emmbuf = NULL; rv = emm_build_identity_request(&emmbuf, mme_ue); @@ -139,7 +139,9 @@ void emm_state_identity(fsm_t *s, event_t *e) { if (MME_HAVE_SGW_S11_PATH(mme_ue)) { - mme_s11_handle_delete_all_sessions_in_ue(mme_ue); + rv = mme_gtp_send_delete_all_sessions(mme_ue); + d_assert(rv == CORE_OK, break, + "mme_gtp_send_delete_all_sessions failed"); } else { @@ -431,7 +433,10 @@ void emm_state_attached(fsm_t *s, event_t *e) if (MME_HAVE_SGW_S11_PATH(mme_ue)) { - mme_s11_handle_delete_all_sessions_in_ue(mme_ue); + status_t rv; + rv = mme_gtp_send_delete_all_sessions(mme_ue); + d_assert(rv == CORE_OK, break, + "mme_gtp_send_delete_all_sessions failed"); } else { @@ -526,6 +531,8 @@ void emm_state_exception(fsm_t *s, event_t *e) static void emm_state_attach_request(fsm_t *s, event_t *e, mme_ue_t *mme_ue, nas_message_t *message) { + status_t rv; + d_assert(s, return, "Null param"); d_assert(e, return, "Null param"); d_assert(mme_ue, return, "Null param"); @@ -550,7 +557,6 @@ static void emm_state_attach_request(fsm_t *s, event_t *e, { if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { - status_t rv; rv = nas_send_emm_to_esm(mme_ue, &mme_ue->pdn_connectivity_request); d_assert(rv == CORE_OK,, "nas_send_emm_to_esm failed"); FSM_TRAN(s, &emm_state_default_esm); @@ -559,7 +565,9 @@ static void emm_state_attach_request(fsm_t *s, event_t *e, { if (MME_HAVE_SGW_S11_PATH(mme_ue)) { - mme_s11_handle_delete_all_sessions_in_ue(mme_ue); + rv = mme_gtp_send_delete_all_sessions(mme_ue); + d_assert(rv == CORE_OK, return, + "mme_gtp_send_delete_all_sessions failed"); } else { diff --git a/src/mme/mme_gtp_path.c b/src/mme/mme_gtp_path.c index a53469d52e..1ee1b7a264 100644 --- a/src/mme/mme_gtp_path.c +++ b/src/mme/mme_gtp_path.c @@ -154,6 +154,34 @@ status_t mme_gtp_send_delete_session_request(mme_sess_t *sess) return CORE_OK; } +status_t mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue) +{ + status_t rv; + mme_sess_t *sess = NULL, *next_sess = NULL; + + d_assert(mme_ue, return CORE_ERROR, "Null param"); + sess = mme_sess_first(mme_ue); + while (sess != NULL) + { + next_sess = mme_sess_next(sess); + + if (MME_HAVE_SGW_S1U_PATH(sess)) + { + rv = mme_gtp_send_delete_session_request(sess); + d_assert(rv == CORE_OK, return CORE_ERROR, + "mme_gtp_send_delete_session_request error"); + } + else + { + mme_sess_remove(sess); + } + + sess = next_sess; + } + + return CORE_OK; +} + status_t mme_gtp_send_create_bearer_response(mme_bearer_t *bearer) { status_t rv; diff --git a/src/mme/mme_gtp_path.h b/src/mme/mme_gtp_path.h index b86a742189..ac6346a988 100644 --- a/src/mme/mme_gtp_path.h +++ b/src/mme/mme_gtp_path.h @@ -16,6 +16,8 @@ CORE_DECLARE(status_t) mme_gtp_send_modify_bearer_request( mme_bearer_t *bearer); CORE_DECLARE(status_t) mme_gtp_send_delete_session_request( mme_sess_t *sess); +CORE_DECLARE(status_t) mme_gtp_send_delete_all_sessions( + mme_ue_t *mme_ue); CORE_DECLARE(status_t) mme_gtp_send_create_bearer_response( mme_bearer_t *bearer); CORE_DECLARE(status_t) mme_gtp_send_release_access_bearers_response( diff --git a/src/mme/mme_s11_handler.c b/src/mme/mme_s11_handler.c index 4a3f71c9c1..582f00a73a 100644 --- a/src/mme/mme_s11_handler.c +++ b/src/mme/mme_s11_handler.c @@ -124,59 +124,6 @@ void mme_s11_handle_modify_bearer_response( d_assert(rv == CORE_OK, return, "xact_commit error"); } -void mme_s11_handle_delete_all_sessions_in_ue(mme_ue_t *mme_ue) -{ - status_t rv; - mme_sess_t *sess = NULL, *next_sess = NULL; - - d_assert(mme_ue, return, "Null param"); - sess = mme_sess_first(mme_ue); - while (sess != NULL) - { - next_sess = mme_sess_next(sess); - - if (MME_HAVE_SGW_S1U_PATH(sess)) - { - rv = mme_gtp_send_delete_session_request(sess); - d_assert(rv == CORE_OK, return, - "mme_gtp_send_delete_session_request error"); - } - else - { - mme_sess_remove(sess); - } - - sess = next_sess; - } -} - -void mme_s11_handle_delete_session_response( - gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_delete_session_response_t *rsp) -{ - status_t rv; - mme_sess_t *sess = NULL; - - d_assert(xact, return, "Null param"); - d_assert(mme_ue, return, "Null param"); - d_assert(rsp, return, "Null param"); - sess = GTP_XACT_RETRIEVE_SESSION(xact); - d_assert(sess, return, "Null param"); - - if (rsp->cause.presence == 0) - { - d_error("No Cause"); - return; - } - - d_trace(3, "[GTP] Delete Session Response : " - "MME[%d] <-- SGW[%d]\n", mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid); - - mme_sess_remove(sess); - - rv = gtp_xact_commit(xact); - d_assert(rv == CORE_OK, return, "xact_commit error"); -} - void mme_s11_handle_create_bearer_request( gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_create_bearer_request_t *req) { diff --git a/src/mme/mme_s11_handler.h b/src/mme/mme_s11_handler.h index 2533f6f8fc..831e7cc6fa 100644 --- a/src/mme/mme_s11_handler.h +++ b/src/mme/mme_s11_handler.h @@ -15,7 +15,6 @@ CORE_DECLARE(void) mme_s11_handle_create_session_response( gtp_create_session_response_t *rsp); CORE_DECLARE(void) mme_s11_handle_modify_bearer_response( gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_modify_bearer_response_t *rsp); -CORE_DECLARE(void) mme_s11_handle_delete_all_sessions_in_ue(mme_ue_t *mme_ue); CORE_DECLARE(void) mme_s11_handle_delete_session_response( gtp_xact_t *xact, mme_ue_t *mme_ue, gtp_delete_session_response_t *rsp); CORE_DECLARE(void) mme_s11_handle_create_bearer_request( diff --git a/src/mme/s1ap_build.c b/src/mme/s1ap_build.c index a6b4a7f803..1efed6e1c7 100644 --- a/src/mme/s1ap_build.c +++ b/src/mme/s1ap_build.c @@ -536,28 +536,7 @@ status_t s1ap_build_ue_context_release_commmand( ies->uE_S1AP_IDs.choice.mME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id; } - ies->cause.present = cause->present; - switch(ies->cause.present) - { - case S1ap_Cause_PR_radioNetwork: - ies->cause.choice.radioNetwork = cause->choice.radioNetwork; - break; - case S1ap_Cause_PR_transport: - ies->cause.choice.transport = cause->choice.transport; - break; - case S1ap_Cause_PR_nas: - ies->cause.choice.nas = cause->choice.nas; - break; - case S1ap_Cause_PR_protocol: - ies->cause.choice.protocol = cause->choice.protocol; - break; - case S1ap_Cause_PR_misc: - ies->cause.choice.misc = cause->choice.misc; - break; - default: - d_error("Invalid cause type : %d", ies->cause.present); - break; - } + s1ap_build_cause(&ies->cause, cause); message.procedureCode = S1ap_ProcedureCode_id_UEContextRelease; message.direction = S1AP_PDU_PR_initiatingMessage;