UE-initiated detach_request is handled in every EMM-state

This commit is contained in:
Sukchan Lee 2018-02-02 15:59:21 +09:00
parent d944bca038
commit 57f3baa273
7 changed files with 152 additions and 63 deletions

View file

@ -11,7 +11,7 @@ libmme_la_SOURCES = \
emm_handler.h emm_build.h \
esm_handler.h esm_build.h \
mme_gtp_path.h mme_s11_build.h mme_s11_handler.h \
mme_sm.h \
mme_sm.h mme_path.h \
mme_kdf.c kasumi.c snow_3g.c zuc.c \
mme_init.c mme_event.c mme_context.c \
s1ap_sm.c s1ap_build.c s1ap_handler.c s1ap_conv.c s1ap_path.c \
@ -20,7 +20,7 @@ libmme_la_SOURCES = \
emm_sm.c emm_handler.c emm_build.c \
esm_sm.c esm_handler.c esm_build.c \
mme_gtp_path.c mme_s11_build.c mme_s11_handler.c \
mme_sm.c \
mme_sm.c mme_path.c \
$(NULL)
if USRSCTP

View file

@ -16,6 +16,7 @@
#include "nas_path.h"
#include "s1ap_path.h"
#include "mme_gtp_path.h"
#include "mme_path.h"
#include "mme_sm.h"
void emm_state_initial(fsm_t *s, event_t *e)
@ -207,18 +208,10 @@ static void common_register_state(fsm_t *s, event_t *e)
FSM_TRAN(s, emm_state_exception);
return;
}
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK,,
"mme_gtp_send_delete_all_sessions failed");
}
else
{
rv = nas_send_detach_accept(mme_ue);
d_assert(rv == CORE_OK,,
"nas_send_detach_accept failed");
}
rv = mme_send_detach_accept(mme_ue);
d_assert(rv == CORE_OK,, "mme_send_detach_accept failed");
FSM_TRAN(s, &emm_state_de_registered);
return;
}
@ -326,6 +319,7 @@ static void common_register_state(fsm_t *s, event_t *e)
void emm_state_authentication(fsm_t *s, event_t *e)
{
status_t rv;
mme_ue_t *mme_ue = NULL;
d_assert(s, return, "Null param");
@ -370,8 +364,6 @@ void emm_state_authentication(fsm_t *s, event_t *e)
memcmp(authentication_response_parameter->res,
mme_ue->xres, mme_ue->xres_len) != 0)
{
status_t rv;
rv = nas_send_authentication_reject(mme_ue);
d_assert(rv == CORE_OK,, "nas send error");
FSM_TRAN(&mme_ue->sm, &emm_state_exception);
@ -405,6 +397,25 @@ void emm_state_authentication(fsm_t *s, event_t *e)
FSM_TRAN(s, &emm_state_exception);
break;
}
case NAS_DETACH_REQUEST:
{
d_trace(3, "[EMM] Detach request\n");
d_trace(5, " IMSI[%s]\n", mme_ue->imsi_bcd);
rv = emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
if (rv != CORE_OK)
{
d_error("emm_handle_attach_request() failed");
FSM_TRAN(s, emm_state_exception);
return;
}
rv = mme_send_detach_accept(mme_ue);
d_assert(rv == CORE_OK,, "mme_send_detach_accept failed");
FSM_TRAN(s, &emm_state_de_registered);
break;
}
default:
{
d_warn("Unknown message[%d]", message->emm.h.message_type);
@ -423,6 +434,7 @@ void emm_state_authentication(fsm_t *s, event_t *e)
void emm_state_security_mode(fsm_t *s, event_t *e)
{
status_t rv;
mme_ue_t *mme_ue = NULL;
d_assert(s, return, "Null param");
@ -437,7 +449,6 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
{
case FSM_ENTRY_SIG:
{
status_t rv;
pkbuf_t *emmbuf = NULL;
rv = emm_build_security_mode_command(&emmbuf, mme_ue);
@ -505,6 +516,25 @@ void emm_state_security_mode(fsm_t *s, event_t *e)
FSM_TRAN(s, &emm_state_exception);
break;
}
case NAS_DETACH_REQUEST:
{
d_trace(3, "[EMM] Detach request\n");
d_trace(5, " IMSI[%s]\n", mme_ue->imsi_bcd);
rv = emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
if (rv != CORE_OK)
{
d_error("emm_handle_attach_request() failed");
FSM_TRAN(s, emm_state_exception);
return;
}
rv = mme_send_detach_accept(mme_ue);
d_assert(rv == CORE_OK,, "mme_send_detach_accept failed");
FSM_TRAN(s, &emm_state_de_registered);
break;
}
default:
{
d_warn("Unknown message[%d]", message->emm.h.message_type);
@ -575,6 +605,25 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
FSM_TRAN(s, &emm_state_exception);
break;
}
case NAS_DETACH_REQUEST:
{
d_trace(3, "[EMM] Detach request\n");
d_trace(5, " IMSI[%s]\n", mme_ue->imsi_bcd);
rv = emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
if (rv != CORE_OK)
{
d_error("emm_handle_attach_request() failed");
FSM_TRAN(s, emm_state_exception);
return;
}
rv = mme_send_detach_accept(mme_ue);
d_assert(rv == CORE_OK,, "mme_send_detach_accept failed");
FSM_TRAN(s, &emm_state_de_registered);
break;
}
default:
{
d_warn("Unknown message[%d]",

51
src/mme/mme_path.c Normal file
View file

@ -0,0 +1,51 @@
#define TRACE_MODULE _mme_path
#include "s1ap_path.h"
#include "nas_path.h"
#include "mme_gtp_path.h"
#include "mme_path.h"
status_t mme_send_detach_accept(mme_ue_t *mme_ue)
{
status_t rv;
d_assert(mme_ue, return CORE_ERROR,);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK,,
"mme_gtp_send_delete_all_sessions failed");
}
else
{
rv = nas_send_detach_accept(mme_ue);
d_assert(rv == CORE_OK,,
"nas_send_detach_accept failed");
}
return rv;
}
status_t mme_send_ue_context_release_command(mme_ue_t *mme_ue, enb_ue_t *enb_ue)
{
status_t rv;
d_assert(enb_ue, return CORE_ERROR,);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK,,
"mme_gtp_send_delete_all_sessions failed");
}
else
{
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK,, "s1ap send error");
}
return rv;
}

