We cannot initialize the state in all cases. [#569]

In TS24.501 Ch 5.5.1.3.8 Abnormal cases on the network side

d) REGISTRATION REQUEST with 5GS registration type IE set to
"mobility registration updating" or "periodic registration updating"
received after the REGISTRATION ACCEPT message has been sent and
before the REGISTRATION COMPLETE message is received.

Since, we have to do this special case, it is desirable
to handle it directly inside the state(gmm-sm.c).
This commit is contained in:
Sukchan Lee 2020-09-21 14:37:17 -04:00
parent 87077c91cb
commit d73ff77031
10 changed files with 139 additions and 24 deletions

View File

@ -742,6 +742,26 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
/*
* Pull #569 : State should be initialized again.
*
* However, we cannot initialize the state in all cases.
*
* In TS24.501 Ch 5.5.1.3.8 Abnormal cases on the network side
*
* d) REGISTRATION REQUEST with 5GS registration type IE set to
* "mobility registration updating" or "periodic registration updating"
* received after the REGISTRATION ACCEPT message has been sent and
* before the REGISTRATION COMPLETE message is received.
*
* Since, we have to do this special case, it is desirable
* to handle it directly inside the state(gmm-sm.c).
*/
#if 0
amf_ue_fsm_fini(amf_ue);
amf_ue_fsm_init(amf_ue);
#endif
}
amf_ue_associate_ran_ue(amf_ue, ran_ue);
}

View File

@ -1102,7 +1102,6 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue)
{
amf_gnb_t *gnb = NULL;
amf_ue_t *amf_ue = NULL;
amf_event_t e;
ogs_assert(ran_ue);
gnb = ran_ue->gnb;
@ -1142,11 +1141,7 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue)
ogs_app()->timer_mgr, amf_timer_t3570_expire, amf_ue);
amf_ue->t3570.pkbuf = NULL;
/* Create FSM */
memset(&e, 0, sizeof(e));
e.amf_ue = amf_ue;
ogs_fsm_create(&amf_ue->sm, gmm_state_initial, gmm_state_final);
ogs_fsm_init(&amf_ue->sm, &e);
amf_ue_fsm_init(amf_ue);
ogs_list_add(&self.amf_ue_list, amf_ue);
@ -1159,16 +1154,12 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue)
void amf_ue_remove(amf_ue_t *amf_ue)
{
int i;
amf_event_t e;
ogs_assert(amf_ue);
ogs_list_remove(&self.amf_ue_list, amf_ue);
memset(&e, 0, sizeof(e));
e.amf_ue = amf_ue;
ogs_fsm_fini(&amf_ue->sm, &e);
ogs_fsm_delete(&amf_ue->sm);
amf_ue_fsm_fini(amf_ue);
/* Clear hash table */
if (amf_ue->m_tmsi) {
@ -1232,6 +1223,30 @@ void amf_ue_remove_all()
amf_ue_remove(amf_ue);
}
void amf_ue_fsm_init(amf_ue_t *amf_ue)
{
amf_event_t e;
ogs_assert(amf_ue);
memset(&e, 0, sizeof(e));
e.amf_ue = amf_ue;
ogs_fsm_create(&amf_ue->sm, gmm_state_initial, gmm_state_final);
ogs_fsm_init(&amf_ue->sm, &e);
}
void amf_ue_fsm_fini(amf_ue_t *amf_ue)
{
amf_event_t e;
ogs_assert(amf_ue);
memset(&e, 0, sizeof(e));
e.amf_ue = amf_ue;
ogs_fsm_fini(&amf_ue->sm, &e);
ogs_fsm_delete(&amf_ue->sm);
}
amf_ue_t *amf_ue_find_by_guti(ogs_nas_5gs_guti_t *guti)
{
ogs_assert(guti);

View File

@ -489,6 +489,9 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue);
void amf_ue_remove(amf_ue_t *amf_ue);
void amf_ue_remove_all(void);
void amf_ue_fsm_init(amf_ue_t *amf_ue);
void amf_ue_fsm_fini(amf_ue_t *amf_ue);
amf_ue_t *amf_ue_find_by_guti(ogs_nas_5gs_guti_t *nas_guti);
amf_ue_t *amf_ue_find_by_teid(uint32_t teid);
amf_ue_t *amf_ue_find_by_suci(char *suci);

View File

@ -199,6 +199,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
ogs_error("gmm_handle_service_update() failed");
OGS_FSM_TRAN(s, gmm_state_exception);
}
OGS_FSM_TRAN(s, gmm_state_registered);
break;
case OGS_NAS_5GS_IDENTITY_RESPONSE:

View File

@ -434,6 +434,26 @@ void ngap_handle_initial_ue_message(amf_gnb_t *gnb, ogs_ngap_message_t *message)
ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
/*
* Pull #569 : State should be initialized again.
*
* However, we cannot initialize the state in all cases.
*
* In TS24.501 Ch 5.5.1.3.8 Abnormal cases on the network side
*
* d) REGISTRATION REQUEST with 5GS registration type IE set to
* "mobility registration updating" or "periodic registration updating"
* received after the REGISTRATION ACCEPT message has been sent and
* before the REGISTRATION COMPLETE message is received.
*
* Since, we have to do this special case, it is desirable
* to handle it directly inside the state(gmm-sm.c).
*/
#if 0
amf_ue_fsm_fini(amf_ue);
amf_ue_fsm_init(amf_ue);
#endif
}
amf_ue_associate_ran_ue(amf_ue, ran_ue);
}

