forked from acouzens/open5gs
[SMF] Fixed PTI when PDU Session Reject
This commit is contained in:
parent
95459f8376
commit
ddf09f270a
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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().
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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 =
|
||||
|
|
Loading…
Reference in New Issue