From 70ec9483ad71299e01a086a88b4cac9fb5be0c58 Mon Sep 17 00:00:00 2001 From: gauthier <gauthier@mycompany.com> Date: Wed, 1 Jul 2015 14:33:50 +0000 Subject: [PATCH] Changed macro macro_enb to CGI cell id. git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7677 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair-cn/S1AP/s1ap_eNB_handlers.c | 265 +++++++++++++++++++++- openair-cn/S1AP/s1ap_eNB_nas_procedures.c | 12 +- openair-cn/UTILS/conversions.h | 25 +- 3 files changed, 291 insertions(+), 11 deletions(-) diff --git a/openair-cn/S1AP/s1ap_eNB_handlers.c b/openair-cn/S1AP/s1ap_eNB_handlers.c index 56528f13bb..9b5ee1b789 100644 --- a/openair-cn/S1AP/s1ap_eNB_handlers.c +++ b/openair-cn/S1AP/s1ap_eNB_handlers.c @@ -67,6 +67,11 @@ int s1ap_eNB_handle_s1_setup_failure(uint32_t assoc_id, uint32_t stream, struct s1ap_message_s *message_p); +static +int s1ap_eNB_handle_error_indication(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *message_p); + static int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, uint32_t stream, @@ -94,7 +99,7 @@ s1ap_message_decoded_callback messages_callback[][3] = { { 0, 0, 0 }, /* initialUEMessage */ { 0, 0, 0 }, /* uplinkNASTransport */ { 0, 0, 0 }, /* Reset */ - { 0, 0, 0 }, /* ErrorIndication */ + { s1ap_eNB_handle_error_indication, 0, 0 }, /* ErrorIndication */ { 0, 0, 0 }, /* NASNonDeliveryIndication */ { 0, s1ap_eNB_handle_s1_setup_response, s1ap_eNB_handle_s1_setup_failure }, /* S1Setup */ { 0, 0, 0 }, /* UEContextReleaseRequest */ @@ -418,6 +423,264 @@ int s1ap_eNB_handle_s1_setup_response(uint32_t assoc_id, return 0; } + +static +int s1ap_eNB_handle_error_indication(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *message_p) +{ + S1ap_ErrorIndicationIEs_t *s1_error_indication_p; + s1ap_eNB_mme_data_t *mme_desc_p; + + DevAssert(message_p != NULL); + + s1_error_indication_p = &message_p->msg.s1ap_ErrorIndicationIEs; + + /* S1 Setup Failure == Non UE-related procedure -> stream 0 */ + if (stream != 0) { + S1AP_WARN("[SCTP %d] Received s1 Error indication on stream != 0 (%d)\n", + assoc_id, stream); + } + + if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) { + S1AP_ERROR("[SCTP %d] Received S1 Error indication for non existing " + "MME context\n", assoc_id); + return -1; + } + if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_MME_UE_S1AP_ID_PRESENT) { + S1AP_WARN("Received S1 Error indication MME UE S1AP ID 0x%x\n", s1_error_indication_p->mme_ue_s1ap_id); + } + if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_ENB_UE_S1AP_ID_PRESENT) { + S1AP_WARN("Received S1 Error indication eNB UE S1AP ID 0x%x\n", s1_error_indication_p->eNB_UE_S1AP_ID); + } + + if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_CAUSE_PRESENT) { + switch(s1_error_indication_p->cause.present) { + case S1ap_Cause_PR_NOTHING: + S1AP_WARN("Received S1 Error indication cause NOTHING\n"); + break; + case S1ap_Cause_PR_radioNetwork: + switch (s1_error_indication_p->cause.choice.radioNetwork) { + case S1ap_CauseRadioNetwork_unspecified: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unspecified\n"); + break; + case S1ap_CauseRadioNetwork_tx2relocoverall_expiry: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_tx2relocoverall_expiry\n"); + break; + case S1ap_CauseRadioNetwork_successful_handover: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_successful_handover\n"); + break; + case S1ap_CauseRadioNetwork_release_due_to_eutran_generated_reason: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_release_due_to_eutran_generated_reason\n"); + break; + case S1ap_CauseRadioNetwork_handover_cancelled: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_handover_cancelled\n"); + break; + case S1ap_CauseRadioNetwork_partial_handover: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_partial_handover\n"); + break; + case S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system\n"); + break; + case S1ap_CauseRadioNetwork_ho_target_not_allowed: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_ho_target_not_allowed\n"); + break; + case S1ap_CauseRadioNetwork_tS1relocoverall_expiry: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_tS1relocoverall_expiry\n"); + break; + case S1ap_CauseRadioNetwork_tS1relocprep_expiry: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_tS1relocprep_expiry\n"); + break; + case S1ap_CauseRadioNetwork_cell_not_available: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_cell_not_available\n"); + break; + case S1ap_CauseRadioNetwork_unknown_targetID: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_targetID\n"); + break; + case S1ap_CauseRadioNetwork_no_radio_resources_available_in_target_cell: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_no_radio_resources_available_in_target_cell\n"); + break; + case S1ap_CauseRadioNetwork_unknown_mme_ue_s1ap_id: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_mme_ue_s1ap_id\n"); + break; + case S1ap_CauseRadioNetwork_unknown_enb_ue_s1ap_id: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_enb_ue_s1ap_id\n"); + break; + case S1ap_CauseRadioNetwork_unknown_pair_ue_s1ap_id: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_pair_ue_s1ap_id\n"); + break; + case S1ap_CauseRadioNetwork_handover_desirable_for_radio_reason: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_handover_desirable_for_radio_reason\n"); + break; + case S1ap_CauseRadioNetwork_time_critical_handover: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_time_critical_handover\n"); + break; + case S1ap_CauseRadioNetwork_resource_optimisation_handover: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_resource_optimisation_handover\n"); + break; + case S1ap_CauseRadioNetwork_reduce_load_in_serving_cell: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_reduce_load_in_serving_cell\n"); + break; + case S1ap_CauseRadioNetwork_user_inactivity: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_user_inactivity\n"); + break; + case S1ap_CauseRadioNetwork_radio_connection_with_ue_lost: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_radio_connection_with_ue_lost\n"); + break; + case S1ap_CauseRadioNetwork_load_balancing_tau_required: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_load_balancing_tau_required\n"); + break; + case S1ap_CauseRadioNetwork_cs_fallback_triggered: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_cs_fallback_triggered\n"); + break; + case S1ap_CauseRadioNetwork_ue_not_available_for_ps_service: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_ue_not_available_for_ps_service\n"); + break; + case S1ap_CauseRadioNetwork_radio_resources_not_available: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_radio_resources_not_available\n"); + break; + case S1ap_CauseRadioNetwork_failure_in_radio_interface_procedure: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_failure_in_radio_interface_procedure\n"); + break; + case S1ap_CauseRadioNetwork_invals1ap_id_qos_combination: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_invals1ap_id_qos_combination\n"); + break; + case S1ap_CauseRadioNetwork_interrat_redirection: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_interrat_redirection\n"); + break; + case S1ap_CauseRadioNetwork_interaction_with_other_procedure: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_interaction_with_other_procedure\n"); + break; + case S1ap_CauseRadioNetwork_unknown_E_RAB_ID: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_E_RAB_ID\n"); + break; + case S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances\n"); + break; + case S1ap_CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported\n"); + break; + case S1ap_CauseRadioNetwork_s1_intra_system_handover_triggered: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_s1_intra_system_handover_triggered\n"); + break; + case S1ap_CauseRadioNetwork_s1_inter_system_handover_triggered: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_s1_inter_system_handover_triggered\n"); + break; + case S1ap_CauseRadioNetwork_x2_handover_triggered: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_x2_handover_triggered\n"); + break; + case S1ap_CauseRadioNetwork_redirection_towards_1xRTT: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_redirection_towards_1xRTT\n"); + break; + case S1ap_CauseRadioNetwork_not_supported_QCI_value: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_not_supported_QCI_value\n"); + break; + case S1ap_CauseRadioNetwork_invals1ap_id_CSG_Id: + S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_invals1ap_id_CSG_Id\n"); + break; + default: + S1AP_WARN("Received S1 Error indication cause radio network case not handled\n"); + } + break; + + case S1ap_Cause_PR_transport: + switch (s1_error_indication_p->cause.choice.transport) { + case S1ap_CauseTransport_transport_resource_unavailable: + S1AP_WARN("Received S1 Error indication S1ap_CauseTransport_transport_resource_unavailable\n"); + break; + case S1ap_CauseTransport_unspecified: + S1AP_WARN("Received S1 Error indication S1ap_CauseTransport_unspecified\n"); + break; + default: + S1AP_WARN("Received S1 Error indication cause transport case not handled\n"); + } + break; + + case S1ap_Cause_PR_nas: + switch (s1_error_indication_p->cause.choice.nas) { + case S1ap_CauseNas_normal_release: + S1AP_WARN("Received S1 Error indication S1ap_CauseNas_normal_release\n"); + break; + case S1ap_CauseNas_authentication_failure: + S1AP_WARN("Received S1 Error indication S1ap_CauseNas_authentication_failure\n"); + break; + case S1ap_CauseNas_detach: + S1AP_WARN("Received S1 Error indication S1ap_CauseNas_detach\n"); + break; + case S1ap_CauseNas_unspecified: + S1AP_WARN("Received S1 Error indication S1ap_CauseNas_unspecified\n"); + break; + case S1ap_CauseNas_csg_subscription_expiry: + S1AP_WARN("Received S1 Error indication S1ap_CauseNas_csg_subscription_expiry\n"); + break; + default: + S1AP_WARN("Received S1 Error indication cause nas case not handled\n"); + } + break; + + case S1ap_Cause_PR_protocol: + switch (s1_error_indication_p->cause.choice.protocol) { + case S1ap_CauseProtocol_transfer_syntax_error: + S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_transfer_syntax_error\n"); + break; + case S1ap_CauseProtocol_abstract_syntax_error_reject: + S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_abstract_syntax_error_reject\n"); + break; + case S1ap_CauseProtocol_abstract_syntax_error_ignore_and_notify: + S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_abstract_syntax_error_ignore_and_notify\n"); + break; + case S1ap_CauseProtocol_message_not_compatible_with_receiver_state: + S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_message_not_compatible_with_receiver_state\n"); + break; + case S1ap_CauseProtocol_semantic_error: + S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_semantic_error\n"); + break; + case S1ap_CauseProtocol_abstract_syntax_error_falsely_constructed_message: + S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_abstract_syntax_error_falsely_constructed_message\n"); + break; + case S1ap_CauseProtocol_unspecified: + S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_unspecified\n"); + break; + default: + S1AP_WARN("Received S1 Error indication cause protocol case not handled\n"); + } + break; + + case S1ap_Cause_PR_misc: + switch (s1_error_indication_p->cause.choice.protocol) { + case S1ap_CauseMisc_control_processing_overload: + S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_control_processing_overload\n"); + break; + case S1ap_CauseMisc_not_enough_user_plane_processing_resources: + S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_not_enough_user_plane_processing_resources\n"); + break; + case S1ap_CauseMisc_hardware_failure: + S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_hardware_failure\n"); + break; + case S1ap_CauseMisc_om_intervention: + S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_om_intervention\n"); + break; + case S1ap_CauseMisc_unspecified: + S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_unspecified\n"); + break; + case S1ap_CauseMisc_unknown_PLMN: + S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_unknown_PLMN\n"); + break; + default: + S1AP_WARN("Received S1 Error indication cause misc case not handled\n"); + } + break; + } + } + if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_CRITICALITYDIAGNOSTICS_PRESENT) { + // TODO continue + } + // TODO continue + + return 0; +} + + static int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, uint32_t stream, diff --git a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c index 41eacac889..41db38a40a 100644 --- a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c @@ -155,7 +155,7 @@ int s1ap_eNB_handle_nas_first_req( initial_ue_message_p->rrC_Establishment_Cause = s1ap_nas_first_req_p->establishment_cause; if (s1ap_nas_first_req_p->ue_identity.presenceMask & UE_IDENTITIES_s_tmsi) { - S1AP_DEBUG("S_TMSI_PRESENT"); + S1AP_DEBUG("S_TMSI_PRESENT\n"); initial_ue_message_p->presenceMask |= S1AP_INITIALUEMESSAGEIES_S_TMSI_PRESENT; MME_CODE_TO_OCTET_STRING(s1ap_nas_first_req_p->ue_identity.s_tmsi.mme_code, @@ -165,7 +165,7 @@ int s1ap_eNB_handle_nas_first_req( } if (s1ap_nas_first_req_p->ue_identity.presenceMask & UE_IDENTITIES_gummei) { - S1AP_DEBUG("GUMMEI_ID_PRESENT"); + S1AP_DEBUG("GUMMEI_ID_PRESENT\n"); initial_ue_message_p->presenceMask |= S1AP_INITIALUEMESSAGEIES_GUMMEI_ID_PRESENT; MCC_MNC_TO_PLMNID( @@ -191,8 +191,10 @@ int s1ap_eNB_handle_nas_first_req( * The cell identity is defined on 28 bits but as we use macro enb id, * we have to pad. */ +#warning "TODO get cell id from RRC" MACRO_ENB_ID_TO_CELL_IDENTITY(instance_p->eNB_id, - &initial_ue_message_p->eutran_cgi.cell_ID); + 0, // Cell ID + &initial_ue_message_p->eutran_cgi.cell_ID); MCC_MNC_TO_TBCD(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length, @@ -389,8 +391,10 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_ s1ap_eNB_instance_p->mnc_digit_length, &uplink_NAS_transport_p->eutran_cgi.pLMNidentity); +#warning "TODO get cell id from RRC" MACRO_ENB_ID_TO_CELL_IDENTITY(s1ap_eNB_instance_p->eNB_id, - &uplink_NAS_transport_p->eutran_cgi.cell_ID); + 0, + &uplink_NAS_transport_p->eutran_cgi.cell_ID); /* MCC/MNC should be repeated in TAI and EUTRAN CGI */ MCC_MNC_TO_PLMNID( diff --git a/openair-cn/UTILS/conversions.h b/openair-cn/UTILS/conversions.h index 6d35833eaf..4762f93873 100644 --- a/openair-cn/UTILS/conversions.h +++ b/openair-cn/UTILS/conversions.h @@ -259,6 +259,13 @@ do { \ + pLMN.MNCdigit2 * 10 + pLMN.MNCdigit1; \ } while(0) +/* TS 36.413 v10.9.0 section 9.2.1.37: + * Macro eNB ID: + * Equal to the 20 leftmost bits of the Cell + * Identity IE contained in the E-UTRAN CGI + * IE (see subclause 9.2.1.38) of each cell + * served by the eNB. + */ #define MACRO_ENB_ID_TO_BIT_STRING(mACRO, bITsTRING) \ do { \ (bITsTRING)->buf = calloc(3, sizeof(uint8_t)); \ @@ -268,14 +275,20 @@ do { \ (bITsTRING)->size = 3; \ (bITsTRING)->bits_unused = 4; \ } while(0) - -#define MACRO_ENB_ID_TO_CELL_IDENTITY(mACRO, bITsTRING) \ +/* +/* TS 36.413 v10.9.0 section 9.2.1.38: + * E-UTRAN CGI/Cell Identity + * The leftmost bits of the Cell + * Identity correspond to the eNB + * ID (defined in subclause 9.2.1.37). + */ +#define MACRO_ENB_ID_TO_CELL_IDENTITY(mACRO, cELL_iD, bITsTRING) \ do { \ (bITsTRING)->buf = calloc(4, sizeof(uint8_t)); \ - (bITsTRING)->buf[0] = 0; \ - (bITsTRING)->buf[1] = ((mACRO) >> 12); \ - (bITsTRING)->buf[2] = (mACRO) >> 4; \ - (bITsTRING)->buf[3] = ((mACRO) & 0x0f) << 4; \ + (bITsTRING)->buf[0] = ((mACRO) >> 12); \ + (bITsTRING)->buf[1] = (mACRO) >> 4; \ + (bITsTRING)->buf[2] = (((mACRO) & 0x0f) << 4) | ((cELL_iD) >> 4); \ + (bITsTRING)->buf[3] = ((cELL_iD) & 0x0f) << 4; \ (bITsTRING)->size = 4; \ (bITsTRING)->bits_unused = 4; \ } while(0) -- GitLab