/* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The OpenAirInterface Software Alliance licenses this file to You under * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 * * 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. *------------------------------------------------------------------------------- * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ /***************************************************************************** Source emmData.h Version 0.1 Date 2012/10/18 Product NAS stack Subsystem EPS Mobility Management Author Frederic Maurel Description Defines internal private data handled by EPS Mobility Management sublayer. *****************************************************************************/ #ifndef __EMMDATA_H__ #define __EMMDATA_H__ #include "commonDef.h" #include "networkDef.h" #include "securityDef.h" #include "openair3/SECU/secu_defs.h" #include "OctetString.h" #include "nas_timer.h" #include "esmData.h" #include "emm_proc_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ /* * The name of the file used as non-volatile memory device to store * persistent EMM data when the UE is switched off */ #define EMM_NVRAM_FILENAME ".ue_emm.nvram" /* * The name of the environment variable which defines the directory * where the EMM data file is located */ #define EMM_NVRAM_DIRNAME "NVRAM_DIR" /* Network selection modes of operation */ #define EMM_DATA_PLMN_AUTO NET_PLMN_AUTO #define EMM_DATA_PLMN_MANUAL NET_PLMN_MANUAL /* Checks Mobile Country Code equality */ #define MCCS_ARE_EQUAL(n1, n2) (((n1).MCCdigit1 == (n2).MCCdigit1) && \ ((n1).MCCdigit2 == (n2).MCCdigit2) && \ ((n1).MCCdigit3 == (n2).MCCdigit3)) /* Checks Mobile Network Code equality */ #define MNCS_ARE_EQUAL(n1, n2) (((n1).MNCdigit1 == (n2).MNCdigit1) && \ ((n1).MNCdigit2 == (n2).MNCdigit2) && \ ((n1).MNCdigit3 == (n2).MNCdigit3)) /* Checks PLMNs equality */ #define PLMNS_ARE_EQUAL(p1, p2) ((MCCS_ARE_EQUAL((p1),(p2))) && \ (MNCS_ARE_EQUAL((p1),(p2)))) /* Checks TAIs equality */ #define TAIS_ARE_EQUAL(t1, t2) ((PLMNS_ARE_EQUAL((t1).plmn,(t2).plmn)) && \ ((t1).tac == (t2).tac)) /****************************************************************************/ /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ /* * Internal data used for attach procedure */ #define EMM_ATTACH_COUNTER_MAX 5 typedef struct { unsigned int attempt_count; /* Counter used to limit the number of * subsequently rejected attach attempts */ } emm_attach_data_t; /* * Internal data used for detach procedure */ typedef struct { #define EMM_DETACH_COUNTER_MAX 5 unsigned int count; /* Counter used to limit the number of * subsequently detach attempts */ bool switch_off; /* UE switch-off indicator */ emm_proc_detach_type_t type; /* Type of the detach procedure * currently in progress */ } emm_detach_data_t; /* * -------------------------------------------------------------------------- * EPS NAS security context handled by EPS Mobility Management sublayer in * the UE and in the MME * -------------------------------------------------------------------------- */ /* Type of security context */ typedef enum { EMM_KSI_NOT_AVAILABLE = 0, EMM_KSI_NATIVE, EMM_KSI_MAPPED } emm_ksi_t; /* EPS NAS security context structure */ typedef struct emm_security_context_s { emm_ksi_t type; /* Type of security context */ int eksi; /* NAS key set identifier for E-UTRAN */ OctetString kasme; /* ASME security key (native context) */ //OctetString ksgsn; /* SGSN security key (mapped context) */ OctetString knas_enc; /* NAS cyphering key */ OctetString knas_int; /* NAS integrity key */ stream_security_container_t *security_container; /* container for NAS security */ struct count_s{ uint32_t spare:8; uint32_t overflow:16; uint32_t seq_num:8; } dl_count, ul_count; /* Downlink and uplink count parameters */ struct { uint8_t eps_encryption; /* algorithm used for ciphering */ uint8_t eps_integrity; /* algorithm used for integrity protection */ uint8_t umts_encryption; /* algorithm used for ciphering */ uint8_t umts_integrity; /* algorithm used for integrity protection */ uint8_t gprs_encryption; /* algorithm used for ciphering */ uint8_t umts_present:1; uint8_t gprs_present:1; } capability; /* UE network capability */ struct { uint8_t encryption:4; /* algorithm used for ciphering */ uint8_t integrity:4; /* algorithm used for integrity protection */ } selected_algorithms; /* MME selected algorithms */ } emm_security_context_t; /* * -------------------------------------------------------------------------- * EMM internal data handled by EPS Mobility Management sublayer in the UE * -------------------------------------------------------------------------- */ /* * EPS update status * ----------------- * The EPS update status value is changed only after the execution of an attach * or combined attach, network initiated detach, authentication, tracking area * update or combined tracking area update, service request or paging for EPS * services using IMSI procedure. * * EU1: The last attach or tracking area updating attempt was successful. * EU2: The last attach, service request or tracking area updating attempt * failed procedurally, i.e. no response or reject message was received * from the MME. * EU3: The last attach, service request or tracking area updating attempt * was correctly performed, but the answer from the MME was negative * (because of roaming or subscription restrictions). */ typedef enum { EU1_UPDATED, EU2_NOT_UPDATED, EU3_ROAMING_NOT_ALLOWED } emm_eps_update_t; /* * EPS Connection Management states * -------------------------------- * ECM-IDLE: No NAS signalling connection between UE and network exists. * No UE context exists in the network. * ECM-CONNECTED: The signalling connection is established between the UE * and the MME (RRC connection and S1_MME connection). */ typedef enum { ECM_IDLE, ECM_CONNECTED } emm_ecm_state_t; /* * Structure of the EMM parameters stored in the UE's non-volatile memory * ---------------------------------------------------------------------- * These EMM parameters can only be used if the IMSI from the USIM matches * the IMSI stored in the non-volatile memory; else the UE shall delete the * EMM parameters. * * - EPLMN: List of equivalent PLMNs - Updated at the end of each attach or * combined attach or tracking area updating or combined tracking area * updating procedure. Deleted if the USIM is removed or when the UE attached * for emergency bearer services enters the state EMM-DEREGISTERED. * These PLMNs shall be regarded by the UE as equivalent to each other * for PLMN selection, cell selection/re-selection and handover. * The maximum number of possible entries in the stored list is 16. */ typedef struct emm_nvdata_s { imsi_t imsi; plmn_t rplmn; /* The registered PLMN */ /* List of equivalent PLMNs */ #define EMM_DATA_EPLMN_MAX 16 PLMN_LIST_T(EMM_DATA_EPLMN_MAX) eplmn; } emm_nvdata_t; typedef struct { struct nas_timer_t T3402; /* attach failure timer */ struct nas_timer_t T3410; /* attach timer */ struct nas_timer_t T3411; /* attach restart timer */ struct nas_timer_t T3412; /* periodic tracking area update timer */ struct nas_timer_t T3416; /* EPS authentication challenge timer */ struct nas_timer_t T3417; /* Service request timer */ struct nas_timer_t T3418; /* MAC authentication failure timer */ struct nas_timer_t T3420; /* Synch authentication failure timer */ struct nas_timer_t T3421; /* Detach timer */ struct nas_timer_t T3430; /* tracking area update timer */ struct nas_timer_t T3423; /* E-UTRAN deactivate ISR timer */ } emm_timers_t; /* * Structure of the EMM data * ------------------------- */ typedef struct emm_data_s { int usim_is_valid; /* Indication of USIM data validity */ imei_t *imei; /* IMEI read from the UE's non-volatile memory*/ const imsi_t *imsi; /* The valid IMSI read from the USIM */ GUTI_t *guti; /* The valid GUTI read from the USIM */ tai_t *tai; /* Last visited registered Tracking Area Id */ emm_eps_update_t status; /* The current EPS update status */ emm_ecm_state_t ecm_status; /* The EPS Connection Management status */ bool is_attached; /* Network attachment indicator */ bool is_emergency; /* Emergency bearer services indicator*/ /* Tracking Areas list the UE is registered to * Contains the list of TAIs that identify the tracking areas that * the UE can enter without performing a tracking area updating * procedure. The TAIs in a TAI list assigned by an MME to a UE * pertain to the same MME area. */ #define EMM_DATA_TAI_MAX 16 TAI_LIST_T(EMM_DATA_TAI_MAX) ltai; int plmn_mode; /* Network selection operating mode */ int plmn_index; /* Manually selected PLMN */ int plmn_rat; /* Manually selected Radio Access Technology*/ plmn_t splmn; /* The currently selected PLMN */ int is_rplmn; /* splmn is the registered PLMN */ int is_eplmn; /* splmn is in the list of equivalent PLMNs */ Stat_t stat; /* Current network registration status */ tac_t tac; /* Tracking area code */ ci_t ci; /* GERAN/UTRAN/E-UTRAN serving cell identifier */ AcT_t rat; /* Radio Access Technology of the serving cell */ /* An octet string representation of operators present in the network */ struct { #define EMM_DATA_BUFFER_SIZE 2048 char buffer[EMM_DATA_BUFFER_SIZE+1]; } plist; /* * Data used for PLMN selection procedure * -------------------------------------- */ plmn_t hplmn; /* The Home PLMN derived from the IMSI */ /* List of Forbidden PLMNs * Contains the list of PLMN identities for which a Location * Registration has been rejected with EMM cause code #11 (PLMN * not allowed). A PLMN is removed from this list if, after a * subsequent manual selection of that PLMN, there is a successful * Location Request. */ #define EMM_DATA_FPLMN_MAX 4 PLMN_LIST_T(EMM_DATA_FPLMN_MAX) fplmn; /* List of Forbidden PLMNs for GPRS service * Contains the list of PLMN identities for which an Attach Request * has been rejected with EMM cause code #14 (GPRS/EPS services not * allowed in this PLMN). A PLMN is removed from this list if, after * a subsequent manual selection of that PLMN, there is a successful * GPRS attach or EPS attach. */ #define EMM_DATA_FPLMN_GPRS_MAX 4 PLMN_LIST_T(EMM_DATA_FPLMN_GPRS_MAX) fplmn_gprs; /* List of Equivalent HPLMNs */ #define EMM_DATA_EHPLMN_MAX 4 PLMN_LIST_T(EMM_DATA_EHPLMN_MAX) ehplmn; /* List of user controlled PLMNs */ #define EMM_DATA_PLMN_MAX 4 PLMN_LIST_T(EMM_DATA_PLMN_MAX) plmn; uint16_t userAcT[EMM_DATA_PLMN_MAX]; /* List of operator controlled PLMNs */ #define EMM_DATA_OPLMN_MAX 4 PLMN_LIST_T(EMM_DATA_OPLMN_MAX) oplmn; uint16_t operAcT[EMM_DATA_OPLMN_MAX]; /* List of operator network name records */ #define EMM_DATA_OPNN_MAX 16 uint8_t n_opnns; struct { const plmn_t *plmn; const char *fullname; const char *shortname; } opnn[EMM_DATA_OPNN_MAX]; /* * Data used for roaming service * ----------------------------- */ /* List of Forbidden Tracking Areas * Contains the list of TAIs for which an attach request has been * rejected with EMM cause code #12 (tracking area not allowed). */ #define EMM_DATA_FTAI_MAX 40 TAI_LIST_T(EMM_DATA_FTAI_MAX) ftai; /* List of Forbidden Tracking Areas for roaming * Contains the list of TAIs for which an attach request has been * rejected with EMM cause code #13 (roaming not allowed in this * tracking area). */ #define EMM_DATA_FTAI_ROAMING_MAX 40 TAI_LIST_T(EMM_DATA_FTAI_ROAMING_MAX) ftai_roaming; /* * NAS configuration parameters * ---------------------------- * see "Non Access Stratum Configuration" in USIM API header file */ uint8_t NAS_SignallingPriority; uint8_t NMO_I_Behaviour; uint8_t AttachWithImsi; uint8_t MinimumPeriodicSearchTimer; uint8_t ExtendedAccessBarring; uint8_t Timer_T3245_Behaviour; /* * EMM data stored in the UE's memory * ---------------------------------- */ emm_nvdata_t nvdata; /* * EPS NAS security context * ------------------------ */ emm_security_context_t *security; /* current security context */ emm_security_context_t *non_current; /* non-current security context */ /* * EPS mobility management timers – UE side * ---------------------------------------- */ emm_timers_t *emm_timers; emm_detach_data_t *emm_detach_data; emm_attach_data_t *emm_attach_data; } emm_data_t; /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ #define T3402_DEFAULT_VALUE 720 /* 12 minutes */ #define T3410_DEFAULT_VALUE 15 /* 15 seconds */ #define T3411_DEFAULT_VALUE 10 /* 10 seconds */ #define T3412_DEFAULT_VALUE 3240 /* 54 minutes */ #define T3416_DEFAULT_VALUE 30 /* 30 seconds */ #define T3417_DEFAULT_VALUE 5 /* 5 seconds */ #define T3417ext_DEFAULT_VALUE 10 /* 10 seconds */ #define T3418_DEFAULT_VALUE 20 /* 20 seconds */ #define T3420_DEFAULT_VALUE 15 /* 15 seconds */ #define T3421_DEFAULT_VALUE 15 /* 15 seconds */ #define T3423_DEFAULT_VALUE T3412_DEFAULT_VALUE #define T3430_DEFAULT_VALUE 15 /* 15 seconds */ #define T3440_DEFAULT_VALUE 10 /* 10 seconds */ /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ #endif /* __EMMDATA_H__*/