diff --git a/src/amf/gmm-build.c b/src/amf/gmm-build.c index 20de7983f..cb54e34bd 100644 --- a/src/amf/gmm-build.c +++ b/src/amf/gmm-build.c @@ -440,8 +440,7 @@ ogs_pkbuf_t *gmm_build_security_mode_command(amf_ue_t *amf_ue) return nas_5gs_security_encode(amf_ue, &message); } -ogs_pkbuf_t *gmm_build_configuration_update_command( - amf_ue_t *amf_ue, int ack, int red) +ogs_pkbuf_t *gmm_build_configuration_update_command(amf_ue_t *amf_ue, int red) { ogs_nas_5gs_message_t message; ogs_nas_5gs_configuration_update_command_t *configuration_update_command = @@ -451,6 +450,9 @@ ogs_pkbuf_t *gmm_build_configuration_update_command( &configuration_update_command->universal_time_and_local_time_zone; ogs_nas_daylight_saving_time_t *network_daylight_saving_time = &configuration_update_command->network_daylight_saving_time; + ogs_nas_configuration_update_indication_t + *configuration_update_indication = + &configuration_update_command->configuration_update_indication; struct timeval tv; struct tm gmt, local; @@ -480,17 +482,11 @@ ogs_pkbuf_t *gmm_build_configuration_update_command( OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GMM; message.gmm.h.message_type = OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND; - if (ack | red) { - ogs_nas_configuration_update_indication_t - *configuration_update_indication = - &configuration_update_command->configuration_update_indication; + configuration_update_command->presencemask |= + OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_PRESENT; - configuration_update_command->presencemask |= - OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_PRESENT; - - configuration_update_indication->ack = ack; - configuration_update_indication->red = red; - } + configuration_update_indication->ack = 1; + configuration_update_indication->red = red; configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT; diff --git a/src/amf/gmm-build.h b/src/amf/gmm-build.h index e9005c9ba..3cdc85348 100644 --- a/src/amf/gmm-build.h +++ b/src/amf/gmm-build.h @@ -41,8 +41,7 @@ ogs_pkbuf_t *gmm_build_security_mode_command(amf_ue_t *amf_ue); ogs_pkbuf_t *gmm_build_authentication_request(amf_ue_t *amf_ue); ogs_pkbuf_t *gmm_build_authentication_reject(void); -ogs_pkbuf_t *gmm_build_configuration_update_command( - amf_ue_t *amf_ue, int ack, int red); +ogs_pkbuf_t *gmm_build_configuration_update_command(amf_ue_t *amf_ue, int red); ogs_pkbuf_t *gmm_build_dl_nas_transport(amf_sess_t *sess, uint8_t payload_container_type, ogs_pkbuf_t *payload, diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index a358ad0ec..11dcd2e98 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -345,7 +345,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e) * If t3555 is timeout, the saved pkbuf is used. * In this case, ack should be set to 1 for timer expiration */ - nas_5gs_send_configuration_update_command(amf_ue, 1, 0); + nas_5gs_send_configuration_update_command(amf_ue, 0); } break; @@ -873,9 +873,18 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_REGISTRATION_COMPLETE: ogs_debug("[%s] Registration complete", amf_ue->supi); - /* Ack/Red to 0 - * - No need to receive configuration update complete */ - nas_5gs_send_configuration_update_command(amf_ue, 0, 0); + /* + * TS24.501 + * 5.4.4.2 Generic UE configuration update procedure initiated + * by the network + * + * If an acknowledgement from the UE is requested, the AMF shall + * indicate acknowledgement requested in the Configuration update + * indication IE in the CONFIGURATION UPDATE COMMAND message and + * shall start timer T3555. Acknowledgement shall be requested + * for all parameters except when only NITZ is included. + */ + nas_5gs_send_configuration_update_command(amf_ue, 0); OGS_FSM_TRAN(s, &gmm_state_registered); break; diff --git a/src/amf/nas-path.c b/src/amf/nas-path.c index 0535e1f35..21ca37778 100644 --- a/src/amf/nas-path.c +++ b/src/amf/nas-path.c @@ -272,8 +272,7 @@ void nas_5gs_send_security_mode_command(amf_ue_t *amf_ue) ogs_expect(rv == OGS_OK); } -void nas_5gs_send_configuration_update_command( - amf_ue_t *amf_ue, int ack, int red) +void nas_5gs_send_configuration_update_command(amf_ue_t *amf_ue, int red) { int rv; ogs_pkbuf_t *gmmbuf = NULL; @@ -286,15 +285,13 @@ void nas_5gs_send_configuration_update_command( gmmbuf = amf_ue->t3555.pkbuf; ogs_expect_or_return(gmmbuf); } else { - gmmbuf = gmm_build_configuration_update_command(amf_ue, ack, red); + gmmbuf = gmm_build_configuration_update_command(amf_ue, red); ogs_expect_or_return(gmmbuf); } - if (ack) { - amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf); - ogs_timer_start(amf_ue->t3555.timer, - amf_timer_cfg(AMF_TIMER_T3555)->duration); - } + amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf); + ogs_timer_start(amf_ue->t3555.timer, + amf_timer_cfg(AMF_TIMER_T3555)->duration); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); diff --git a/src/amf/nas-path.h b/src/amf/nas-path.h index 72ffca790..87f0f2aaf 100644 --- a/src/amf/nas-path.h +++ b/src/amf/nas-path.h @@ -51,8 +51,7 @@ void nas_5gs_send_authentication_reject(amf_ue_t *amf_ue); void nas_5gs_send_security_mode_command(amf_ue_t *amf_ue); -void nas_5gs_send_configuration_update_command( - amf_ue_t *amf_ue, int ack, int red); +void nas_5gs_send_configuration_update_command(amf_ue_t *amf_ue, int red); void nas_send_pdu_session_establishment_accept(amf_sess_t *sess, ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf); diff --git a/tests/registration/dereg-test.c b/tests/registration/dereg-test.c index c5c50f0f5..1e4b9cda1 100644 --- a/tests/registration/dereg-test.c +++ b/tests/registration/dereg-test.c @@ -281,6 +281,14 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); @@ -292,16 +300,6 @@ static void test1_func(abts_case *tc, void *data) rv = testgnb_ngap_send(ngap, sendbuf); ABTS_INT_EQUAL(tc, OGS_OK, rv); -#if 0 /* No need to send configuration update complete */ - /* Send Configuration update complete */ - gmmbuf = testgmm_build_configuration_update_complete(&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); -#endif - /* Receive PDU session establishment accept */ recvbuf = testgnb_ngap_read(ngap); ABTS_PTR_NOTNULL(tc, recvbuf); diff --git a/tests/registration/gmm-status-test.c b/tests/registration/gmm-status-test.c index 0d0696b37..b7da8ddd9 100644 --- a/tests/registration/gmm-status-test.c +++ b/tests/registration/gmm-status-test.c @@ -269,6 +269,14 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); diff --git a/tests/registration/guti-test.c b/tests/registration/guti-test.c index 01f746794..680e27c40 100644 --- a/tests/registration/guti-test.c +++ b/tests/registration/guti-test.c @@ -289,6 +289,14 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); @@ -467,6 +475,14 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); @@ -793,6 +809,14 @@ static void test2_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); diff --git a/tests/registration/identity-test.c b/tests/registration/identity-test.c index 6710f53c0..0a1c4f4af 100644 --- a/tests/registration/identity-test.c +++ b/tests/registration/identity-test.c @@ -275,6 +275,14 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); diff --git a/tests/registration/idle-test.c b/tests/registration/idle-test.c index 32d8f622e..59eeaa08e 100644 --- a/tests/registration/idle-test.c +++ b/tests/registration/idle-test.c @@ -275,6 +275,14 @@ static void test1_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); @@ -760,6 +768,14 @@ static void test2_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send UE context release request */ sendbuf = testngap_build_ue_context_release_request(&test_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity, @@ -1091,6 +1107,14 @@ static void test3_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send PDU session establishment request */ gsmbuf = testgsm_build_pdu_session_establishment_request(&test_sess); ABTS_PTR_NOTNULL(tc, gsmbuf); @@ -1521,6 +1545,14 @@ static void test4_func(abts_case *tc, void *data) ABTS_PTR_NOTNULL(tc, recvbuf); testngap_recv(&test_ue, recvbuf); + /* Send Configuration update complete */ + gmmbuf = testgmm_build_configuration_update_complete(&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); + /* Send UE context release request */ sendbuf = testngap_build_ue_context_release_request(&test_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_user_inactivity,