diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 3386a33f8..a1d3668b8 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1398,9 +1398,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; case OGS_NAS_5GS_5GMM_STATUS: - ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->suci, - nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); + ogs_warn("[%s] 5GMM STATUS : Cause[%d]", + amf_ue->suci, nas_message->gmm.gmm_status.gmm_cause); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: @@ -1648,7 +1647,6 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_5GMM_STATUS: ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->suci, nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: @@ -1954,7 +1952,6 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_5GMM_STATUS: ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->supi, nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: @@ -2315,7 +2312,6 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_5GMM_STATUS: ogs_warn("[%s] 5GMM STATUS : Cause[%d]", amf_ue->supi, nas_message->gmm.gmm_status.gmm_cause); - OGS_FSM_TRAN(s, &gmm_state_exception); break; case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE: diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 27b59681a..29e737e94 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -814,9 +814,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e, case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: @@ -1037,9 +1035,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) break; case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); @@ -1251,9 +1247,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) break; case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); @@ -1503,9 +1497,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_EMM_STATUS: ogs_warn("EMM STATUS : IMSI[%s] Cause[%d]", - mme_ue->imsi_bcd, - message->emm.emm_status.emm_cause); - OGS_FSM_TRAN(s, &emm_state_exception); + mme_ue->imsi_bcd, message->emm.emm_status.emm_cause); break; case OGS_NAS_EPS_DETACH_REQUEST: ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); diff --git a/tests/attach/emm-status-test.c b/tests/attach/emm-status-test.c index e0efc4bdc..51b6b80e0 100644 --- a/tests/attach/emm-status-test.c +++ b/tests/attach/emm-status-test.c @@ -35,6 +35,9 @@ static void test1_func(abts_case *tc, void *data) test_sess_t *sess = NULL; test_bearer_t *bearer = NULL; + uint32_t enb_ue_s1ap_id; + uint64_t mme_ue_s1ap_id; + bson_t *doc = NULL; /* Setup Test UE & Session Context */ @@ -53,7 +56,7 @@ static void test1_func(abts_case *tc, void *data) ogs_assert(test_ue); test_ue->e_cgi.cell_id = 0x1079baf0; - test_ue->nas.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.ksi = 0; test_ue->nas.value = OGS_NAS_ATTACH_TYPE_COMBINED_EPS_IMSI_ATTACH; test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; @@ -88,7 +91,9 @@ static void test1_func(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); /* Send Attach Request */ - sess->pdn_connectivity_param.pco = 1; + memset(&sess->pdn_connectivity_param, + 0, sizeof(sess->pdn_connectivity_param)); + sess->pdn_connectivity_param.eit = 1; sess->pdn_connectivity_param.request_type = OGS_NAS_EPS_REQUEST_TYPE_INITIAL; esmbuf = testesm_build_pdn_connectivity_request(sess, false); @@ -101,9 +106,10 @@ static void test1_func(abts_case *tc, void *data) test_ue->attach_request_param.tmsi_status = 1; test_ue->attach_request_param.mobile_station_classmark_2 = 1; test_ue->attach_request_param.ue_usage_setting = 1; - emmbuf = testemm_build_attach_request(test_ue, esmbuf, false, false); + emmbuf = testemm_build_attach_request(test_ue, esmbuf, true, false); ABTS_PTR_NOTNULL(tc, emmbuf); + memset(&test_ue->initial_ue_param, 0, sizeof(test_ue->initial_ue_param)); sendbuf = test_s1ap_build_initial_ue_message( test_ue, emmbuf, S1AP_RRC_Establishment_Cause_mo_Signalling, false); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -137,6 +143,20 @@ static void test1_func(abts_case *tc, void *data) rv = testenb_s1ap_send(s1ap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive ESM Information Request */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send ESM Information Response */ + sess->esm_information_param.epco = 1; + esmbuf = testesm_build_esm_information_response(sess); + ABTS_PTR_NOTNULL(tc, esmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive Initial Context Setup Request + * Attach Accept + * Activate Default Bearer Context Request */ @@ -153,6 +173,44 @@ static void test1_func(abts_case *tc, void *data) rv = testenb_s1ap_send(s1ap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Send UE Capability Info Indication */ + sendbuf = tests1ap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Initial Context Setup Response */ + sendbuf = test_s1ap_build_initial_context_setup_response(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Attach Complete + Activate default EPS bearer cotext accept */ + test_ue->nr_cgi.cell_id = 0x1234502; + bearer = test_bearer_find_by_ue_ebi(test_ue, 5); + ogs_assert(bearer); + esmbuf = testesm_build_activate_default_eps_bearer_context_accept( + bearer, false); + ABTS_PTR_NOTNULL(tc, esmbuf); + emmbuf = testemm_build_attach_complete(test_ue, esmbuf); + ABTS_PTR_NOTNULL(tc, emmbuf); + sendbuf = test_s1ap_build_uplink_nas_transport(test_ue, emmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive EMM information */ + recvbuf = testenb_s1ap_read(s1ap); + ABTS_PTR_NOTNULL(tc, recvbuf); + tests1ap_recv(test_ue, recvbuf); + + /* Send UE Context Release Request */ + sendbuf = test_s1ap_build_ue_context_release_request(test_ue, + S1AP_Cause_PR_radioNetwork, S1AP_CauseRadioNetwork_user_inactivity); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testenb_s1ap_send(s1ap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive UE Context Release Command */ recvbuf = testenb_s1ap_read(s1ap); ABTS_PTR_NOTNULL(tc, recvbuf); diff --git a/tests/registration/gmm-status-test.c b/tests/registration/gmm-status-test.c index 86abfbd96..dfffcc555 100644 --- a/tests/registration/gmm-status-test.c +++ b/tests/registration/gmm-status-test.c @@ -73,7 +73,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, gtpu); /* Send NG-Setup Reqeust */ - sendbuf = testngap_build_ng_setup_request(0x4000, 28); + sendbuf = testngap_build_ng_setup_request(0x4000, 22); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -89,6 +89,7 @@ static void test1_func(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); /* Send Registration request */ + test_ue->registration_request_param.guti = 1; gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); ABTS_PTR_NOTNULL(tc, gmmbuf); @@ -106,6 +107,19 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive Identity request */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Identity response */ + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive Authentication request */ recvbuf = testgnb_ngap_read(ngap); ABTS_PTR_NOTNULL(tc, recvbuf); @@ -132,6 +146,15 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Send GMM Status */ + gmmbuf = testgmm_build_gmm_status(test_ue, + OGS_5GMM_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Receive InitialContextSetupRequest + * Registration accept */ recvbuf = testgnb_ngap_read(ngap); @@ -141,6 +164,12 @@ static void test1_func(abts_case *tc, void *data) NGAP_ProcedureCode_id_InitialContextSetup, test_ue->ngap_procedure_code); + /* Send UERadioCapabilityInfoIndication */ + sendbuf = testngap_build_ue_radio_capability_info_indication(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + /* Send InitialContextSetupResponse */ sendbuf = testngap_build_initial_context_setup_response(test_ue, false); ABTS_PTR_NOTNULL(tc, sendbuf); @@ -167,7 +196,7 @@ static void test1_func(abts_case *tc, void *data) sess->ul_nas_transport_param.request_type = OGS_NAS_5GS_REQUEST_TYPE_INITIAL; sess->ul_nas_transport_param.dnn = 1; - sess->ul_nas_transport_param.s_nssai = 1; + sess->ul_nas_transport_param.s_nssai = 0; sess->pdu_session_establishment_param.ssc_mode = 1; sess->pdu_session_establishment_param.epco = 1; @@ -192,24 +221,16 @@ static void test1_func(abts_case *tc, void *data) NGAP_ProcedureCode_id_PDUSessionResourceSetup, test_ue->ngap_procedure_code); - /* - * Related to issue #536. When running with VirtualBox 1 Core, - * AMF sends namf-callback response very late. In SMF, - * the Session context has already been removed, so an assertion occurs. - * - * It seems to be related to the response part of MHD. We will check - * if the same situation occurs after upgrading to nghttp2. - * - * If this issue still occurs on nghttp2, - * I will remove the assertion from SMF. - */ - ogs_msleep(100); + /* Send PDUSessionResourceSetupResponse */ + sendbuf = testngap_sess_build_pdu_session_resource_setup_response(sess); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); - /* Send GMM Status */ - gmmbuf = testgmm_build_gmm_status(test_ue, - OGS_5GMM_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_THE_PROTOCOL_STATE); - ABTS_PTR_NOTNULL(tc, gmmbuf); - sendbuf = testngap_build_uplink_nas_transport(test_ue, gmmbuf); + /* Send UEContextReleaseRequest */ + sendbuf = testngap_build_ue_context_release_request(test_ue, + NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, + true); ABTS_PTR_NOTNULL(tc, sendbuf); rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); @@ -228,6 +249,8 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); + ogs_msleep(300); + /********** Remove Subscriber in Database */ ABTS_INT_EQUAL(tc, OGS_OK, test_db_remove_ue(test_ue));