[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.
This commit is contained in:
Sukchan Lee 2024-03-22 06:48:58 +09:00
parent 3b5e851f5d
commit 1dc4300203
8 changed files with 147 additions and 111 deletions

View File

@ -29,7 +29,7 @@
#define OGS_LOG_DOMAIN __gmm_log_domain #define OGS_LOG_DOMAIN __gmm_log_domain
static ogs_nas_5gmm_cause_t gmm_handle_nas_message_container( 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); ogs_nas_message_container_t *nas_message_container);
static uint8_t gmm_cause_from_access_control(ogs_plmn_id_t *plmn_id); 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; 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) ogs_nas_5gs_registration_request_t *registration_request)
{ {
amf_sess_t *sess = NULL; 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_nas_5gs_update_type_t *update_type = NULL;
ogs_assert(amf_ue); ogs_assert(amf_ue);
ogs_assert(ran_ue);
ogs_assert(registration_request); ogs_assert(registration_request);
last_visited_registered_tai = 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) { OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) {
return gmm_handle_nas_message_container( return gmm_handle_nas_message_container(
amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST, ran_ue, amf_ue, OGS_NAS_5GS_REGISTRATION_REQUEST,
&registration_request->nas_message_container); &registration_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 ((psimask & (1 << sess->psi)) == 0) {
if (SESSION_CONTEXT_IN_SMF(sess)) if (SESSION_CONTEXT_IN_SMF(sess))
amf_sbi_send_release_session( 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 (psimask & (1 << sess->psi)) {
if (SESSION_CONTEXT_IN_SMF(sess)) if (SESSION_CONTEXT_IN_SMF(sess))
amf_sbi_send_activating_session( 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; 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) ogs_nas_5gs_service_request_t *service_request)
{ {
amf_sess_t *sess = NULL; 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_nas_allowed_pdu_session_status_t *allowed_pdu_session_status = NULL;
ogs_assert(amf_ue); ogs_assert(amf_ue);
ogs_assert(ran_ue);
ogs_assert(service_request);
uplink_data_status = &service_request->uplink_data_status; uplink_data_status = &service_request->uplink_data_status;
ogs_assert(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) { OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT) {
return gmm_handle_nas_message_container( 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); &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 ((psimask & (1 << sess->psi)) == 0) {
if (SESSION_CONTEXT_IN_SMF(sess)) if (SESSION_CONTEXT_IN_SMF(sess))
amf_sbi_send_release_session( 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 (psimask & (1 << sess->psi)) {
if (SESSION_CONTEXT_IN_SMF(sess)) if (SESSION_CONTEXT_IN_SMF(sess))
amf_sbi_send_activating_session( 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) ogs_nas_5gs_deregistration_request_from_ue_t *deregistration_request)
{ {
int r, state, xact_count = 0; int r, state, xact_count = 0;
ran_ue_t *ran_ue = NULL;
ogs_nas_de_registration_type_t *de_registration_type = NULL; ogs_nas_de_registration_type_t *de_registration_type = NULL;
ogs_assert(amf_ue); ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
ogs_assert(deregistration_request); ogs_assert(deregistration_request);
de_registration_type = &deregistration_request->de_registration_type; 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); xact_count = amf_sess_xact_count(amf_ue);
state = AMF_UE_INITIATED_DE_REGISTERED; 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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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); ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue); ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue); ogs_assert(ran_ue);
ogs_assert(identity_response);
mobile_identity = &identity_response->mobile_identity; 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_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_5gs_mobile_identity_t *imeisv = NULL;
ogs_nas_mobile_identity_imeisv_t *mobile_identity_imeisv = NULL; ogs_nas_mobile_identity_imeisv_t *mobile_identity_imeisv = NULL;
ogs_assert(amf_ue); ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
ogs_assert(ran_ue);
ogs_assert(security_mode_complete); 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) { OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT) {
return gmm_handle_nas_message_container( 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); &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, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION,
discovery_option, discovery_option,
amf_nsmf_pdusession_build_create_sm_context, 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_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} else { } else {
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NNSSF_NSSELECTION, OGS_SBI_SERVICE_TYPE_NNSSF_NSSELECTION,
discovery_option, 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_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); 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( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, 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,
&param); &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); 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( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_N1_RELEASED, &param); ran_ue, sess,
AMF_UPDATE_SM_CONTEXT_N1_RELEASED, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} else { } 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( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param); ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); 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( 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) ogs_nas_message_container_t *nas_message_container)
{ {
int gmm_cause; 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_nas_5gs_message_t nas_message;
ogs_assert(amf_ue); ogs_assert(amf_ue);
ogs_assert(ran_ue);
ogs_assert(nas_message_container); ogs_assert(nas_message_container);
if (!nas_message_container->buffer || !nas_message_container->length) { 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: case OGS_NAS_5GS_REGISTRATION_REQUEST:
ogs_debug("Registration request in NAS message container"); ogs_debug("Registration request in NAS message container");
gmm_cause = gmm_handle_registration_update( gmm_cause = gmm_handle_registration_update(
amf_ue, &nas_message.gmm.registration_request); ran_ue, amf_ue, &nas_message.gmm.registration_request);
break; break;
case OGS_NAS_5GS_SERVICE_REQUEST: case OGS_NAS_5GS_SERVICE_REQUEST:
ogs_debug("Service request in NAS message container"); ogs_debug("Service request in NAS message container");
gmm_cause = gmm_handle_service_update( gmm_cause = gmm_handle_service_update(
amf_ue, &nas_message.gmm.service_request); ran_ue, amf_ue, &nas_message.gmm.service_request);
break; break;
default: default:
ogs_error("Unknown message [%d]", nas_message.gmm.h.message_type); ogs_error("Unknown message [%d]", nas_message.gmm.h.message_type);

View File

@ -30,13 +30,15 @@ extern "C" {
ogs_nas_5gmm_cause_t gmm_handle_registration_request(amf_ue_t *amf_ue, 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_security_header_type_t h, NGAP_ProcedureCode_t ngap_code,
ogs_nas_5gs_registration_request_t *registration_request); 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_5gs_registration_request_t *registration_request);
ogs_nas_5gmm_cause_t gmm_handle_service_request(amf_ue_t *amf_ue, 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_security_header_type_t h, NGAP_ProcedureCode_t ngap_code,
ogs_nas_5gs_service_request_t *service_request); 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); ogs_nas_5gs_service_request_t *service_request);
int gmm_handle_deregistration_request(amf_ue_t *amf_ue, int gmm_handle_deregistration_request(amf_ue_t *amf_ue,

View File

@ -64,7 +64,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
{ {
amf_ue_t *amf_ue = NULL; amf_ue_t *amf_ue = NULL;
amf_sess_t *sess = NULL; amf_sess_t *sess = NULL;
ran_ue_t *ran_ue = NULL;
ogs_sbi_message_t *sbi_message = 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) { AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) {
int xact_count = amf_sess_xact_count(amf_ue); 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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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]) SWITCH(sbi_message->h.resource.component[2])
CASE(OGS_SBI_RESOURCE_NAME_TRANSFER) 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) { if (sbi_message->res_status == OGS_SBI_HTTP_STATUS_OK) {
r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue); r = amf_namf_comm_handle_ue_context_transfer_response(sbi_message, amf_ue);
ogs_expect(r == OGS_OK); 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_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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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) { AMF_NETWORK_INITIATED_EXPLICIT_DE_REGISTERED) {
int xact_count = amf_sess_xact_count(amf_ue); 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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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 { } 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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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); CLEAR_NG_CONTEXT(amf_ue);
gmm_cause = gmm_handle_registration_update( 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) { if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_registration_update() " ogs_error("[%s] gmm_handle_registration_update() "
"failed [%d]", amf_ue->suci, gmm_cause); "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 { } else {
amf_sbi_send_release_all_sessions( 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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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); CLEAR_NG_CONTEXT(amf_ue);
gmm_cause = gmm_handle_service_update( 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) { if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_service_update() failed [%d]", ogs_error("[%s] gmm_handle_service_update() failed [%d]",
amf_ue->suci, gmm_cause); 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_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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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_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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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); xact_count = amf_sess_xact_count(amf_ue);
amf_sbi_send_release_all_sessions( 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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { 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); CLEAR_NG_CONTEXT(amf_ue);
gmm_cause = gmm_handle_registration_update( 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) { if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] gmm_handle_registration_update() " ogs_error("[%s] gmm_handle_registration_update() "
"failed [%d]", amf_ue->suci, gmm_cause); "failed [%d]", amf_ue->suci, gmm_cause);
@ -2664,7 +2662,7 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
} else { } else {
amf_sbi_send_release_all_sessions( 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) && if (!AMF_SESSION_RELEASE_PENDING(amf_ue) &&
amf_sess_xact_count(amf_ue) == xact_count) { amf_sess_xact_count(amf_ue) == xact_count) {

View File

@ -1018,7 +1018,7 @@ void ngap_handle_initial_context_setup_response(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param); ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); 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_ue->deactivation.cause = NGAP_CauseNas_normal_release;
amf_sbi_send_deactivate_all_sessions( 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); Cause->present, (int)Cause->choice.radioNetwork);
new_xact_count = amf_sess_xact_count(amf_ue); new_xact_count = amf_sess_xact_count(amf_ue);
@ -1552,7 +1552,7 @@ void ngap_handle_ue_context_release_request(
if (!PDUSessionList) { if (!PDUSessionList) {
amf_sbi_send_deactivate_all_sessions( 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); Cause->present, (int)Cause->choice.radioNetwork);
} else { } else {
for (i = 0; i < PDUSessionList->list.count; i++) { for (i = 0; i < PDUSessionList->list.count; i++) {
@ -1584,7 +1584,7 @@ void ngap_handle_ue_context_release_request(
PDUSessionItem->pDUSessionID); PDUSessionItem->pDUSessionID);
if (SESSION_CONTEXT_IN_SMF(sess)) { if (SESSION_CONTEXT_IN_SMF(sess)) {
amf_sbi_send_deactivate_session( 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); 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( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param); ran_ue, sess, AMF_UPDATE_SM_CONTEXT_ACTIVATED, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -2128,7 +2128,7 @@ void ngap_handle_pdu_session_resource_setup_response(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, &param); ran_ue, sess, AMF_UPDATE_SM_CONTEXT_SETUP_FAIL, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -2321,7 +2321,7 @@ void ngap_handle_pdu_session_resource_modify_response(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param); ran_ue, sess, AMF_UPDATE_SM_CONTEXT_MODIFIED, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -2508,7 +2508,7 @@ void ngap_handle_pdu_session_resource_release_response(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, &param); ran_ue, sess, AMF_UPDATE_SM_CONTEXT_N2_RELEASED, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -2977,7 +2977,8 @@ void ngap_handle_path_switch_request(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, &param); ran_ue, sess,
AMF_UPDATE_SM_CONTEXT_PATH_SWITCH_REQUEST, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -3366,7 +3367,8 @@ void ngap_handle_handover_required(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, &param); source_ue, sess,
AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -3607,7 +3609,8 @@ void ngap_handle_handover_request_ack(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, &param); target_ue, sess,
AMF_UPDATE_SM_CONTEXT_HANDOVER_REQ_ACK, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -3879,7 +3882,7 @@ void ngap_handle_handover_cancel(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, &param); source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_CANCEL, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} }
@ -4188,7 +4191,7 @@ void ngap_handle_handover_notification(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, amf_nsmf_pdusession_build_update_sm_context,
sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, &param); source_ue, sess, AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} }
@ -4604,7 +4607,7 @@ void ngap_handle_ng_reset(
old_xact_count = amf_sess_xact_count(amf_ue); old_xact_count = amf_sess_xact_count(amf_ue);
amf_sbi_send_deactivate_all_sessions( 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_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure); NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure);

View File

@ -121,7 +121,7 @@ int amf_nnssf_nsselection_handle_get(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, discovery_option,
amf_nsmf_pdusession_build_create_sm_context, amf_nsmf_pdusession_build_create_sm_context,
sess, AMF_CREATE_SM_CONTEXT_NO_STATE, &param); ran_ue, sess, AMF_CREATE_SM_CONTEXT_NO_STATE, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} else { } else {
@ -163,7 +163,8 @@ int amf_nnssf_nsselection_handle_get(
ogs_freeaddrinfo(addr6); ogs_freeaddrinfo(addr6);
r = amf_sess_sbi_discover_by_nsi( 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_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} }

View File

@ -635,7 +635,7 @@ int amf_nsmf_pdusession_handle_update_sm_context(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_create_sm_context, 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_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} else { } else {

View File

@ -158,30 +158,24 @@ int amf_sess_sbi_discover_and_send(
ogs_sbi_service_type_e service_type, ogs_sbi_service_type_e service_type,
ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_discovery_option_t *discovery_option,
ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data), 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 r;
int rv; int rv;
ogs_sbi_xact_t *xact = NULL; ogs_sbi_xact_t *xact = NULL;
amf_ue_t *amf_ue = NULL;
ogs_assert(service_type); ogs_assert(service_type);
ogs_assert(sess); ogs_assert(sess);
ogs_assert(build); ogs_assert(build);
amf_ue = amf_ue_cycle(sess->amf_ue); if (ran_ue) {
if (!amf_ue) { sess->ran_ue = ran_ue_cycle(ran_ue);
ogs_error("UE(amf_ue) Context has already been removed"); if (!sess->ran_ue) {
return OGS_NOTFOUND; ogs_error("NG context has already been removed");
} return OGS_NOTFOUND;
}
sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue); } else
if (!sess->ran_ue) { sess->ran_ue = NULL;
ogs_error("[%s] RAN-NG Context has already been removed",
amf_ue->supi);
return OGS_NOTFOUND;
}
xact = ogs_sbi_xact_add( xact = ogs_sbi_xact_add(
&sess->sbi, service_type, discovery_option, &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; OpenAPI_nf_type_e requester_nf_type = OpenAPI_nf_type_NULL;
ogs_sbi_discovery_option_t *discovery_option = NULL; ogs_sbi_discovery_option_t *discovery_option = NULL;
amf_ue_t *amf_ue = NULL; amf_ue_t *amf_ue = NULL;
ran_ue_t *ran_ue = NULL;
amf_sess_t *sess = NULL; amf_sess_t *sess = NULL;
xact = data; xact = data;
@ -253,14 +248,30 @@ static int client_discover_cb(
} }
ogs_assert(sess->sbi.type == OGS_SBI_OBJ_SESS_TYPE); ogs_assert(sess->sbi.type == OGS_SBI_OBJ_SESS_TYPE);
amf_ue = sess->amf_ue; amf_ue = amf_ue_cycle(sess->amf_ue);
ogs_assert(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) { if (status != OGS_OK) {
ogs_log_message( ogs_log_message(
status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0, status == OGS_DONE ? OGS_LOG_DEBUG : OGS_LOG_WARN, 0,
"client_discover_cb() failed [%d]", status); "client_discover_cb() failed [%d]", status);
ogs_sbi_xact_remove(xact); ogs_sbi_xact_remove(xact);
if (response)
ogs_sbi_response_free(response);
return OGS_ERROR; return OGS_ERROR;
} }
@ -269,7 +280,7 @@ static int client_discover_cb(
rv = ogs_sbi_parse_response(&message, response); rv = ogs_sbi_parse_response(&message, response);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("cannot parse HTTP response"); 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_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -279,7 +290,7 @@ static int client_discover_cb(
if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { if (message.res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("NF-Discover failed [%d]", message.res_status); 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_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -289,7 +300,7 @@ static int client_discover_cb(
if (!message.SearchResult) { if (!message.SearchResult) {
ogs_error("No 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_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -306,7 +317,7 @@ static int client_discover_cb(
ogs_error("[%s:%d] (NF discover) No [%s]", ogs_error("[%s:%d] (NF discover) No [%s]",
amf_ue->supi, sess->psi, amf_ue->supi, sess->psi,
ogs_sbi_service_type_to_name(service_type)); 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, OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME); AMF_NAS_BACKOFF_TIME);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
@ -318,7 +329,7 @@ static int client_discover_cb(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
service_type, NULL, service_type, NULL,
amf_nsmf_pdusession_build_create_sm_context, 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_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
@ -339,15 +350,13 @@ cleanup:
} }
int amf_sess_sbi_discover_by_nsi( 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_service_type_e service_type,
ogs_sbi_discovery_option_t *discovery_option) ogs_sbi_discovery_option_t *discovery_option)
{ {
ogs_sbi_xact_t *xact = NULL; ogs_sbi_xact_t *xact = NULL;
ogs_sbi_client_t *client = NULL; ogs_sbi_client_t *client = NULL;
amf_ue_t *amf_ue = NULL;
ogs_assert(sess); ogs_assert(sess);
client = sess->nssf.nrf.client; client = sess->nssf.nrf.client;
ogs_assert(client); ogs_assert(client);
@ -356,18 +365,14 @@ int amf_sess_sbi_discover_by_nsi(
ogs_warn("Try to discover [%s]", ogs_warn("Try to discover [%s]",
ogs_sbi_service_type_to_name(service_type)); ogs_sbi_service_type_to_name(service_type));
amf_ue = amf_ue_cycle(sess->amf_ue); if (ran_ue) {
if (!amf_ue) { sess->ran_ue = ran_ue_cycle(ran_ue);
ogs_error("UE(amf_ue) Context has already been removed"); if (!sess->ran_ue) {
return OGS_NOTFOUND; ogs_error("NG context has already been removed");
} return OGS_NOTFOUND;
}
sess->ran_ue = ran_ue_cycle(amf_ue->ran_ue); } else
if (!sess->ran_ue) { sess->ran_ue = NULL;
ogs_error("[%s] RAN-NG Context has already been removed",
amf_ue->supi);
return OGS_NOTFOUND;
}
xact = ogs_sbi_xact_add( xact = ogs_sbi_xact_add(
&sess->sbi, service_type, discovery_option, NULL, NULL, NULL); &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; 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; amf_nsmf_pdusession_sm_context_param_t param;
int r; 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( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, sess, state, &param); amf_nsmf_pdusession_build_update_sm_context,
ran_ue, sess, state, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} }
void amf_sbi_send_deactivate_session( 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; amf_nsmf_pdusession_sm_context_param_t param;
int r; int r;
@ -422,13 +429,14 @@ void amf_sbi_send_deactivate_session(
r = amf_sess_sbi_discover_and_send( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL,
amf_nsmf_pdusession_build_update_sm_context, sess, state, &param); amf_nsmf_pdusession_build_update_sm_context,
ran_ue, sess, state, &param);
ogs_expect(r == OGS_OK); ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); ogs_assert(r != OGS_ERROR);
} }
void amf_sbi_send_deactivate_all_sessions( 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; 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) { ogs_list_for_each(&amf_ue->sess_list, sess) {
if (SESSION_CONTEXT_IN_SMF(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) { ogs_list_for_each_safe(&gnb->ran_ue_list, ran_ue_next, ran_ue) {
int old_xact_count = 0, new_xact_count = 0; 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) { if (amf_ue) {
old_xact_count = amf_sess_xact_count(amf_ue); old_xact_count = amf_sess_xact_count(amf_ue);
amf_sbi_send_deactivate_all_sessions( 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); NGAP_CauseRadioNetwork_failure_in_radio_interface_procedure);
new_xact_count = amf_sess_xact_count(amf_ue); 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; 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( r = amf_sess_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NSMF_PDUSESSION, NULL, 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_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR); 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); 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; 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) { ogs_list_for_each(&amf_ue->sess_list, sess) {
if (SESSION_CONTEXT_IN_SMF(sess)) if (SESSION_CONTEXT_IN_SMF(sess))
amf_sbi_send_release_session(sess, state); amf_sbi_send_release_session(ran_ue, sess, state);
} }
} }

View File

@ -74,23 +74,26 @@ int amf_sess_sbi_discover_and_send(
ogs_sbi_service_type_e service_type, ogs_sbi_service_type_e service_type,
ogs_sbi_discovery_option_t *discovery_option, ogs_sbi_discovery_option_t *discovery_option,
ogs_sbi_request_t *(*build)(amf_sess_t *sess, void *data), 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( 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_service_type_e service_type,
ogs_sbi_discovery_option_t *discovery_option); 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( 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( 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_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(
void amf_sbi_send_release_all_sessions(amf_ue_t *amf_ue, int state); 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( bool amf_sbi_send_n1_n2_failure_notify(
amf_sess_t *sess, OpenAPI_n1_n2_message_transfer_cause_e cause); amf_sess_t *sess, OpenAPI_n1_n2_message_transfer_cause_e cause);