mirror of
https://github.com/open5gs/open5gs.git
synced 2026-05-05 23:37:22 +00:00
UE-initiated detach_request is handled in every EMM-state
This commit is contained in:
parent
d944bca038
commit
57f3baa273
7 changed files with 152 additions and 63 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
51
src/mme/mme_path.c
Normal 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
20
src/mme/mme_path.h
Normal 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__ */
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue