forked from acouzens/open5gs
[AMF/MME] Refactor SM to prevent crash (#1912)
This commit is contained in:
parent
3f772823a6
commit
8ce18b3828
|
@ -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)
|
||||
|
||||
|
|
476
src/amf/gmm-sm.c
476
src/amf/gmm-sm.c
|
@ -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);
|
||||
|
||||
|
|
201
src/mme/emm-sm.c
201
src/mme/emm-sm.c
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue