[AMF/MME] Refactor SM to prevent crash (#1912)

This commit is contained in:
Sukchan Lee 2022-11-26 21:38:46 +09:00
parent 3f772823a6
commit 8ce18b3828
3 changed files with 431 additions and 248 deletions

View File

@ -113,7 +113,7 @@ void ogs_log_hexdump_func(ogs_log_level_e level, int domain_id,
#define ogs_assert_if_reached() \
do { \
ogs_warn("%s: should not be reached.", OGS_FUNC); \
ogs_fatal("%s: should not be reached.", OGS_FUNC); \
ogs_abort(); \
} while(0)

View File

@ -54,13 +54,20 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e);
void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
{
amf_ue_t *amf_ue = NULL;
ogs_assert(s);
amf_sess_t *sess = NULL;
ogs_sbi_message_t *sbi_message = NULL;
ogs_assert(e);
amf_sm_debug(e);
amf_ue = e->amf_ue;
ogs_assert(amf_ue);
if (e->sess) {
sess = e->sess;
amf_ue = sess->amf_ue;
ogs_assert(amf_ue);
} else {
amf_ue = e->amf_ue;
ogs_assert(amf_ue);
}
switch (e->h.id) {
case OGS_FSM_ENTRY_SIG:
@ -71,35 +78,190 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
break;
case OGS_FSM_EXIT_SIG:
break;
default:
break;
}
common_register_state(s, e);
case AMF_EVENT_5GMM_MESSAGE:
common_register_state(s, e);
break;
case AMF_EVENT_5GMM_TIMER:
switch (e->h.timer_id) {
case AMF_TIMER_T3570:
if (amf_ue->t3570.retry_count >=
amf_timer_cfg(AMF_TIMER_T3570)->max_count) {
ogs_warn("Retransmission of Identity-Request failed. "
"Stop retransmission");
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3570.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
}
break;
case AMF_TIMER_T3522:
if (amf_ue->t3522.retry_count >=
amf_timer_cfg(AMF_TIMER_T3522)->max_count) {
ogs_warn("Retransmission of Deregistration-Request failed. "
"Stop retransmission");
CLEAR_AMF_UE_TIMER(amf_ue->t3522);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3522.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_request(amf_ue,
OpenAPI_deregistration_reason_NULL));
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
amf_timer_get_name(e->h.timer_id), e->h.timer_id);
}
break;
case OGS_EVENT_SBI_CLIENT:
sbi_message = e->h.sbi.message;
ogs_assert(sbi_message);
SWITCH(sbi_message->h.service.name)
CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH)
SWITCH(sbi_message->h.resource.component[0])
CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS)
if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED &&
sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
if (sbi_message->res_status ==
OGS_SBI_HTTP_STATUS_NOT_FOUND) {
ogs_warn("[%s] Cannot find SUCI [%d]",
amf_ue->suci, sbi_message->res_status);
} else {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->suci, sbi_message->res_status);
}
break;
}
SWITCH(sbi_message->h.method)
CASE(OGS_SBI_HTTP_METHOD_POST)
ogs_warn("[%s] Ignore SBI message", amf_ue->suci);
break;
CASE(OGS_SBI_HTTP_METHOD_PUT)
ogs_warn("[%s] Ignore SBI message", amf_ue->suci);
break;
DEFAULT
ogs_error("[%s] Invalid HTTP method [%s]",
amf_ue->suci, sbi_message->h.method);
ogs_assert_if_reached();
END
break;
DEFAULT
ogs_error("Invalid resource name [%s]",
sbi_message->h.resource.component[0]);
ogs_assert_if_reached();
END
break;
CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM)
SWITCH(sbi_message->h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_REGISTRATIONS)
if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED &&
sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT &&
sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status);
break;
}
SWITCH(sbi_message->h.method)
CASE(OGS_SBI_HTTP_METHOD_PUT)
ogs_warn("[%s] Ignore SBI message", amf_ue->supi);
break;
DEFAULT
ogs_error("[%s] Invalid HTTP method [%s]",
amf_ue->suci, sbi_message->h.method);
ogs_assert_if_reached();
END
break;
DEFAULT
ogs_error("Invalid resource name [%s]",
sbi_message->h.resource.component[1]);
ogs_assert_if_reached();
END
break;
CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM)
SWITCH(sbi_message->h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA)
CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA)
CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS)
if ((sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) &&
(sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED)) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status);
break;
}
ogs_warn("[%s] Ignore SBI message", amf_ue->supi);
break;
DEFAULT
ogs_error("Invalid resource name [%s]",
sbi_message->h.resource.component[1]);
ogs_assert_if_reached();
END
break;
CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL)
SWITCH(sbi_message->h.resource.component[0])
CASE(OGS_SBI_RESOURCE_NAME_POLICIES)
SWITCH(sbi_message->h.method)
CASE(OGS_SBI_HTTP_METHOD_POST)
ogs_warn("[%s] Ignore SBI message", amf_ue->suci);
break;
CASE(OGS_SBI_HTTP_METHOD_DELETE)
if (!amf_ue->network_initiated_de_reg)
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_accept(amf_ue));
PCF_AM_POLICY_CLEAR(amf_ue);
break;
DEFAULT
ogs_error("Unknown method [%s]", sbi_message->h.method);
ogs_assert_if_reached();
END
break;
DEFAULT
ogs_error("Invalid resource name [%s]",
sbi_message->h.resource.component[0]);
ogs_assert_if_reached();
END
break;
DEFAULT
ogs_error("Invalid service name [%s]", sbi_message->h.service.name);
ogs_assert_if_reached();
END
break;
default:
ogs_error("Unknown event[%s]", amf_event_get_name(e));
}
}
void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
{
ogs_assert(s);
ogs_assert(e);
amf_sm_debug(e);
common_register_state(s, e);
}
static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
{
int rv, xact_count = 0;
ogs_nas_5gmm_cause_t gmm_cause;
amf_ue_t *amf_ue = NULL;
amf_sess_t *sess = NULL;
ran_ue_t *ran_ue = NULL;
ogs_nas_5gs_message_t *nas_message = NULL;
ogs_nas_security_header_type_t h;
ogs_sbi_response_t *sbi_response = NULL;
ogs_sbi_message_t *sbi_message = NULL;
ogs_assert(e);
@ -119,6 +281,126 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
case OGS_FSM_EXIT_SIG:
break;
case AMF_EVENT_5GMM_MESSAGE:
common_register_state(s, e);
break;
case AMF_EVENT_5GMM_TIMER:
switch (e->h.timer_id) {
case AMF_TIMER_T3513:
if (amf_ue->t3513.retry_count >=
amf_timer_cfg(AMF_TIMER_T3513)->max_count) {
amf_sess_t *sess = NULL;
/* Paging failed */
ogs_warn("[%s] Paging failed. Stop", amf_ue->supi);
ogs_list_for_each(&amf_ue->sess_list, sess) {
if (sess->paging.ongoing == true &&
sess->paging.n1n2_failure_txf_notif_uri != NULL) {
ogs_assert(true ==
amf_sbi_send_n1_n2_failure_notify(
sess,
OpenAPI_n1_n2_message_transfer_cause_UE_NOT_RESPONDING));
}
}
/* Clear Paging Info */
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
/* Clear N2 Transfer */
AMF_UE_CLEAR_N2_TRANSFER(
amf_ue, pdu_session_resource_setup_request);
/* Clear 5GSM Message */
AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue);
/* Clear t3513 Timers */
CLEAR_AMF_UE_TIMER(amf_ue->t3513);
} else {
amf_ue->t3513.retry_count++;
/* If t3513 is timeout, the saved pkbuf is used. */
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
}
break;
case AMF_TIMER_T3555:
if (amf_ue->t3555.retry_count >=
amf_timer_cfg(AMF_TIMER_T3555)->max_count) {
/* Configuration update command failed */
ogs_warn("[%s] Configuration update failed. Stop",
amf_ue->supi);
CLEAR_AMF_UE_TIMER(amf_ue->t3555);
} else {
amf_ue->t3555.retry_count++;
/*
* If t3555 is timeout, the saved pkbuf is used.
* In this case, ack should be set to 1 for timer expiration
*/
ogs_assert(OGS_OK ==
nas_5gs_send_configuration_update_command(amf_ue, NULL));
}
break;
case AMF_TIMER_T3570:
if (amf_ue->t3570.retry_count >=
amf_timer_cfg(AMF_TIMER_T3570)->max_count) {
ogs_warn("Retransmission of Identity-Request failed. "
"Stop retransmission");
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3570.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
amf_timer_get_name(e->h.timer_id), e->h.timer_id);
}
break;
case OGS_EVENT_SBI_CLIENT:
sbi_message = e->h.sbi.message;
ogs_assert(sbi_message);
ogs_error("Invalid service name [%s]", sbi_message->h.service.name);
ogs_assert_if_reached();
break;
default:
ogs_error("Unknown event[%s]", amf_event_get_name(e));
}
}
static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
{
int rv, xact_count = 0;
ogs_nas_5gmm_cause_t gmm_cause;
amf_ue_t *amf_ue = NULL;
amf_sess_t *sess = NULL;
ran_ue_t *ran_ue = NULL;
ogs_nas_5gs_message_t *nas_message = NULL;
ogs_nas_security_header_type_t h;
ogs_assert(e);
if (e->sess) {
sess = e->sess;
amf_ue = sess->amf_ue;
ogs_assert(amf_ue);
} else {
amf_ue = e->amf_ue;
ogs_assert(amf_ue);
}
switch (e->h.id) {
case AMF_EVENT_5GMM_MESSAGE:
nas_message = e->nas.message;
ogs_assert(nas_message);
@ -370,141 +652,9 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
}
break;
case AMF_EVENT_5GMM_TIMER:
switch (e->h.timer_id) {
case AMF_TIMER_T3513:
if (amf_ue->t3513.retry_count >=
amf_timer_cfg(AMF_TIMER_T3513)->max_count) {
amf_sess_t *sess = NULL;
/* Paging failed */
ogs_warn("[%s] Paging failed. Stop", amf_ue->supi);
ogs_list_for_each(&amf_ue->sess_list, sess) {
if (sess->paging.ongoing == true &&
sess->paging.n1n2_failure_txf_notif_uri != NULL) {
ogs_assert(true ==
amf_sbi_send_n1_n2_failure_notify(
sess,
OpenAPI_n1_n2_message_transfer_cause_UE_NOT_RESPONDING));
}
}
/* Clear Paging Info */
AMF_UE_CLEAR_PAGING_INFO(amf_ue);
/* Clear N2 Transfer */
AMF_UE_CLEAR_N2_TRANSFER(
amf_ue, pdu_session_resource_setup_request);
/* Clear 5GSM Message */
AMF_UE_CLEAR_5GSM_MESSAGE(amf_ue);
/* Clear t3513 Timers */
CLEAR_AMF_UE_TIMER(amf_ue->t3513);
} else {
amf_ue->t3513.retry_count++;
/* If t3513 is timeout, the saved pkbuf is used. */
ogs_assert(OGS_OK == ngap_send_paging(amf_ue));
}
break;
case AMF_TIMER_T3555:
if (amf_ue->t3555.retry_count >=
amf_timer_cfg(AMF_TIMER_T3555)->max_count) {
/* Configuration update command failed */
ogs_warn("[%s] Configuration update failed. Stop",
amf_ue->supi);
CLEAR_AMF_UE_TIMER(amf_ue->t3555);
} else {
amf_ue->t3555.retry_count++;
/*
* If t3555 is timeout, the saved pkbuf is used.
* In this case, ack should be set to 1 for timer expiration
*/
ogs_assert(OGS_OK ==
nas_5gs_send_configuration_update_command(amf_ue, NULL));
}
break;
case AMF_TIMER_T3570:
if (amf_ue->t3570.retry_count >=
amf_timer_cfg(AMF_TIMER_T3570)->max_count) {
ogs_warn("Retransmission of Identity-Request failed. "
"Stop retransmission");
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3570.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
}
break;
case AMF_TIMER_T3522:
if (amf_ue->t3522.retry_count >=
amf_timer_cfg(AMF_TIMER_T3522)->max_count) {
ogs_warn("Retransmission of Deregistration-Request failed. "
"Stop retransmission");
CLEAR_AMF_UE_TIMER(amf_ue->t3522);
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else {
amf_ue->t3522.retry_count++;
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_request(amf_ue,
OpenAPI_deregistration_reason_NULL));
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
amf_timer_get_name(e->h.timer_id), e->h.timer_id);
}
break;
case OGS_EVENT_SBI_CLIENT:
sbi_response = e->h.sbi.response;
ogs_assert(sbi_response);
sbi_message = e->h.sbi.message;
ogs_assert(sbi_message);
SWITCH(sbi_message->h.service.name)
CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL)
SWITCH(sbi_message->h.resource.component[0])
CASE(OGS_SBI_RESOURCE_NAME_POLICIES)
SWITCH(sbi_message->h.method)
CASE(OGS_SBI_HTTP_METHOD_DELETE)
if (!amf_ue->network_initiated_de_reg)
ogs_assert(OGS_OK ==
nas_5gs_send_de_registration_accept(amf_ue));
PCF_AM_POLICY_CLEAR(amf_ue);
break;
DEFAULT
ogs_error("Unknown method [%s]", sbi_message->h.method);
ogs_assert_if_reached();
END
break;
DEFAULT
ogs_error("Invalid resource name [%s]",
sbi_message->h.resource.component[0]);
ogs_assert_if_reached();
END
break;
DEFAULT
ogs_error("Invalid service name [%s]", sbi_message->h.service.name);
ogs_assert_if_reached();
END
break;
default:
ogs_error("Unknown event[%s]", amf_event_get_name(e));
ogs_fatal("Unknown event[%s]", amf_event_get_name(e));
ogs_assert_if_reached();
}
}
@ -523,7 +673,6 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
ogs_nas_authentication_failure_parameter_t
*authentication_failure_parameter = NULL;
ogs_sbi_response_t *sbi_response = NULL;
ogs_sbi_message_t *sbi_message = NULL;
ogs_assert(s);
@ -685,8 +834,6 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
}
break;
case OGS_EVENT_SBI_CLIENT:
sbi_response = e->h.sbi.response;
ogs_assert(sbi_response);
sbi_message = e->h.sbi.message;
ogs_assert(sbi_message);
@ -958,7 +1105,6 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
ogs_nas_5gs_message_t *nas_message = NULL;
ogs_nas_security_header_type_t h;
ogs_sbi_response_t *sbi_response = NULL;
ogs_sbi_message_t *sbi_message = NULL;
gmm_configuration_update_command_param_t param;
@ -984,8 +1130,6 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
break;
case OGS_EVENT_SBI_CLIENT:
sbi_response = e->h.sbi.response;
ogs_assert(sbi_response);
sbi_message = e->h.sbi.message;
ogs_assert(sbi_message);

