blob: d61e13f03de9e4ff1bf2d1684a83d7a4a5abb791 [file] [log] [blame]
/*
* 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*/