From ddf09f270aaaaae67ac9ec1c157b4b28f1c90d10 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Mon, 7 Nov 2022 16:51:51 +0900 Subject: [PATCH] [SMF] Fixed PTI when PDU Session Reject --- src/smf/gsm-build.c | 4 +- src/smf/gsm-build.h | 2 +- src/smf/n4-handler.c | 50 ++++++++++++++++++---- src/smf/nsmf-handler.c | 73 ++++++++++++++++++-------------- src/smf/smf-sm.c | 2 - tests/slice/different-dnn-test.c | 2 +- tests/slice/same-dnn-test.c | 4 +- 7 files changed, 89 insertions(+), 48 deletions(-) diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index 1f6051437..2575b9daf 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -292,7 +292,7 @@ static void encode_qos_rule_packet_filter( } ogs_pkbuf_t *gsm_build_pdu_session_modification_command( - smf_sess_t *sess, uint8_t pti, + smf_sess_t *sess, uint8_t qos_rule_code, uint8_t qos_flow_description_code) { ogs_pkbuf_t *pkbuf = NULL; @@ -325,7 +325,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_modification_command( message.gsm.h.extended_protocol_discriminator = OGS_NAS_EXTENDED_PROTOCOL_DISCRIMINATOR_5GSM; message.gsm.h.pdu_session_identity = sess->psi; - message.gsm.h.procedure_transaction_identity = pti; + message.gsm.h.procedure_transaction_identity = sess->pti; message.gsm.h.message_type = OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND; /* QoS rule */ diff --git a/src/smf/gsm-build.h b/src/smf/gsm-build.h index 6df396d56..48118891a 100644 --- a/src/smf/gsm-build.h +++ b/src/smf/gsm-build.h @@ -31,7 +31,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_reject( smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause); ogs_pkbuf_t *gsm_build_pdu_session_modification_command( - smf_sess_t *sess, uint8_t pti, + smf_sess_t *sess, uint8_t qos_rule_code, uint8_t qos_flow_description_code); ogs_pkbuf_t *gsm_build_pdu_session_modification_reject( smf_sess_t *sess, ogs_nas_5gsm_cause_t gsm_cause); diff --git a/src/smf/n4-handler.c b/src/smf/n4-handler.c index 28052de49..cf4d0fb89 100644 --- a/src/smf/n4-handler.c +++ b/src/smf/n4-handler.c @@ -464,11 +464,23 @@ void smf_5gc_n4_handle_session_modification_response( ogs_assert(flags & OGS_PFCP_MODIFY_SESSION); + /* + * TS24.501 + * 6.2 General on elementary 5GSM procedures + * 6.2.1 Principles of PTI handling for 5GSM procedures + * + * If a command message is not sent as result of + * a received request message, the sending entity shall + * include in the command message the PTI value set to + * "no procedure transaction identity assigned" + * (see examples in figure 6.2.1.4). + */ + sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED; + memset(¶m, 0, sizeof(param)); param.state = SMF_NETWORK_REQUESTED_QOS_FLOW_MODIFICATION; param.n1smbuf = gsm_build_pdu_session_modification_command( sess, - OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE, OGS_NAS_DELETE_NEW_QOS_FLOW_DESCRIPTION); ogs_assert(param.n1smbuf); @@ -492,7 +504,7 @@ void smf_5gc_n4_handle_session_modification_response( ogs_assert(flags & OGS_PFCP_MODIFY_SESSION); n1smbuf = gsm_build_pdu_session_modification_command( - sess, sess->pti, + sess, OGS_NAS_QOS_CODE_DELETE_EXISTING_QOS_RULE, OGS_NAS_DELETE_NEW_QOS_FLOW_DESCRIPTION); ogs_assert(n1smbuf); @@ -528,11 +540,23 @@ void smf_5gc_n4_handle_session_modification_response( ogs_assert(flags & OGS_PFCP_MODIFY_SESSION); + /* + * TS24.501 + * 6.2 General on elementary 5GSM procedures + * 6.2.1 Principles of PTI handling for 5GSM procedures + * + * If a command message is not sent as result of + * a received request message, the sending entity shall + * include in the command message the PTI value set to + * "no procedure transaction identity assigned" + * (see examples in figure 6.2.1.4). + */ + sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED; + memset(¶m, 0, sizeof(param)); param.state = SMF_NETWORK_REQUESTED_QOS_FLOW_MODIFICATION; param.n1smbuf = gsm_build_pdu_session_modification_command( sess, - OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, OGS_NAS_QOS_CODE_CREATE_NEW_QOS_RULE, OGS_NAS_CREATE_NEW_QOS_FLOW_DESCRIPTION); ogs_assert(param.n1smbuf); @@ -577,12 +601,23 @@ void smf_5gc_n4_handle_session_modification_response( if (flags & OGS_PFCP_MODIFY_NETWORK_REQUESTED) { ogs_assert(flags & OGS_PFCP_MODIFY_SESSION); + /* + * TS24.501 + * 6.2 General on elementary 5GSM procedures + * 6.2.1 Principles of PTI handling for 5GSM procedures + * + * If a command message is not sent as result of + * a received request message, the sending entity shall + * include in the command message the PTI value set to + * "no procedure transaction identity assigned" + * (see examples in figure 6.2.1.4). + */ + sess->pti = OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED; + memset(¶m, 0, sizeof(param)); param.state = SMF_NETWORK_REQUESTED_QOS_FLOW_MODIFICATION; param.n1smbuf = gsm_build_pdu_session_modification_command( - sess, - OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED, - qos_rule_code, qos_flow_description_code); + sess, qos_rule_code, qos_flow_description_code); ogs_assert(param.n1smbuf); param.n2smbuf = ngap_build_pdu_session_resource_modify_request_transfer( @@ -599,8 +634,7 @@ void smf_5gc_n4_handle_session_modification_response( ogs_assert(flags & OGS_PFCP_MODIFY_SESSION); n1smbuf = gsm_build_pdu_session_modification_command( - sess, sess->pti, - qos_rule_code, qos_flow_description_code); + sess, qos_rule_code, qos_flow_description_code); ogs_assert(n1smbuf); n2smbuf = ngap_build_pdu_session_resource_modify_request_transfer( diff --git a/src/smf/nsmf-handler.c b/src/smf/nsmf-handler.c index d8c1b9eef..c01248582 100644 --- a/src/smf/nsmf-handler.c +++ b/src/smf/nsmf-handler.c @@ -28,6 +28,7 @@ bool smf_nsmf_handle_create_sm_context( { smf_ue_t *smf_ue = NULL; + ogs_nas_5gsm_header_t *gsm_header = NULL; ogs_pkbuf_t *n1smbuf = NULL; ogs_sbi_client_t *client = NULL; @@ -50,14 +51,44 @@ bool smf_nsmf_handle_create_sm_context( if (!SmContextCreateData) { ogs_error("[%s:%d] No SmContextCreateData", smf_ue->supi, sess->psi); - n1smbuf = gsm_build_pdu_session_establishment_reject(sess, - OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION); smf_sbi_send_sm_context_create_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - "No SmContextCreateData", smf_ue->supi, n1smbuf); + "No SmContextCreateData", smf_ue->supi, NULL); return false; } + n1SmMsg = SmContextCreateData->n1_sm_msg; + if (!n1SmMsg || !n1SmMsg->content_id) { + ogs_error("[%s:%d] No n1SmMsg", smf_ue->supi, sess->psi); + smf_sbi_send_sm_context_create_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, + "No n1SmMsg", smf_ue->supi, NULL); + return false; + } + + n1smbuf = ogs_sbi_find_part_by_content_id(message, n1SmMsg->content_id); + if (!n1smbuf) { + ogs_error("[%s:%d] No N1 SM Content [%s]", + smf_ue->supi, sess->psi, n1SmMsg->content_id); + smf_sbi_send_sm_context_create_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, + "No N1 SM Content", smf_ue->supi, NULL); + return false; + } + + gsm_header = (ogs_nas_5gsm_header_t *)n1smbuf->data; + ogs_assert(gsm_header); + + sess->pti = gsm_header->procedure_transaction_identity; + if (sess->pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) { + ogs_error("[%s:%d] No PTI", smf_ue->supi, sess->psi); + smf_sbi_send_sm_context_create_error(stream, + OGS_SBI_HTTP_STATUS_BAD_REQUEST, + "No PTI", smf_ue->supi, NULL); + return false; + + } + sNssai = SmContextCreateData->s_nssai; if (!sNssai) { ogs_error("[%s:%d] No sNssai", smf_ue->supi, sess->psi); @@ -106,29 +137,6 @@ bool smf_nsmf_handle_create_sm_context( return false; } - n1SmMsg = SmContextCreateData->n1_sm_msg; - if (!n1SmMsg || !n1SmMsg->content_id) { - ogs_error("[%s:%d] No n1SmMsg", smf_ue->supi, sess->psi); - n1smbuf = gsm_build_pdu_session_establishment_reject(sess, - OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION); - smf_sbi_send_sm_context_create_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, - "No n1SmMsg", smf_ue->supi, n1smbuf); - return false; - } - - n1smbuf = ogs_sbi_find_part_by_content_id(message, n1SmMsg->content_id); - if (!n1smbuf) { - ogs_error("[%s:%d] No N1 SM Content [%s]", - smf_ue->supi, sess->psi, n1SmMsg->content_id); - n1smbuf = gsm_build_pdu_session_establishment_reject(sess, - OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION); - smf_sbi_send_sm_context_create_error(stream, - OGS_SBI_HTTP_STATUS_BAD_REQUEST, - "No N1 SM Content", smf_ue->supi, n1smbuf); - return false; - } - if (!SmContextCreateData->sm_context_status_uri) { ogs_error("[%s:%d] No SmContextStatusNotification", smf_ue->supi, sess->psi); @@ -228,6 +236,7 @@ bool smf_nsmf_handle_update_sm_context( OpenAPI_ref_to_binary_data_t *n1SmMsg = NULL; OpenAPI_ref_to_binary_data_t *n2SmMsg = NULL; + ogs_nas_5gsm_header_t *gsm_header = NULL; ogs_pkbuf_t *n1smbuf = NULL; ogs_pkbuf_t *n2smbuf = NULL; @@ -274,11 +283,9 @@ bool smf_nsmf_handle_update_sm_context( n1SmMsg = SmContextUpdateData->n1_sm_msg; if (!n1SmMsg || !n1SmMsg->content_id) { ogs_error("[%s:%d] No n1SmMsg", smf_ue->supi, sess->psi); - n1smbuf = gsm_build_pdu_session_release_reject(sess, - OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION); smf_sbi_send_sm_context_update_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - "No n1SmMsg", smf_ue->supi, n1smbuf, NULL); + "No n1SmMsg", smf_ue->supi, NULL, NULL); return false; } @@ -286,14 +293,16 @@ bool smf_nsmf_handle_update_sm_context( if (!n1smbuf) { ogs_error("[%s:%d] No N1 SM Content [%s]", smf_ue->supi, sess->psi, n1SmMsg->content_id); - n1smbuf = gsm_build_pdu_session_release_reject(sess, - OGS_5GSM_CAUSE_INVALID_MANDATORY_INFORMATION); smf_sbi_send_sm_context_update_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST, - "No N1 SM Content", smf_ue->supi, n1smbuf, NULL); + "No N1 SM Content", smf_ue->supi, NULL, NULL); return false; } + gsm_header = (ogs_nas_5gsm_header_t *)n1smbuf->data; + ogs_assert(gsm_header); + sess->pti = gsm_header->procedure_transaction_identity; + /* * NOTE : The pkbuf created in the SBI message will be removed * from ogs_sbi_message_free(). diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index 10a5ed90c..c2980fe7e 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -859,8 +859,6 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_assert(sess); ogs_assert(OGS_FSM_STATE(&sess->sm)); - sess->pti = nas_message.gsm.h.procedure_transaction_identity; - e->nas.message = &nas_message; ogs_fsm_dispatch(&sess->sm, e); diff --git a/tests/slice/different-dnn-test.c b/tests/slice/different-dnn-test.c index 50a28833d..3c2e57396 100644 --- a/tests/slice/different-dnn-test.c +++ b/tests/slice/different-dnn-test.c @@ -167,7 +167,7 @@ static void test1_func(abts_case *tc, void *data) sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 10); ogs_assert(sess); - sess->pti = 0; + sess->pti = 20; sess->pdu_session_type = OGS_PDU_SESSION_TYPE_IPV4; sess->ul_nas_transport_param.request_type = diff --git a/tests/slice/same-dnn-test.c b/tests/slice/same-dnn-test.c index 895ca208d..8ad4b79b4 100644 --- a/tests/slice/same-dnn-test.c +++ b/tests/slice/same-dnn-test.c @@ -167,7 +167,7 @@ static void test1_func(abts_case *tc, void *data) sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 10); ogs_assert(sess); - sess->pti = 0; + sess->pti = 20; sess->pdu_session_type = OGS_PDU_SESSION_TYPE_IPV4; sess->ul_nas_transport_param.request_type = @@ -497,7 +497,7 @@ static void test2_func(abts_case *tc, void *data) sess = test_sess_add_by_dnn_and_psi(test_ue, "internet", 10); ogs_assert(sess); - sess->pti = 0; + sess->pti = 20; sess->pdu_session_type = OGS_PDU_SESSION_TYPE_IPV4; sess->ul_nas_transport_param.request_type =