Added more log in GTP Error (#1920)

This commit is contained in:
Sukchan Lee 2022-12-02 09:10:49 +09:00
parent fa5b2fe075
commit a4dc990bf1
2 changed files with 170 additions and 105 deletions

View File

@ -82,8 +82,9 @@ void mme_s11_handle_create_session_response(
ogs_gtp2_create_session_response_t *rsp)
{
int rv, i;
uint8_t cause_value = 0;
ogs_gtp2_cause_t *cause = NULL;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t bearer_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
ogs_gtp2_f_teid_t *sgw_s11_teid = NULL;
ogs_gtp2_f_teid_t *pgw_s5c_teid = NULL;
ogs_gtp2_f_teid_t *sgw_s1u_teid = NULL;
@ -126,19 +127,30 @@ void mme_s11_handle_create_session_response(
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
/************************
* Getting Cause Value
************************/
if (rsp->cause.presence && rsp->cause.data) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
session_cause = cause->value;
}
/************************
* Check MME-UE Context
************************/
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (!mme_ue_from_teid) {
ogs_error("No Context in TEID");
ogs_error("[%s] No Context in TEID [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND;
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_error("[%s] Attach reject [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
}
@ -152,7 +164,8 @@ void mme_s11_handle_create_session_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
if (rsp->sender_f_teid_for_control_plane.presence == 0) {
ogs_error("No S11 TEID");
ogs_error("[%s] No S11 TEID [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
@ -163,7 +176,8 @@ void mme_s11_handle_create_session_response(
} else {
if (rsp->pgw_s5_s8__s2a_s2b_f_teid_for_pmip_based_interface_or_for_gtp_based_control_plane_interface.presence == 0) {
ogs_error("No S5C TEID");
ogs_error("[%s] No S5C TEID [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
@ -182,25 +196,29 @@ void mme_s11_handle_create_session_response(
rsp->pdn_address_allocation.len);
if (!OGS_PDU_SESSION_TYPE_IS_VALID(paa.session_type)) {
ogs_error("Unknown PDN Type[%u]", paa.session_type);
ogs_error("[%s] Unknown PDN Type [Session:%u, Cause:%d]",
mme_ue->imsi_bcd, paa.session_type, session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT;
}
} else {
ogs_error("No PDN Address Allocation");
ogs_error("[%s] No PDN Address Allocation [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
}
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
ogs_error("[%s] No Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_error("[%s] Attach reject [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
@ -212,35 +230,38 @@ void mme_s11_handle_create_session_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
for (i = 0; i < OGS_BEARER_PER_UE; i++) {
ogs_gtp2_cause_t *cause = NULL;
if (rsp->bearer_contexts_created[i].cause.presence == 0) {
break;
}
cause = rsp->bearer_contexts_created[i].cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Bearer Cause [VALUE:%d]", cause_value);
if (cause == NULL) {
ogs_error("No Cause Data");
continue;
}
bearer_cause = cause->value;
if (bearer_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] GTP Bearer Cause [VALUE:%d]",
mme_ue->imsi_bcd, bearer_cause);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
OGS_NAS_EMM_CAUSE_NETWORK_FAILURE,
OGS_NAS_ESM_CAUSE_NETWORK_FAILURE));
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
}
}
cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
cause_value !=
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
session_cause !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE &&
cause_value !=
session_cause !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
ogs_error("GTP Cause [Value:%d]", cause_value);
ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
if (create_action == OGS_GTP_CREATE_IN_ATTACH_REQUEST) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
ogs_assert(OGS_OK == nas_eps_send_attach_reject(mme_ue,
@ -404,9 +425,9 @@ void mme_s11_handle_modify_bearer_response(
ogs_gtp2_modify_bearer_response_t *rsp)
{
int rv;
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int modify_action = 0;
ogs_gtp2_cause_t *cause = NULL;
mme_ue_t *mme_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
@ -428,13 +449,23 @@ void mme_s11_handle_modify_bearer_response(
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
/************************
* Getting Cause Value
************************/
if (rsp->cause.presence && rsp->cause.data) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
session_cause = cause->value;
}
/************************
* Check MME-UE Context
************************/
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (!mme_ue_from_teid) {
ogs_error("No Context in TEID");
ogs_error("[%s] No Context in TEID [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND;
}
@ -449,7 +480,7 @@ void mme_s11_handle_modify_bearer_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
ogs_error("[%s] No Cause [%d]", mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
@ -463,11 +494,8 @@ void mme_s11_handle_modify_bearer_response(
********************/
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [Value:%d]", cause_value);
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
}
@ -498,7 +526,7 @@ void mme_s11_handle_delete_session_response(
ogs_gtp2_delete_session_response_t *rsp)
{
int rv;
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int action = 0;
sgw_ue_t *source_ue = NULL, *target_ue = NULL;
mme_sess_t *sess = NULL;
@ -548,7 +576,7 @@ void mme_s11_handle_delete_session_response(
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED)
ogs_error("GTP Cause [Value:%d] - Ignored", cause_value);
ogs_error("GTP Cause [VALUE:%d] - Ignored", cause_value);
}
/********************
@ -669,7 +697,7 @@ void mme_s11_handle_create_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_create_bearer_request_t *req)
{
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL, *default_bearer = NULL;
mme_sess_t *sess = NULL;
sgw_ue_t *sgw_ue = NULL;
@ -848,7 +876,7 @@ void mme_s11_handle_update_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_update_bearer_request_t *req)
{
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL;
mme_sess_t *sess = NULL;
sgw_ue_t *sgw_ue = NULL;
@ -985,7 +1013,7 @@ void mme_s11_handle_delete_bearer_request(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_delete_bearer_request_t *req)
{
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL;
mme_sess_t *sess = NULL;
@ -1101,7 +1129,7 @@ void mme_s11_handle_release_access_bearers_response(
ogs_gtp2_release_access_bearers_response_t *rsp)
{
int rv;
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int action = 0;
enb_ue_t *enb_ue = NULL;
@ -1144,7 +1172,7 @@ void mme_s11_handle_release_access_bearers_response(
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED)
ogs_error("GTP Cause [Value:%d, ACTION:%d]", cause_value, action);
ogs_error("GTP Cause [VALUE:%d, ACTION:%d]", cause_value, action);
}
/********************
@ -1251,7 +1279,7 @@ void mme_s11_handle_downlink_data_notification(
ogs_gtp_xact_t *xact, mme_ue_t *mme_ue,
ogs_gtp2_downlink_data_notification_t *noti)
{
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL;
sgw_ue_t *sgw_ue = NULL;
@ -1391,8 +1419,8 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
ogs_gtp2_create_indirect_data_forwarding_tunnel_response_t *rsp)
{
int rv;
uint8_t cause_value = 0;
ogs_gtp2_cause_t *cause = NULL;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
sgw_ue_t *sgw_ue = NULL;
mme_bearer_t *bearer = NULL;
mme_ue_t *mme_ue = NULL;
@ -1417,13 +1445,23 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
/************************
* Getting Cause Value
************************/
if (rsp->cause.presence && rsp->cause.data) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
session_cause = cause->value;
}
/************************
* Check MME-UE Context
************************/
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (!mme_ue_from_teid) {
ogs_error("No Context in TEID");
ogs_error("[%s] No Context in TEID [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND;
}
@ -1438,7 +1476,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
ogs_error("[%s] No Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
@ -1452,11 +1490,8 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
********************/
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [Value:%d]", cause_value);
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
}
@ -1509,8 +1544,8 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
ogs_gtp2_delete_indirect_data_forwarding_tunnel_response_t *rsp)
{
int rv;
uint8_t cause_value = 0;
ogs_gtp2_cause_t *cause = NULL;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int action = 0;
mme_ue_t *mme_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
@ -1533,13 +1568,23 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
rv = ogs_gtp_xact_commit(xact);
ogs_expect_or_return(rv == OGS_OK);
/************************
* Getting Cause Value
************************/
if (rsp->cause.presence && rsp->cause.data) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
session_cause = cause->value;
}
/************************
* Check MME-UE Context
************************/
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (!mme_ue_from_teid) {
ogs_error("No Context in TEID");
ogs_error("[%s] No Context in TEID [Cause:%d]",
mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND;
}
@ -1554,7 +1599,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
ogs_error("[%s] No Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
@ -1568,11 +1613,8 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
********************/
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [Value:%d]", cause_value);
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [VALUE:%d]", session_cause);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return;
}
@ -1604,7 +1646,7 @@ void mme_s11_handle_bearer_resource_failure_indication(
ogs_gtp2_bearer_resource_failure_indication_t *ind)
{
int rv;
uint8_t cause_value = 0;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
mme_bearer_t *bearer = NULL;
mme_sess_t *sess = NULL;
@ -1640,7 +1682,7 @@ void mme_s11_handle_bearer_resource_failure_indication(
ogs_assert(cause);
cause_value = cause->value;
ogs_warn("GTP Cause [Value:%d] - Ignored", cause_value);
ogs_warn("GTP Cause [VALUE:%d] - Ignored", cause_value);
} else {
ogs_error("No Cause");
}

View File

@ -64,8 +64,9 @@ void sgwc_s5c_handle_create_session_response(
ogs_pkbuf_t *gtpbuf, ogs_gtp2_message_t *message)
{
int rv, i;
uint8_t cause_value;
ogs_gtp2_cause_t *cause = NULL;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t bearer_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
sgwc_ue_t *sgwc_ue = NULL;
sgwc_bearer_t *bearer = NULL;
@ -96,6 +97,15 @@ void sgwc_s5c_handle_create_session_response(
rv = ogs_gtp_xact_commit(s5c_xact);
ogs_expect(rv == OGS_OK);
/************************
* Getting Cause Value
************************/
if (rsp->cause.presence && rsp->cause.data) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
session_cause = cause->value;
}
/************************
* Check Session Context
*
@ -104,7 +114,7 @@ void sgwc_s5c_handle_create_session_response(
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (!sess) {
ogs_error("No Context in TEID");
ogs_error("No Context in TEID [Cause:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND;
} else {
sgwc_ue = sess->sgwc_ue;
@ -124,7 +134,7 @@ void sgwc_s5c_handle_create_session_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
if (rsp->pgw_s5_s8__s2a_s2b_f_teid_for_pmip_based_interface_or_for_gtp_based_control_plane_interface.presence == 0) {
ogs_error("No GTP TEID");
ogs_error("No GTP TEID [Cause:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
if (rsp->pdn_address_allocation.presence) {
@ -134,17 +144,18 @@ void sgwc_s5c_handle_create_session_response(
ogs_min(sizeof(paa), rsp->pdn_address_allocation.len));
if (!OGS_PDU_SESSION_TYPE_IS_VALID(paa.session_type)) {
ogs_error("Unknown PDN Type %u", paa.session_type);
ogs_error("Unknown PDN Type %u, Cause:%d",
paa.session_type, session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT;
}
} else {
ogs_error("No PDN Address Allocation");
ogs_error("No PDN Address Allocation [Cause:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
ogs_error("No Cause [VALUE:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
@ -161,35 +172,36 @@ void sgwc_s5c_handle_create_session_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
for (i = 0; i < OGS_BEARER_PER_UE; i++) {
ogs_gtp2_cause_t *cause = NULL;
if (rsp->bearer_contexts_created[i].cause.presence == 0) {
break;
}
cause = rsp->bearer_contexts_created[i].cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Bearer Cause [VALUE:%d]", cause_value);
if (cause == NULL) {
ogs_error("No Cause Data");
continue;
}
bearer_cause = cause->value;
if (bearer_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Bearer Cause [VALUE:%d]", bearer_cause);
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, bearer_cause);
return;
}
}
cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
cause_value !=
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED &&
session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED_PARTIALLY &&
session_cause !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_NETWORK_PREFERENCE &&
cause_value !=
session_cause !=
OGS_GTP2_CAUSE_NEW_PDN_TYPE_DUE_TO_SINGLE_ADDRESS_BEARER_ONLY) {
ogs_error("GTP Cause [Value:%d]", cause_value);
ogs_error("GTP Cause [VALUE:%d]", session_cause);
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause);
return;
}
@ -289,8 +301,8 @@ void sgwc_s5c_handle_modify_bearer_response(
ogs_pkbuf_t *gtpbuf, ogs_gtp2_message_t *message)
{
int rv;
ogs_gtp2_cause_t *cause = NULL;
uint8_t cause_value;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int modify_action;
sgwc_ue_t *sgwc_ue = NULL;
@ -316,6 +328,15 @@ void sgwc_s5c_handle_modify_bearer_response(
rv = ogs_gtp_xact_commit(s5c_xact);
ogs_expect(rv == OGS_OK);
/************************
* Getting Cause Value
************************/
if (rsp->cause.presence && rsp->cause.data) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
session_cause = cause->value;
}
/************************
* Check Session Context
*
@ -324,7 +345,7 @@ void sgwc_s5c_handle_modify_bearer_response(
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (!sess) {
ogs_error("No Context in TEID");
ogs_error("No Context in TEID [Cause:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND;
} else {
sgwc_ue = sess->sgwc_ue;
@ -349,7 +370,7 @@ void sgwc_s5c_handle_modify_bearer_response(
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
if (rsp->cause.presence == 0) {
ogs_error("No Cause");
ogs_error("No Cause [VALUE:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
@ -370,19 +391,16 @@ void sgwc_s5c_handle_modify_bearer_response(
********************/
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [Value:%d]", cause_value);
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [VALUE:%d]", session_cause);
if (modify_action == OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST)
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, cause_value);
OGS_GTP2_CREATE_SESSION_RESPONSE_TYPE, session_cause);
else
ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, cause_value);
OGS_GTP2_MODIFY_BEARER_RESPONSE_TYPE, session_cause);
return;
}
@ -420,7 +438,8 @@ void sgwc_s5c_handle_delete_session_response(
ogs_pkbuf_t *gtpbuf, ogs_gtp2_message_t *message)
{
int rv;
uint8_t cause_value;
uint8_t cause_value = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
sgwc_ue_t *sgwc_ue = NULL;
@ -443,6 +462,15 @@ void sgwc_s5c_handle_delete_session_response(
rv = ogs_gtp_xact_commit(s5c_xact);
ogs_expect(rv == OGS_OK);
/************************
* Getting Cause Value
************************/
if (rsp->cause.presence && rsp->cause.data) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
session_cause = cause->value;
}
/************************
* Check Session Context
*
@ -451,7 +479,7 @@ void sgwc_s5c_handle_delete_session_response(
cause_value = OGS_GTP2_CAUSE_REQUEST_ACCEPTED;
if (!sess) {
ogs_error("No Context in TEID");
ogs_error("No Context in TEID [Cause:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_CONTEXT_NOT_FOUND;
} else {
sgwc_ue = sess->sgwc_ue;
@ -470,18 +498,13 @@ void sgwc_s5c_handle_delete_session_response(
********************/
ogs_assert(cause_value == OGS_GTP2_CAUSE_REQUEST_ACCEPTED);
if (rsp->cause.presence) {
ogs_gtp2_cause_t *cause = rsp->cause.data;
ogs_assert(cause);
cause_value = cause->value;
} else {
ogs_error("No Cause");
if (rsp->cause.presence == 0) {
ogs_error("No Cause [VALUE:%d]", session_cause);
cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [Value:%d] - Ignored", cause_value);
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [VALUE:%d] - Ignored", session_cause);
}
/********************