diff --git a/src/amf/amf-sm.c b/src/amf/amf-sm.c index 04105912f..c0e6ab069 100644 --- a/src/amf/amf-sm.c +++ b/src/amf/amf-sm.c @@ -690,9 +690,7 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) break; } - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); - amf_ue = amf_ue_cycle(amf_ue); + amf_ue = amf_ue_cycle(sess->amf_ue); if (!amf_ue) { ogs_error("UE(amf_ue) Context has already been removed"); break; @@ -701,13 +699,13 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e) ogs_error("[%d:%d] Cannot receive SBI message", sess->psi, sess->pti); if (sess->payload_container_type) { - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(sess->ran_ue, NGAP_Cause_PR_transport, NGAP_CauseTransport_transport_resource_unavailable); ogs_expect(r == OGS_OK); diff --git a/src/amf/context.h b/src/amf/context.h index 2e4020d25..f10262887 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -697,6 +697,7 @@ typedef struct amf_sess_s { /* Related Context */ amf_ue_t *amf_ue; + ran_ue_t *ran_ue; ogs_s_nssai_t s_nssai; ogs_s_nssai_t mapped_hplmn; diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index c3755e442..a6720c171 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -1016,7 +1016,7 @@ ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue, return OGS_5GMM_CAUSE_REQUEST_ACCEPTED; } -int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue, +int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_ul_nas_transport_t *ul_nas_transport) { int r; @@ -1031,7 +1031,8 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue, ogs_nas_dnn_t *dnn = NULL; ogs_nas_5gsm_header_t *gsm_header = NULL; - ogs_assert(amf_ue); + ogs_assert(amf_ue_cycle(amf_ue)); + ogs_assert(ran_ue_cycle(ran_ue)); ogs_assert(ul_nas_transport); payload_container_type = &ul_nas_transport->payload_container_type; @@ -1318,7 +1319,7 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue, if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("[%s:%d] Session Context is not in SMF [%d]", amf_ue->supi, sess->psi, gsm_header->message_type); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE, 0); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/src/amf/gmm-handler.h b/src/amf/gmm-handler.h index 77c92ca7c..d89dd9f83 100644 --- a/src/amf/gmm-handler.h +++ b/src/amf/gmm-handler.h @@ -50,7 +50,8 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue, ogs_nas_5gs_security_mode_complete_t *security_mode_complete); -int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue, +int gmm_handle_ul_nas_transport( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_ul_nas_transport_t *ul_nas_transport); #ifdef __cplusplus diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 0a7d4aaba..3386a33f8 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -1132,8 +1132,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, ogs_nas_5gmm_cause_t gmm_cause; amf_ue_t *amf_ue = NULL; - amf_sess_t *sess = NULL; ran_ue_t *ran_ue = NULL; + amf_sess_t *sess = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; @@ -1187,7 +1187,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("gmm_handle_registration_request() failed [%d]", gmm_cause); - r = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + r = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -1216,7 +1216,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_update() " "failed [%d]", amf_ue->suci, gmm_cause); - r = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + r = nas_5gs_send_registration_reject( + ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -1228,7 +1229,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); r = nas_5gs_send_gmm_reject( - amf_ue, + ran_ue, amf_ue, OGS_5GMM_CAUSE_NO_NETWORK_SLICES_AVAILABLE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1292,7 +1293,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (state != GMM_COMMON_STATE_REGISTERED) { ogs_info("[%s] Handling service request failed [Not registered]", amf_ue->suci); - r = nas_5gs_send_service_reject(amf_ue, + r = nas_5gs_send_service_reject(ran_ue, amf_ue, OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1305,7 +1306,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_service_request() failed [%d]", amf_ue->suci, gmm_cause); - r = nas_5gs_send_service_reject(amf_ue, gmm_cause); + r = nas_5gs_send_service_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -1314,7 +1315,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (!AMF_UE_HAVE_SUCI(amf_ue)) { ogs_info("Service request : Unknown UE"); - r = nas_5gs_send_service_reject(amf_ue, + r = nas_5gs_send_service_reject(ran_ue, amf_ue, OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1324,7 +1325,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(amf_ue)) { ogs_error("No Security Context"); - r = nas_5gs_send_service_reject(amf_ue, + r = nas_5gs_send_service_reject(ran_ue, amf_ue, OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1344,7 +1345,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_service_update() failed [%d]", amf_ue->suci, gmm_cause); - r = nas_5gs_send_service_reject(amf_ue, gmm_cause); + r = nas_5gs_send_service_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -1364,7 +1365,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); - r = nas_5gs_send_gmm_reject(amf_ue, gmm_cause); + 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); @@ -1373,7 +1374,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, if (!AMF_UE_HAVE_SUCI(amf_ue)) { ogs_error("No SUCI"); - r = nas_5gs_send_gmm_reject(amf_ue, gmm_cause); + 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); @@ -1481,7 +1482,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, } gmm_handle_ul_nas_transport( - amf_ue, &nas_message->gmm.ul_nas_transport); + ran_ue, amf_ue, &nas_message->gmm.ul_nas_transport); break; case OGS_NAS_5GS_REGISTRATION_COMPLETE: @@ -1506,6 +1507,7 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) ogs_nas_5gmm_cause_t gmm_cause; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; amf_sess_t *sess = NULL; ogs_nas_5gs_message_t *nas_message = NULL; @@ -1540,6 +1542,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) nas_message = e->nas.message; ogs_assert(nas_message); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); + h.type = e->nas.type; switch (nas_message->gmm.h.message_type) { @@ -1626,7 +1631,7 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e) if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_request() failed [%d]", amf_ue->suci, gmm_cause); - r = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + r = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -1801,6 +1806,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) int r; ogs_nas_5gmm_cause_t gmm_cause; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; @@ -1825,6 +1831,9 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) nas_message = e->nas.message; ogs_assert(nas_message); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); + h.type = e->nas.type; switch (nas_message->gmm.h.message_type) { @@ -1873,7 +1882,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) ogs_error("[%s] gmm_handle_security_mode_complete() " "failed [%d] in type [%d]", amf_ue->suci, gmm_cause, amf_ue->nas.message_type); - r = nas_5gs_send_gmm_reject(amf_ue, gmm_cause); + 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); @@ -1917,7 +1926,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_request() failed [%d]", amf_ue->suci, gmm_cause); - r = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + r = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -1935,7 +1944,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_SERVICE_REQUEST: ogs_info("[%s] Service request", amf_ue->supi); - r = nas_5gs_send_service_reject(amf_ue, + r = nas_5gs_send_service_reject(ran_ue, amf_ue, OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1967,7 +1976,7 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e) if (amf_ue->t3560.retry_count >= amf_timer_cfg(AMF_TIMER_T3560)->max_count) { ogs_warn("[%s] Retransmission failed. Stop", amf_ue->supi); - r = nas_5gs_send_gmm_reject(amf_ue, + r = nas_5gs_send_gmm_reject(amf_ue->ran_ue, amf_ue, OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1997,6 +2006,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) ogs_nas_5gmm_cause_t gmm_cause; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; amf_sess_t *sess = NULL; ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; @@ -2041,7 +2051,8 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) ogs_error("[%s] HTTP response error [%d]", amf_ue->supi, sbi_message->res_status); r = nas_5gs_send_gmm_reject( - amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); + amf_ue->ran_ue, amf_ue, + OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); @@ -2085,7 +2096,8 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) ogs_error("[%s] HTTP response error [%d]", amf_ue->supi, sbi_message->res_status); r = nas_5gs_send_gmm_reject( - amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); + amf_ue->ran_ue, amf_ue, + OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); @@ -2171,6 +2183,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) nas_message = e->nas.message; ogs_assert(nas_message); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); + h.type = e->nas.type; xact_count = amf_sess_xact_count(amf_ue); @@ -2266,7 +2281,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_request() failed [%d]", amf_ue->suci, gmm_cause); - r = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + r = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -2290,7 +2305,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) case OGS_NAS_5GS_SERVICE_REQUEST: ogs_info("[%s] Service request", amf_ue->supi); - r = nas_5gs_send_service_reject(amf_ue, + r = nas_5gs_send_service_reject(ran_ue, amf_ue, OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2444,7 +2459,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("gmm_handle_registration_request() failed [%d]", gmm_cause); - r = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + r = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -2475,7 +2490,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_update() " "failed [%d]", amf_ue->suci, gmm_cause); - r = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + r = nas_5gs_send_registration_reject( + ran_ue, amf_ue, gmm_cause); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); OGS_FSM_TRAN(s, gmm_state_exception); @@ -2487,7 +2503,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); r = nas_5gs_send_gmm_reject( - amf_ue, + ran_ue, amf_ue, OGS_5GMM_CAUSE_NO_NETWORK_SLICES_AVAILABLE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index efbd158ae..43410c8dd 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -177,7 +177,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer( * 4.3.2 PDU Session Establishment * ***********************************/ - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_cycle(sess->ran_ue); if (ran_ue) { if (sess->pdu_session_establishment_accept) { ogs_pkbuf_free(sess->pdu_session_establishment_accept); @@ -187,11 +187,11 @@ int amf_namf_comm_handle_n1_n2_message_transfer( if (ran_ue->initial_context_setup_request_sent == true) { ngapbuf = ngap_sess_build_pdu_session_resource_setup_request( - sess, gmmbuf, n2buf); + ran_ue, sess, gmmbuf, n2buf); ogs_assert(ngapbuf); } else { ngapbuf = ngap_sess_build_initial_context_setup_request( - sess, gmmbuf, n2buf); + ran_ue, sess, gmmbuf, n2buf); ogs_assert(ngapbuf); ran_ue->initial_context_setup_request_sent = true; @@ -482,7 +482,7 @@ int amf_namf_comm_handle_n1_n2_message_transfer( ogs_error("[%d:%d] PDU session establishment reject", sess->psi, sess->pti); - r = nas_5gs_send_gsm_reject(sess, + r = nas_5gs_send_gsm_reject(sess->ran_ue, sess, OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1buf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1006,38 +1006,35 @@ int amf_namf_callback_handle_sdm_data_change_notify( if (amf_ue) { ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); - if ((!ran_ue) || (amf_ue_is_rat_restricted(amf_ue))) { + if (!ran_ue) { + ogs_error("NG context has already been removed"); + /* ran_ue is required for amf_ue_is_rat_restricted() */ - if (!ran_ue) { - ogs_error("NG context has already been removed"); - /* ran_ue is required for amf_ue_is_rat_restricted() */ + ogs_error("Not implemented : Use Implicit De-registration"); + state = AMF_NETWORK_INITIATED_IMPLICIT_DE_REGISTERED; - ogs_error("Not implemented : Use Implicit De-registration"); - state = AMF_NETWORK_INITIATED_IMPLICIT_DE_REGISTERED; - } - else { - /* - * - AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED - * 1. UDM_UECM_DeregistrationNotification - * 2. Deregistration request - * 3. UDM_SDM_Unsubscribe - * 4. UDM_UECM_Deregistration - * 5. PDU session release request - * 6. PDUSessionResourceReleaseCommand + - * PDU session release command - * 7. PDUSessionResourceReleaseResponse - * 8. AM_Policy_Association_Termination - * 9. Deregistration accept - * 10. Signalling Connection Release - */ - r = nas_5gs_send_de_registration_request( - amf_ue, - OpenAPI_deregistration_reason_REREGISTRATION_REQUIRED, 0); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + } else if (amf_ue_is_rat_restricted(amf_ue)) { + /* + * - AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED + * 1. UDM_UECM_DeregistrationNotification + * 2. Deregistration request + * 3. UDM_SDM_Unsubscribe + * 4. UDM_UECM_Deregistration + * 5. PDU session release request + * 6. PDUSessionResourceReleaseCommand + + * PDU session release command + * 7. PDUSessionResourceReleaseResponse + * 8. AM_Policy_Association_Termination + * 9. Deregistration accept + * 10. Signalling Connection Release + */ + r = nas_5gs_send_de_registration_request( + amf_ue, + OpenAPI_deregistration_reason_REREGISTRATION_REQUIRED, 0); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); - state = AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED; - } + state = AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED; if (UDM_SDM_SUBSCRIBED(amf_ue)) { r = amf_ue_sbi_discover_and_send( @@ -1062,7 +1059,7 @@ int amf_namf_callback_handle_sdm_data_change_notify( ngapbuf = ngap_build_ue_context_modification_request(amf_ue); ogs_assert(ngapbuf); - r = nas_5gs_send_to_gnb(amf_ue, ngapbuf); + r = ngap_send_to_ran_ue(ran_ue, ngapbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } diff --git a/src/amf/nas-path.c b/src/amf/nas-path.c index a720b6682..aa341c55a 100644 --- a/src/amf/nas-path.c +++ b/src/amf/nas-path.c @@ -27,7 +27,8 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) int rv; ogs_assert(pkbuf); - if (!amf_ue_cycle(amf_ue)) { + amf_ue = amf_ue_cycle(amf_ue); + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); ogs_pkbuf_free(pkbuf); return OGS_NOTFOUND; @@ -39,35 +40,23 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) return rv; } -int nas_5gs_send_to_downlink_nas_transport(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) +int nas_5gs_send_to_downlink_nas_transport( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf) { int rv; ogs_pkbuf_t *ngapbuf = NULL; - ran_ue_t *ran_ue = NULL; + ogs_assert(ran_ue_cycle(ran_ue)); + ogs_assert(amf_ue_cycle(amf_ue)); ogs_assert(pkbuf); - if (!amf_ue_cycle(amf_ue)) { - ogs_error("UE(amf-ue) context has already been removed"); - ogs_pkbuf_free(pkbuf); - return OGS_NOTFOUND; - } - - ran_ue = ran_ue_cycle(amf_ue->ran_ue); - if (!ran_ue) { - ogs_error("NG context has already been removed"); - ogs_pkbuf_free(pkbuf); - return OGS_NOTFOUND; - } - - ngapbuf = ngap_build_downlink_nas_transport( - ran_ue, pkbuf, false, false); + ngapbuf = ngap_build_downlink_nas_transport(ran_ue, pkbuf, false, false); if (!ngapbuf) { ogs_error("ngap_build_downlink_nas_transport() failed"); return OGS_ERROR; } - rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); + rv = ngap_send_to_ran_ue(ran_ue, ngapbuf); ogs_expect(rv == OGS_OK); return rv; @@ -184,15 +173,13 @@ int nas_5gs_send_registration_accept(amf_ue_t *amf_ue) } int nas_5gs_send_registration_reject( - amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause) + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause) { int rv; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { - ogs_error("UE(amf-ue) context has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(ran_ue_cycle(ran_ue)); + ogs_assert(amf_ue_cycle(amf_ue)); switch (amf_ue->nas.registration.value) { case OGS_NAS_5GS_REGISTRATION_TYPE_INITIAL: @@ -224,7 +211,7 @@ int nas_5gs_send_registration_reject( return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -303,7 +290,8 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue) rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); ogs_expect(rv == OGS_OK); } else { - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport( + amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); } } @@ -312,20 +300,13 @@ int nas_5gs_send_service_accept(amf_ue_t *amf_ue) } int nas_5gs_send_service_reject( - amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause) + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause) { int rv; ogs_pkbuf_t *gmmbuf = NULL; - if (!amf_ue_cycle(amf_ue)) { - ogs_error("UE(amf-ue) context has already been removed"); - return OGS_NOTFOUND; - } - - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(ran_ue_cycle(ran_ue)); + ogs_assert(amf_ue_cycle(amf_ue)); ogs_debug("[%s] Service reject", amf_ue->supi); @@ -335,7 +316,7 @@ int nas_5gs_send_service_reject( return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -370,7 +351,8 @@ int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue) return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport( + amf_ue->ran_ue, amf_ue, gmmbuf); if (rv != OGS_OK) { ogs_error("nas_5gs_send_to_downlink_nas_transport() failed"); return rv; @@ -428,7 +410,8 @@ int nas_5gs_send_de_registration_request( ogs_timer_start(amf_ue->t3522.timer, amf_timer_cfg(AMF_TIMER_T3522)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport( + amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -470,7 +453,8 @@ int nas_5gs_send_identity_request(amf_ue_t *amf_ue) ogs_timer_start(amf_ue->t3570.timer, amf_timer_cfg(AMF_TIMER_T3570)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport( + amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -514,7 +498,7 @@ int nas_5gs_send_authentication_request(amf_ue_t *amf_ue) amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REQ); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -545,7 +529,7 @@ int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue) amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_AMF_AUTH_REJECT); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -587,7 +571,7 @@ int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue) ogs_timer_start(amf_ue->t3560.timer, amf_timer_cfg(AMF_TIMER_T3560)->duration); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -648,7 +632,7 @@ int nas_5gs_send_configuration_update_command( amf_metrics_inst_global_inc(AMF_METR_GLOB_CTR_MM_CONF_UPDATE); - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -693,25 +677,25 @@ int nas_send_pdu_session_setup_request(amf_sess_t *sess, if (ran_ue->ue_context_requested == true && ran_ue->initial_context_setup_request_sent == false) { ngapbuf = ngap_sess_build_initial_context_setup_request( - sess, gmmbuf, n2smbuf); + ran_ue, sess, gmmbuf, n2smbuf); if (!ngapbuf) { ogs_error("ngap_sess_build_initial_context_setup_request() failed"); return OGS_ERROR; } - rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); + rv = ngap_send_to_ran_ue(ran_ue, ngapbuf); ogs_expect(rv == OGS_OK); ran_ue->initial_context_setup_request_sent = true; } else { ngapbuf = ngap_sess_build_pdu_session_resource_setup_request( - sess, gmmbuf, n2smbuf); + ran_ue, sess, gmmbuf, n2smbuf); if (!ngapbuf) { ogs_error("ngap_sess_build_initial_context_setup_request() failed"); return OGS_ERROR; } - rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); + rv = ngap_send_to_ran_ue(ran_ue, ngapbuf); ogs_expect(rv == OGS_OK); } @@ -739,7 +723,7 @@ int nas_send_pdu_session_modification_command(amf_sess_t *sess, } ran_ue = ran_ue_cycle(amf_ue->ran_ue); if (!ran_ue) { - ogs_warn("NG context has already been removed"); + ogs_warn("[%s] NG context has already been removed", amf_ue->supi); if (n1smbuf) ogs_pkbuf_free(n1smbuf); ogs_pkbuf_free(n2smbuf); return OGS_NOTFOUND; @@ -903,34 +887,36 @@ int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause) return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(amf_ue->ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; } int nas_5gs_send_gmm_reject( - amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause) + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause) { int rv; - if (!amf_ue_cycle(amf_ue)) { + amf_ue = amf_ue_cycle(amf_ue); + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_cycle(ran_ue); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } switch(amf_ue->nas.message_type) { case OGS_NAS_5GS_REGISTRATION_REQUEST: - rv = nas_5gs_send_registration_reject(amf_ue, gmm_cause); + rv = nas_5gs_send_registration_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(rv == OGS_OK); break; case OGS_NAS_5GS_SERVICE_REQUEST: - rv = nas_5gs_send_service_reject(amf_ue, gmm_cause); + rv = nas_5gs_send_service_reject(ran_ue, amf_ue, gmm_cause); ogs_expect(rv == OGS_OK); break; default: @@ -970,23 +956,16 @@ int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status) { int rv; - if (!amf_ue_cycle(amf_ue)) { - ogs_error("UE(amf-ue) context has already been removed"); - return OGS_NOTFOUND; - } + ogs_assert(amf_ue); - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); - return OGS_NOTFOUND; - } - - rv = nas_5gs_send_gmm_reject(amf_ue, gmm_cause_from_sbi(status)); + rv = nas_5gs_send_gmm_reject( + amf_ue->ran_ue, amf_ue, gmm_cause_from_sbi(status)); ogs_expect(rv == OGS_OK); return rv; } -int nas_5gs_send_dl_nas_transport(amf_sess_t *sess, +int nas_5gs_send_dl_nas_transport(ran_ue_t *ran_ue, amf_sess_t *sess, uint8_t payload_container_type, ogs_pkbuf_t *payload_container, ogs_nas_5gmm_cause_t cause, uint8_t backoff_time) { @@ -996,15 +975,21 @@ int nas_5gs_send_dl_nas_transport(amf_sess_t *sess, amf_ue_t *amf_ue = NULL; ogs_assert(sess); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_NOTFOUND; + } - amf_ue = sess->amf_ue; - if (!amf_ue_cycle(amf_ue)) { + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_cycle(ran_ue); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -1019,7 +1004,7 @@ int nas_5gs_send_dl_nas_transport(amf_sess_t *sess, ogs_error("gmm_build_dl_nas_transport() failed"); return OGS_ERROR; } - rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); + rv = nas_5gs_send_to_downlink_nas_transport(ran_ue, amf_ue, gmmbuf); ogs_expect(rv == OGS_OK); return rv; @@ -1038,22 +1023,28 @@ int nas_5gs_send_dl_nas_transport(amf_sess_t *sess, * As such, this function 'nas_5gs_send_gsm_reject()' must be used * only when an N1 SM message has been forwarded to the SMF. */ -int nas_5gs_send_gsm_reject(amf_sess_t *sess, +int nas_5gs_send_gsm_reject(ran_ue_t *ran_ue, amf_sess_t *sess, uint8_t payload_container_type, ogs_pkbuf_t *payload_container) { int rv; amf_ue_t *amf_ue = NULL; ogs_assert(sess); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_NOTFOUND; + } - amf_ue = sess->amf_ue; - if (!amf_ue_cycle(amf_ue)) { + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_cycle(ran_ue); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -1061,29 +1052,36 @@ int nas_5gs_send_gsm_reject(amf_sess_t *sess, ogs_assert(payload_container); rv = nas_5gs_send_dl_nas_transport( - sess, payload_container_type, payload_container, 0, 0); + ran_ue, sess, payload_container_type, payload_container, 0, 0); ogs_expect(rv == OGS_OK); return rv; } int nas_5gs_send_back_gsm_message( - amf_sess_t *sess, ogs_nas_5gmm_cause_t cause, uint8_t backoff_time) + ran_ue_t *ran_ue, amf_sess_t *sess, + ogs_nas_5gmm_cause_t cause, uint8_t backoff_time) { int rv; ogs_pkbuf_t *pbuf = NULL; amf_ue_t *amf_ue = NULL; ogs_assert(sess); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_NOTFOUND; + } - amf_ue = sess->amf_ue; - if (!amf_ue_cycle(amf_ue)) { + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_cycle(ran_ue); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -1097,7 +1095,8 @@ int nas_5gs_send_back_gsm_message( } rv = nas_5gs_send_dl_nas_transport( - sess, sess->payload_container_type, pbuf, cause, backoff_time); + ran_ue, sess, sess->payload_container_type, pbuf, + cause, backoff_time); ogs_expect(rv == OGS_OK); return rv; diff --git a/src/amf/nas-path.h b/src/amf/nas-path.h index 9b5715bb1..0c86ca35a 100644 --- a/src/amf/nas-path.h +++ b/src/amf/nas-path.h @@ -30,15 +30,15 @@ extern "C" { int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf); int nas_5gs_send_to_downlink_nas_transport( - amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf); + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf); int nas_5gs_send_registration_accept(amf_ue_t *amf_ue); int nas_5gs_send_registration_reject( - amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); int nas_5gs_send_service_accept(amf_ue_t *amf_ue); int nas_5gs_send_service_reject( - amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue); int nas_5gs_send_de_registration_request( @@ -66,17 +66,18 @@ int nas_send_pdu_session_release_command(amf_sess_t *sess, int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause); int nas_5gs_send_gmm_reject( - amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status); -int nas_5gs_send_dl_nas_transport(amf_sess_t *sess, +int nas_5gs_send_dl_nas_transport(ran_ue_t *ran_ue, amf_sess_t *sess, uint8_t payload_container_type, ogs_pkbuf_t *payload_container, ogs_nas_5gmm_cause_t cause, uint8_t backoff_time); -int nas_5gs_send_gsm_reject(amf_sess_t *sess, +int nas_5gs_send_gsm_reject(ran_ue_t *ran_ue, amf_sess_t *sess, uint8_t payload_container_type, ogs_pkbuf_t *payload_container); int nas_5gs_send_back_gsm_message( - amf_sess_t *sess, ogs_nas_5gmm_cause_t cause, uint8_t backoff_time); + ran_ue_t *ran_ue, amf_sess_t *sess, + ogs_nas_5gmm_cause_t cause, uint8_t backoff_time); #ifdef __cplusplus } diff --git a/src/amf/ngap-build.c b/src/amf/ngap-build.c index 4f1dbb529..e41725fc0 100644 --- a/src/amf/ngap-build.c +++ b/src/amf/ngap-build.c @@ -905,11 +905,11 @@ ogs_pkbuf_t *ngap_build_ue_context_modification_request(amf_ue_t *amf_ue) } ogs_pkbuf_t *ngap_sess_build_initial_context_setup_request( - amf_sess_t *sess, ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf) + ran_ue_t *ran_ue, amf_sess_t *sess, + ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf) { int i; - ran_ue_t *ran_ue = NULL; amf_ue_t *amf_ue = NULL; NGAP_NGAP_PDU_t pdu; @@ -931,7 +931,7 @@ ogs_pkbuf_t *ngap_sess_build_initial_context_setup_request( ogs_assert(sess); amf_ue = amf_ue_cycle(sess->amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("InitialContextSetupRequest(Session)"); @@ -1436,10 +1436,10 @@ ogs_pkbuf_t *ngap_ue_build_pdu_session_resource_setup_request( } ogs_pkbuf_t *ngap_sess_build_pdu_session_resource_setup_request( - amf_sess_t *sess, ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf) + ran_ue_t *ran_ue, amf_sess_t *sess, + ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf) { amf_ue_t *amf_ue = NULL; - ran_ue_t *ran_ue = NULL; NGAP_NGAP_PDU_t pdu; NGAP_InitiatingMessage_t *initiatingMessage = NULL; @@ -1463,7 +1463,7 @@ ogs_pkbuf_t *ngap_sess_build_pdu_session_resource_setup_request( amf_ue = amf_ue_cycle(sess->amf_ue); ogs_assert(amf_ue); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_cycle(ran_ue); ogs_assert(ran_ue); ogs_debug("PDUSessionResourceSetupRequest(Session)"); diff --git a/src/amf/ngap-build.h b/src/amf/ngap-build.h index dc0815b38..3f057fd54 100644 --- a/src/amf/ngap-build.h +++ b/src/amf/ngap-build.h @@ -41,14 +41,16 @@ ogs_pkbuf_t *ngap_ue_build_initial_context_setup_request( amf_ue_t *amf_ue, ogs_pkbuf_t *gmmbuf); ogs_pkbuf_t *ngap_build_ue_context_modification_request(amf_ue_t *amf_ue); ogs_pkbuf_t *ngap_sess_build_initial_context_setup_request( - amf_sess_t *sess, ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf); + ran_ue_t *ran_ue, amf_sess_t *sess, + ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf); ogs_pkbuf_t *ngap_build_ue_context_release_command( ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause); ogs_pkbuf_t *ngap_ue_build_pdu_session_resource_setup_request( amf_ue_t *amf_ue, ogs_pkbuf_t *gmmbuf); ogs_pkbuf_t *ngap_sess_build_pdu_session_resource_setup_request( - amf_sess_t *sess, ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf); + ran_ue_t *ran_ue, amf_sess_t *sess, + ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf); ogs_pkbuf_t *ngap_build_pdu_session_resource_modify_request( amf_sess_t *sess, ogs_pkbuf_t *gmmbuf, ogs_pkbuf_t *n2smbuf); ogs_pkbuf_t *ngap_build_pdu_session_resource_release_command( diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index e662616fe..300bbac5f 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -955,7 +955,7 @@ void ngap_handle_initial_context_setup_response( if (!PDUSessionItem) { ogs_error("No PDUSessionResourceSetupItemCxtRes"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -965,7 +965,7 @@ void ngap_handle_initial_context_setup_response( transfer = &PDUSessionItem->pDUSessionResourceSetupResponseTransfer; if (!transfer) { ogs_error("No PDUSessionResourceSetupResponseTransfer"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -975,7 +975,7 @@ void ngap_handle_initial_context_setup_response( if (PDUSessionItem->pDUSessionID == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -986,7 +986,7 @@ void ngap_handle_initial_context_setup_response( if (!sess) { ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -997,7 +997,7 @@ void ngap_handle_initial_context_setup_response( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -1563,7 +1563,7 @@ void ngap_handle_ue_context_release_request( if (!PDUSessionItem) { ogs_error("No PDUSessionResourceSetupItemSURes"); r = ngap_send_error_indication2( - amf_ue, NGAP_Cause_PR_protocol, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1574,7 +1574,7 @@ void ngap_handle_ue_context_release_request( OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); r = ngap_send_error_indication2( - amf_ue, NGAP_Cause_PR_protocol, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1934,7 +1934,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!PDUSessionItem) { ogs_error("No PDUSessionResourceSetupItemSURes"); r = ngap_send_error_indication2( - amf_ue, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -1946,7 +1946,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!transfer) { ogs_error("No PDUSessionResourceSetupResponseTransfer"); r = ngap_send_error_indication2( - amf_ue, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -1958,7 +1958,7 @@ void ngap_handle_pdu_session_resource_setup_response( OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); r = ngap_send_error_indication2( - amf_ue, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -1970,7 +1970,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!sess) { ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -1981,7 +1981,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2019,7 +2019,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!PDUSessionFailedItem) { ogs_error("No PDUSessionResourceFailedToSetupItemSURes"); r = ngap_send_error_indication2( - amf_ue, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -2033,7 +2033,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!transfer) { ogs_error("No PDUSessionResourceSetupUnsuccessfulTransfer"); r = ngap_send_error_indication2( - amf_ue, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -2045,7 +2045,7 @@ void ngap_handle_pdu_session_resource_setup_response( OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); r = ngap_send_error_indication2( - amf_ue, + ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -2059,7 +2059,7 @@ void ngap_handle_pdu_session_resource_setup_response( ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionFailedItem->pDUSessionID); r = ngap_send_error_indication2( - amf_ue, + ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2070,7 +2070,7 @@ void ngap_handle_pdu_session_resource_setup_response( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionFailedItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2137,7 +2137,7 @@ void ngap_handle_pdu_session_resource_setup_response( } } else { ogs_error("No PDUSessionResourceList"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2249,7 +2249,7 @@ void ngap_handle_pdu_session_resource_modify_response( if (!PDUSessionList) { ogs_error("No PDUSessionResourceModifyListModRes"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2263,7 +2263,7 @@ void ngap_handle_pdu_session_resource_modify_response( if (!PDUSessionItem) { ogs_error("No PDUSessionResourceModifyItemModRes"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2273,7 +2273,7 @@ void ngap_handle_pdu_session_resource_modify_response( transfer = &PDUSessionItem->pDUSessionResourceModifyResponseTransfer; if (!transfer) { ogs_error("No PDUSessionResourceModifyResponseTransfer"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2283,7 +2283,7 @@ void ngap_handle_pdu_session_resource_modify_response( if (PDUSessionItem->pDUSessionID == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2294,7 +2294,7 @@ void ngap_handle_pdu_session_resource_modify_response( if (!sess) { ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2305,7 +2305,7 @@ void ngap_handle_pdu_session_resource_modify_response( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2436,7 +2436,7 @@ void ngap_handle_pdu_session_resource_release_response( if (!PDUSessionList) { ogs_error("No PDUSessionResourceReleasedListRelRes"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2450,7 +2450,7 @@ void ngap_handle_pdu_session_resource_release_response( if (!PDUSessionItem) { ogs_error("No PDUSessionResourceReleasedItemRelRes"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2460,7 +2460,7 @@ void ngap_handle_pdu_session_resource_release_response( transfer = &PDUSessionItem->pDUSessionResourceReleaseResponseTransfer; if (!transfer) { ogs_error("No PDUSessionResourceReleaseResponseTransfer"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2470,7 +2470,7 @@ void ngap_handle_pdu_session_resource_release_response( if (PDUSessionItem->pDUSessionID == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2481,7 +2481,7 @@ void ngap_handle_pdu_session_resource_release_response( if (!sess) { ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2492,7 +2492,7 @@ void ngap_handle_pdu_session_resource_release_response( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2791,7 +2791,7 @@ void ngap_handle_path_switch_request( if (!UserLocationInformation) { ogs_error("No UserLocationInformation"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2802,7 +2802,7 @@ void ngap_handle_path_switch_request( NGAP_UserLocationInformation_PR_userLocationInformationNR) { ogs_error("Not implemented UserLocationInformation[%d]", UserLocationInformation->present); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_unspecified); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2811,7 +2811,7 @@ void ngap_handle_path_switch_request( if (!UESecurityCapabilities) { ogs_error("No UESecurityCapabilities"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2820,7 +2820,7 @@ void ngap_handle_path_switch_request( if (!PDUSessionResourceToBeSwitchedDLList) { ogs_error("No PDUSessionResourceToBeSwitchedDLList"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2829,7 +2829,7 @@ void ngap_handle_path_switch_request( if (!SECURITY_CONTEXT_IS_VALID(amf_ue)) { ogs_error("No Security Context"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_nas, NGAP_CauseNas_authentication_failure); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2915,7 +2915,7 @@ void ngap_handle_path_switch_request( if (!PDUSessionItem) { ogs_error("No NGAP_PDUSessionResourceToBeSwitchedDLItem"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2925,7 +2925,7 @@ void ngap_handle_path_switch_request( transfer = &PDUSessionItem->pathSwitchRequestTransfer; if (!transfer) { ogs_error("No PDUSessionResourceSetupResponseTransfer"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2935,7 +2935,7 @@ void ngap_handle_path_switch_request( if (PDUSessionItem->pDUSessionID == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -2946,7 +2946,7 @@ void ngap_handle_path_switch_request( if (!sess) { ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -2957,7 +2957,7 @@ void ngap_handle_path_switch_request( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -3110,7 +3110,7 @@ void ngap_handle_handover_required( if (!HandoverType) { ogs_error("No HandoverType"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3119,7 +3119,7 @@ void ngap_handle_handover_required( if (!Cause) { ogs_error("No Cause"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3128,7 +3128,7 @@ void ngap_handle_handover_required( if (!TargetID) { ogs_error("No TargetID"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3137,7 +3137,7 @@ void ngap_handle_handover_required( if (TargetID->present != NGAP_TargetID_PR_targetRANNodeID) { ogs_error("Not implemented TargetID[%d]", TargetID->present); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3146,7 +3146,7 @@ void ngap_handle_handover_required( targetRANNodeID = TargetID->choice.targetRANNodeID; if (!targetRANNodeID) { ogs_error("No targetRANNodeID"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3157,7 +3157,7 @@ void ngap_handle_handover_required( if (globalRANNodeID->present != NGAP_GlobalRANNodeID_PR_globalGNB_ID) { ogs_error("Not implemented globalRANNodeID[%d]", globalRANNodeID->present); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3167,7 +3167,7 @@ void ngap_handle_handover_required( globalGNB_ID = globalRANNodeID->choice.globalGNB_ID; if (!globalGNB_ID) { ogs_error("No globalGNB_ID"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3179,7 +3179,7 @@ void ngap_handle_handover_required( if (!target_gnb) { ogs_error("Handover required : cannot find target gNB-id[0x%x]", target_gnb_id); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3188,7 +3188,7 @@ void ngap_handle_handover_required( if (!PDUSessionList) { ogs_error("No PDUSessionList"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3197,7 +3197,7 @@ void ngap_handle_handover_required( if (!SourceToTarget_TransparentContainer) { ogs_error("No SourceToTarget_TransparentContainer"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3206,7 +3206,7 @@ void ngap_handle_handover_required( if (!SECURITY_CONTEXT_IS_VALID(amf_ue)) { ogs_error("No Security Context"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_nas, NGAP_CauseNas_authentication_failure); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3216,7 +3216,7 @@ void ngap_handle_handover_required( /* Target UE */ target_ue = ran_ue_add(target_gnb, INVALID_UE_NGAP_ID); if (target_ue == NULL) { - r = ngap_send_error_indication2(amf_ue, NGAP_Cause_PR_misc, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_misc, NGAP_CauseMisc_control_processing_overload); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3260,7 +3260,7 @@ void ngap_handle_handover_required( if (!PDUSessionItem) { ogs_error("No PDUSessionResourceItemHORqd"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3270,7 +3270,7 @@ void ngap_handle_handover_required( transfer = &PDUSessionItem->handoverRequiredTransfer; if (!transfer) { ogs_error("No handoverRequiredTransfer"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3280,7 +3280,7 @@ void ngap_handle_handover_required( if (PDUSessionItem->pDUSessionID == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3291,7 +3291,7 @@ void ngap_handle_handover_required( if (!sess) { ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -3302,7 +3302,7 @@ void ngap_handle_handover_required( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(source_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -3474,7 +3474,7 @@ void ngap_handle_handover_request_ack( if (!PDUSessionList) { ogs_error("No PDUSessionList"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(target_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3483,7 +3483,7 @@ void ngap_handle_handover_request_ack( if (!TargetToSource_TransparentContainer) { ogs_error("No TargetToSource_TransparentContainer"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(target_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3501,7 +3501,7 @@ void ngap_handle_handover_request_ack( if (!PDUSessionItem) { ogs_error("No PDUSessionResourceAdmittedItem"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(target_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3511,7 +3511,7 @@ void ngap_handle_handover_request_ack( transfer = &PDUSessionItem->handoverRequestAcknowledgeTransfer; if (!transfer) { ogs_error("No handoverRequestAcknowledgeTransfer"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(target_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3521,7 +3521,7 @@ void ngap_handle_handover_request_ack( if (PDUSessionItem->pDUSessionID == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) { ogs_error("PDU Session Identity is unassigned"); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(target_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3532,7 +3532,7 @@ void ngap_handle_handover_request_ack( if (!sess) { ogs_error("Cannot find PDU Session ID [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(target_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); @@ -3543,7 +3543,7 @@ void ngap_handle_handover_request_ack( if (!SESSION_CONTEXT_IN_SMF(sess)) { ogs_error("Session Context is not in SMF [%d]", (int)PDUSessionItem->pDUSessionID); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(target_ue, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_unknown_PDU_session_ID); ogs_expect(r == OGS_OK); diff --git a/src/amf/ngap-path.c b/src/amf/ngap-path.c index c5247dd18..65cf408a5 100644 --- a/src/amf/ngap-path.c +++ b/src/amf/ngap-path.c @@ -494,18 +494,25 @@ int ngap_send_path_switch_ack(amf_sess_t *sess) int rv; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; ogs_pkbuf_t *ngapbuf = NULL; ogs_assert(sess); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_NOTFOUND; + } - amf_ue = sess->amf_ue; - if (!amf_ue_cycle(amf_ue)) { + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { ogs_error("UE(amf-ue) context has already been removed"); return OGS_NOTFOUND; } - if (!ran_ue_cycle(amf_ue->ran_ue)) { - ogs_error("NG context has already been removed"); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); return OGS_NOTFOUND; } @@ -687,17 +694,11 @@ int ngap_send_error_indication( } int ngap_send_error_indication2( - amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause) + ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause) { int rv; - ran_ue_t *ran_ue; - if (!amf_ue_cycle(amf_ue)) { - ogs_error("UE(amf-ue) context has already been removed"); - return OGS_NOTFOUND; - } - - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ran_ue = ran_ue_cycle(ran_ue); if (!ran_ue) { ogs_error("NG context has already been removed"); return OGS_NOTFOUND; diff --git a/src/amf/ngap-path.h b/src/amf/ngap-path.h index c3a7e1bb8..9cfa74ab9 100644 --- a/src/amf/ngap-path.h +++ b/src/amf/ngap-path.h @@ -82,7 +82,7 @@ int ngap_send_error_indication( uint64_t *amf_ue_ngap_id, NGAP_Cause_PR group, long cause); int ngap_send_error_indication2( - amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause); + ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause); int ngap_send_ng_reset_ack( amf_gnb_t *gnb, NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface); diff --git a/src/amf/nnrf-handler.c b/src/amf/nnrf-handler.c index f42e80dc0..95f9bf21f 100644 --- a/src/amf/nnrf-handler.c +++ b/src/amf/nnrf-handler.c @@ -79,19 +79,16 @@ void amf_nnrf_handle_nf_discover( sess = (amf_sess_t *)sbi_object; ogs_assert(sess); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); - ogs_error("[%d:%d] (NF discover) No [%s]", sess->psi, sess->pti, ogs_sbi_service_type_to_name(service_type)); if (sess->payload_container_type) { - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(sess->ran_ue, NGAP_Cause_PR_transport, NGAP_CauseTransport_transport_resource_unavailable); ogs_expect(r == OGS_OK); diff --git a/src/amf/nnssf-handler.c b/src/amf/nnssf-handler.c index 2d4816fab..27e81650a 100644 --- a/src/amf/nnssf-handler.c +++ b/src/amf/nnssf-handler.c @@ -39,14 +39,22 @@ int amf_nnssf_nsselection_handle_get( amf_ue_t *amf_ue = NULL; ran_ue_t *ran_ue = NULL; - ogs_assert(sess); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); ogs_assert(recvmsg); - ogs_assert(!SESSION_CONTEXT_IN_SMF(sess)); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_ERROR; + } + + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + return OGS_ERROR; + } + + ran_ue = ran_ue_cycle(sess->ran_ue); if (!ran_ue) { ogs_error("NG context has already been removed"); return OGS_ERROR; diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index a534a015f..8a1bd0717 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -29,8 +29,28 @@ int amf_nsmf_pdusession_handle_create_sm_context( { int rv, r; - ogs_assert(sess); + amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; + ogs_assert(recvmsg); + ogs_assert(sess); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_ERROR; + } + + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + return OGS_ERROR; + } + + ran_ue = ran_ue_cycle(sess->ran_ue); + if (!ran_ue) { + ogs_error("[%s] RAN-NG Context has already been removed", amf_ue->supi); + return OGS_ERROR; + } if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_CREATED) { ogs_sbi_message_t message; @@ -38,7 +58,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( if (!recvmsg->http.location) { ogs_error("[%d:%d] No http.location", sess->psi, sess->pti); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -54,7 +74,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( if (rv != OGS_OK) { ogs_error("[%d:%d] Cannot parse http.location [%s]", sess->psi, sess->pti, recvmsg->http.location); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -68,7 +88,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( sess->psi, sess->pti, recvmsg->http.location); ogs_sbi_header_free(&header); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -86,11 +106,10 @@ int amf_nsmf_pdusession_handle_create_sm_context( * there is no sm-context-ref. The PDU session establishment accept * stored in [1-SERVER] is now trasnmitted to gNB. */ - amf_ue_t *amf_ue = sess->amf_ue; - ogs_assert(amf_ue); - - r = nas_5gs_send_to_gnb(amf_ue, + r = ngap_send_to_ran_ue(ran_ue, sess->pdu_session_establishment_accept); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); sess->pdu_session_establishment_accept = NULL; @@ -99,7 +118,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( sess->psi, sess->pti); ogs_sbi_header_free(&header); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -124,7 +143,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( SmContextCreateError = recvmsg->SmContextCreateError; if (!SmContextCreateError) { ogs_error("[%d:%d] No SmContextCreateError", sess->psi, sess->pti); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -134,7 +153,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( } if (!SmContextCreateError->error) { ogs_error("[%d:%d] No Error", sess->psi, sess->pti); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -157,7 +176,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( n1smbuf = ogs_pkbuf_copy(n1smbuf); ogs_assert(n1smbuf); - r = nas_5gs_send_gsm_reject(sess, + r = nas_5gs_send_gsm_reject(ran_ue, sess, OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -167,7 +186,7 @@ int amf_nsmf_pdusession_handle_create_sm_context( } ogs_error("[%d:%d] 5GMM was not forwarded", sess->psi, sess->pti); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -187,10 +206,21 @@ int amf_nsmf_pdusession_handle_update_sm_context( amf_ue_t *amf_ue = NULL; ran_ue_t *ran_ue = NULL; - ogs_assert(sess); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); ogs_assert(recvmsg); + ogs_assert(sess); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_ERROR; + } + + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + return OGS_ERROR; + } + + ran_ue = ran_ue_cycle(sess->ran_ue); if (recvmsg->res_status == OGS_SBI_HTTP_STATUS_NO_CONTENT || recvmsg->res_status == OGS_SBI_HTTP_STATUS_OK) { @@ -225,7 +255,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n2smbuf) { ogs_error("[%s:%d] No N2 SM Content", amf_ue->supi, sess->psi); - nas_5gs_send_gmm_reject(amf_ue, + nas_5gs_send_gmm_reject(ran_ue, amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); AMF_SESS_CLEAR(sess); @@ -242,8 +272,6 @@ int amf_nsmf_pdusession_handle_update_sm_context( AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) && AMF_SESSION_SYNC_DONE(amf_ue, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); - if (ran_ue) { if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) { r = amf_ue_sbi_discover_and_send( @@ -305,7 +333,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n1smbuf) { ogs_error("[%s:%d] No N1 SM Content [%s]", amf_ue->supi, sess->psi, n1SmMsg->content_id); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -317,7 +345,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n2smbuf) { ogs_error("[%s:%d] No N2 SM Content", amf_ue->supi, sess->psi); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -347,7 +375,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n1smbuf) { ogs_error("[%s:%d] No N1 SM Content [%s]", amf_ue->supi, sess->psi, n1SmMsg->content_id); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -359,7 +387,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n2smbuf) { ogs_error("[%s:%d] No N2 SM Content", amf_ue->supi, sess->psi); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -388,7 +416,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n2smbuf) { ogs_error("[%s:%d] No N2 SM Content", amf_ue->supi, sess->psi); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -414,7 +442,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n2smbuf) { ogs_error("[%s:%d] No N2 SM Content", amf_ue->supi, sess->psi); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -438,7 +466,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( default: ogs_error("Not implemented [%d]", SmContextUpdatedData->n2_sm_info_type); - r = ngap_send_error_indication2(amf_ue, + r = ngap_send_error_indication2(ran_ue, NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ogs_expect(r == OGS_OK); @@ -593,7 +621,6 @@ int amf_nsmf_pdusession_handle_update_sm_context( } else if (state == AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); /* * 1. PDU session establishment request * (Duplicated PDU Session ID) @@ -636,17 +663,21 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { ran_ue_t *source_ue = NULL, *target_ue = NULL; - source_ue = amf_ue->ran_ue; + source_ue = sess->ran_ue; ogs_assert(source_ue); - target_ue = source_ue->target_ue; - ogs_assert(target_ue); - - r = ngap_send_ran_ue_context_release_command(target_ue, - NGAP_Cause_PR_radioNetwork, - NGAP_CauseRadioNetwork_handover_cancelled, - NGAP_UE_CTX_REL_NG_HANDOVER_CANCEL, 0); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); + target_ue = ran_ue_cycle(source_ue->target_ue); + if (target_ue) { + r = ngap_send_ran_ue_context_release_command( + target_ue, + NGAP_Cause_PR_radioNetwork, + NGAP_CauseRadioNetwork_handover_cancelled, + NGAP_UE_CTX_REL_NG_HANDOVER_CANCEL, 0); + ogs_expect(r == OGS_OK); + ogs_assert(r != OGS_ERROR); + } else { + ogs_warn("[%s] RAN-NG Context has already been removed", + amf_ue->supi); + } } } else if (state == AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY) { @@ -655,7 +686,6 @@ int amf_nsmf_pdusession_handle_update_sm_context( } else if (state == AMF_REMOVE_S1_CONTEXT_BY_LO_CONNREFUSED) { if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { - ran_ue = ran_ue_cycle(amf_ue->ran_ue); amf_ue_deassociate(amf_ue); @@ -701,7 +731,6 @@ int amf_nsmf_pdusession_handle_update_sm_context( } else if (state == AMF_REMOVE_S1_CONTEXT_BY_RESET_ALL) { if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); amf_ue_deassociate(amf_ue); @@ -758,7 +787,6 @@ int amf_nsmf_pdusession_handle_update_sm_context( } else if (state == AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL) { if (AMF_SESSION_SYNC_DONE(amf_ue, state)) { ran_ue_t *iter = NULL; - ran_ue = ran_ue_cycle(amf_ue->ran_ue); amf_ue_deassociate(amf_ue); @@ -867,7 +895,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!SmContextUpdateError) { ogs_error("[%d:%d] No SmContextUpdateError [%d]", sess->psi, sess->pti, recvmsg->res_status); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -879,7 +907,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!ProblemDetails) { ogs_error("[%d:%d] No ProblemDetails [%d]", sess->psi, sess->pti, recvmsg->res_status); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -941,7 +969,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( n1smbuf = ogs_pkbuf_copy(n1smbuf); ogs_assert(n1smbuf); - r = nas_5gs_send_gsm_reject(sess, + r = nas_5gs_send_gsm_reject(ran_ue, sess, OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -954,7 +982,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( n2SmInfo = SmContextUpdateError->n2_sm_info; if (!n2SmInfo || !n2SmInfo->content_id) { ogs_error("[%d:%d] No N2 SM Message", sess->psi, sess->pti); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -967,7 +995,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( if (!n2smbuf) { ogs_error("[%d:%d] No N2 SM Content [%s]", sess->psi, sess->pti, n2SmInfo->content_id); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -979,7 +1007,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( ogs_error("[%d:%d] Error Indication [state:%d]", sess->psi, sess->pti, state); - r = ngap_send_error_indication2(amf_ue, + 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); @@ -994,10 +1022,22 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) { int r; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; ogs_assert(sess); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); + sess = amf_sess_cycle(sess); + if (!sess) { + ogs_error("Session has already been removed"); + return OGS_ERROR; + } + + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + return OGS_ERROR; + } + + ran_ue = ran_ue_cycle(sess->ran_ue); /* * To check if Reactivation Request has been used. @@ -1041,8 +1081,6 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) amf_ue, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) && AMF_SESSION_SYNC_DONE( amf_ue, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) { - ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); - if (ran_ue) { if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) { r = amf_ue_sbi_discover_and_send( diff --git a/src/amf/nudm-handler.c b/src/amf/nudm-handler.c index 8f2585215..1eee28157 100644 --- a/src/amf/nudm-handler.c +++ b/src/amf/nudm-handler.c @@ -26,22 +26,10 @@ int amf_nudm_sdm_handle_provisioned( amf_ue_t *amf_ue, int state, ogs_sbi_message_t *recvmsg) { int i, r; - ran_ue_t *ran_ue = NULL; ogs_assert(amf_ue); ogs_assert(recvmsg); - ran_ue = ran_ue_cycle(amf_ue->ran_ue); - if (!ran_ue) { - /* ran_ue is required for amf_ue_is_rat_restricted() */ - ogs_error("NG context has already been removed"); - r = nas_5gs_send_gmm_reject( - amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); - ogs_expect(r == OGS_OK); - ogs_assert(r != OGS_ERROR); - return OGS_ERROR; - } - SWITCH(recvmsg->h.resource.component[1]) CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) @@ -156,7 +144,8 @@ int amf_nudm_sdm_handle_provisioned( if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); r = nas_5gs_send_gmm_reject( - amf_ue, OGS_5GMM_CAUSE_NO_NETWORK_SLICES_AVAILABLE); + amf_ue->ran_ue, amf_ue, + OGS_5GMM_CAUSE_NO_NETWORK_SLICES_AVAILABLE); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return OGS_ERROR; @@ -165,7 +154,8 @@ int amf_nudm_sdm_handle_provisioned( if (amf_ue_is_rat_restricted(amf_ue)) { ogs_error("Registration rejected due to RAT restrictions"); r = nas_5gs_send_gmm_reject( - amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); + amf_ue->ran_ue, amf_ue, + OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); return OGS_ERROR; diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index f136df24a..ae0074650 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -162,16 +162,31 @@ int amf_sess_sbi_discover_and_send( int rv; ogs_sbi_xact_t *xact = NULL; + amf_ue_t *amf_ue = NULL; + ogs_assert(service_type); ogs_assert(sess); ogs_assert(build); + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + return OGS_NOTFOUND; + } + + sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue); + if (!sess->ran_ue) { + ogs_error("[%s] RAN-NG Context has already been removed", + amf_ue->supi); + return OGS_NOTFOUND; + } + xact = ogs_sbi_xact_add( &sess->sbi, service_type, discovery_option, (ogs_sbi_build_f)build, sess, data); if (!xact) { ogs_error("amf_sess_sbi_discover_and_send() failed"); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -184,7 +199,7 @@ int amf_sess_sbi_discover_and_send( if (rv != OGS_OK) { ogs_error("amf_sess_sbi_discover_and_send() failed"); ogs_sbi_xact_remove(xact); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -252,7 +267,7 @@ static int client_discover_cb( rv = ogs_sbi_parse_response(&message, response); if (rv != OGS_OK) { ogs_error("cannot parse HTTP response"); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -262,7 +277,7 @@ static int client_discover_cb( if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { ogs_error("NF-Discover failed [%d]", message.res_status); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -272,7 +287,7 @@ static int client_discover_cb( if (!message.SearchResult) { ogs_error("No SearchResult"); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -289,7 +304,7 @@ static int client_discover_cb( ogs_error("[%s:%d] (NF discover) No [%s]", amf_ue->supi, sess->psi, ogs_sbi_service_type_to_name(service_type)); - r = nas_5gs_send_back_gsm_message(sess, + r = nas_5gs_send_back_gsm_message(sess->ran_ue, sess, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME); ogs_expect(r == OGS_OK); @@ -329,6 +344,8 @@ int amf_sess_sbi_discover_by_nsi( ogs_sbi_xact_t *xact = NULL; ogs_sbi_client_t *client = NULL; + amf_ue_t *amf_ue = NULL; + ogs_assert(sess); client = sess->nssf.nrf.client; ogs_assert(client); @@ -337,6 +354,19 @@ int amf_sess_sbi_discover_by_nsi( ogs_warn("Try to discover [%s]", ogs_sbi_service_type_to_name(service_type)); + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf_ue) Context has already been removed"); + return OGS_NOTFOUND; + } + + sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue); + if (!sess->ran_ue) { + ogs_error("[%s] RAN-NG Context has already been removed", + amf_ue->supi); + return OGS_NOTFOUND; + } + xact = ogs_sbi_xact_add( &sess->sbi, service_type, discovery_option, NULL, NULL, NULL); if (!xact) { diff --git a/tests/registration/guti-test.c b/tests/registration/guti-test.c index d6be10a17..a3b592143 100644 --- a/tests/registration/guti-test.c +++ b/tests/registration/guti-test.c @@ -1220,6 +1220,303 @@ static void test3_func(abts_case *tc, void *data) test_ue_remove(test_ue); } +static void test4_issues2839_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; + + uint32_t ran_ue_ngap_id; /* gNB-UE-NGAP-ID received from gNB */ + uint64_t amf_ue_ngap_id; /* AMF-UE-NGAP-ID received from AMF */ + + 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, 22); + 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 Registration request */ + test_ue->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + test_ue->registration_request_param.gmm_capability = 1; + test_ue->registration_request_param.s1_ue_network_capability = 1; + test_ue->registration_request_param.requested_nssai = 1; + test_ue->registration_request_param.last_visited_registered_tai = 1; + test_ue->registration_request_param.ue_usage_setting = 1; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + 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 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); + testngap_recv(test_ue, recvbuf); + + /* Send Authentication response */ + gmmbuf = testgmm_build_authentication_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 Security mode command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + /* Send Security mode complete */ + gmmbuf = testgmm_build_security_mode_complete(test_ue, nasbuf); + 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); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + 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); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Send Registration complete */ + gmmbuf = testgmm_build_registration_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 */ + sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 5); + ogs_assert(sess); + + 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 = 0; + + sess->pdu_session_establishment_param.ssc_mode = 1; + sess->pdu_session_establishment_param.epco = 1; + + gsmbuf = testgsm_build_pdu_session_establishment_request(sess); + ABTS_PTR_NOTNULL(tc, gsmbuf); + gmmbuf = testgmm_build_ul_nas_transport(sess, + OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, gsmbuf); + 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 Registration request + * - Update Registration request type + * - Uplink Data Status */ + test_ue->nas.registration.value = + OGS_NAS_5GS_REGISTRATION_TYPE_MOBILITY_UPDATING; + + test_ue->registration_request_param.uplink_data_status = 1; + test_ue->registration_request_param.psimask.uplink_data_status = + 1 << sess->psi; + nasbuf = testgmm_build_registration_request(test_ue, NULL, false, false); + ABTS_PTR_NOTNULL(tc, nasbuf); + + memset(&test_ue->registration_request_param, 0, + sizeof(test_ue->registration_request_param)); + test_ue->registration_request_param.guti = 1; + gmmbuf = testgmm_build_registration_request(test_ue, nasbuf, true, false); + ABTS_PTR_NOTNULL(tc, gmmbuf); + + sendbuf = testngap_build_initial_ue_message(test_ue, gmmbuf, + NGAP_RRCEstablishmentCause_mo_Signalling, true, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* Receive Configuration update command */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_DownlinkNASTransport, + test_ue->ngap_procedure_code); + + /* OLD 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); + + /* Receive InitialContextSetupRequest + + * Registration accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + ABTS_INT_EQUAL(tc, + NGAP_ProcedureCode_id_InitialContextSetup, + test_ue->ngap_procedure_code); + + /* Backup NGAP-ID */ + ran_ue_ngap_id = test_ue->ran_ue_ngap_id; + amf_ue_ngap_id = test_ue->amf_ue_ngap_id; + + /* Receive PDUSessionResourceSetupRequest + + * DL NAS transport + + * PDU session establishment accept */ + recvbuf = testgnb_ngap_read(ngap); + ABTS_PTR_NOTNULL(tc, recvbuf); + testngap_recv(test_ue, recvbuf); + + ABTS_INT_EQUAL(tc, ran_ue_ngap_id, test_ue->ran_ue_ngap_id + 1); + ABTS_INT_EQUAL(tc, amf_ue_ngap_id, test_ue->amf_ue_ngap_id + 1); + + /* Send OLD 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); + + /* Restore NGAP-ID */ + test_ue->ran_ue_ngap_id = ran_ue_ngap_id; + test_ue->amf_ue_ngap_id = amf_ue_ngap_id; + + /* Send InitialContextSetupResponse */ + sendbuf = testngap_build_initial_context_setup_response(test_ue, true); + ABTS_PTR_NOTNULL(tc, sendbuf); + rv = testgnb_ngap_send(ngap, sendbuf); + ABTS_INT_EQUAL(tc, OGS_OK, rv); + + /* 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); + + /* 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_guti(abts_suite *suite) { suite = ADD_SUITE(suite) @@ -1227,6 +1524,7 @@ abts_suite *test_guti(abts_suite *suite) abts_run_test(suite, test1_func, NULL); abts_run_test(suite, test2_func, NULL); abts_run_test(suite, test3_func, NULL); + abts_run_test(suite, test4_issues2839_func, NULL); return suite; }