diff --git a/src/smf/gsm-sm.c b/src/smf/gsm-sm.c index 3b938a65b..7c8b30d0f 100644 --- a/src/smf/gsm-sm.c +++ b/src/smf/gsm-sm.c @@ -716,6 +716,9 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) ogs_pfcp_xact_t *pfcp_xact = NULL; ogs_pfcp_message_t *pfcp_message = NULL; + ogs_diam_gy_message_t *gy_message = NULL; + uint32_t diam_err; + ogs_nas_5gs_message_t *nas_message = NULL; ogs_sbi_stream_t *stream = NULL; @@ -829,6 +832,24 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e) } break; + case SMF_EVT_GY_MESSAGE: + gy_message = e->gy_message; + ogs_assert(gy_message); + + switch(gy_message->cmd_code) { + case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: + switch (gy_message->cc_request_type) { + case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST: + ogs_assert(e->pfcp_xact); + diam_err = smf_gy_handle_cca_update_request(sess, gy_message, e->pfcp_xact); + if (diam_err != ER_DIAMETER_SUCCESS) + OGS_FSM_TRAN(s, smf_gsm_state_wait_pfcp_deletion); + break; + } + break; + } + break; + case OGS_EVENT_SBI_SERVER: sbi_message = e->h.sbi.message; ogs_assert(sbi_message); diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index d3480e204..dd754501f 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -149,7 +149,7 @@ uint32_t smf_gy_handle_cca_initial_request( return ER_DIAMETER_SUCCESS; } -void smf_gy_handle_cca_update_request( +uint32_t smf_gy_handle_cca_update_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, ogs_pfcp_xact_t *pfcp_xact) { @@ -175,10 +175,8 @@ void smf_gy_handle_cca_update_request( if (gy_message->result_code != ER_DIAMETER_SUCCESS) { ogs_warn("Gy CCA Update Diameter failure: res=%u err=%u", gy_message->result_code, *gy_message->err); - // TODO: generate new gtp_xact from sess here? */ - //ogs_assert(OGS_OK == - // smf_epc_pfcp_send_session_deletion_request(sess, gtp_xact)); - return; + return gy_message->err ? *gy_message->err : + ER_DIAMETER_AUTHENTICATION_REJECTED; } bearer = smf_default_bearer_in_sess(sess); @@ -234,6 +232,7 @@ void smf_gy_handle_cca_update_request( OGS_GTP1_CAUSE_REACTIACTION_REQUESTED); ogs_assert(rv == OGS_OK); } + return ER_DIAMETER_SUCCESS; } uint32_t smf_gy_handle_cca_termination_request( diff --git a/src/smf/gy-handler.h b/src/smf/gy-handler.h index 87983b9c3..019d9b29d 100644 --- a/src/smf/gy-handler.h +++ b/src/smf/gy-handler.h @@ -30,7 +30,7 @@ extern "C" { uint32_t smf_gy_handle_cca_initial_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, ogs_gtp_xact_t *gtp_xact); -void smf_gy_handle_cca_update_request( +uint32_t smf_gy_handle_cca_update_request( smf_sess_t *sess, ogs_diam_gy_message_t *gy_message, ogs_pfcp_xact_t *pfcp_xact); uint32_t smf_gy_handle_cca_termination_request( diff --git a/src/smf/smf-sm.c b/src/smf/smf-sm.c index d81cded0a..60fc8f0a8 100644 --- a/src/smf/smf-sm.c +++ b/src/smf/smf-sm.c @@ -328,23 +328,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e) switch(gy_message->cmd_code) { case OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL: - switch(gy_message->cc_request_type) { - case OGS_DIAM_GY_CC_REQUEST_TYPE_INITIAL_REQUEST: - ogs_fsm_dispatch(&sess->sm, e); - break; - case OGS_DIAM_GY_CC_REQUEST_TYPE_UPDATE_REQUEST: - ogs_assert(e->pfcp_xact); - smf_gy_handle_cca_update_request( - sess, gy_message, e->pfcp_xact); - break; - case OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST: - ogs_fsm_dispatch(&sess->sm, e); - break; - default: - ogs_error("Not implemented(%d)", gy_message->cc_request_type); - break; - } - + ogs_fsm_dispatch(&sess->sm, e); break; case OGS_DIAM_GY_CMD_RE_AUTH: smf_gy_handle_re_auth_request(sess, gy_message);