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:
parent
87077c91cb
commit
d73ff77031
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue