| /* |
| * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd. |
| * Copyright (c) 2017 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef __S1AP_STRUCTS_H_ |
| #define __S1AP_STRUCTS_H_ |
| |
| #include <stdint.h> |
| #include <stdbool.h> |
| |
| #include "sec.h" |
| #include "ProcedureCode.h" |
| #include "Criticality.h" |
| #include "S1AP-PDU.h" |
| #include "InitiatingMessage.h" |
| |
| #define NAS_RAND_SIZE 16 |
| #define NAS_AUTN_SIZE 16 |
| |
| #define AUTH_REQ_NO_OF_IES 3 |
| #define SEC_MODE_NO_OF_IES 3 |
| #define ESM_REQ_NO_OF_IES 3 |
| #define ICS_REQ_NO_OF_IES 6 |
| #define DTCH_ACCEPT_NO_OF_IES 3 |
| #define UE_CTX_RELEASE_NO_OF_IES 3 |
| #define ATTACH_REJECT_NO_OF_IES 3 |
| |
| #define ATTACH_ID_REQUEST_NO_OF_IES 3 |
| #define TAU_RSP_NO_OF_IES 3 |
| |
| #define NI_UE_CTX_RELEASE_NO_OF_IES 3 |
| #define NI_DTCH_REQUEST_NO_OF_IES 3 |
| |
| |
| #define AUTH_REQ_NO_OF_NAS_IES 2 |
| #define SEC_MODE_NO_OF_NAS_IES 1 |
| #define ICS_REQ_NO_OF_NAS_IES 5 |
| #define TAU_RSP_NO_OF_NAS_IES 2 |
| |
| #define SERVICE_REQ_SECURITY_HEADER 12 |
| #define SHORT_MAC_SIZE 2 |
| |
| #define AUTHREQ_NAS_SECURITY_PARAM 0x01 |
| |
| #define MSISDN_STR_LEN 10 |
| |
| #define EMM_MAX_TAI_LIST 16 |
| |
| #define SECURITY_KEY_SIZE 32 |
| |
| #define MAC_SIZE 4 |
| #define AUTH_SYNC_FAILURE 21 |
| #define AUTH_RESPONSE 53 |
| /* ESM messages */ |
| #define ESM_MSG_ACTV_DEF_BEAR__CTX_REQ 0xc1 |
| |
| /*24.008 - 10.5.6.1 |
| APN name can be in range of min 3 octets to max 102 octets |
| */ |
| #define MAX_APN_LEN 102 |
| |
| |
| struct apn_name { |
| unsigned char len; |
| unsigned char val[MAX_APN_LEN];/*TODO: Make dynamic as range is big 3-102*/ |
| }; |
| |
| /*TODO: Needed fro paging. Ignoring for now*/ |
| struct proto_conf { |
| int placeholder; |
| }; |
| |
| struct esm_sec_info { |
| struct proto_conf proto_config; |
| }; |
| |
| /*NAS MSG IE CODES */ |
| /* Message content : |
| 3gpp 24.301 |
| Table 8.2.4.1: IEI Column.*/ |
| typedef enum |
| { |
| NAS_IE_TYPE_EPS_MOBILE_ID_IMSI=0x1, |
| NAS_IE_TYPE_UE_NETWORK_CAPABILITY=0x2, |
| NAS_IE_TYPE_ESM_MSG=0x3, |
| NAS_IE_TYPE_TMSI_STATUS=0x09, |
| NAS_IE_TYPE_MS_NETWORK_FEATURE_SUPPORT=0x0C, |
| NAS_IE_TYPE_GUTI_TYPE=0x0E, |
| NAS_IE_TYPE_ADDITIONAL_UPDATE_TYPE=0xF, |
| NAS_IE_TYPE_MS_CLASSMARK_2=0x11, |
| NAS_IE_TYPE_LAI=0x13, |
| NAS_IE_TYPE_PTMSI_SIGNATURE=0x19, |
| NAS_IE_TYPE_MS_CLASSMARK_3=0x20, |
| NAS_IE_TYPE_APN=0x28, |
| NAS_IE_TYPE_AUTH_FAIL_PARAM=0x30, |
| NAS_IE_TYPE_MS_NETWORK_CAPABILITY=0x31, |
| NAS_IE_TYPE_DRX_PARAM=0x5C, |
| NAS_IE_TYPE_TAI=0x52, |
| NAS_IE_TYPE_VOICE_DOMAIN_PREF_UE_USAGE_SETTING=0x5D, |
| NAS_IE_TYPE_TX_FLAG=0xAA, |
| NAS_IE_TYPE_PCO=0xAB, |
| NAS_IE_TYPE_PTI=0xAC, |
| }nas_ie_type; |
| typedef struct MS_net_capab { |
| bool pres; |
| unsigned char element_id; |
| unsigned char len; |
| unsigned char capab[6]; |
| }MS_net_capab; |
| |
| #if 0 |
| /* MS Network capability */ |
| typedef struct MS_net_capab { |
| unsigned char pres; |
| unsigned char len; |
| unsigned char gea1; |
| unsigned char smCapViaDdctdChan; |
| unsigned char smCapViaGprsChan; |
| unsigned char ucs2Supp; |
| unsigned char ssScrInd; |
| unsigned char soLsaCap; |
| unsigned char revLvlInd; |
| unsigned char pfcFeatMode; |
| unsigned char gea2; |
| unsigned char gea3; |
| unsigned char gea4; |
| unsigned char gea5; |
| unsigned char gea6; |
| unsigned char gea7; |
| unsigned char lcsVaCap; |
| unsigned char psInterRATho2UtranIuModeCap; |
| unsigned char psInterRATho2EutranS1ModeCap; |
| unsigned char csfbCap; |
| unsigned char isrSupp; |
| unsigned char srvcc2UtranCap; |
| unsigned char epcCap; |
| }MS_net_capab; |
| #endif |
| |
| struct UE_net_capab { |
| unsigned char len; |
| unsigned char capab[6]; |
| }; |
| #if 0 |
| /* UE Network capability */ |
| typedef struct UE_net_capab { |
| unsigned char pres; |
| unsigned char len; |
| |
| unsigned char eea7; |
| unsigned char eea6; |
| unsigned char eea5; |
| unsigned char eea4; |
| unsigned char eea3; |
| unsigned char eea2_128; |
| unsigned char eea1_128; |
| unsigned char eea0; |
| |
| unsigned char eia7; |
| unsigned char eia6; |
| unsigned char eia5; |
| unsigned char eia4; |
| unsigned char eia3; |
| unsigned char eia2_128; |
| unsigned char eia1_128; |
| unsigned char eia0; |
| |
| unsigned char uea7; |
| unsigned char uea6; |
| unsigned char uea5; |
| unsigned char uea4; |
| unsigned char uea3; |
| unsigned char uea2; |
| unsigned char uea1; |
| unsigned char uea0; |
| |
| unsigned char uia7; |
| unsigned char uia6; |
| unsigned char uia5; |
| unsigned char uia4; |
| unsigned char uia3; |
| unsigned char uia2; |
| unsigned char uia1; |
| unsigned char ucs2; |
| |
| unsigned char vcc_1xsr; |
| |
| } UE_net_capab; |
| #endif |
| |
| enum drx_params { |
| PAGINX_DRX32, |
| PAGINX_DRX64, |
| PAGINX_DRX128, |
| PAGINX_DRX256, |
| PAGINX_DRX512, |
| }; |
| |
| enum s1ap_cn_domain |
| { |
| CN_DOMAIN_PS, |
| CN_DOMAIN_CS, |
| CN_DOMAIN_NONE |
| }; |
| |
| struct s1ap_header{ |
| unsigned short procedure_code; |
| unsigned char criticality; |
| }; |
| |
| #pragma pack(1) |
| |
| /*36.413: 9.2.3.8 - MCC, MCN : Only 3 bytes are used*/ |
| struct PLMN { |
| unsigned char idx[3]; |
| }; |
| |
| struct TAI { |
| struct PLMN plmn_id; |
| short tac; /*2 bytes. 36.413: 9.2.3.7*/ |
| }; |
| |
| struct STMSI { |
| uint8_t mme_code; |
| uint32_t m_TMSI; |
| }; |
| |
| |
| typedef struct tai_list { |
| uint8_t spare :1; |
| uint8_t type :2; |
| uint8_t num_of_elements :4; |
| struct TAI partial_list[EMM_MAX_TAI_LIST]; |
| } tai_list; |
| |
| typedef struct pdn_address { |
| uint8_t spare :5; |
| uint8_t type :3; |
| uint32_t ipv4; /* TODO: Revisit 24.301 - 9.9.4.9.1 */ |
| } pdn_address; |
| |
| typedef struct linked_transcation_id { |
| uint8_t flag :1; |
| uint8_t val :7; |
| } linked_transcation_id; |
| |
| typedef struct esm_qos |
| { |
| uint8_t reliability_class :3; |
| uint8_t delay_class :3; |
| uint8_t spare1 :2; |
| uint8_t precedence_class :3; |
| uint8_t spare2 :1; |
| uint8_t peak_throughput :4; |
| uint8_t mean_throughput :5; |
| uint8_t spare3 :3; |
| uint8_t delivery_err_sdu :3; |
| uint8_t delivery_order :2; |
| uint8_t traffic_class :3; |
| uint8_t max_sdu_size; |
| uint8_t mbr_ul; |
| uint8_t mbr_dl; |
| uint8_t sdu_err_ratio :4; |
| uint8_t residual_ber :4; |
| uint8_t trffic_prio :2; |
| uint8_t transfer_delay :6; |
| uint8_t gbr_ul; |
| uint8_t gbr_dl; |
| uint8_t src_stat_desc :4; |
| uint8_t sig_ind :1; |
| uint8_t spare4 :3; |
| uint8_t mbr_dl_ext; |
| uint8_t gbr_dl_ext; |
| uint8_t mbr_ul_ext; |
| uint8_t gbr_ul_ext; |
| |
| } esm_qos; |
| |
| /* TODO : Revisit 24.301 - 9.9.4.2.1 */ |
| typedef struct ESM_APN_AMBR { |
| uint8_t dl; |
| uint8_t reserved; |
| uint8_t dlext; |
| uint8_t ulext; |
| uint8_t dlext2; |
| /* uint8_t dl_total; */ |
| uint8_t ulext2; |
| /* uint8_t ul_total; */ |
| } ESM_APN_AMBR; |
| |
| typedef struct guti { |
| uint8_t spare :4; |
| uint8_t odd_even_indication :1; |
| uint8_t id_type :3; |
| struct PLMN plmn_id; |
| uint16_t mme_grp_id; |
| uint8_t mme_code; |
| uint32_t m_TMSI; |
| } guti; |
| |
| typedef struct esm_msg_container { |
| uint8_t eps_bearer_id :4; |
| uint8_t proto_discriminator :4; |
| uint8_t procedure_trans_identity; |
| uint8_t session_management_msgs; |
| uint8_t eps_qos; /* TODO: Revisit 24.301 - 9.9.4.3.1 */ |
| struct apn_name apn; |
| pdn_address pdn_addr; |
| linked_transcation_id linked_ti; |
| esm_qos negotiated_qos; |
| ESM_APN_AMBR apn_ambr; |
| } esm_msg_container; |
| |
| typedef struct ue_sec_capabilities { |
| uint8_t eea1 :1; |
| uint8_t eea2 :1; |
| uint8_t eea3 :1; |
| uint8_t eea4 :1; |
| uint8_t eea5 :1; |
| uint8_t eea6_128 :1; |
| uint8_t eea7_128 :1; |
| uint8_t eea8 :1; |
| |
| uint8_t eia1 :1; |
| uint8_t eia2 :1; |
| uint8_t eia3 :1; |
| uint8_t eia4 :1; |
| uint8_t eia5 :1; |
| uint8_t eia6_128 :1; |
| uint8_t eia8_128 :1; |
| uint8_t eia8 :1; |
| |
| uint8_t uea1 :1; |
| uint8_t uea2 :1; |
| uint8_t uea3 :1; |
| uint8_t uea4 :1; |
| uint8_t uea5 :1; |
| uint8_t uea6 :1; |
| uint8_t uea7 :1; |
| uint8_t uea8 :1; |
| |
| uint8_t uia1 :1; |
| uint8_t uia2 :1; |
| uint8_t uia3 :1; |
| uint8_t uia4 :1; |
| uint8_t uia5 :1; |
| uint8_t uia6 :1; |
| uint8_t uia7 :1; |
| uint8_t spare1 :1; |
| |
| uint8_t gea1 :1; |
| uint8_t gea2 :1; |
| uint8_t gea3 :1; |
| uint8_t gea4 :1; |
| uint8_t gea5 :1; |
| uint8_t gea6 :1; |
| uint8_t gea7 :1; |
| uint8_t spare2 :1; |
| } ue_sec_capabilities; |
| |
| typedef struct nas_pdu_header { |
| unsigned char security_header_type:4; |
| unsigned char proto_discriminator:4; |
| unsigned char message_type; |
| unsigned char security_encryption_algo:4; |
| unsigned char security_integrity_algo:4; |
| unsigned char nas_security_param; |
| unsigned char mac[MAC_SIZE]; |
| unsigned char short_mac[SHORT_MAC_SIZE]; |
| unsigned char ksi; |
| unsigned char seq_no; |
| unsigned char eps_bearer_identity; |
| unsigned char procedure_trans_identity; |
| unsigned char detach_type; |
| } nas_pdu_header; |
| |
| #pragma pack() |
| |
| /****Information elements presentations **/ |
| #define BINARY_IMSI_LEN 8 /*same as packet capture. TODO: Write macros*/ |
| #define BCD_IMSI_STR_LEN 15 |
| |
| /*36.413 - 9.2.1.38*/ |
| struct CGI { |
| struct PLMN plmn_id; |
| int cell_id; |
| }; |
| /*36.413: 9.2.1.37*/ |
| #define MACRO_ENB_ID_SIZE 20 |
| struct ie_global_enb_id { |
| int plmn; |
| char macro_enb_id[MACRO_ENB_ID_SIZE]; |
| /*TODO: make union of enb IDs*/ |
| }; |
| |
| /*36.413: 9.1.8.4*/ |
| #define ENB_NAME_SIZE 150 |
| struct ie_enb_name { |
| char enb_name[ENB_NAME_SIZE]; |
| }; |
| |
| /*36.413: 9.2.1.3a*/ |
| enum ie_RRC_est_cause { |
| EMERGENCY, |
| HIGHPRIORITYACCESS, |
| MT_ACCESS, |
| MO_SIGNALLING, |
| MO_DATA, |
| DELAYTOLERANTACCESS, |
| MO_VOICECALL, |
| MO_EXCEPTIONDATA |
| }; |
| |
| /**E-RAB structure declarations**/ |
| struct eRAB_header { //TODO: making provision, chec -is it needed? |
| unsigned char criticality; |
| }; |
| |
| struct eRAB_setup_ctx_SU { |
| unsigned short eRAB_id; |
| unsigned short dont_know_byte; |
| unsigned int transp_layer_addr; |
| unsigned int gtp_teid; |
| }; |
| |
| union eRAB_IE { |
| struct eRAB_setup_ctx_SU su_res; |
| }; |
| |
| typedef struct eRAB_elements { |
| struct eRAB_header header; |
| unsigned char no_of_elements; |
| union eRAB_IE *elements; |
| }eRAB_elements; |
| /**eRAB structures end**/ |
| |
| /**Information elements structs end**/ |
| typedef union nas_pdu_elements_union { |
| unsigned char rand[NAS_RAND_SIZE]; |
| unsigned char autn[NAS_AUTN_SIZE]; |
| unsigned char IMSI[BINARY_IMSI_LEN]; |
| unsigned char short_mac[SHORT_MAC_SIZE]; |
| struct esm_sec_info esm_info; |
| enum drx_params drx; |
| struct MS_net_capab ms_network; |
| struct UE_net_capab ue_network; |
| |
| struct XRES auth_resp; /*Authentication response*/ |
| struct AUTS auth_fail_resp; /*Authentication response*/ |
| |
| struct apn_name apn; |
| |
| unsigned char attach_res; |
| unsigned char t3412; |
| tai_list tailist; |
| esm_msg_container esm_msg; |
| guti mi_guti; |
| bool esm_info_tx_required; |
| unsigned char pti; |
| unsigned char eps_res; |
| unsigned char spare; |
| unsigned short int pco_options[10]; |
| }nas_pdu_elements_union; |
| typedef struct nas_pdu_elements { |
| nas_ie_type msgType; |
| nas_pdu_elements_union pduElement; |
| }nas_pdu_elements; |
| |
| |
| #define NAS_MSG_UE_IE_GUTI 0x00000001 |
| #define NAS_MSG_UE_IE_IMSI 0x00000002 |
| #define UE_ID_IMSI(flags) ((flags & NAS_MSG_UE_IE_IMSI) == NAS_MSG_UE_IE_IMSI) |
| #define UE_ID_GUTI(flags) ((flags & NAS_MSG_UE_IE_GUTI) == NAS_MSG_UE_IE_GUTI) |
| typedef struct nasPDU { |
| nas_pdu_header header; |
| unsigned char elements_len; |
| nas_pdu_elements *elements; |
| unsigned int flags; |
| } nasPDU; |
| |
| #pragma pack(1) |
| /* TODO : Change type */ |
| typedef struct ue_aggregate_maximum_bitrate { |
| uint32_t uEaggregateMaxBitRateDL; |
| uint32_t uEaggregateMaxBitRateUL; |
| } ue_aggregate_maximum_bitrate; |
| |
| typedef struct allocation_retention_prio { |
| uint8_t prioLevel :4; |
| uint8_t preEmptionCapab :1; |
| uint8_t preEmptionVulnebility :1; |
| uint8_t spare :2; |
| } allocation_retention_prio; |
| |
| typedef struct E_RAB_Level_QoS_Params { |
| uint8_t qci; |
| //uint8_t ext; |
| allocation_retention_prio arPrio; |
| } E_RAB_Level_QoS_Params; |
| |
| typedef struct ERABSetup { |
| uint8_t e_RAB_ID; |
| E_RAB_Level_QoS_Params e_RAB_QoS_Params; |
| uint32_t transportLayerAddress; |
| uint32_t gtp_teid; |
| struct nasPDU nas; |
| } ERABSetup; |
| |
| #pragma pack() |
| /* Dependencies */ |
| typedef enum s1apCause_PR { |
| s1apCause_PR_NOTHING, /* No components present */ |
| s1apCause_PR_radioNetwork, |
| s1apCause_PR_transport, |
| s1apCause_PR_nas, |
| s1apCause_PR_protocol, |
| s1apCause_PR_misc |
| |
| } s1apCause_PR; |
| |
| typedef enum s1apCause_PR_transporauseRadioNetwork { |
| s1apCauseRadioNetwork_unspecified = 0, |
| s1apCauseRadioNetwork_tx2relocoverall_expiry = 1, |
| s1apCauseRadioNetwork_successful_handover = 2, |
| s1apCauseRadioNetwork_release_due_to_eutran_generated_reason = 3, |
| s1apCauseRadioNetwork_handover_cancelled = 4, |
| s1apCauseRadioNetwork_partial_handover = 5, |
| s1apCauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system = 6, |
| s1apCauseRadioNetwork_ho_target_not_allowed = 7, |
| s1apCauseRadioNetwork_tS1relocoverall_expiry = 8, |
| s1apCauseRadioNetwork_tS1relocprep_expiry = 9, |
| s1apCauseRadioNetwork_cell_not_available = 10, |
| s1apCauseRadioNetwork_unknown_targetID = 11, |
| s1apCauseRadioNetwork_no_radio_resources_available_in_target_cell = 12, |
| s1apCauseRadioNetwork_unknown_mme_ue_s1ap_id = 13, |
| s1apCauseRadioNetwork_unknown_enb_ue_s1ap_id = 14, |
| s1apCauseRadioNetwork_unknown_pair_ue_s1ap_id = 15, |
| s1apCauseRadioNetwork_handover_desirable_for_radio_reason = 16, |
| s1apCauseRadioNetwork_time_critical_handover = 17, |
| s1apCauseRadioNetwork_resource_optimisation_handover = 18, |
| s1apCauseRadioNetwork_reduce_load_in_serving_cell = 19, |
| s1apCauseRadioNetwork_user_inactivity = 20, |
| s1apCauseRadioNetwork_radio_connection_with_ue_lost = 21, |
| s1apCauseRadioNetwork_load_balancing_tau_required = 22, |
| s1apCauseRadioNetwork_cs_fallback_triggered = 23, |
| s1apCauseRadioNetwork_ue_not_available_for_ps_service = 24, |
| s1apCauseRadioNetwork_radio_resources_not_available = 25, |
| s1apCauseRadioNetwork_failure_in_radio_interface_procedure = 26, |
| s1apCauseRadioNetwork_invalid_qos_combination = 27, |
| s1apCauseRadioNetwork_interrat_redirection = 28, |
| s1apCauseRadioNetwork_interaction_with_other_procedure = 29, |
| s1apCauseRadioNetwork_unknown_E_RAB_ID = 30, |
| s1apCauseRadioNetwork_multiple_E_RAB_ID_instances = 31, |
| s1apCauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported = 32, |
| s1apCauseRadioNetwork_s1_intra_system_handover_triggered = 33, |
| s1apCauseRadioNetwork_s1_inter_system_handover_triggered = 34, |
| s1apCauseRadioNetwork_x2_handover_triggered = 35, |
| s1apCauseRadioNetwork_redirection_towards_1xRTT = 36, |
| s1apCauseRadioNetwork_not_supported_QCI_value = 37, |
| s1apCauseRadioNetwork_invalid_CSG_Id = 38, |
| s1apCauseRadioNetwork_release_due_to_pre_emption = 39 |
| } e_s1apCauseRadioNetwork; |
| |
| typedef enum s1apCauseTransport { |
| s1apCauseTransport_transport_resource_unavailable = 0, |
| s1apCauseTransport_unspecified = 1 |
| } e_s1apCauseTransport; |
| |
| typedef enum s1apCauseNas { |
| s1apCauseNas_normal_release = 0, |
| s1apCauseNas_authentication_failure = 1, |
| s1apCauseNas_detach = 2, |
| s1apCauseNas_unspecified = 3, |
| s1apCauseNas_csg_subscription_expiry = 4 |
| } e_s1apCauseNas; |
| |
| typedef enum s1apCauseProtocol { |
| s1apCauseProtocol_transfer_syntax_error = 0, |
| s1apCauseProtocol_abstract_syntax_error_reject = 1, |
| s1apCauseProtocol_abstract_syntax_error_ignore_and_notify = 2, |
| s1apCauseProtocol_message_not_compatible_with_receiver_state = 3, |
| s1apCauseProtocol_semantic_error = 4, |
| s1apCauseProtocol_abstract_syntax_error_falsely_constructed_message = 5, |
| s1apCauseProtocol_unspecified = 6 |
| } e_s1apCauseProtocol; |
| |
| typedef enum s1apCauseMisc { |
| s1apCauseMisc_control_processing_overload = 0, |
| s1apCauseMisc_not_enough_user_plane_processing_resources = 1, |
| s1apCauseMisc_hardware_failure = 2, |
| s1apCauseMisc_om_intervention = 3, |
| s1apCauseMisc_unspecified = 4, |
| s1apCauseMisc_unknown_PLMN = 5 |
| } e_s1apCauseMisc; |
| |
| /* s1apCauseMisc */ |
| typedef long s1apCauseMisc_t; |
| /* s1apCauseProtocol */ |
| typedef long s1apCauseProtocol_t; |
| /* s1apCauseNas */ |
| typedef long s1apCauseNas_t; |
| /* s1apCauseTransport */ |
| typedef long s1apCauseTransport_t; |
| /* s1apCauseRadioNetwork */ |
| typedef long s1apCauseRadioNetwork_t; |
| |
| typedef struct s1apCause { |
| s1apCause_PR present; |
| union s1apCause_u { |
| s1apCauseRadioNetwork_t radioNetwork; |
| s1apCauseTransport_t transport; |
| s1apCauseNas_t nas; |
| s1apCauseProtocol_t protocol; |
| s1apCauseMisc_t misc; |
| } choice; |
| } s1apCause_t; |
| |
| |
| typedef struct proto_IE_data { |
| int IE_type; |
| union value{ |
| struct ie_enb_name enb_name; |
| struct ie_global_enb_id global_enb_id; |
| long enb_ue_s1ap_id; |
| long mme_ue_s1ap_id; |
| struct nasPDU nas; |
| struct s1apCause cause; |
| struct TAI tai; |
| struct CGI utran_cgi; |
| struct STMSI s_tmsi; |
| enum ie_RRC_est_cause rrc_est_cause; |
| struct eRAB_elements erab; |
| ue_aggregate_maximum_bitrate ue_aggrt_max_bit_rate; |
| ERABSetup E_RABToBeSetupItemCtxtSUReq; |
| ue_sec_capabilities ue_sec_capab; |
| uint8_t sec_key[SECURITY_KEY_SIZE]; |
| }val; |
| }proto_IEs; |
| |
| struct proto_IE { |
| ProcedureCode_t procedureCode; |
| Criticality_t criticality; |
| short no_of_IEs; |
| proto_IEs *data; |
| uint8_t ie_nas_index; |
| uint8_t ie_tai_index; |
| uint8_t ie_cgi_index; |
| }; |
| |
| enum protocolie_id { |
| id_MME_UE_S1AP_ID = 0, |
| id_Cause = 2, |
| id_eNB_UE_S1AP_ID = 8, |
| id_ERABToBeSetupListCtxtSUReq = 24, |
| id_NAS_PDU = 26, |
| id_ERABToBeSetupItemCtxtSUReq = 52, |
| id_uEaggregatedMaximumBitrate = 66, |
| id_SecurityKey = 73, |
| id_UE_S1AP_IDs = 99, |
| id_UESecurityCapabilities = 107, |
| }; |
| |
| enum protocol_discriminator{ |
| EPSSessionManagementMessage = 2, |
| EPSMobilityManagementMessages = 7, |
| }; |
| |
| enum criticality{ |
| CRITICALITY_REJECT = 0x0, |
| CRITICALITY_IGNORE = 0x40, |
| CRITICALITY_NOTIFY, |
| }; |
| |
| enum eps_nas_mesage_type { |
| AttachAccept = 0x42, |
| AttachReject = 0x44, |
| DetachAccept = 0x46, |
| DetachRequest = 0x45, |
| TauAccept = 0x49, |
| TauReject = 0x4b, |
| AuthenticationRequest = 0x52, |
| IdentityRequest = 0x55, |
| SecurityModeCommand = 0x5d, |
| ESMInformationRequest = 0xd9, |
| }; |
| |
| enum procedure_code { |
| id_InitialContextSetup = 9, |
| id_downlinkNASTransport = 11, |
| id_errorIndication = 15, |
| id_UEContexRelease = 23, |
| }; |
| |
| typedef struct s1ap_PDU { |
| unsigned char procedurecode; |
| unsigned char criticality; |
| struct proto_IE value; |
| }s1ap_PDU; |
| |
| /* NAS Security Header */ |
| typedef enum security_header_type { |
| Plain = 0, |
| IntegrityProtected, |
| IntegrityProtectedCiphered, |
| IntegrityProtectedEPSSecCntxt, |
| }security_header_type; |
| |
| typedef struct nas_pdu_header_sec { |
| unsigned char security_header_type:4; |
| unsigned char proto_discriminator:4; |
| unsigned char mac[MAC_SIZE]; |
| unsigned char seq_no; |
| }nas_pdu_header_sec; |
| |
| typedef struct nas_pdu_header_short { |
| unsigned char security_header_type:4; |
| unsigned char proto_discriminator:4; |
| unsigned char message_type; |
| }nas_pdu_header_short; |
| |
| typedef struct nas_pdu_header_long { |
| unsigned char security_header_type:4; |
| unsigned char proto_discriminator:4; |
| unsigned char procedure_trans_identity; |
| unsigned char message_type; |
| }nas_pdu_header_long; |
| |
| /* NAS Security Encryption Algorithm */ |
| typedef enum security_encryption_algo { |
| Algo_EEA0 = 0, |
| |
| }security_encryption_algo; |
| |
| /* NAS Security Integrity Algorithm */ |
| typedef enum security_integrity_algo { |
| Algo_EIA0 = 0, |
| Algo_128EIA1 = 1, |
| }security_integrity_algo; |
| |
| |
| #define BUFFER_SIZE 255 |
| |
| typedef struct Buffer { |
| unsigned char buf[BUFFER_SIZE]; |
| unsigned char pos; |
| }Buffer; |
| |
| #endif /*__S1AP_STRUCTS_H*/ |