From 1dc4300203189b7f730f204e24252cb2a88c8d41 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Fri, 22 Mar 2024 06:48:58 +0900 Subject: [PATCH] [AMF] ran_ue can be NULL in IMPLICIT Dereg (#2999) When we try to send an SBI message to SMF to release a session, sometimes ran_ue is NULL. This happens when the Mobile Reachable Timer expires and Implicit Deregistration is triggered. To account for this case, we added the `ran_ue` parameter to the SBI interface and made it work even if it is NULL. --- src/amf/gmm-handler.c | 58 +++++++++++++-------- src/amf/gmm-handler.h | 6 ++- src/amf/gmm-sm.c | 30 ++++++----- src/amf/ngap-handler.c | 31 ++++++------ src/amf/nnssf-handler.c | 5 +- src/amf/nsmf-handler.c | 2 +- src/amf/sbi-path.c | 109 ++++++++++++++++++++++------------------ src/amf/sbi-path.h | 17 ++++--- 8 files changed, 147 insertions(+), 111 deletions(-) diff --git a/src/amf/gmm-handler.c b/src/amf/gmm-handler.c index ba2cd86be..16a9eb1e3 100644 --- a/src/amf/gmm-handler.c +++ b/src/amf/gmm-handler.c @@ -29,7 +29,7 @@ #define OGS_LOG_DOMAIN __gmm_log_domain static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( - amf_ue_t *amf_ue, uint8_t message_type, + ran_ue_t *ran_ue, amf_ue_t *amf_ue, uint8_t message_type, ogs_nas_message_container_t *nas_message_container); static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id); @@ -339,7 +339,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, return OGS_5GMM_CAUSE_REQUEST_ACCEPTED; } -ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_registration_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_registration_request_t *registration_request) { amf_sess_t *sess = NULL; @@ -352,6 +353,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, ogs_nas_5gs_update_type_t *update_type = NULL; ogs_assert(amf_ue); + ogs_assert(ran_ue); ogs_assert(registration_request); last_visited_registered_tai = @@ -376,7 +378,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) { return gmm_handle_nas_message_container( - amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST, + ran_ue, amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST, ®istration_request->nas_message_container); } @@ -472,7 +474,7 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, if ((psimask & (1 << sess->psi)) == 0) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_release_session( - sess, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT); + ran_ue, sess, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT); } } } @@ -491,7 +493,8 @@ ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, if (psimask & (1 << sess->psi)) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_activating_session( - sess, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST); } } } @@ -653,7 +656,8 @@ ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, return OGS_5GMM_CAUSE_REQUEST_ACCEPTED; } -ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_service_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_service_request_t *service_request) { amf_sess_t *sess = NULL; @@ -665,6 +669,8 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, ogs_nas_allowed_pdu_session_status_t *allowed_pdu_session_status = NULL; ogs_assert(amf_ue); + ogs_assert(ran_ue); + ogs_assert(service_request); uplink_data_status = &service_request->uplink_data_status; ogs_assert(uplink_data_status); @@ -677,7 +683,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) { return gmm_handle_nas_message_container( - amf_ue, OGS_NAS_5GS_SERVICE_REQUEST, + ran_ue, amf_ue, OGS_NAS_5GS_SERVICE_REQUEST, &service_request->nas_message_container); } @@ -712,7 +718,7 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, if ((psimask & (1 << sess->psi)) == 0) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_release_session( - sess, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT); + ran_ue, sess, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT); } } } @@ -739,7 +745,8 @@ ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, if (psimask & (1 << sess->psi)) { if (SESSION_CONTEXT_IN_SMF(sess)) amf_sbi_send_activating_session( - sess, AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST); } } } @@ -757,9 +764,12 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue, ogs_nas_5gs_deregistration_request_from_ue_t *deregistration_request) { int r, state, xact_count = 0; + ran_ue_t *ran_ue = NULL; ogs_nas_de_registration_type_t *de_registration_type = NULL; ogs_assert(amf_ue); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); ogs_assert(deregistration_request); de_registration_type = &deregistration_request->de_registration_type; @@ -790,7 +800,7 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue, xact_count = amf_sess_xact_count(amf_ue); state = AMF_UE_INITIATED_DE_REGISTERED; - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions(ran_ue, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -884,6 +894,7 @@ ogs_nas_5gmm_cause_t gmm_handle_identity_response(amf_ue_t *amf_ue, ogs_assert(amf_ue); ran_ue = ran_ue_cycle(amf_ue->ran_ue); ogs_assert(ran_ue); + ogs_assert(identity_response); mobile_identity = &identity_response->mobile_identity; @@ -940,12 +951,15 @@ 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) + ogs_nas_5gs_security_mode_complete_t *security_mode_complete) { + ran_ue_t *ran_ue = NULL; ogs_nas_5gs_mobile_identity_t *imeisv = NULL; ogs_nas_mobile_identity_imeisv_t *mobile_identity_imeisv = NULL; ogs_assert(amf_ue); + ran_ue = ran_ue_cycle(amf_ue->ran_ue); + ogs_assert(ran_ue); ogs_assert(security_mode_complete); /* @@ -1021,7 +1035,7 @@ ogs_nas_5gmm_cause_t gmm_handle_security_mode_complete(amf_ue_t *amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT) { return gmm_handle_nas_message_container( - amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE, + ran_ue, amf_ue, OGS_NAS_5GS_SECURITY_MODE_COMPLETE, &security_mode_complete->nas_message_container); } @@ -1316,14 +1330,15 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NNSSF_NSSELECTION, discovery_option, - amf_nnssf_nsselection_build_get, sess, 0, NULL); + amf_nnssf_nsselection_build_get, + ran_ue, sess, 0, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -1337,7 +1352,8 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID, + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_DUPLICATED_PDU_SESSION_ID, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1366,7 +1382,8 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, ¶m); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_N1_RELEASED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { @@ -1374,7 +1391,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -1440,7 +1457,7 @@ int gmm_handle_ul_nas_transport(ran_ue_t *ran_ue, amf_ue_t *amf_ue, } static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( - amf_ue_t *amf_ue, uint8_t message_type, + ran_ue_t *ran_ue, amf_ue_t *amf_ue, uint8_t message_type, ogs_nas_message_container_t *nas_message_container) { int gmm_cause; @@ -1449,6 +1466,7 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( ogs_nas_5gs_message_t nas_message; ogs_assert(amf_ue); + ogs_assert(ran_ue); ogs_assert(nas_message_container); if (!nas_message_container->buffer || !nas_message_container->length) { @@ -1505,12 +1523,12 @@ static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( case OGS_NAS_5GS_REGISTRATION_REQUEST: ogs_debug("Registration request in NAS message container"); gmm_cause = gmm_handle_registration_update( - amf_ue, &nas_message.gmm.registration_request); + ran_ue, amf_ue, &nas_message.gmm.registration_request); break; case OGS_NAS_5GS_SERVICE_REQUEST: ogs_debug("Service request in NAS message container"); gmm_cause = gmm_handle_service_update( - amf_ue, &nas_message.gmm.service_request); + ran_ue, amf_ue, &nas_message.gmm.service_request); break; default: ogs_error("Unknown message [%d]", nas_message.gmm.h.message_type); diff --git a/src/amf/gmm-handler.h b/src/amf/gmm-handler.h index 4cedf2077..3e735aa9e 100644 --- a/src/amf/gmm-handler.h +++ b/src/amf/gmm-handler.h @@ -30,13 +30,15 @@ extern "C" { ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code, ogs_nas_5gs_registration_request_t *registration_request); -ogs_nas_5gmm_cause_t gmm_handle_registration_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_registration_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_registration_request_t *registration_request); ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, ogs_nas_security_header_type_t h, NGAP_ProcedureCode_t ngap_code, ogs_nas_5gs_service_request_t *service_request); -ogs_nas_5gmm_cause_t gmm_handle_service_update(amf_ue_t *amf_ue, +ogs_nas_5gmm_cause_t gmm_handle_service_update( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, ogs_nas_5gs_service_request_t *service_request); int gmm_handle_deregistration_request(amf_ue_t *amf_ue, diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 522cf774a..6231e633c 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -64,7 +64,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) { amf_ue_t *amf_ue = NULL; amf_sess_t *sess = NULL; - ran_ue_t *ran_ue = NULL; ogs_sbi_message_t *sbi_message = NULL; @@ -302,7 +301,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { int xact_count = amf_sess_xact_count(amf_ue); - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions(NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -555,9 +554,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) SWITCH(sbi_message->h.resource.component[2]) CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) - ran_ue = ran_ue_cycle(amf_ue->ran_ue); - ogs_assert(ran_ue); - if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) { r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue); ogs_expect(r == OGS_OK); @@ -574,7 +570,8 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) } amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + amf_ue->ran_ue, amf_ue, + AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -887,7 +884,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) { int xact_count = amf_sess_xact_count(amf_ue); - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions(NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -1058,7 +1055,8 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e) } else { - amf_sbi_send_release_all_sessions(amf_ue, state); + amf_sbi_send_release_all_sessions( + NULL, amf_ue, state); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -1333,7 +1331,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, CLEAR_NG_CONTEXT(amf_ue); gmm_cause = gmm_handle_registration_update( - amf_ue, &nas_message->gmm.registration_request); + ran_ue, amf_ue, &nas_message->gmm.registration_request); if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_update() " "failed [%d]", amf_ue->suci, gmm_cause); @@ -1392,7 +1390,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, } else { amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -1462,7 +1460,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, CLEAR_NG_CONTEXT(amf_ue); gmm_cause = gmm_handle_service_update( - amf_ue, &nas_message->gmm.service_request); + ran_ue, amf_ue, &nas_message->gmm.service_request); if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_service_update() failed [%d]", amf_ue->suci, gmm_cause); @@ -1513,7 +1511,7 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e, } amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2417,7 +2415,7 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) } amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2552,7 +2550,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + amf_ue->ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { @@ -2613,7 +2611,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) CLEAR_NG_CONTEXT(amf_ue); gmm_cause = gmm_handle_registration_update( - amf_ue, &nas_message->gmm.registration_request); + ran_ue, amf_ue, &nas_message->gmm.registration_request); if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) { ogs_error("[%s] gmm_handle_registration_update() " "failed [%d]", amf_ue->suci, gmm_cause); @@ -2664,7 +2662,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) } else { amf_sbi_send_release_all_sessions( - amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); + ran_ue, amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE); if (!AMF_SESSION_RELEASE_PENDING(amf_ue) && amf_sess_xact_count(amf_ue) == xact_count) { diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 8c6d852ef..e9e2b8768 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -1018,7 +1018,7 @@ void ngap_handle_initial_context_setup_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -1248,7 +1248,7 @@ void ngap_handle_initial_context_setup_failure( amf_ue->deactivation.cause = NGAP_CauseNas_normal_release; amf_sbi_send_deactivate_all_sessions( - amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, + ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, Cause->present, (int)Cause->choice.radioNetwork); new_xact_count = amf_sess_xact_count(amf_ue); @@ -1552,7 +1552,7 @@ void ngap_handle_ue_context_release_request( if (!PDUSessionList) { amf_sbi_send_deactivate_all_sessions( - amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, + ran_ue, amf_ue, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, Cause->present, (int)Cause->choice.radioNetwork); } else { for (i = 0; i < PDUSessionList->list.count; i++) { @@ -1584,7 +1584,7 @@ void ngap_handle_ue_context_release_request( PDUSessionItem->pDUSessionID); if (SESSION_CONTEXT_IN_SMF(sess)) { amf_sbi_send_deactivate_session( - sess, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_DEACTIVATED, Cause->present, (int)Cause->choice.radioNetwork); } } @@ -2002,7 +2002,7 @@ void ngap_handle_pdu_session_resource_setup_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2128,7 +2128,7 @@ void ngap_handle_pdu_session_resource_setup_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, ¶m); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2321,7 +2321,7 @@ void ngap_handle_pdu_session_resource_modify_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2508,7 +2508,7 @@ void ngap_handle_pdu_session_resource_release_response( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, ¶m); + ran_ue, sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -2977,7 +2977,8 @@ void ngap_handle_path_switch_request( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, ¶m); + ran_ue, sess, + AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3366,7 +3367,8 @@ void ngap_handle_handover_required( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, ¶m); + source_ue, sess, + AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3607,7 +3609,8 @@ void ngap_handle_handover_request_ack( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, ¶m); + target_ue, sess, + AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -3879,7 +3882,7 @@ void ngap_handle_handover_cancel( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, ¶m); + source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -4188,7 +4191,7 @@ void ngap_handle_handover_notification( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_update_sm_context, - sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, ¶m); + source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } @@ -4604,7 +4607,7 @@ void ngap_handle_ng_reset( old_xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_deactivate_all_sessions( - amf_ue, AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL, + ran_ue, amf_ue, AMF_REMOVE_S1_CONTEXT_BY_RESET_PARTIAL, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure); diff --git a/src/amf/nnssf-handler.c b/src/amf/nnssf-handler.c index 27e81650a..f13a1b817 100644 --- a/src/amf/nnssf-handler.c +++ b/src/amf/nnssf-handler.c @@ -121,7 +121,7 @@ int amf_nnssf_nsselection_handle_get( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, ¶m); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { @@ -163,7 +163,8 @@ int amf_nnssf_nsselection_handle_get( ogs_freeaddrinfo(addr6); r = amf_sess_sbi_discover_by_nsi( - sess, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option); + ran_ue, sess, + OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index f011b7e9e..09aad0293 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -635,7 +635,7 @@ int amf_nsmf_pdusession_handle_update_sm_context( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } else { diff --git a/src/amf/sbi-path.c b/src/amf/sbi-path.c index 0f5e4a3cb..c48d3e49e 100644 --- a/src/amf/sbi-path.c +++ b/src/amf/sbi-path.c @@ -158,30 +158,24 @@ int amf_sess_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data), - amf_sess_t *sess, int state, void *data) + ran_ue_t *ran_ue, amf_sess_t *sess, int state, void *data) { int r; 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; - } + if (ran_ue) { + sess->ran_ue = ran_ue_cycle(ran_ue); + if (!sess->ran_ue) { + ogs_error("NG context has already been removed"); + return OGS_NOTFOUND; + } + } else + sess->ran_ue = NULL; xact = ogs_sbi_xact_add( &sess->sbi, service_type, discovery_option, @@ -221,6 +215,7 @@ static int client_discover_cb( OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL; ogs_sbi_discovery_option_t *discovery_option = NULL; amf_ue_t *amf_ue = NULL; + ran_ue_t *ran_ue = NULL; amf_sess_t *sess = NULL; xact = data; @@ -253,14 +248,30 @@ static int client_discover_cb( } ogs_assert(sess->sbi.type == OGS_SBI_OBJ_SESS_TYPE); - amf_ue = sess->amf_ue; - ogs_assert(amf_ue); + amf_ue = amf_ue_cycle(sess->amf_ue); + if (!amf_ue) { + ogs_error("UE(amf-ue) context has already been removed"); + ogs_sbi_xact_remove(xact); + if (response) + ogs_sbi_response_free(response); + return OGS_ERROR; + } + ran_ue = ran_ue_cycle(sess->ran_ue); + if (!ran_ue) { + ogs_error("[%s] NG context has already been removed", amf_ue->supi); + ogs_sbi_xact_remove(xact); + if (response) + ogs_sbi_response_free(response); + return OGS_ERROR; + } if (status != OGS_OK) { ogs_log_message( status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, "client_discover_cb() failed [%d]", status); ogs_sbi_xact_remove(xact); + if (response) + ogs_sbi_response_free(response); return OGS_ERROR; } @@ -269,7 +280,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->ran_ue, 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); ogs_assert(r != OGS_ERROR); @@ -279,7 +290,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->ran_ue, 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); ogs_assert(r != OGS_ERROR); @@ -289,7 +300,7 @@ static int client_discover_cb( if (!message.SearchResult) { ogs_error("No SearchResult"); - r = nas_5gs_send_back_gsm_message(sess->ran_ue, 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); ogs_assert(r != OGS_ERROR); @@ -306,7 +317,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->ran_ue, 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); @@ -318,7 +329,7 @@ static int client_discover_cb( r = amf_sess_sbi_discover_and_send( service_type, NULL, amf_nsmf_pdusession_build_create_sm_context, - sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); + ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -339,15 +350,13 @@ cleanup: } int amf_sess_sbi_discover_by_nsi( - amf_sess_t *sess, + ran_ue_t *ran_ue, amf_sess_t *sess, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option) { 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); @@ -356,18 +365,14 @@ 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; - } + if (ran_ue) { + sess->ran_ue = ran_ue_cycle(ran_ue); + if (!sess->ran_ue) { + ogs_error("NG context has already been removed"); + return OGS_NOTFOUND; + } + } else + sess->ran_ue = NULL; xact = ogs_sbi_xact_add( &sess->sbi, service_type, discovery_option, NULL, NULL, NULL); @@ -388,7 +393,8 @@ int amf_sess_sbi_discover_by_nsi( client, client_discover_cb, xact->request, xact) == true ? OGS_OK : OGS_ERROR; } -void amf_sbi_send_activating_session(amf_sess_t *sess, int state) +void amf_sbi_send_activating_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state) { amf_nsmf_pdusession_sm_context_param_t param; int r; @@ -400,13 +406,14 @@ void amf_sbi_send_activating_session(amf_sess_t *sess, int state) r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, - amf_nsmf_pdusession_build_update_sm_context, sess, state, ¶m); + amf_nsmf_pdusession_build_update_sm_context, + ran_ue, sess, state, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } void amf_sbi_send_deactivate_session( - amf_sess_t *sess, int state, int group, int cause) + ran_ue_t *ran_ue, amf_sess_t *sess, int state, int group, int cause) { amf_nsmf_pdusession_sm_context_param_t param; int r; @@ -422,13 +429,14 @@ void amf_sbi_send_deactivate_session( r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, - amf_nsmf_pdusession_build_update_sm_context, sess, state, ¶m); + amf_nsmf_pdusession_build_update_sm_context, + ran_ue, sess, state, ¶m); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); } void amf_sbi_send_deactivate_all_sessions( - amf_ue_t *amf_ue, int state, int group, int cause) + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state, int group, int cause) { amf_sess_t *sess = NULL; @@ -436,7 +444,7 @@ void amf_sbi_send_deactivate_all_sessions( ogs_list_for_each(&amf_ue->sess_list, sess) { if (SESSION_CONTEXT_IN_SMF(sess)) - amf_sbi_send_deactivate_session(sess, state, group, cause); + amf_sbi_send_deactivate_session(ran_ue, sess, state, group, cause); } } @@ -448,13 +456,13 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state) ogs_list_for_each_safe(&gnb->ran_ue_list, ran_ue_next, ran_ue) { int old_xact_count = 0, new_xact_count = 0; - amf_ue = ran_ue->amf_ue; + amf_ue = amf_ue_cycle(ran_ue->amf_ue); if (amf_ue) { old_xact_count = amf_sess_xact_count(amf_ue); amf_sbi_send_deactivate_all_sessions( - amf_ue, state, NGAP_Cause_PR_radioNetwork, + ran_ue, amf_ue, state, NGAP_Cause_PR_radioNetwork, NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure); new_xact_count = amf_sess_xact_count(amf_ue); @@ -482,7 +490,8 @@ void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state) } } -void amf_sbi_send_release_session(amf_sess_t *sess, int state) +void amf_sbi_send_release_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state) { int r; @@ -490,7 +499,8 @@ void amf_sbi_send_release_session(amf_sess_t *sess, int state) r = amf_sess_sbi_discover_and_send( OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, - amf_nsmf_pdusession_build_release_sm_context, sess, state, NULL); + amf_nsmf_pdusession_build_release_sm_context, + ran_ue, sess, state, NULL); ogs_expect(r == OGS_OK); ogs_assert(r != OGS_ERROR); @@ -498,7 +508,8 @@ void amf_sbi_send_release_session(amf_sess_t *sess, int state) CLEAR_SM_CONTEXT_REF(sess); } -void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state) +void amf_sbi_send_release_all_sessions( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state) { amf_sess_t *sess = NULL; @@ -506,7 +517,7 @@ void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state) ogs_list_for_each(&amf_ue->sess_list, sess) { if (SESSION_CONTEXT_IN_SMF(sess)) - amf_sbi_send_release_session(sess, state); + amf_sbi_send_release_session(ran_ue, sess, state); } } diff --git a/src/amf/sbi-path.h b/src/amf/sbi-path.h index da6952eb7..3f666f5d6 100644 --- a/src/amf/sbi-path.h +++ b/src/amf/sbi-path.h @@ -74,23 +74,26 @@ int amf_sess_sbi_discover_and_send( ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data), - amf_sess_t *sess, int state, void *data); + ran_ue_t *ran_ue, amf_sess_t *sess, int state, void *data); int amf_sess_sbi_discover_by_nsi( - amf_sess_t *sess, + ran_ue_t *ran_ue, amf_sess_t *sess, ogs_sbi_service_type_e service_type, ogs_sbi_discovery_option_t *discovery_option); -void amf_sbi_send_activating_session(amf_sess_t *sess, int state); +void amf_sbi_send_activating_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state); void amf_sbi_send_deactivate_session( - amf_sess_t *sess, int state, int group, int cause); + ran_ue_t *ran_ue, amf_sess_t *sess, int state, int group, int cause); void amf_sbi_send_deactivate_all_sessions( - amf_ue_t *amf_ue, int state, int group, int cause); + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state, int group, int cause); void amf_sbi_send_deactivate_all_ue_in_gnb(amf_gnb_t *gnb, int state); -void amf_sbi_send_release_session(amf_sess_t *sess, int state); -void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state); +void amf_sbi_send_release_session( + ran_ue_t *ran_ue, amf_sess_t *sess, int state); +void amf_sbi_send_release_all_sessions( + ran_ue_t *ran_ue, amf_ue_t *amf_ue, int state); bool amf_sbi_send_n1_n2_failure_notify( amf_sess_t *sess, OpenAPI_n1_n2_message_transfer_cause_e cause);