View File

@ -56,11 +56,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e);
void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
mme_ue_t *mme_ue = NULL;
ogs_assert(s);
ogs_assert(e);
mme_sm_debug(e);
ogs_assert(e);
mme_ue = e->mme_ue;
ogs_assert(mme_ue);
@ -72,21 +71,130 @@ void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e)
break;
case OGS_FSM_EXIT_SIG:
break;
default:
break;
}
common_register_state(s, e);
case MME_EVENT_EMM_MESSAGE:
common_register_state(s, e);
break;
case MME_EVENT_EMM_TIMER:
switch (e->timer_id) {
case MME_TIMER_T3470:
if (mme_ue->t3470.retry_count >=
mme_timer_cfg(MME_TIMER_T3470)->max_count) {
ogs_warn("Retransmission of Identity-Request failed. "
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3470.pkbuf);
rv = nas_eps_send_identity_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3470.retry_count++;
} else {
ogs_error("nas_eps_send_identity_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
mme_timer_get_name(e->timer_id), e->timer_id);
}
break;
default:
ogs_error("Unknown event[%s]", mme_event_get_name(e));
}
}
void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
{
ogs_assert(s);
int rv;
mme_ue_t *mme_ue = NULL;
ogs_assert(e);
mme_sm_debug(e);
mme_ue = e->mme_ue;
ogs_assert(mme_ue);
common_register_state(s, e);
switch (e->id) {
case OGS_FSM_ENTRY_SIG:
break;
case OGS_FSM_EXIT_SIG:
break;
case MME_EVENT_EMM_MESSAGE:
common_register_state(s, e);
break;
case MME_EVENT_EMM_TIMER:
switch (e->timer_id) {
case MME_TIMER_T3413:
if (mme_ue->t3413.retry_count >=
mme_timer_cfg(MME_TIMER_T3413)->max_count) {
/* Paging failed */
ogs_warn("Paging to IMSI[%s] failed. Stop paging",
mme_ue->imsi_bcd);
CLEAR_MME_UE_TIMER(mme_ue->t3413);
ogs_assert(MME_PAGING_ONGOING(mme_ue));
mme_send_after_paging(mme_ue, true);
} else {
mme_ue->t3413.retry_count++;
/*
* If t3413 is timeout, the saved pkbuf is used.
* We don't have to set CNDomain.
* So, we just set CNDomain to 0
*/
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, 0));
}
break;
case MME_TIMER_T3470:
if (mme_ue->t3470.retry_count >=
mme_timer_cfg(MME_TIMER_T3470)->max_count) {
ogs_warn("Retransmission of Identity-Request failed. "
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3470.pkbuf);
rv = nas_eps_send_identity_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3470.retry_count++;
} else {
ogs_error("nas_eps_send_identity_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
}
break;
case MME_TIMER_T3422:
if (mme_ue->t3422.retry_count >=
mme_timer_cfg(MME_TIMER_T3422)->max_count) {
ogs_warn("Retransmission of Detach Request failed. "
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3422.pkbuf);
rv = nas_eps_send_detach_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3422.retry_count++;
} else {
ogs_error("nas_eps_send_detach_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
mme_timer_get_name(e->timer_id), e->timer_id);
}
break;
default:
ogs_error("Unknown event[%s]", mme_event_get_name(e));
}
}
static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
@ -104,11 +212,6 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(mme_ue);
switch (e->id) {
case OGS_FSM_ENTRY_SIG:
break;
case OGS_FSM_EXIT_SIG:
break;
case MME_EVENT_EMM_MESSAGE:
message = e->nas_message;
ogs_assert(message);
@ -589,73 +692,9 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
}
break;
case MME_EVENT_EMM_TIMER:
switch (e->timer_id) {
case MME_TIMER_T3413:
if (mme_ue->t3413.retry_count >=
mme_timer_cfg(MME_TIMER_T3413)->max_count) {
/* Paging failed */
ogs_warn("Paging to IMSI[%s] failed. Stop paging",
mme_ue->imsi_bcd);
CLEAR_MME_UE_TIMER(mme_ue->t3413);
ogs_assert(MME_PAGING_ONGOING(mme_ue));
mme_send_after_paging(mme_ue, true);
} else {
mme_ue->t3413.retry_count++;
/*
* If t3413 is timeout, the saved pkbuf is used.
* We don't have to set CNDomain.
* So, we just set CNDomain to 0
*/
ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, 0));
}
break;
case MME_TIMER_T3470:
if (mme_ue->t3470.retry_count >=
mme_timer_cfg(MME_TIMER_T3470)->max_count) {
ogs_warn("Retransmission of Identity-Request failed. "
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3470.pkbuf);
rv = nas_eps_send_identity_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3470.retry_count++;
} else {
ogs_error("nas_eps_send_identity_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
}
break;
case MME_TIMER_T3422:
if (mme_ue->t3422.retry_count >=
mme_timer_cfg(MME_TIMER_T3422)->max_count) {
ogs_warn("Retransmission of Detach Request failed. "
"Stop retransmission");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else {
ogs_assert(mme_ue->t3422.pkbuf);
rv = nas_eps_send_detach_request(mme_ue);
if (rv == OGS_OK) {
mme_ue->t3422.retry_count++;
} else {
ogs_error("nas_eps_send_detach_request() failed");
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
}
}
break;
default:
ogs_error("Unknown timer[%s:%d]",
mme_timer_get_name(e->timer_id), e->timer_id);
}
break;
default:
ogs_error("Unknown event[%s]", mme_event_get_name(e));
ogs_fatal("Unknown event[%s]", mme_event_get_name(e));
ogs_assert_if_reached();
}
}