diff --git a/src/amf/namf-handler.c b/src/amf/namf-handler.c index a356eb807..5367e259f 100644 --- a/src/amf/namf-handler.c +++ b/src/amf/namf-handler.c @@ -909,22 +909,31 @@ int amf_namf_callback_handle_sdm_data_change_notify( } if (amf_ue) { - 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_Deregisration - * 5. PDU session release request - * 6. PDUSessionResourceReleaseCommand + - * PDU session release command - * 7. PDUSessionResourceReleaseResponse - * 8. AM_Policy_Association_Termination - * 9. Deregistration accept - * 10. Signalling Connecion Release - */ - if (CM_CONNECTED(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() */ + + 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); @@ -932,15 +941,6 @@ int amf_namf_callback_handle_sdm_data_change_notify( ogs_assert(r != OGS_ERROR); state = AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED; - - } else if (CM_IDLE(amf_ue)) { - ogs_error("Not implemented : Use Implicit De-registration"); - - state = AMF_NETWORK_INITIATED_IMPLICIT_DE_REGISTERED; - - } else { - ogs_fatal("Invalid State"); - ogs_assert_if_reached(); } if (UDM_SDM_SUBSCRIBED(amf_ue)) { diff --git a/src/amf/npcf-build.c b/src/amf/npcf-build.c index 50ac1d1b5..9a8a6da8c 100644 --- a/src/amf/npcf-build.c +++ b/src/amf/npcf-build.c @@ -50,6 +50,13 @@ ogs_sbi_request_t *amf_npcf_am_policy_control_build_create( memset(&ueLocation, 0, sizeof(ueLocation)); memset(&UeAmbr, 0, sizeof(UeAmbr)); + ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); + if (!ran_ue) { + ogs_error("NG context has already been removed"); + /* ran_ue is required for amf_ue_rat_type() */ + goto end; + } + server = ogs_list_first(&ogs_sbi_self()->server_list); if (!server) { ogs_error("No server"); diff --git a/src/amf/nsmf-build.c b/src/amf/nsmf-build.c index a963ea6b4..1d1464d55 100644 --- a/src/amf/nsmf-build.c +++ b/src/amf/nsmf-build.c @@ -56,6 +56,13 @@ ogs_sbi_request_t *amf_nsmf_pdusession_build_create_sm_context( memset(&header, 0, sizeof(header)); memset(&ueLocation, 0, sizeof(ueLocation)); + ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue); + if (!ran_ue) { + /* ran_ue is required for amf_ue_rat_type() */ + ogs_error("NG context has already been removed"); + goto end; + } + SmContextCreateData.serving_nf_id = NF_INSTANCE_ID(ogs_sbi_self()->nf_instance); if (!SmContextCreateData.serving_nf_id) { diff --git a/src/amf/nudm-handler.c b/src/amf/nudm-handler.c index 71f3f0b9b..c6a471514 100644 --- a/src/amf/nudm-handler.c +++ b/src/amf/nudm-handler.c @@ -32,6 +32,14 @@ int amf_nudm_sdm_handle_provisioned( SWITCH(recvmsg->h.resource.component[1]) CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) + + ran_ue_t *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"); + return OGS_ERROR; + } + if (recvmsg->AccessAndMobilitySubscriptionData) { OpenAPI_list_t *gpsiList = recvmsg->AccessAndMobilitySubscriptionData->gpsis;