20
src/mme/mme_path.h Normal file
View file

@ -0,0 +1,20 @@
#ifndef __MME_PATH_H__
#define __MME_PATH_H__
#include "core_errno.h"
#include "mme_context.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
CORE_DECLARE(status_t) mme_send_detach_accept(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) mme_send_ue_context_release_command(
mme_ue_t *mme_ue, enb_ue_t *enb_ue);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __MME_PATH_H__ */

View file

@ -19,6 +19,7 @@
#include "mme_s11_handler.h"
#include "mme_fd_path.h"
#include "mme_s6a_handler.h"
#include "mme_path.h"
void mme_state_initial(fsm_t *s, event_t *e)
{
@ -294,20 +295,9 @@ void mme_state_operational(fsm_t *s, event_t *e)
fsm_dispatch(&mme_ue->sm, (fsm_event_t*)e);
if (FSM_CHECK(&mme_ue->sm, emm_state_exception))
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK, pkbuf_free(pkbuf); break,
"gtp send failed");
}
else
{
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK, pkbuf_free(pkbuf); break,
"s1ap send failed");
}
rv = mme_send_ue_context_release_command(mme_ue, enb_ue);
d_assert(rv == CORE_OK,,
"mme_send_ue_context_release_command failed");
}
pkbuf_free(pkbuf);

View file

@ -14,6 +14,7 @@
#include "s1ap_build.h"
#include "s1ap_handler.h"
#include "mme_path.h"
#include "mme_sm.h"
void s1ap_handle_s1_setup_request(mme_enb_t *enb, s1ap_message_t *message)
@ -385,7 +386,7 @@ void s1ap_handle_initial_context_setup_failure(
d_assert(mme_ue,,);
if (mme_ue && FSM_CHECK(&mme_ue->sm, emm_state_registered))
{
d_trace(5, " Registered State\n");
d_trace(5, " EMM-Registered\n");
/*
* 19.2.2.3 in Spec 36.300
@ -435,23 +436,11 @@ void s1ap_handle_initial_context_setup_failure(
}
else
{
d_trace(5, " NOT Registered State\n");
d_trace(5, " NOT EMM-Registered\n");
d_assert(mme_ue,,);
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
d_trace(5, " WITH Delete Sesson\n");
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK,,
"mme_gtp_send_delete_all_sessions failed");
}
else
{
d_trace(5, " WITHOUT Delete Sesson\n");
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK,, "s1ap send error");
}
rv = mme_send_ue_context_release_command(mme_ue, enb_ue);
d_assert(rv == CORE_OK,,
"mme_send_ue_context_release_command failed");
}
}
@ -592,21 +581,9 @@ void s1ap_handle_ue_context_release_request(
else
{
d_trace(5, " NOT EMM-Registered\n");
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
d_trace(5, " WITH Delete Sesson\n");
rv = mme_gtp_send_delete_all_sessions(mme_ue);
d_assert(rv == CORE_OK,,
"mme_gtp_send_delete_all_sessions failed");
}
else
{
d_trace(5, " WITHOUT Delete Sesson\n");
rv = s1ap_send_ue_context_release_command(enb_ue,
S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK,, "s1ap send error");
}
rv = mme_send_ue_context_release_command(mme_ue, enb_ue);
d_assert(rv == CORE_OK,,
"mme_send_ue_context_release_command failed");
}
}

View file

@ -1560,10 +1560,12 @@ abts_suite *test_attach(abts_suite *suite)
{
suite = ADD_SUITE(suite)
#if 0
abts_run_test(suite, attach_test1, NULL);
abts_run_test(suite, attach_test2, NULL);
abts_run_test(suite, attach_test3, NULL);
abts_run_test(suite, attach_test4, NULL);
#endif
abts_run_test(suite, attach_test5, NULL);
return suite;