From 6814de5c5788838f9a101bebe7d7a2c75ff83860 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Tue, 9 Apr 2024 11:18:57 +0900 Subject: [PATCH] udpate it --- src/amf/gmm-sm.c | 26 ++++--- tests/common/ngap-build.c | 9 ++- tests/registration/identity-test.c | 117 +++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 14 deletions(-) diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 6231e633c..9b4b42f39 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1475,6 +1475,20 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, break; case OGS_NAS_5GS_IDENTITY_RESPONSE: + if (amf_ue->nas.message_type != OGS_NAS_5GS_REGISTRATION_REQUEST && + amf_ue->nas.message_type != OGS_NAS_5GS_SERVICE_REQUEST) { + ogs_error( + "No Received Registration Request or Service Request"); + r = ngap_send_error_indication2( + ran_ue, + NGAP_Cause_PR_protocol, + NGAP_CauseProtocol_semantic_error); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + OGS_FSM_TRAN(s, gmm_state_exception); + break; + } + CLEAR_AMF_UE_TIMER(amf_ue->t3570); ogs_info("Identity response"); @@ -1484,17 +1498,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_error("gmm_handle_identity_response() " "failed [%d] in type [%d]", gmm_cause, amf_ue->nas.message_type); - if (amf_ue->nas.message_type == - OGS_NAS_5GS_REGISTRATION_REQUEST || - amf_ue->nas.message_type == - OGS_NAS_5GS_SERVICE_REQUEST) - r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); - else - r = ngap_send_error_indication2( - ran_ue, - NGAP_Cause_PR_protocol, - NGAP_CauseProtocol_semantic_error); - + r = nas_5gs_send_gmm_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); diff --git a/tests/common/ngap-build.c b/tests/common/ngap-build.c index 82e837b46..03a311173 100644 --- a/tests/common/ngap-build.c +++ b/tests/common/ngap-build.c @@ -2669,14 +2669,17 @@ ogs_pkbuf_t *test_ngap_build_malformed_initial_ue_message(int i) "000f007300000700 5500034002000026 001d1c0602940a5f 7f5f7e105c000209" "00007fff00000000 004c4c585f4e5f00 79000f405f7a8a1f 58755ff001940078" "954e005a40012800 0340025fc0007040 010000ab4021205f 5f5f5f4f3d7fff10" - "de5f5f765f000000 0000000000000000 00000000000000" - "", + "de5f5f765f000000 0000000000000000 00000000000000", + "000f" + "4049000005005500 0200030026001b1a 7e049a2167e5027e 005c000d0199f907" + "00000000c0000000 0010007900135099 f907000000010099 f907000001e9b19f" + "fa005a4001180070 400100", "", }; uint16_t len[TEST_NGAP_MAX_MESSAGE] = { 119, - 0, + 77, 0, }; char hexbuf[OGS_HUGE_LEN]; diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index 6b8de0585..46d132cdc 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -354,11 +354,128 @@ static void test1_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void test2_func(abts_case *tc, void *data) +{ + int rv; + ogs_socknode_t *ngap; + ogs_socknode_t *gtpu; + ogs_pkbuf_t *gmmbuf; + ogs_pkbuf_t *gsmbuf; + ogs_pkbuf_t *nasbuf; + ogs_pkbuf_t *sendbuf; + ogs_pkbuf_t *recvbuf; + ogs_ngap_message_t message; + int i; + + ogs_nas_5gs_mobile_identity_suci_t mobile_identity_suci; + test_ue_t *test_ue = NULL; + test_sess_t *sess = NULL; + test_bearer_t *qos_flow = NULL; + + bson_t *doc = NULL; + + /* Setup Test UE & Session Context */ + memset(&mobile_identity_suci, 0, sizeof(mobile_identity_suci)); + + mobile_identity_suci.h.supi_format = OGS_NAS_5GS_SUPI_FORMAT_IMSI; + mobile_identity_suci.h.type = OGS_NAS_5GS_MOBILE_IDENTITY_SUCI; + mobile_identity_suci.routing_indicator1 = 0; + mobile_identity_suci.routing_indicator2 = 0xf; + mobile_identity_suci.routing_indicator3 = 0xf; + mobile_identity_suci.routing_indicator4 = 0xf; + mobile_identity_suci.protection_scheme_id = OGS_PROTECTION_SCHEME_NULL; + mobile_identity_suci.home_network_pki_value = 0; + + test_ue = test_ue_add_by_suci(&mobile_identity_suci, "0000203190"); + ogs_assert(test_ue); + + test_ue->nr_cgi.cell_id = 0x40001; + + test_ue->nas.registration.tsc = 0; + test_ue->nas.registration.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; + test_ue->nas.registration.follow_on_request = 1; + test_ue->nas.registration.value = OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL; + + test_ue->k_string = "465b5ce8b199b49faa5f0a2ee238a6bc"; + test_ue->opc_string = "e8ed289deba952e4283b54e88e6183ca"; + + /* gNB connects to AMF */ + ngap = testngap_client(AF_INET); + ABTS_PTR_NOTNULL(tc, ngap); + + /* gNB connects to UPF */ + gtpu = test_gtpu_server(1, AF_INET); + ABTS_PTR_NOTNULL(tc, gtpu); + + /* Send NG-Setup Reqeust */ + sendbuf = testngap_build_ng_setup_request(0x4000, 29); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive NG-Setup Response */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /********** Insert Subscriber in Database */ + doc = test_db_new_simple(test_ue); + ABTS_PTR_NOTNULL(tc, doc); + ABTS_INT_EQUAL(tc, OGS_OK, test_db_insert_ue(test_ue, doc)); + + /* Send Identity response */ + test_ue->ran_ue_ngap_id = 1; + gmmbuf = testgmm_build_identity_response(test_ue); + ABTS_PTR_NOTNULL(tc, gmmbuf); + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, false, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive ErrorIndication */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_ErrorIndication, + test_ue->ngap_procedure_code); + + /* Receive UEContextReleaseCommand */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_UEContextRelease, + test_ue->ngap_procedure_code); + + /* Send UEContextReleaseComplete */ + sendbuf = testngap_build_ue_context_release_complete(test_ue); + ABTS_PTR_NOTNULL(tc, sendbuf); + 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)); + + /* gNB disonncect from UPF */ + testgnb_gtpu_close(gtpu); + + /* gNB disonncect from AMF */ + testgnb_ngap_close(ngap); + + /* Clear Test UE Context */ + test_ue_remove(test_ue); +} + abts_suite *test_identity(abts_suite *suite) { suite = ADD_SUITE(suite) abts_run_test(suite, test1_func, NULL); + abts_run_test(suite, test2_func, NULL); return suite; }