[SMF] Fixed PTI when PDU Session Reject

This commit is contained in:
Sukchan Lee 2022-11-07 16:51:51 +09:00
parent 95459f8376
commit ddf09f270a
7 changed files with 89 additions and 48 deletions

View File

@ -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 */

View File

@ -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);

View File

@ -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(&param, 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(&param, 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(&param, 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(

View File

@ -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().

View File

@ -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);

View File

@ -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 =

View File

@ -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 =