Files
2025-01-08 20:11:09 +01:00

401 lines
16 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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__*/