View File

@ -153,6 +153,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
}
s1ap_send_initial_context_setup_request(mme_ue);
OGS_FSM_TRAN(s, &emm_state_registered);
break;
}
@ -274,6 +275,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
} else {
ogs_fatal("Invalid Procedure Code[%d]", (int)e->s1ap_code);
}
OGS_FSM_TRAN(s, &emm_state_registered);
break;

View File

@ -2199,7 +2199,6 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
{
mme_enb_t *enb = NULL;
mme_ue_t *mme_ue = NULL;
mme_event_t e;
char buf[OGS_ADDRSTRLEN];
@ -2256,11 +2255,7 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
ogs_app()->timer_mgr, mme_timer_t3470_expire, mme_ue);
mme_ue->t3470.pkbuf = NULL;
/* Create FSM */
memset(&e, 0, sizeof(e));
e.mme_ue = mme_ue;
ogs_fsm_create(&mme_ue->sm, emm_state_initial, emm_state_final);
ogs_fsm_init(&mme_ue->sm, &e);
mme_ue_fsm_init(mme_ue);
ogs_list_add(&self.mme_ue_list, mme_ue);
@ -2272,16 +2267,11 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
void mme_ue_remove(mme_ue_t *mme_ue)
{
mme_event_t e;
ogs_assert(mme_ue);
ogs_list_remove(&self.mme_ue_list, mme_ue);
memset(&e, 0, sizeof(e));
e.mme_ue = mme_ue;
ogs_fsm_fini(&mme_ue->sm, &e);
ogs_fsm_delete(&mme_ue->sm);
mme_ue_fsm_fini(mme_ue);
/* Clear hash table */
if (mme_ue->m_tmsi) {
@ -2325,7 +2315,7 @@ void mme_ue_remove(mme_ue_t *mme_ue)
ogs_list_count(&self.mme_ue_list));
}
void mme_ue_remove_all()
void mme_ue_remove_all(void)
{
mme_ue_t *mme_ue = NULL, *next = NULL;;
@ -2333,6 +2323,30 @@ void mme_ue_remove_all()
mme_ue_remove(mme_ue);
}
void mme_ue_fsm_init(mme_ue_t *mme_ue)
{
mme_event_t e;
ogs_assert(mme_ue);
memset(&e, 0, sizeof(e));
e.mme_ue = mme_ue;
ogs_fsm_create(&mme_ue->sm, emm_state_initial, emm_state_final);
ogs_fsm_init(&mme_ue->sm, &e);
}
void mme_ue_fsm_fini(mme_ue_t *mme_ue)
{
mme_event_t e;
ogs_assert(mme_ue);
memset(&e, 0, sizeof(e));
e.mme_ue = mme_ue;
ogs_fsm_fini(&mme_ue->sm, &e);
ogs_fsm_delete(&mme_ue->sm);
}
mme_ue_t *mme_ue_find_by_imsi_bcd(char *imsi_bcd)
{
uint8_t imsi[OGS_MAX_IMSI_LEN];

View File

@ -690,6 +690,9 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue);
void mme_ue_remove(mme_ue_t *mme_ue);
void mme_ue_remove_all(void);
void mme_ue_fsm_init(mme_ue_t *mme_ue);
void mme_ue_fsm_fini(mme_ue_t *mme_ue);
mme_ue_t *mme_ue_find_by_imsi(uint8_t *imsi, int imsi_len);
mme_ue_t *mme_ue_find_by_imsi_bcd(char *imsi_bcd);
mme_ue_t *mme_ue_find_by_guti(ogs_nas_eps_guti_t *nas_guti);

View File

@ -342,6 +342,24 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
/*
* Pull #569 : State should be initialized again.
*
* However, we cannot initialize the state in all cases.
*
* In TS24.301 Ch 5.5.1.2.7 Abnormal cases on the network side
*
* d) ATTACH REQUEST received after the ATTACH ACCEPT message has been sent
* and before the ATTACH COMPLETE message is received
*
* Since, we have to do this special case, it is desirable
* to handle it directly inside the state(emm-sm.c).
*/
#if 0
mme_ue_fsm_fini(mme_ue);
mme_ue_fsm_init(mme_ue);
#endif
}
mme_ue_associate_enb_ue(mme_ue, enb_ue);
}

View File

@ -303,6 +303,24 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message)
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
/*
* Pull #569 : State should be initialized again.
*
* However, we cannot initialize the state in all cases.
*
* In TS24.301 Ch 5.5.1.2.7 Abnormal cases on the network side
*
* d) ATTACH REQUEST received after the ATTACH ACCEPT message has been sent
* and before the ATTACH COMPLETE message is received
*
* Since, we have to do this special case, it is desirable
* to handle it directly inside the state(emm-sm.c).
*/
#if 0
mme_ue_fsm_fini(mme_ue);
mme_ue_fsm_init(mme_ue);
#endif
}
mme_ue_associate_enb_ue(mme_ue, enb_ue);
}