[AMF] fix an invalid GSM reject aligungr#375

TS24.501
8.2.11 DL NAS transport
8.2.11.4 5GMM cause

The AMF shall include this IE when the Payload container IE
contains an uplink payload which was not forwarded and
the Payload container type IE is not set to "Multiple payloads".

-0-
As such, this function 'nas_5gs_send_gsm_reject()' must be used
only when an N1 SM message has been forwarded to the SMF.
This commit is contained in:
Sukchan Lee 2021-08-14 12:01:13 +09:00
parent af5b3aa931
commit e5594a57b9
7 changed files with 82 additions and 78 deletions

View File

@ -573,8 +573,9 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
sess->psi, sess->pti);
if (sess->payload_container_type) {
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
} else {
ogs_assert(OGS_OK ==
ngap_send_error_indication2(amf_ue,

View File

@ -1082,8 +1082,8 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
ogs_error("[%s:%d] Session Context is not in SMF [%d]",
amf_ue->supi, sess->psi, gsm_header->message_type);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message(sess,
OGS_5GSM_CAUSE_PDU_SESSION_DOES_NOT_EXIST));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE, 0));
return OGS_ERROR;
}

View File

@ -523,7 +523,7 @@ int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status)
return rv;
}
int nas_5gs_send_gsm_reject(amf_sess_t *sess,
int nas_5gs_send_dl_nas_transport(amf_sess_t *sess,
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
ogs_nas_5gmm_cause_t cause, uint8_t backoff_time)
{
@ -539,7 +539,7 @@ int nas_5gs_send_gsm_reject(amf_sess_t *sess,
ogs_assert(payload_container_type);
ogs_assert(payload_container);
ogs_warn("[%s] 5GSM reject", amf_ue->suci);
ogs_warn("[%s] DL NAS transport", amf_ue->suci);
gmmbuf = gmm_build_dl_nas_transport(sess,
payload_container_type, payload_container, cause, backoff_time);
@ -550,9 +550,21 @@ int nas_5gs_send_gsm_reject(amf_sess_t *sess,
return rv;
}
int nas_5gs_send_gsm_reject_from_sbi(amf_sess_t *sess,
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
int status)
/*
* TS24.501
* 8.2.11 DL NAS transport
* 8.2.11.4 5GMM cause
*
* The AMF shall include this IE when the Payload container IE
* contains an uplink payload which was not forwarded and
* the Payload container type IE is not set to "Multiple payloads".
*
* -0-
* As such, this function 'nas_5gs_send_gsm_reject()' must be used
* only when an N1 SM message has been forwarded to the SMF.
*/
int nas_5gs_send_gsm_reject(amf_sess_t *sess,
uint8_t payload_container_type, ogs_pkbuf_t *payload_container)
{
int rv;
@ -560,15 +572,15 @@ int nas_5gs_send_gsm_reject_from_sbi(amf_sess_t *sess,
ogs_assert(payload_container_type);
ogs_assert(payload_container);
rv = nas_5gs_send_gsm_reject(sess, payload_container_type, payload_container,
gmm_cause_from_sbi(status), AMF_NAS_BACKOFF_TIME);
rv = nas_5gs_send_dl_nas_transport(
sess, payload_container_type, payload_container, 0, 0);
ogs_expect(rv == OGS_OK);
return rv;
}
int nas_5gs_send_back_5gsm_message(
amf_sess_t *sess, ogs_nas_5gmm_cause_t cause)
int nas_5gs_send_back_gsm_message(
amf_sess_t *sess, ogs_nas_5gmm_cause_t cause, uint8_t backoff_time)
{
int rv;
ogs_pkbuf_t *pbuf = NULL;
@ -580,20 +592,8 @@ int nas_5gs_send_back_5gsm_message(
pbuf = ogs_pkbuf_copy(sess->payload_container);
ogs_expect_or_return_val(pbuf, OGS_ERROR);
rv = nas_5gs_send_gsm_reject(sess, sess->payload_container_type, pbuf,
cause, AMF_NAS_BACKOFF_TIME);
ogs_expect(rv == OGS_OK);
return rv;
}
int nas_5gs_send_back_5gsm_message_from_sbi(amf_sess_t *sess, int status)
{
int rv;
ogs_assert(sess);
rv = nas_5gs_send_back_5gsm_message(sess, gmm_cause_from_sbi(status));
rv = nas_5gs_send_dl_nas_transport(sess, sess->payload_container_type, pbuf,
cause, backoff_time);
ogs_expect(rv == OGS_OK);
return rv;

View File

@ -61,18 +61,17 @@ int nas_5gs_send_gmm_reject(
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause);
int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status);
int nas_5gs_send_gsm_reject(amf_sess_t *sess,
int nas_5gs_send_dl_nas_transport(amf_sess_t *sess,
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
ogs_nas_5gmm_cause_t cause, uint8_t backoff_time);
int nas_5gs_send_gsm_reject_from_sbi(amf_sess_t *sess,
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
int status);
int nas_5gs_send_back_5gsm_message(
amf_sess_t *sess, ogs_nas_5gmm_cause_t gmm_cause);
int nas_5gs_send_back_5gsm_message_from_sbi(amf_sess_t *sess, int status);
int nas_5gs_send_gsm_reject(amf_sess_t *sess,
uint8_t payload_container_type, ogs_pkbuf_t *payload_container);
int nas_5gs_send_back_gsm_message(
amf_sess_t *sess, ogs_nas_5gmm_cause_t cause, uint8_t backoff_time);
#ifdef __cplusplus
}
#endif
#endif /* AMF_NAS_5GS_PATH_H */
#endif /* AMF_NAS_5GS_PATH_H */

View File

@ -293,8 +293,9 @@ void amf_nnrf_handle_nf_discover(
OpenAPI_nf_type_ToString(xact->target_nf_type));
if (sess->payload_container_type) {
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
} else {
ogs_assert(OGS_OK ==
ngap_send_error_indication2(amf_ue,

View File

@ -39,8 +39,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
if (!recvmsg->http.location) {
ogs_error("[%d:%d] No http.location", sess->psi, sess->pti);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
@ -52,8 +53,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
ogs_error("[%d:%d] Cannot parse http.location [%s]",
sess->psi, sess->pti, recvmsg->http.location);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
@ -63,8 +65,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
ogs_sbi_header_free(&header);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
@ -91,8 +94,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
ogs_sbi_header_free(&header);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
}
@ -113,15 +117,17 @@ int amf_nsmf_pdusession_handle_create_sm_context(
if (!SmContextCreateError) {
ogs_error("[%d:%d] No SmContextCreateError", sess->psi, sess->pti);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, recvmsg->res_status));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
if (!SmContextCreateError->error) {
ogs_error("[%d:%d] No Error", sess->psi, sess->pti);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, recvmsg->res_status));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
@ -137,16 +143,16 @@ int amf_nsmf_pdusession_handle_create_sm_context(
n1smbuf = ogs_pkbuf_copy(n1smbuf);
ogs_assert(n1smbuf);
ogs_assert(OGS_OK ==
nas_5gs_send_gsm_reject_from_sbi(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
n1smbuf, recvmsg->res_status));
nas_5gs_send_gsm_reject(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf));
return OGS_ERROR;
}
}
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, recvmsg->res_status));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
@ -254,8 +260,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
ogs_error("[%s:%d] No N1 SM Content [%s]",
amf_ue->supi, sess->psi, n1SmMsg->content_id);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message(sess,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
@ -263,8 +270,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message(sess,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
return OGS_ERROR;
}
@ -607,9 +615,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
n1smbuf = ogs_pkbuf_copy(n1smbuf);
ogs_assert(n1smbuf);
ogs_assert(OGS_OK ==
nas_5gs_send_gsm_reject_from_sbi(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
n1smbuf, recvmsg->res_status));
nas_5gs_send_gsm_reject(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf));
return OGS_ERROR;
}
}

View File

@ -187,9 +187,8 @@ bool amf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
amf_timer_sbi_client_wait_expire);
if (!xact) {
ogs_error("amf_sess_sbi_discover_and_send() failed");
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
return false;
}
@ -199,9 +198,8 @@ bool amf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
(ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) {
ogs_error("amf_sess_sbi_discover_and_send() failed");
ogs_sbi_xact_remove(xact);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
return false;
}
@ -221,27 +219,24 @@ static int client_discover_cb(ogs_sbi_response_t *response, void *data)
rv = ogs_sbi_parse_response(&message, response);
if (rv != OGS_OK) {
ogs_error("cannot parse HTTP response");
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
goto cleanup;
}
if (message.res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("NF-Discover failed [%d]", message.res_status);
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
goto cleanup;
}
if (!message.SearchResult) {
ogs_error("No SearchResult");
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
ogs_assert(OGS_OK == nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED, AMF_NAS_BACKOFF_TIME));
goto cleanup;
}
@ -253,8 +248,9 @@ static int client_discover_cb(ogs_sbi_response_t *response, void *data)
ogs_error("Cannot discover [%s]",
OpenAPI_nf_type_ToString(OpenAPI_nf_type_SMF));
ogs_assert(OGS_OK ==
nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
nas_5gs_send_back_gsm_message(sess,
OGS_5GMM_CAUSE_PAYLOAD_WAS_NOT_FORWARDED,
AMF_NAS_BACKOFF_TIME));
goto cleanup;
}