mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-02 13:03:31 +00:00
rollback state machine
This commit is contained in:
136
src/mme/emm_sm.c
136
src/mme/emm_sm.c
@@ -84,17 +84,22 @@ void emm_state_detached(fsm_t *s, event_t *e)
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("No Security Context");
|
||||
nas_send_service_reject(mme_ue, EMM_CAUSE_MAC_FAILURE);
|
||||
FSM_TRAN(s, &emm_state_exception);
|
||||
if (MME_HAVE_SGW_S11_PATH(mme_ue))
|
||||
{
|
||||
mme_s6a_send_air(mme_ue, NULL);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("No Session");
|
||||
nas_send_service_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, &emm_state_exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
d_warn("Unknown UE");
|
||||
nas_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -167,19 +172,23 @@ void emm_state_detached(fsm_t *s, event_t *e)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send TAU reject */
|
||||
d_error("No Security Context");
|
||||
nas_send_tau_reject(mme_ue, EMM_CAUSE_MAC_FAILURE);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
if (MME_HAVE_SGW_S11_PATH(mme_ue))
|
||||
{
|
||||
mme_s6a_send_air(mme_ue, NULL);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send TAU reject */
|
||||
d_error("No Session");
|
||||
nas_send_tau_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send TAU reject */
|
||||
d_error("Unknown UE");
|
||||
nas_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -264,12 +273,54 @@ void emm_state_identity(fsm_t *s, event_t *e)
|
||||
}
|
||||
}
|
||||
else if (mme_ue->nas_eps.type ==
|
||||
MME_EPS_TYPE_SERVICE_REQUEST ||
|
||||
mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST)
|
||||
MME_EPS_TYPE_SERVICE_REQUEST)
|
||||
{
|
||||
d_assert(0,,
|
||||
"Invalid EPS Type : %d", mme_ue->nas_eps.type);
|
||||
FSM_TRAN(s, &emm_state_exception);
|
||||
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
|
||||
{
|
||||
rv = s1ap_send_initial_context_setup_request(
|
||||
mme_ue);
|
||||
d_assert(rv == CORE_OK,, "s1ap send error");
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_attached);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MME_HAVE_SGW_S11_PATH(mme_ue))
|
||||
{
|
||||
mme_s6a_send_air(mme_ue, NULL);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("No Session");
|
||||
nas_send_service_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, &emm_state_exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST)
|
||||
{
|
||||
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
|
||||
{
|
||||
/* Send TAU Accept */
|
||||
rv = nas_send_tau_accept(mme_ue);
|
||||
d_assert(rv == CORE_OK,, "send send failed");
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MME_HAVE_SGW_S11_PATH(mme_ue))
|
||||
{
|
||||
mme_s6a_send_air(mme_ue, NULL);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send TAU reject */
|
||||
d_error("No Session");
|
||||
nas_send_tau_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -617,7 +668,7 @@ void emm_state_attached(fsm_t *s, event_t *e)
|
||||
if (rv != CORE_OK)
|
||||
{
|
||||
d_error("emm_handle_service_request() failed "
|
||||
"in emm_state_attached");
|
||||
"in emm_state_detached");
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
break;
|
||||
}
|
||||
@@ -631,17 +682,22 @@ void emm_state_attached(fsm_t *s, event_t *e)
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("No Secuity Context");
|
||||
nas_send_service_reject(mme_ue, EMM_CAUSE_MAC_FAILURE);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
if (MME_HAVE_SGW_S11_PATH(mme_ue))
|
||||
{
|
||||
mme_s6a_send_air(mme_ue, NULL);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("No Session");
|
||||
nas_send_service_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, &emm_state_exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
d_error("Unknown UE");
|
||||
nas_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -728,19 +784,23 @@ void emm_state_attached(fsm_t *s, event_t *e)
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send TAU reject */
|
||||
d_error("No Security Context");
|
||||
nas_send_tau_reject(mme_ue, EMM_CAUSE_MAC_FAILURE);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
if (MME_HAVE_SGW_S11_PATH(mme_ue))
|
||||
{
|
||||
mme_s6a_send_air(mme_ue, NULL);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send TAU reject */
|
||||
d_error("No Session");
|
||||
nas_send_tau_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Send TAU reject */
|
||||
d_error("Unknown UE");
|
||||
nas_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
FSM_TRAN(s, emm_state_exception);
|
||||
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1338,8 +1338,9 @@ static void attach_test5(abts_case *tc, void *data)
|
||||
|
||||
core_sleep(time_from_msec(300));
|
||||
|
||||
mme_self()->mme_ue_s1ap_id = 0;
|
||||
mme_self()->mme_ue_s1ap_id = 1;
|
||||
|
||||
#if 0
|
||||
/* Send Service request */
|
||||
rv = tests1ap_build_service_request(&sendbuf, msgindex);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
@@ -1363,6 +1364,7 @@ static void attach_test5(abts_case *tc, void *data)
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
rv = tests1ap_enb_send(sock, sendbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
#endif
|
||||
|
||||
/***********************************************************************
|
||||
* Attach Request : Known IMSI, Integrity Protected, No Security Context
|
||||
@@ -1455,6 +1457,7 @@ static void attach_test5(abts_case *tc, void *data)
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
pkbuf_free(recvbuf);
|
||||
|
||||
#if 0
|
||||
/* Receive UE Context Release Command */
|
||||
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
|
||||
rv = tests1ap_enb_read(sock, recvbuf);
|
||||
@@ -1484,6 +1487,7 @@ static void attach_test5(abts_case *tc, void *data)
|
||||
rv = tests1ap_enb_read(sock, recvbuf);
|
||||
ABTS_INT_EQUAL(tc, CORE_OK, rv);
|
||||
pkbuf_free(recvbuf);
|
||||
#endif
|
||||
|
||||
core_sleep(time_from_msec(300));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user