From ead9f380a931dce7b4875e8aaa6bf9ef9ac255d3 Mon Sep 17 00:00:00 2001 From: EugeneBogush Date: Mon, 20 Dec 2021 16:21:29 +0200 Subject: [PATCH] update s1ap_handle_e_rab_setup_response (#1295) * Update s1ap-handler.c * Update s1ap-handler.c * update for parse e_rab_setup_response * Update s1ap-handler.c * Update s1ap-handler.c * Update s1ap-handler.c --- src/mme/s1ap-handler.c | 151 ++++++++++++++++++++++++++--------------- 1 file changed, 95 insertions(+), 56 deletions(-) diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 91e471603..ad4154d27 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1065,7 +1065,9 @@ void s1ap_handle_e_rab_setup_response( S1AP_MME_UE_S1AP_ID_t *MME_UE_S1AP_ID = NULL; S1AP_ENB_UE_S1AP_ID_t *ENB_UE_S1AP_ID = NULL; S1AP_E_RABSetupListBearerSURes_t *E_RABSetupListBearerSURes = NULL; - + S1AP_E_RABList_t *E_RABFailedToSetupListBearerSURes = NULL; + S1AP_CriticalityDiagnostics_t *CriticalityDiagnostics = NULL; + enb_ue_t *enb_ue = NULL; mme_ue_t *mme_ue = NULL; @@ -1093,6 +1095,14 @@ void s1ap_handle_e_rab_setup_response( E_RABSetupListBearerSURes = &ie->value.choice.E_RABSetupListBearerSURes; break; + case S1AP_ProtocolIE_ID_id_E_RABFailedToSetupListBearerSURes: + E_RABFailedToSetupListBearerSURes = + &ie->value.choice.E_RABList; + break; + case S1AP_ProtocolIE_ID_id_CriticalityDiagnostics: + CriticalityDiagnostics = + &ie->value.choice.CriticalityDiagnostics; + break; default: break; } @@ -1105,7 +1115,7 @@ void s1ap_handle_e_rab_setup_response( ogs_error("No MME_UE_S1AP_ID"); ogs_assert(OGS_OK == s1ap_send_error_indication(enb, NULL, ENB_UE_S1AP_ID, - S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); return; } @@ -1115,8 +1125,8 @@ void s1ap_handle_e_rab_setup_response( (long long)*MME_UE_S1AP_ID); ogs_assert(OGS_OK == s1ap_send_error_indication(enb, MME_UE_S1AP_ID, NULL, - S1AP_Cause_PR_radioNetwork, - S1AP_CauseRadioNetwork_unknown_mme_ue_s1ap_id)); + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_unknown_mme_ue_s1ap_id)); return; } @@ -1124,81 +1134,110 @@ void s1ap_handle_e_rab_setup_response( ogs_error("No ENB_UE_S1AP_ID"); ogs_assert(OGS_OK == s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, - S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); return; } ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", - enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); - - if (!E_RABSetupListBearerSURes) { - ogs_error("No E_RABSetupListBearerSURes"); - ogs_assert(OGS_OK == - s1ap_send_error_indication(enb, MME_UE_S1AP_ID, ENB_UE_S1AP_ID, - S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); - return; - } + enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); mme_ue = enb_ue->mme_ue; ogs_expect_or_return(mme_ue); - for (i = 0; i < E_RABSetupListBearerSURes->list.count; i++) { - S1AP_E_RABSetupItemBearerSUResIEs_t *item = NULL; - S1AP_E_RABSetupItemBearerSURes_t *e_rab = NULL; + if (E_RABSetupListBearerSURes) { + for (i = 0; i < E_RABSetupListBearerSURes->list.count; i++) { + S1AP_E_RABSetupItemBearerSUResIEs_t *item = NULL; + S1AP_E_RABSetupItemBearerSURes_t *e_rab = NULL; - mme_bearer_t *bearer = NULL; + mme_bearer_t *bearer = NULL; - item = (S1AP_E_RABSetupItemBearerSUResIEs_t *) - E_RABSetupListBearerSURes->list.array[i]; - if (!item) { - ogs_error("No S1AP_E_RABSetupItemBearerSUResIEs_t"); - ogs_assert(OGS_OK == - s1ap_send_error_indication2(mme_ue, - S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); - return; - } + item = (S1AP_E_RABSetupItemBearerSUResIEs_t *) + E_RABSetupListBearerSURes->list.array[i]; + if (!item) { + ogs_error("No S1AP_E_RABSetupItemBearerSUResIEs_t"); + ogs_assert(OGS_OK == + s1ap_send_error_indication2(mme_ue, + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); + return; + } - e_rab = &item->value.choice.E_RABSetupItemBearerSURes; - if (!e_rab) { - ogs_error("No E_RABSetupItemBearerSURes"); - ogs_assert(OGS_OK == - s1ap_send_error_indication2(mme_ue, - S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); - return; - } + e_rab = &item->value.choice.E_RABSetupItemBearerSURes; + if (!e_rab) { + ogs_error("No E_RABSetupItemBearerSURes"); + ogs_assert(OGS_OK == + s1ap_send_error_indication2(mme_ue, + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); + return; + } - bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID); - if (!bearer) { - ogs_error("No Bearer [%d]", (int)e_rab->e_RAB_ID); - ogs_assert(OGS_OK == - s1ap_send_error_indication2(mme_ue, - S1AP_Cause_PR_radioNetwork, - S1AP_CauseRadioNetwork_unknown_E_RAB_ID)); - return; - } + bearer = mme_bearer_find_by_ue_ebi(mme_ue, e_rab->e_RAB_ID); + if (!bearer) { + ogs_error("No Bearer [%d]", (int)e_rab->e_RAB_ID); + ogs_assert(OGS_OK == + s1ap_send_error_indication2(mme_ue, + S1AP_Cause_PR_radioNetwork, + S1AP_CauseRadioNetwork_unknown_E_RAB_ID)); + return; + } - memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf, + memcpy(&bearer->enb_s1u_teid, e_rab->gTP_TEID.buf, sizeof(bearer->enb_s1u_teid)); - bearer->enb_s1u_teid = be32toh(bearer->enb_s1u_teid); - rv = ogs_asn_BIT_STRING_to_ip( + bearer->enb_s1u_teid = be32toh(bearer->enb_s1u_teid); + rv = ogs_asn_BIT_STRING_to_ip( &e_rab->transportLayerAddress, &bearer->enb_s1u_ip); - ogs_assert(rv == OGS_OK); + ogs_assert(rv == OGS_OK); - ogs_debug(" EBI[%d]", bearer->ebi); + ogs_debug(" EBI[%d]", bearer->ebi); - if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) { - mme_bearer_t *linked_bearer = mme_linked_bearer(bearer); - ogs_assert(linked_bearer); - ogs_debug(" Linked-EBI[%d]", linked_bearer->ebi); + if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) { + mme_bearer_t *linked_bearer = mme_linked_bearer(bearer); + ogs_assert(linked_bearer); + ogs_debug(" Linked-EBI[%d]", linked_bearer->ebi); - if (bearer->ebi == linked_bearer->ebi) { + if (bearer->ebi == linked_bearer->ebi) { ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request(bearer, 0)); - } else { + } else { ogs_assert(OGS_OK == mme_gtp_send_create_bearer_response( - bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED)); + bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED)); + } } + } + } + + if (E_RABFailedToSetupListBearerSURes) { + ogs_debug("E_RABFailedToSetupListBearerSURes"); + for (i = 0; i < E_RABFailedToSetupListBearerSURes->list.count; i++) { + S1AP_E_RABItem_t *item = (S1AP_E_RABItem_t *)E_RABFailedToSetupListBearerSURes->list.array[i]; + + if (!item) { + ogs_error("No S1AP_E_RABItem_t"); + ogs_assert(OGS_OK == + s1ap_send_error_indication2(mme_ue, + S1AP_Cause_PR_protocol, S1AP_CauseProtocol_semantic_error)); + return; + } + + ogs_debug("RAB_ID: %d", (int)item->e_RAB_ID); + ogs_debug(" Cause[Group:%d Cause:%d]", + (int)item->cause.present, (int)item->cause.choice.radioNetwork); + } + } + + if (CriticalityDiagnostics) { + ogs_debug("CriticalityDiagnostics"); + S1AP_ProcedureCode_t *procedureCode = CriticalityDiagnostics->procedureCode; + S1AP_TriggeringMessage_t *triggeringMessage = CriticalityDiagnostics->triggeringMessage; + S1AP_Criticality_t *procedureCriticality = CriticalityDiagnostics->procedureCriticality; + if (procedureCode) { + ogs_debug("procedureCode: %ld", (long)procedureCode); + } + if (triggeringMessage) { + ogs_debug("triggeringMessage: %ld", (long)triggeringMessage); + } + if (procedureCriticality) { + ogs_debug("procedureCriticality: %ld", (long)procedureCriticality); } } }