- Formatted some NAS files
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4553 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -200,6 +200,7 @@ static void* _nas_user_mngr(void* args)
|
||||
int exit_loop = FALSE;
|
||||
int nb_command;
|
||||
int bytes;
|
||||
int i;
|
||||
|
||||
int *fd = (int*) args;
|
||||
|
||||
@@ -227,7 +228,7 @@ static void* _nas_user_mngr(void* args)
|
||||
|
||||
/* Decode the user data message */
|
||||
nb_command = user_api_decode_data (bytes);
|
||||
for (int i = 0; i < nb_command; i++)
|
||||
for (i = 0; i < nb_command; i++)
|
||||
{
|
||||
/* Get the user data to be processed */
|
||||
const void* data = user_api_get_data (i);
|
||||
|
||||
+1251
-1233
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,28 +1,28 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source Detach.c
|
||||
Source Detach.c
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/05/07
|
||||
Date 2013/05/07
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the detach related EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
Description Defines the detach related EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
|
||||
The detach procedure is used by the UE to detach for EPS servi-
|
||||
ces, to disconnect from the last PDN it is connected to; by the
|
||||
network to inform the UE that it is detached for EPS services
|
||||
or non-EPS services or both, to disconnect the UE from the last
|
||||
PDN to which it is connected and to inform the UE to re-attach
|
||||
to the network and re-establish all PDN connections.
|
||||
The detach procedure is used by the UE to detach for EPS servi-
|
||||
ces, to disconnect from the last PDN it is connected to; by the
|
||||
network to inform the UE that it is detached for EPS services
|
||||
or non-EPS services or both, to disconnect the UE from the last
|
||||
PDN to which it is connected and to inform the UE to re-attach
|
||||
to the network and re-establish all PDN connections.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -35,7 +35,7 @@ Description Defines the detach related EMM procedure executed by the
|
||||
#include "emm_sap.h"
|
||||
#include "esm_sap.h"
|
||||
|
||||
#include <stdlib.h> // free
|
||||
#include <stdlib.h> // free
|
||||
|
||||
/****************************************************************************/
|
||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||
@@ -46,21 +46,21 @@ Description Defines the detach related EMM procedure executed by the
|
||||
/****************************************************************************/
|
||||
|
||||
/* String representation of the detach type */
|
||||
static const char* _emm_detach_type_str[] = {
|
||||
static const char *_emm_detach_type_str[] = {
|
||||
"EPS", "IMSI", "EPS/IMSI",
|
||||
"RE-ATTACH REQUIRED", "RE-ATTACH NOT REQUIRED", "RESERVED"
|
||||
};
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Internal data handled by the detach procedure in the UE
|
||||
* Internal data handled by the detach procedure in the UE
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
/*
|
||||
* Timer handlers
|
||||
*/
|
||||
void* _emm_detach_t3421_handler(void*);
|
||||
void *_emm_detach_t3421_handler(void *);
|
||||
|
||||
/*
|
||||
* Abnormal case detach procedures
|
||||
@@ -71,18 +71,18 @@ static int _emm_detach_abort(emm_proc_detach_type_t type);
|
||||
* Internal data used for detach procedure
|
||||
*/
|
||||
static struct {
|
||||
#define EMM_DETACH_COUNTER_MAX 5
|
||||
unsigned int count; /* Counter used to limit the number of
|
||||
* subsequently detach attempts */
|
||||
int switch_off; /* UE switch-off indicator */
|
||||
#define EMM_DETACH_COUNTER_MAX 5
|
||||
unsigned int count; /* Counter used to limit the number of
|
||||
* subsequently detach attempts */
|
||||
int switch_off; /* UE switch-off indicator */
|
||||
emm_proc_detach_type_t type; /* Type of the detach procedure
|
||||
* currently in progress */
|
||||
* currently in progress */
|
||||
} _emm_detach_data = {0, FALSE, EMM_DETACH_TYPE_RESERVED};
|
||||
#endif // NAS_UE
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Internal data handled by the detach procedure in the MME
|
||||
* Internal data handled by the detach procedure in the MME
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_MME
|
||||
@@ -94,31 +94,31 @@ static struct {
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Detach procedure executed by the UE
|
||||
* Detach procedure executed by the UE
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_detach() **
|
||||
** Name: emm_proc_detach() **
|
||||
** **
|
||||
** Description: Initiates the detach procedure in order for the UE to de- **
|
||||
** tach for EPS services. **
|
||||
** tach for EPS services. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.2.2.1 **
|
||||
** In state EMM-REGISTERED or EMM-REGISTERED-INITIATED, the **
|
||||
** UE initiates the detach procedure by sending a DETACH RE- **
|
||||
** QUEST message to the network, starting timer T3421 and **
|
||||
** entering state EMM-DEREGISTERED-INITIATED. **
|
||||
** In state EMM-REGISTERED or EMM-REGISTERED-INITIATED, the **
|
||||
** UE initiates the detach procedure by sending a DETACH RE- **
|
||||
** QUEST message to the network, starting timer T3421 and **
|
||||
** entering state EMM-DEREGISTERED-INITIATED. **
|
||||
** **
|
||||
** Inputs: type: Type of the requested detach **
|
||||
** switch_off: Indicates whether the detach is required **
|
||||
** because the UE is switched off or not **
|
||||
** Others: _emm_data **
|
||||
** Inputs: type: Type of the requested detach **
|
||||
** switch_off: Indicates whether the detach is required **
|
||||
** because the UE is switched off or not **
|
||||
** Others: _emm_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_detach_data **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_detach_data **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_detach(emm_proc_detach_type_t type, int switch_off)
|
||||
@@ -130,7 +130,7 @@ int emm_proc_detach(emm_proc_detach_type_t type, int switch_off)
|
||||
int rc;
|
||||
|
||||
LOG_TRACE(INFO, "EMM-PROC - Initiate EPS detach type = %s (%d)",
|
||||
_emm_detach_type_str[type], type);
|
||||
_emm_detach_type_str[type], type);
|
||||
|
||||
/* Initialize the detach procedure internal data */
|
||||
_emm_detach_data.count = 0;
|
||||
@@ -140,11 +140,11 @@ int emm_proc_detach(emm_proc_detach_type_t type, int switch_off)
|
||||
/* Setup EMM procedure handler to be executed upon receiving
|
||||
* lower layer notification */
|
||||
rc = emm_proc_lowerlayer_initialize(emm_proc_detach_request,
|
||||
emm_proc_detach_failure,
|
||||
emm_proc_detach_release, NULL);
|
||||
emm_proc_detach_failure,
|
||||
emm_proc_detach_release, NULL);
|
||||
if (rc != RETURNok) {
|
||||
LOG_TRACE(WARNING, "Failed to initialize EMM procedure handler");
|
||||
LOG_FUNC_RETURN (RETURNerror);
|
||||
LOG_TRACE(WARNING, "Failed to initialize EMM procedure handler");
|
||||
LOG_FUNC_RETURN (RETURNerror);
|
||||
}
|
||||
|
||||
/* Setup NAS information message to transfer */
|
||||
@@ -173,21 +173,21 @@ int emm_proc_detach(emm_proc_detach_type_t type, int switch_off)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_detach_request() **
|
||||
** Name: emm_proc_detach_request() **
|
||||
** **
|
||||
** Description: Performs the detach procedure upon receipt of indication **
|
||||
** from lower layers that Detach Request message has been **
|
||||
** successfully delivered to the network. **
|
||||
** from lower layers that Detach Request message has been **
|
||||
** successfully delivered to the network. **
|
||||
** **
|
||||
** Inputs: args: Not used **
|
||||
** Others: None **
|
||||
** Inputs: args: Not used **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3421 **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3421 **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_detach_request(void* args)
|
||||
int emm_proc_detach_request(void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -195,10 +195,10 @@ int emm_proc_detach_request(void* args)
|
||||
int rc;
|
||||
|
||||
if ( !_emm_detach_data.switch_off ) {
|
||||
/* Start T3421 timer */
|
||||
T3421.id = nas_timer_start(T3421.sec, _emm_detach_t3421_handler, NULL);
|
||||
LOG_TRACE(INFO, "EMM-PROC - Timer T3421 (%d) expires in %ld seconds",
|
||||
T3421.id, T3421.sec);
|
||||
/* Start T3421 timer */
|
||||
T3421.id = nas_timer_start(T3421.sec, _emm_detach_t3421_handler, NULL);
|
||||
LOG_TRACE(INFO, "EMM-PROC - Timer T3421 (%d) expires in %ld seconds",
|
||||
T3421.id, T3421.sec);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -212,24 +212,24 @@ int emm_proc_detach_request(void* args)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_detach_accept() **
|
||||
** Name: emm_proc_detach_accept() **
|
||||
** **
|
||||
** Description: Performs the UE initiated detach procedure for EPS servi- **
|
||||
** ces only When the DETACH ACCEPT message is received from **
|
||||
** the network. **
|
||||
** ces only When the DETACH ACCEPT message is received from **
|
||||
** the network. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.2.2.2 **
|
||||
** Upon receiving the DETACH ACCEPT message, the UE shall **
|
||||
** stop timer T3421, locally deactivate all EPS bearer con- **
|
||||
** texts without peer-to-peer signalling and enter state EMM-**
|
||||
** DEREGISTERED. **
|
||||
** stop timer T3421, locally deactivate all EPS bearer con- **
|
||||
** texts without peer-to-peer signalling and enter state EMM-**
|
||||
** DEREGISTERED. **
|
||||
** **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3421 **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3421 **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_detach_accept(void)
|
||||
@@ -264,24 +264,24 @@ int emm_proc_detach_accept(void)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_detach_failure() **
|
||||
** Name: emm_proc_detach_failure() **
|
||||
** **
|
||||
** Description: Performs the detach procedure abnormal case upon receipt **
|
||||
** of transmission failure of Detach Request message. **
|
||||
** of transmission failure of Detach Request message. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.2.2.4, case h **
|
||||
** The UE shall restart the detach procedure. **
|
||||
** The UE shall restart the detach procedure. **
|
||||
** **
|
||||
** Inputs: is_initial: Not used **
|
||||
** args: Not used **
|
||||
** Others: _emm_detach_data **
|
||||
** Inputs: is_initial: Not used **
|
||||
** args: Not used **
|
||||
** Others: _emm_detach_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_detach_failure(int is_initial, void* args)
|
||||
int emm_proc_detach_failure(int is_initial, void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -308,24 +308,24 @@ int emm_proc_detach_failure(int is_initial, void* args)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_detach_release() **
|
||||
** Name: emm_proc_detach_release() **
|
||||
** **
|
||||
** Description: Performs the detach procedure abnormal case upon receipt **
|
||||
** of NAS signalling connection release indication before **
|
||||
** reception of Detach Accept message. **
|
||||
** of NAS signalling connection release indication before **
|
||||
** reception of Detach Accept message. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.2.2.4, case b **
|
||||
** The detach procedure shall be aborted. **
|
||||
** The detach procedure shall be aborted. **
|
||||
** **
|
||||
** Inputs: args: not used **
|
||||
** Others: _emm_detach_data **
|
||||
** Inputs: args: not used **
|
||||
** Others: _emm_detach_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_detach_release(void* args)
|
||||
int emm_proc_detach_release(void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -340,31 +340,31 @@ int emm_proc_detach_release(void* args)
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Detach procedure executed by the MME
|
||||
* Detach procedure executed by the MME
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_MME
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_detach() **
|
||||
** Name: emm_proc_detach() **
|
||||
** **
|
||||
** Description: Initiate the detach procedure to inform the UE that it is **
|
||||
** detached for EPS services, or to re-attach to the network **
|
||||
** and re-establish all PDN connections. **
|
||||
** detached for EPS services, or to re-attach to the network **
|
||||
** and re-establish all PDN connections. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.2.3.1 **
|
||||
** In state EMM-REGISTERED the network initiates the detach **
|
||||
** procedure by sending a DETACH REQUEST message to the UE, **
|
||||
** starting timer T3422 and entering state EMM-DEREGISTERED- **
|
||||
** INITIATED. **
|
||||
** In state EMM-REGISTERED the network initiates the detach **
|
||||
** procedure by sending a DETACH REQUEST message to the UE, **
|
||||
** starting timer T3422 and entering state EMM-DEREGISTERED- **
|
||||
** INITIATED. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** type: Type of the requested detach **
|
||||
** Others: _emm_detach_type_str **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** type: Type of the requested detach **
|
||||
** Others: _emm_detach_type_str **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3422 **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3422 **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_detach(unsigned int ueid, emm_proc_detach_type_t type)
|
||||
@@ -374,7 +374,7 @@ int emm_proc_detach(unsigned int ueid, emm_proc_detach_type_t type)
|
||||
int rc = RETURNerror;
|
||||
|
||||
LOG_TRACE(INFO, "EMM-PROC - Initiate detach type = %s (%d)",
|
||||
_emm_detach_type_str[type], type);
|
||||
_emm_detach_type_str[type], type);
|
||||
|
||||
/* TODO */
|
||||
|
||||
@@ -383,51 +383,51 @@ int emm_proc_detach(unsigned int ueid, emm_proc_detach_type_t type)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_detach_request() **
|
||||
** Name: emm_proc_detach_request() **
|
||||
** **
|
||||
** Description: Performs the UE initiated detach procedure for EPS servi- **
|
||||
** ces only When the DETACH REQUEST message is received by **
|
||||
** the network. **
|
||||
** ces only When the DETACH REQUEST message is received by **
|
||||
** the network. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.2.2.2 **
|
||||
** Upon receiving the DETACH REQUEST message the network **
|
||||
** shall send a DETACH ACCEPT message to the UE and store **
|
||||
** the current EPS security context, if the detach type IE **
|
||||
** does not indicate "switch off". Otherwise, the procedure **
|
||||
** is completed when the network receives the DETACH REQUEST **
|
||||
** message. **
|
||||
** The network shall deactivate the EPS bearer context(s) **
|
||||
** for this UE locally without peer-to-peer signalling and **
|
||||
** shall enter state EMM-DEREGISTERED. **
|
||||
** Upon receiving the DETACH REQUEST message the network **
|
||||
** shall send a DETACH ACCEPT message to the UE and store **
|
||||
** the current EPS security context, if the detach type IE **
|
||||
** does not indicate "switch off". Otherwise, the procedure **
|
||||
** is completed when the network receives the DETACH REQUEST **
|
||||
** message. **
|
||||
** The network shall deactivate the EPS bearer context(s) **
|
||||
** for this UE locally without peer-to-peer signalling and **
|
||||
** shall enter state EMM-DEREGISTERED. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** type: Type of the requested detach **
|
||||
** switch_off: Indicates whether the detach is required **
|
||||
** because the UE is switched off or not **
|
||||
** native_ksi: TRUE if the security context is of type **
|
||||
** native **
|
||||
** ksi: The NAS ket sey identifier **
|
||||
** guti: The GUTI if provided by the UE **
|
||||
** imsi: The IMSI if provided by the UE **
|
||||
** imei: The IMEI if provided by the UE **
|
||||
** Others: _emm_data **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** type: Type of the requested detach **
|
||||
** switch_off: Indicates whether the detach is required **
|
||||
** because the UE is switched off or not **
|
||||
** native_ksi: TRUE if the security context is of type **
|
||||
** native **
|
||||
** ksi: The NAS ket sey identifier **
|
||||
** guti: The GUTI if provided by the UE **
|
||||
** imsi: The IMSI if provided by the UE **
|
||||
** imei: The IMEI if provided by the UE **
|
||||
** Others: _emm_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
|
||||
int switch_off, int native_ksi, int ksi,
|
||||
GUTI_t* guti, imsi_t* imsi, imei_t* imei)
|
||||
int switch_off, int native_ksi, int ksi,
|
||||
GUTI_t *guti, imsi_t *imsi, imei_t *imei)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
int rc;
|
||||
emm_data_context_t* emm_ctx = NULL;
|
||||
emm_data_context_t *emm_ctx = NULL;
|
||||
|
||||
LOG_TRACE(INFO, "EMM-PROC - Detach type = %s (%d) requested (ueid=%u)",
|
||||
_emm_detach_type_str[type], type, ueid);
|
||||
_emm_detach_type_str[type], type, ueid);
|
||||
|
||||
/* Get the UE context */
|
||||
#if defined(EPC_BUILD)
|
||||
@@ -436,82 +436,94 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
|
||||
}
|
||||
#else
|
||||
if (ueid < EMM_DATA_NB_UE_MAX) {
|
||||
emm_ctx = _emm_data.ctx[ueid];
|
||||
emm_ctx = _emm_data.ctx[ueid];
|
||||
}
|
||||
#endif
|
||||
|
||||
if (emm_ctx == NULL) {
|
||||
LOG_TRACE(WARNING, "No EMM context exists for the UE (ueid=%u)", ueid);
|
||||
LOG_FUNC_RETURN(RETURNok);
|
||||
LOG_TRACE(WARNING, "No EMM context exists for the UE (ueid=%u)", ueid);
|
||||
LOG_FUNC_RETURN(RETURNok);
|
||||
}
|
||||
|
||||
if (switch_off)
|
||||
{
|
||||
/* The UE is switched off */
|
||||
if (emm_ctx->guti) free(emm_ctx->guti);
|
||||
if (emm_ctx->imsi) free(emm_ctx->imsi);
|
||||
if (emm_ctx->imei) free(emm_ctx->imei);
|
||||
if (emm_ctx->esm_msg.length > 0) free(emm_ctx->esm_msg.value);
|
||||
/* Release NAS security context */
|
||||
if (emm_ctx->security) {
|
||||
emm_security_context_t* security = emm_ctx->security;
|
||||
if (security->kasme.value) free(security->kasme.value);
|
||||
if (security->knas_enc.value) free(security->knas_enc.value);
|
||||
if (security->knas_int.value) free(security->knas_int.value);
|
||||
free(emm_ctx->security);
|
||||
}
|
||||
/* Release the EMM context */
|
||||
if (switch_off) {
|
||||
/* The UE is switched off */
|
||||
if (emm_ctx->guti) {
|
||||
free(emm_ctx->guti);
|
||||
}
|
||||
if (emm_ctx->imsi) {
|
||||
free(emm_ctx->imsi);
|
||||
}
|
||||
if (emm_ctx->imei) {
|
||||
free(emm_ctx->imei);
|
||||
}
|
||||
if (emm_ctx->esm_msg.length > 0) {
|
||||
free(emm_ctx->esm_msg.value);
|
||||
}
|
||||
/* Release NAS security context */
|
||||
if (emm_ctx->security) {
|
||||
emm_security_context_t *security = emm_ctx->security;
|
||||
if (security->kasme.value) {
|
||||
free(security->kasme.value);
|
||||
}
|
||||
if (security->knas_enc.value) {
|
||||
free(security->knas_enc.value);
|
||||
}
|
||||
if (security->knas_int.value) {
|
||||
free(security->knas_int.value);
|
||||
}
|
||||
free(emm_ctx->security);
|
||||
}
|
||||
/* Release the EMM context */
|
||||
#if defined(EPC_BUILD)
|
||||
emm_data_context_remove(&_emm_data, emm_ctx);
|
||||
free(emm_ctx);
|
||||
#else
|
||||
free(_emm_data.ctx[ueid]);
|
||||
_emm_data.ctx[ueid] = NULL;
|
||||
free(_emm_data.ctx[ueid]);
|
||||
_emm_data.ctx[ueid] = NULL;
|
||||
#endif
|
||||
rc = RETURNok;
|
||||
}
|
||||
else {
|
||||
/* Normal detach without UE switch-off */
|
||||
emm_sap_t emm_sap;
|
||||
emm_as_data_t *emm_as = &emm_sap.u.emm_as.u.data;
|
||||
rc = RETURNok;
|
||||
} else {
|
||||
/* Normal detach without UE switch-off */
|
||||
emm_sap_t emm_sap;
|
||||
emm_as_data_t *emm_as = &emm_sap.u.emm_as.u.data;
|
||||
|
||||
/* Setup NAS information message to transfer */
|
||||
emm_as->NASinfo = EMM_AS_NAS_INFO_DETACH;
|
||||
emm_as->NASmsg.length = 0;
|
||||
emm_as->NASmsg.value = NULL;
|
||||
/* Set the UE identifier */
|
||||
emm_as->guti = NULL;
|
||||
emm_as->ueid = ueid;
|
||||
/* Setup EPS NAS security data */
|
||||
emm_as_set_security_data(&emm_as->sctx, emm_ctx->security, FALSE, TRUE);
|
||||
/*
|
||||
* Notify EMM-AS SAP that Detach Accept message has to
|
||||
* be sent to the network
|
||||
*/
|
||||
emm_sap.primitive = EMMAS_DATA_REQ;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
/* Setup NAS information message to transfer */
|
||||
emm_as->NASinfo = EMM_AS_NAS_INFO_DETACH;
|
||||
emm_as->NASmsg.length = 0;
|
||||
emm_as->NASmsg.value = NULL;
|
||||
/* Set the UE identifier */
|
||||
emm_as->guti = NULL;
|
||||
emm_as->ueid = ueid;
|
||||
/* Setup EPS NAS security data */
|
||||
emm_as_set_security_data(&emm_as->sctx, emm_ctx->security, FALSE, TRUE);
|
||||
/*
|
||||
* Notify EMM-AS SAP that Detach Accept message has to
|
||||
* be sent to the network
|
||||
*/
|
||||
emm_sap.primitive = EMMAS_DATA_REQ;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
}
|
||||
|
||||
if (rc != RETURNerror) {
|
||||
/*
|
||||
* Notify ESM that all EPS bearer contexts allocated for this UE have
|
||||
* to be locally deactivated
|
||||
*/
|
||||
esm_sap_t esm_sap;
|
||||
esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ;
|
||||
esm_sap.ueid = ueid;
|
||||
esm_sap.data.eps_bearer_context_deactivate.ebi = ESM_SAP_ALL_EBI;
|
||||
rc = esm_sap_send(&esm_sap);
|
||||
/*
|
||||
* Notify ESM that all EPS bearer contexts allocated for this UE have
|
||||
* to be locally deactivated
|
||||
*/
|
||||
esm_sap_t esm_sap;
|
||||
esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ;
|
||||
esm_sap.ueid = ueid;
|
||||
esm_sap.data.eps_bearer_context_deactivate.ebi = ESM_SAP_ALL_EBI;
|
||||
rc = esm_sap_send(&esm_sap);
|
||||
|
||||
if (rc != RETURNerror) {
|
||||
emm_sap_t emm_sap;
|
||||
/*
|
||||
* Notify EMM that the UE has been implicitly detached
|
||||
*/
|
||||
emm_sap.primitive = EMMREG_DETACH_REQ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
}
|
||||
if (rc != RETURNerror) {
|
||||
emm_sap_t emm_sap;
|
||||
/*
|
||||
* Notify EMM that the UE has been implicitly detached
|
||||
*/
|
||||
emm_sap.primitive = EMMREG_DETACH_REQ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
}
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN(rc);
|
||||
@@ -525,31 +537,31 @@ int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
|
||||
#ifdef NAS_UE
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Timer handlers
|
||||
* Timer handlers
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: _emm_detach_t3421_handler() **
|
||||
** Name: _emm_detach_t3421_handler() **
|
||||
** **
|
||||
** Description: T3421 timeout handler **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.2.2.4 case c **
|
||||
** On the first four expiries of the timer, the UE shall re- **
|
||||
** transmit the DETACH REQUEST message and shall reset and **
|
||||
** restart timer T3421. On the fifth expiry of timer T3421, **
|
||||
** the detach procedure shall be aborted. **
|
||||
** On the first four expiries of the timer, the UE shall re- **
|
||||
** transmit the DETACH REQUEST message and shall reset and **
|
||||
** restart timer T3421. On the fifth expiry of timer T3421, **
|
||||
** the detach procedure shall be aborted. **
|
||||
** **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: _emm_detach_data **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: _emm_detach_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
void* _emm_detach_t3421_handler(void* args)
|
||||
void *_emm_detach_t3421_handler(void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -559,49 +571,47 @@ void* _emm_detach_t3421_handler(void* args)
|
||||
_emm_detach_data.count += 1;
|
||||
|
||||
LOG_TRACE(WARNING, "EMM-PROC - T3421 timer expired, "
|
||||
"retransmission counter = %d", _emm_detach_data.count);
|
||||
"retransmission counter = %d", _emm_detach_data.count);
|
||||
|
||||
if (_emm_detach_data.count < EMM_DETACH_COUNTER_MAX)
|
||||
{
|
||||
/* Retransmit the Detach Request message */
|
||||
emm_sap_t emm_sap;
|
||||
emm_as_data_t *emm_as = &emm_sap.u.emm_as.u.data;
|
||||
if (_emm_detach_data.count < EMM_DETACH_COUNTER_MAX) {
|
||||
/* Retransmit the Detach Request message */
|
||||
emm_sap_t emm_sap;
|
||||
emm_as_data_t *emm_as = &emm_sap.u.emm_as.u.data;
|
||||
|
||||
/* Stop timer T3421 */
|
||||
T3421.id = nas_timer_stop(T3421.id);
|
||||
/* Stop timer T3421 */
|
||||
T3421.id = nas_timer_stop(T3421.id);
|
||||
|
||||
/* Setup NAS information message to transfer */
|
||||
emm_as->NASinfo = EMM_AS_NAS_INFO_DETACH;
|
||||
emm_as->NASmsg.length = 0;
|
||||
emm_as->NASmsg.value = NULL;
|
||||
/* Set the detach type */
|
||||
emm_as->type = _emm_detach_data.type;
|
||||
/* Set the switch-off indicator */
|
||||
emm_as->switch_off = _emm_detach_data.switch_off;
|
||||
/* Set the EPS mobile identity */
|
||||
emm_as->guti = _emm_data.guti;
|
||||
emm_as->ueid = 0;
|
||||
/* Setup EPS NAS security data */
|
||||
emm_as_set_security_data(&emm_as->sctx, _emm_data.security,
|
||||
FALSE, TRUE);
|
||||
/* Setup NAS information message to transfer */
|
||||
emm_as->NASinfo = EMM_AS_NAS_INFO_DETACH;
|
||||
emm_as->NASmsg.length = 0;
|
||||
emm_as->NASmsg.value = NULL;
|
||||
/* Set the detach type */
|
||||
emm_as->type = _emm_detach_data.type;
|
||||
/* Set the switch-off indicator */
|
||||
emm_as->switch_off = _emm_detach_data.switch_off;
|
||||
/* Set the EPS mobile identity */
|
||||
emm_as->guti = _emm_data.guti;
|
||||
emm_as->ueid = 0;
|
||||
/* Setup EPS NAS security data */
|
||||
emm_as_set_security_data(&emm_as->sctx, _emm_data.security,
|
||||
FALSE, TRUE);
|
||||
|
||||
/*
|
||||
* Notify EMM-AS SAP that Detach Request message has to
|
||||
* be sent to the network
|
||||
*/
|
||||
emm_sap.primitive = EMMAS_DATA_REQ;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
/*
|
||||
* Notify EMM-AS SAP that Detach Request message has to
|
||||
* be sent to the network
|
||||
*/
|
||||
emm_sap.primitive = EMMAS_DATA_REQ;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
|
||||
if (rc != RETURNerror) {
|
||||
/* Start T3421 timer */
|
||||
T3421.id = nas_timer_start(T3421.sec, _emm_detach_t3421_handler, NULL);
|
||||
LOG_TRACE(INFO, "EMM-PROC - Timer T3421 (%d) expires in %ld "
|
||||
"seconds", T3421.id, T3421.sec);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Abort the detach procedure */
|
||||
rc = _emm_detach_abort(_emm_detach_data.type);
|
||||
if (rc != RETURNerror) {
|
||||
/* Start T3421 timer */
|
||||
T3421.id = nas_timer_start(T3421.sec, _emm_detach_t3421_handler, NULL);
|
||||
LOG_TRACE(INFO, "EMM-PROC - Timer T3421 (%d) expires in %ld "
|
||||
"seconds", T3421.id, T3421.sec);
|
||||
}
|
||||
} else {
|
||||
/* Abort the detach procedure */
|
||||
rc = _emm_detach_abort(_emm_detach_data.type);
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN(NULL);
|
||||
@@ -609,22 +619,22 @@ void* _emm_detach_t3421_handler(void* args)
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Abnormal cases in the UE
|
||||
* Abnormal cases in the UE
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: _emm_detach_abort() **
|
||||
** Name: _emm_detach_abort() **
|
||||
** **
|
||||
** Description: Aborts the detach procedure **
|
||||
** **
|
||||
** Inputs: type: not used **
|
||||
** Others: _emm_detach_data **
|
||||
** Inputs: type: not used **
|
||||
** Others: _emm_detach_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3421 **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: T3421 **
|
||||
** **
|
||||
***************************************************************************/
|
||||
static int _emm_detach_abort(emm_proc_detach_type_t type)
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source EmmCommon.h
|
||||
Source EmmCommon.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/04/19
|
||||
Date 2013/04/19
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines callback functions executed within EMM common procedures
|
||||
by the Non-Access Stratum running at the network side.
|
||||
Description Defines callback functions executed within EMM common procedures
|
||||
by the Non-Access Stratum running at the network side.
|
||||
|
||||
Following EMM common procedures can always be initiated by the
|
||||
network whilst a NAS signalling connection exists:
|
||||
Following EMM common procedures can always be initiated by the
|
||||
network whilst a NAS signalling connection exists:
|
||||
|
||||
GUTI reallocation
|
||||
authentication
|
||||
security mode control
|
||||
identification
|
||||
EMM information
|
||||
GUTI reallocation
|
||||
authentication
|
||||
security mode control
|
||||
identification
|
||||
EMM information
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -36,7 +36,7 @@ Description Defines callback functions executed within EMM common procedures
|
||||
#include "nas_log.h"
|
||||
#include "emmData.h"
|
||||
|
||||
#include <stdlib.h> // malloc, free
|
||||
#include <stdlib.h> // malloc, free
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
@@ -52,10 +52,10 @@ Description Defines callback functions executed within EMM common procedures
|
||||
/******************* L O C A L D E F I N I T I O N S *******************/
|
||||
/****************************************************************************/
|
||||
|
||||
/* EMM procedure callback cleanup function */
|
||||
/* EMM procedure callback cleanup function */
|
||||
static void _emm_common_cleanup(unsigned int ueid);
|
||||
|
||||
/* Ongoing EMM procedure callback functions */
|
||||
/* Ongoing EMM procedure callback functions */
|
||||
typedef struct emm_common_data_s {
|
||||
unsigned int ueid;
|
||||
int ref_count;
|
||||
@@ -63,7 +63,7 @@ typedef struct emm_common_data_s {
|
||||
emm_common_reject_callback_t reject;
|
||||
emm_common_failure_callback_t failure;
|
||||
emm_common_abort_callback_t abort;
|
||||
void* args;
|
||||
void *args;
|
||||
|
||||
#if defined(EPC_BUILD)
|
||||
RB_ENTRY(emm_common_data_s) entries;
|
||||
@@ -117,7 +117,7 @@ struct emm_common_data_s *emm_common_data_context_get(
|
||||
return RB_FIND(emm_common_data_map, &root->emm_common_data_root, &reference);
|
||||
}
|
||||
#else
|
||||
static emm_common_data_t* _emm_common_data[EMM_DATA_NB_UE_MAX];
|
||||
static emm_common_data_t *_emm_common_data[EMM_DATA_NB_UE_MAX];
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -126,34 +126,34 @@ static emm_common_data_t* _emm_common_data[EMM_DATA_NB_UE_MAX];
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_common_initialize() **
|
||||
** Name: emm_proc_common_initialize() **
|
||||
** **
|
||||
** Description: Initialize EMM procedure callback functions executed for **
|
||||
** the UE with the given identifier **
|
||||
** the UE with the given identifier **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** success: EMM procedure executed upon successful EMM **
|
||||
** common procedure completion **
|
||||
** reject: EMM procedure executed if the EMM common **
|
||||
** procedure failed or is rejected **
|
||||
** failure: EMM procedure executed upon transmission **
|
||||
** failure reported by lower layer **
|
||||
** abort: EMM common procedure executed when the on- **
|
||||
** going EMM procedure is aborted **
|
||||
** args: EMM common procedure argument parameters **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** success: EMM procedure executed upon successful EMM **
|
||||
** common procedure completion **
|
||||
** reject: EMM procedure executed if the EMM common **
|
||||
** procedure failed or is rejected **
|
||||
** failure: EMM procedure executed upon transmission **
|
||||
** failure reported by lower layer **
|
||||
** abort: EMM common procedure executed when the on- **
|
||||
** going EMM procedure is aborted **
|
||||
** args: EMM common procedure argument parameters **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_common_data **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_common_data **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_common_initialize(unsigned int ueid,
|
||||
emm_common_success_callback_t _success,
|
||||
emm_common_reject_callback_t _reject,
|
||||
emm_common_failure_callback_t _failure,
|
||||
emm_common_abort_callback_t _abort,
|
||||
void* args)
|
||||
emm_common_success_callback_t _success,
|
||||
emm_common_reject_callback_t _reject,
|
||||
emm_common_failure_callback_t _failure,
|
||||
emm_common_abort_callback_t _abort,
|
||||
void *args)
|
||||
{
|
||||
struct emm_common_data_s *emm_common_data_ctx = NULL;
|
||||
LOG_FUNC_IN;
|
||||
@@ -166,7 +166,7 @@ int emm_proc_common_initialize(unsigned int ueid,
|
||||
#endif
|
||||
|
||||
if (emm_common_data_ctx == NULL) {
|
||||
emm_common_data_ctx = (emm_common_data_t*)malloc(sizeof(emm_common_data_t));
|
||||
emm_common_data_ctx = (emm_common_data_t *)malloc(sizeof(emm_common_data_t));
|
||||
emm_common_data_ctx->ueid = ueid;
|
||||
#if defined(EPC_BUILD)
|
||||
RB_INSERT(emm_common_data_map, &emm_common_data_head.emm_common_data_root,
|
||||
@@ -191,19 +191,19 @@ int emm_proc_common_initialize(unsigned int ueid,
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_common_success() **
|
||||
** Name: emm_proc_common_success() **
|
||||
** **
|
||||
** Description: The EMM common procedure initiated between the UE with **
|
||||
** the specified identifier and the MME completed success- **
|
||||
** fully. The network performs required actions related to **
|
||||
** the ongoing EMM procedure. **
|
||||
** the specified identifier and the MME completed success- **
|
||||
** fully. The network performs required actions related to **
|
||||
** the ongoing EMM procedure. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data, _emm_data **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data, _emm_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_common_success(unsigned int ueid)
|
||||
@@ -244,19 +244,19 @@ int emm_proc_common_success(unsigned int ueid)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_common_reject() **
|
||||
** Name: emm_proc_common_reject() **
|
||||
** **
|
||||
** Description: The EMM common procedure initiated between the UE with **
|
||||
** the specified identifier and the MME failed or has been **
|
||||
** rejected. The network performs required actions related **
|
||||
** to the ongoing EMM procedure. **
|
||||
** the specified identifier and the MME failed or has been **
|
||||
** rejected. The network performs required actions related **
|
||||
** to the ongoing EMM procedure. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data, _emm_data **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data, _emm_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_common_reject(unsigned int ueid)
|
||||
@@ -297,20 +297,20 @@ int emm_proc_common_reject(unsigned int ueid)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_common_failure() **
|
||||
** Name: emm_proc_common_failure() **
|
||||
** **
|
||||
** Description: The EMM common procedure has been initiated between the **
|
||||
** UE with the specified identifier and the MME, and a lower **
|
||||
** layer failure occurred before the EMM common procedure **
|
||||
** being completed. The network performs required actions **
|
||||
** related to the ongoing EMM procedure. **
|
||||
** UE with the specified identifier and the MME, and a lower **
|
||||
** layer failure occurred before the EMM common procedure **
|
||||
** being completed. The network performs required actions **
|
||||
** related to the ongoing EMM procedure. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data, _emm_data **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data, _emm_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_common_failure(unsigned int ueid)
|
||||
@@ -350,19 +350,19 @@ int emm_proc_common_failure(unsigned int ueid)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_common_abort() **
|
||||
** Name: emm_proc_common_abort() **
|
||||
** **
|
||||
** Description: The ongoing EMM procedure has been aborted. The network **
|
||||
** performs required actions related to the EMM common pro- **
|
||||
** cedure previously initiated between the UE with the spe- **
|
||||
** cified identifier and the MME. **
|
||||
** performs required actions related to the EMM common pro- **
|
||||
** cedure previously initiated between the UE with the spe- **
|
||||
** cified identifier and the MME. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_common_abort(unsigned int ueid)
|
||||
@@ -402,21 +402,21 @@ int emm_proc_common_abort(unsigned int ueid)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_common_get_args() **
|
||||
** Name: emm_proc_common_get_args() **
|
||||
** **
|
||||
** Description: Returns pointer to the EMM common procedure argument pa- **
|
||||
** rameters allocated for the UE with the given identifier. **
|
||||
** rameters allocated for the UE with the given identifier. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: _emm_common_data **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: pointer to the EMM common procedure argu- **
|
||||
** ment parameters **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: pointer to the EMM common procedure argu- **
|
||||
** ment parameters **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
void* emm_proc_common_get_args(unsigned int ueid)
|
||||
void *emm_proc_common_get_args(unsigned int ueid)
|
||||
{
|
||||
emm_common_data_t *emm_common_data_ctx = NULL;
|
||||
LOG_FUNC_IN;
|
||||
@@ -439,19 +439,19 @@ void* emm_proc_common_get_args(unsigned int ueid)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_common_cleanup() **
|
||||
** Name: emm_proc_common_cleanup() **
|
||||
** **
|
||||
** Description: Cleans EMM procedure callback functions upon completion **
|
||||
** of an EMM common procedure previously initiated within an **
|
||||
** EMM procedure currently in progress between the network **
|
||||
** and the UE with the specified identifier. **
|
||||
** of an EMM common procedure previously initiated within an **
|
||||
** EMM procedure currently in progress between the network **
|
||||
** and the UE with the specified identifier. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: _emm_common_data **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: _emm_common_data **
|
||||
** **
|
||||
***************************************************************************/
|
||||
static void _emm_common_cleanup(unsigned int ueid)
|
||||
@@ -469,7 +469,7 @@ static void _emm_common_cleanup(unsigned int ueid)
|
||||
if (emm_common_data_ctx) {
|
||||
emm_common_data_ctx->ref_count -= 1;
|
||||
if (emm_common_data_ctx->ref_count == 0) {
|
||||
/* Release the callback functions */
|
||||
/* Release the callback functions */
|
||||
#if defined(EPC_BUILD)
|
||||
RB_REMOVE(emm_common_data_map,
|
||||
&emm_common_data_head.emm_common_data_root,
|
||||
@@ -477,7 +477,7 @@ static void _emm_common_cleanup(unsigned int ueid)
|
||||
#endif
|
||||
free(emm_common_data_ctx);
|
||||
emm_common_data_ctx = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // NAS_MME
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source EmmCommon.h
|
||||
Source EmmCommon.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/04/19
|
||||
Date 2013/04/19
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines callback functions executed within EMM common procedures
|
||||
by the Non-Access Stratum running at the network side.
|
||||
Description Defines callback functions executed within EMM common procedures
|
||||
by the Non-Access Stratum running at the network side.
|
||||
|
||||
Following EMM common procedures can always be initiated by the
|
||||
network whilst a NAS signalling connection exists:
|
||||
Following EMM common procedures can always be initiated by the
|
||||
network whilst a NAS signalling connection exists:
|
||||
|
||||
GUTI reallocation
|
||||
authentication
|
||||
security mode control
|
||||
identification
|
||||
EMM information
|
||||
GUTI reallocation
|
||||
authentication
|
||||
security mode control
|
||||
identification
|
||||
EMM information
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __EMM_COMMON_H__
|
||||
@@ -47,9 +47,9 @@ Description Defines callback functions executed within EMM common procedures
|
||||
* - The EMM common procedure failed or is rejected
|
||||
* - Lower layer failure occured before the EMM common procedure completion
|
||||
*/
|
||||
typedef int (*emm_common_success_callback_t)(void*);
|
||||
typedef int (*emm_common_reject_callback_t) (void*);
|
||||
typedef int (*emm_common_failure_callback_t)(void*);
|
||||
typedef int (*emm_common_success_callback_t)(void *);
|
||||
typedef int (*emm_common_reject_callback_t) (void *);
|
||||
typedef int (*emm_common_failure_callback_t)(void *);
|
||||
|
||||
/*
|
||||
* Type of EMM common procedure callback function
|
||||
@@ -57,7 +57,7 @@ typedef int (*emm_common_failure_callback_t)(void*);
|
||||
* EMM common procedure to be executed when the ongoing EMM procedure is
|
||||
* aborted.
|
||||
*/
|
||||
typedef int (*emm_common_abort_callback_t)(void*);
|
||||
typedef int (*emm_common_abort_callback_t)(void *);
|
||||
|
||||
/****************************************************************************/
|
||||
/******************** G L O B A L V A R I A B L E S ********************/
|
||||
@@ -68,17 +68,17 @@ typedef int (*emm_common_abort_callback_t)(void*);
|
||||
/****************************************************************************/
|
||||
|
||||
int emm_proc_common_initialize(unsigned int ueid,
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure,
|
||||
emm_common_abort_callback_t abort,
|
||||
void* args);
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure,
|
||||
emm_common_abort_callback_t abort,
|
||||
void *args);
|
||||
|
||||
int emm_proc_common_success(unsigned int ueid);
|
||||
int emm_proc_common_reject(unsigned int ueid);
|
||||
int emm_proc_common_failure(unsigned int ueid);
|
||||
int emm_proc_common_abort(unsigned int ueid);
|
||||
|
||||
void* emm_proc_common_get_args(unsigned int ueid);
|
||||
void *emm_proc_common_get_args(unsigned int ueid);
|
||||
|
||||
#endif /* __EMM_COMMON_H__*/
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source Emmstatus.c
|
||||
Source Emmstatus.c
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/06/26
|
||||
Date 2013/06/26
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the EMM status procedure executed by the Non-Access
|
||||
Stratum.
|
||||
Description Defines the EMM status procedure executed by the Non-Access
|
||||
Stratum.
|
||||
|
||||
The purpose of the sending of the EMM STATUS message is to
|
||||
report at any time certain error conditions detected upon
|
||||
receipt of EMM protocol data. The EMM STATUS message can be
|
||||
sent by both the MME and the UE.
|
||||
The purpose of the sending of the EMM STATUS message is to
|
||||
report at any time certain error conditions detected upon
|
||||
receipt of EMM protocol data. The EMM STATUS message can be
|
||||
sent by both the MME and the UE.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -47,22 +47,22 @@ Description Defines the EMM status procedure executed by the Non-Access
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_status_ind() **
|
||||
** Name: emm_proc_status_ind() **
|
||||
** **
|
||||
** Description: Processes received EMM status message. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.7 **
|
||||
** On receipt of an EMM STATUS message no state transition **
|
||||
** and no specific action shall be taken. Local actions are **
|
||||
** possible and are implementation dependent. **
|
||||
** 3GPP TS 24.301, section 5.7 **
|
||||
** On receipt of an EMM STATUS message no state transition **
|
||||
** and no specific action shall be taken. Local actions are **
|
||||
** possible and are implementation dependent. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** emm_cause: Received EMM cause code **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** emm_cause: Received EMM cause code **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_status_ind(unsigned int ueid, int emm_cause)
|
||||
@@ -72,7 +72,7 @@ int emm_proc_status_ind(unsigned int ueid, int emm_cause)
|
||||
int rc;
|
||||
|
||||
LOG_TRACE(INFO,"EMM-PROC - EMM status procedure requested (cause=%d)",
|
||||
emm_cause);
|
||||
emm_cause);
|
||||
|
||||
LOG_TRACE(DEBUG, "EMM-PROC - To be implemented");
|
||||
|
||||
@@ -84,17 +84,17 @@ int emm_proc_status_ind(unsigned int ueid, int emm_cause)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_status() **
|
||||
** Name: emm_proc_status() **
|
||||
** **
|
||||
** Description: Initiates EMM status procedure. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** emm_cause: EMM cause code to be reported **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** emm_cause: EMM cause code to be reported **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_status(unsigned int ueid, int emm_cause)
|
||||
@@ -133,7 +133,7 @@ int emm_proc_status(unsigned int ueid, int emm_cause)
|
||||
#endif
|
||||
/* Setup EPS NAS security data */
|
||||
emm_as_set_security_data(&emm_sap.u.emm_as.u.status.sctx, sctx,
|
||||
FALSE, TRUE);
|
||||
FALSE, TRUE);
|
||||
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source Identification.c
|
||||
Source Identification.c
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/04/09
|
||||
Date 2013/04/09
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the identification EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
Description Defines the identification EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
|
||||
The identification procedure is used by the network to request
|
||||
a particular UE to provide specific identification parameters
|
||||
(IMSI, IMEI).
|
||||
The identification procedure is used by the network to request
|
||||
a particular UE to provide specific identification parameters
|
||||
(IMSI, IMEI).
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -31,8 +31,8 @@ Description Defines the identification EMM procedure executed by the
|
||||
|
||||
#include "emm_sap.h"
|
||||
|
||||
#include <stdlib.h> // malloc, free
|
||||
#include <string.h> // memcpy
|
||||
#include <stdlib.h> // malloc, free
|
||||
#include <string.h> // memcpy
|
||||
|
||||
/****************************************************************************/
|
||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||
@@ -43,50 +43,50 @@ Description Defines the identification EMM procedure executed by the
|
||||
/****************************************************************************/
|
||||
|
||||
/* String representation of the requested identity type */
|
||||
static const char* _emm_identity_type_str[] = {
|
||||
static const char *_emm_identity_type_str[] = {
|
||||
"NOT AVAILABLE", "IMSI", "IMEI", "IMEISV", "TMSI"
|
||||
};
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Internal data handled by the identification procedure in the UE
|
||||
* Internal data handled by the identification procedure in the UE
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
#endif // NAS_UE
|
||||
#endif // NAS_UE
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Internal data handled by the identification procedure in the MME
|
||||
* Internal data handled by the identification procedure in the MME
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_MME
|
||||
/*
|
||||
* Timer handlers
|
||||
*/
|
||||
static void* _identification_t3470_handler(void*);
|
||||
static void *_identification_t3470_handler(void *);
|
||||
|
||||
/*
|
||||
* Function executed whenever the ongoing EMM procedure that initiated
|
||||
* the identification procedure is aborted or the maximum value of the
|
||||
* retransmission timer counter is exceed
|
||||
*/
|
||||
static int _identification_abort(void*);
|
||||
static int _identification_abort(void *);
|
||||
|
||||
/*
|
||||
* Internal data used for identification procedure
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int ueid; /* UE identifier */
|
||||
#define IDENTIFICATION_COUNTER_MAX 5
|
||||
unsigned int retransmission_count; /* Retransmission counter */
|
||||
emm_proc_identity_type_t type; /* Type of UE identity */
|
||||
int notify_failure; /* Indicates whether the identification
|
||||
* procedure failure shall be notified
|
||||
* to the ongoing EMM procedure */
|
||||
unsigned int ueid; /* UE identifier */
|
||||
#define IDENTIFICATION_COUNTER_MAX 5
|
||||
unsigned int retransmission_count; /* Retransmission counter */
|
||||
emm_proc_identity_type_t type; /* Type of UE identity */
|
||||
int notify_failure; /* Indicates whether the identification
|
||||
* procedure failure shall be notified
|
||||
* to the ongoing EMM procedure */
|
||||
} identification_data_t;
|
||||
|
||||
static int _identification_request(identification_data_t* data);
|
||||
static int _identification_request(identification_data_t *data);
|
||||
#endif // NAS_MME
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -95,28 +95,28 @@ static int _identification_request(identification_data_t* data);
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Identification procedure executed by the UE
|
||||
* Identification procedure executed by the UE
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_identification_request() **
|
||||
** Name: emm_proc_identification_request() **
|
||||
** **
|
||||
** Description: Performs the MME requested identification procedure. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.4.4.3 **
|
||||
** Upon receiving the IDENTITY REQUEST message, the UE shall **
|
||||
** send an IDENTITY RESPONSE message to the network. The **
|
||||
** IDENTITY RESPONSE message shall contain the identifica- **
|
||||
** tion parameters as requested by the network. **
|
||||
** Upon receiving the IDENTITY REQUEST message, the UE shall **
|
||||
** send an IDENTITY RESPONSE message to the network. The **
|
||||
** IDENTITY RESPONSE message shall contain the identifica- **
|
||||
** tion parameters as requested by the network. **
|
||||
** **
|
||||
** Inputs: type: Type of the requested identity **
|
||||
** Others: None **
|
||||
** Inputs: type: Type of the requested identity **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_identification_request(emm_proc_identity_type_t type)
|
||||
@@ -127,48 +127,47 @@ int emm_proc_identification_request(emm_proc_identity_type_t type)
|
||||
emm_sap_t emm_sap;
|
||||
|
||||
LOG_TRACE(INFO, "EMM-PROC - Identification requested type = %s (%d)",
|
||||
_emm_identity_type_str[type], type);
|
||||
_emm_identity_type_str[type], type);
|
||||
|
||||
/* Setup EMM procedure handler to be executed upon receiving
|
||||
* lower layer notification */
|
||||
rc = emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL);
|
||||
if (rc != RETURNok) {
|
||||
LOG_TRACE(WARNING,
|
||||
"EMM-PROC - Failed to initialize EMM procedure handler");
|
||||
LOG_FUNC_RETURN (RETURNerror);
|
||||
LOG_TRACE(WARNING,
|
||||
"EMM-PROC - Failed to initialize EMM procedure handler");
|
||||
LOG_FUNC_RETURN (RETURNerror);
|
||||
}
|
||||
|
||||
emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_NOT_AVAILABLE;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case EMM_IDENT_TYPE_IMSI:
|
||||
/* International Mobile Subscriber Identity is requested */
|
||||
if (_emm_data.imsi) {
|
||||
emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_IMSI;
|
||||
emm_sap.u.emm_as.u.security.imsi = _emm_data.imsi;
|
||||
}
|
||||
break;
|
||||
switch (type) {
|
||||
case EMM_IDENT_TYPE_IMSI:
|
||||
/* International Mobile Subscriber Identity is requested */
|
||||
if (_emm_data.imsi) {
|
||||
emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_IMSI;
|
||||
emm_sap.u.emm_as.u.security.imsi = _emm_data.imsi;
|
||||
}
|
||||
break;
|
||||
|
||||
case EMM_IDENT_TYPE_IMEI:
|
||||
/* International Mobile Equipment Identity is requested */
|
||||
if (_emm_data.imei) {
|
||||
emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_IMEI;
|
||||
emm_sap.u.emm_as.u.security.imei = _emm_data.imei;
|
||||
}
|
||||
break;
|
||||
case EMM_IDENT_TYPE_IMEI:
|
||||
/* International Mobile Equipment Identity is requested */
|
||||
if (_emm_data.imei) {
|
||||
emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_IMEI;
|
||||
emm_sap.u.emm_as.u.security.imei = _emm_data.imei;
|
||||
}
|
||||
break;
|
||||
|
||||
case EMM_IDENT_TYPE_TMSI:
|
||||
/* Temporary Mobile Subscriber Identity is requested */
|
||||
if (_emm_data.guti) {
|
||||
emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_TMSI;
|
||||
emm_sap.u.emm_as.u.security.tmsi = _emm_data.guti->m_tmsi;
|
||||
}
|
||||
break;
|
||||
case EMM_IDENT_TYPE_TMSI:
|
||||
/* Temporary Mobile Subscriber Identity is requested */
|
||||
if (_emm_data.guti) {
|
||||
emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_TMSI;
|
||||
emm_sap.u.emm_as.u.security.tmsi = _emm_data.guti->m_tmsi;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Other identities are not available */
|
||||
break;
|
||||
default:
|
||||
/* Other identities are not available */
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -181,7 +180,7 @@ int emm_proc_identification_request(emm_proc_identity_type_t type)
|
||||
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT;
|
||||
/* Setup EPS NAS security data */
|
||||
emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx,
|
||||
_emm_data.security, FALSE, TRUE);
|
||||
_emm_data.security, FALSE, TRUE);
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
|
||||
LOG_FUNC_RETURN (rc);
|
||||
@@ -190,86 +189,86 @@ int emm_proc_identification_request(emm_proc_identity_type_t type)
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Identification procedure executed by the MME
|
||||
* Identification procedure executed by the MME
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_MME
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_identification() **
|
||||
** Name: emm_proc_identification() **
|
||||
** **
|
||||
** Description: Initiates an identification procedure. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.4.4.2 **
|
||||
** The network initiates the identification procedure by **
|
||||
** sending an IDENTITY REQUEST message to the UE and star- **
|
||||
** ting the timer T3470. The IDENTITY REQUEST message speci- **
|
||||
** fies the requested identification parameters in the Iden- **
|
||||
** tity type information element. **
|
||||
** The network initiates the identification procedure by **
|
||||
** sending an IDENTITY REQUEST message to the UE and star- **
|
||||
** ting the timer T3470. The IDENTITY REQUEST message speci- **
|
||||
** fies the requested identification parameters in the Iden- **
|
||||
** tity type information element. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** type: Type of the requested identity **
|
||||
** success: Callback function executed when the identi-**
|
||||
** fication procedure successfully completes **
|
||||
** reject: Callback function executed when the identi-**
|
||||
** fication procedure fails or is rejected **
|
||||
** failure: Callback function executed whener a lower **
|
||||
** layer failure occured before the identifi- **
|
||||
** cation procedure comnpletes **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** type: Type of the requested identity **
|
||||
** success: Callback function executed when the identi-**
|
||||
** fication procedure successfully completes **
|
||||
** reject: Callback function executed when the identi-**
|
||||
** fication procedure fails or is rejected **
|
||||
** failure: Callback function executed whener a lower **
|
||||
** layer failure occured before the identifi- **
|
||||
** cation procedure comnpletes **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_data **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_data **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_identification(unsigned int ueid,
|
||||
emm_data_context_t *emm_ctx,
|
||||
emm_proc_identity_type_t type,
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure)
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
int rc = RETURNerror;
|
||||
|
||||
LOG_TRACE(INFO, "EMM-PROC - Initiate identification type = %s (%d)",
|
||||
_emm_identity_type_str[type], type);
|
||||
_emm_identity_type_str[type], type);
|
||||
|
||||
/* Allocate parameters of the retransmission timer callback */
|
||||
identification_data_t* data =
|
||||
(identification_data_t*)malloc(sizeof(identification_data_t));
|
||||
identification_data_t *data =
|
||||
(identification_data_t *)malloc(sizeof(identification_data_t));
|
||||
|
||||
if (data != NULL) {
|
||||
/* Setup ongoing EMM procedure callback functions */
|
||||
rc = emm_proc_common_initialize(ueid, success, reject, failure,
|
||||
_identification_abort, data);
|
||||
if (rc != RETURNok) {
|
||||
LOG_TRACE(WARNING, "Failed to initialize EMM callback functions");
|
||||
free(data);
|
||||
LOG_FUNC_RETURN (RETURNerror);
|
||||
}
|
||||
/* Set the UE identifier */
|
||||
data->ueid = ueid;
|
||||
/* Reset the retransmission counter */
|
||||
data->retransmission_count = 0;
|
||||
/* Set the type of the requested identity */
|
||||
data->type = type;
|
||||
/* Set the failure notification indicator */
|
||||
data->notify_failure = FALSE;
|
||||
/* Send identity request message to the UE */
|
||||
rc = _identification_request(data);
|
||||
if (rc != RETURNerror) {
|
||||
/*
|
||||
* Notify EMM that common procedure has been initiated
|
||||
*/
|
||||
emm_sap_t emm_sap;
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_REQ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
/* Setup ongoing EMM procedure callback functions */
|
||||
rc = emm_proc_common_initialize(ueid, success, reject, failure,
|
||||
_identification_abort, data);
|
||||
if (rc != RETURNok) {
|
||||
LOG_TRACE(WARNING, "Failed to initialize EMM callback functions");
|
||||
free(data);
|
||||
LOG_FUNC_RETURN (RETURNerror);
|
||||
}
|
||||
/* Set the UE identifier */
|
||||
data->ueid = ueid;
|
||||
/* Reset the retransmission counter */
|
||||
data->retransmission_count = 0;
|
||||
/* Set the type of the requested identity */
|
||||
data->type = type;
|
||||
/* Set the failure notification indicator */
|
||||
data->notify_failure = FALSE;
|
||||
/* Send identity request message to the UE */
|
||||
rc = _identification_request(data);
|
||||
if (rc != RETURNerror) {
|
||||
/*
|
||||
* Notify EMM that common procedure has been initiated
|
||||
*/
|
||||
emm_sap_t emm_sap;
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_REQ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
emm_sap.u.emm_reg.ctx = emm_ctx;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
}
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
}
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN (rc);
|
||||
@@ -277,33 +276,33 @@ int emm_proc_identification(unsigned int ueid,
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_identification_complete() **
|
||||
** Name: emm_proc_identification_complete() **
|
||||
** **
|
||||
** Description: Performs the identification completion procedure executed **
|
||||
** by the network. **
|
||||
** by the network. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.4.4.4 **
|
||||
** Upon receiving the IDENTITY RESPONSE message, the MME **
|
||||
** shall stop timer T3470. **
|
||||
** Upon receiving the IDENTITY RESPONSE message, the MME **
|
||||
** shall stop timer T3470. **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** imsi: The IMSI received from the UE **
|
||||
** imei: The IMEI received from the UE **
|
||||
** tmsi: The TMSI received from the UE **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** imsi: The IMSI received from the UE **
|
||||
** imei: The IMEI received from the UE **
|
||||
** tmsi: The TMSI received from the UE **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_data, T3470 **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _emm_data, T3470 **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_identification_complete(unsigned int ueid, const imsi_t* imsi,
|
||||
const imei_t* imei, UInt32_t* tmsi)
|
||||
int emm_proc_identification_complete(unsigned int ueid, const imsi_t *imsi,
|
||||
const imei_t *imei, UInt32_t *tmsi)
|
||||
{
|
||||
int rc = RETURNerror;
|
||||
emm_sap_t emm_sap;
|
||||
|
||||
emm_data_context_t* emm_ctx = NULL;
|
||||
emm_data_context_t *emm_ctx = NULL;
|
||||
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -314,9 +313,11 @@ int emm_proc_identification_complete(unsigned int ueid, const imsi_t* imsi,
|
||||
T3470.id = nas_timer_stop(T3470.id);
|
||||
|
||||
/* Release retransmission timer paramaters */
|
||||
identification_data_t* data =
|
||||
(identification_data_t*)(emm_proc_common_get_args(ueid));
|
||||
if (data) free(data);
|
||||
identification_data_t *data =
|
||||
(identification_data_t *)(emm_proc_common_get_args(ueid));
|
||||
if (data) {
|
||||
free(data);
|
||||
}
|
||||
|
||||
/* Get the UE context */
|
||||
#if defined(EPC_BUILD)
|
||||
@@ -330,49 +331,46 @@ int emm_proc_identification_complete(unsigned int ueid, const imsi_t* imsi,
|
||||
#endif
|
||||
|
||||
if (emm_ctx) {
|
||||
if (imsi) {
|
||||
/* Update the IMSI */
|
||||
if (emm_ctx->imsi == NULL) {
|
||||
emm_ctx->imsi = (imsi_t*)malloc(sizeof(imsi_t));
|
||||
}
|
||||
if (emm_ctx->imsi) {
|
||||
memcpy(emm_ctx->imsi, imsi, sizeof(imsi_t));
|
||||
}
|
||||
}
|
||||
else if (imei) {
|
||||
/* Update the IMEI */
|
||||
if (emm_ctx->imei == NULL) {
|
||||
emm_ctx->imei = (imei_t*)malloc(sizeof(imei_t));
|
||||
}
|
||||
if (emm_ctx->imei) {
|
||||
memcpy(emm_ctx->imei, imei, sizeof(imei_t));
|
||||
}
|
||||
}
|
||||
else if (tmsi) {
|
||||
/* Update the GUTI */
|
||||
if (emm_ctx->guti == NULL) {
|
||||
emm_ctx->guti = (GUTI_t*)malloc(sizeof(GUTI_t));
|
||||
}
|
||||
if (emm_ctx->guti) {
|
||||
memcpy(&emm_ctx->guti->gummei,
|
||||
&_emm_data.conf.gummei, sizeof(gummei_t));
|
||||
emm_ctx->guti->m_tmsi = *tmsi;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Notify EMM that the identification procedure successfully completed
|
||||
*/
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_CNF;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
emm_sap.u.emm_reg.u.common.is_attached = emm_ctx->is_attached;
|
||||
}
|
||||
else {
|
||||
LOG_TRACE(ERROR, "EMM-PROC - No EMM context exists");
|
||||
/*
|
||||
* Notify EMM that the identification procedure failed
|
||||
*/
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_REJ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
if (imsi) {
|
||||
/* Update the IMSI */
|
||||
if (emm_ctx->imsi == NULL) {
|
||||
emm_ctx->imsi = (imsi_t *)malloc(sizeof(imsi_t));
|
||||
}
|
||||
if (emm_ctx->imsi) {
|
||||
memcpy(emm_ctx->imsi, imsi, sizeof(imsi_t));
|
||||
}
|
||||
} else if (imei) {
|
||||
/* Update the IMEI */
|
||||
if (emm_ctx->imei == NULL) {
|
||||
emm_ctx->imei = (imei_t *)malloc(sizeof(imei_t));
|
||||
}
|
||||
if (emm_ctx->imei) {
|
||||
memcpy(emm_ctx->imei, imei, sizeof(imei_t));
|
||||
}
|
||||
} else if (tmsi) {
|
||||
/* Update the GUTI */
|
||||
if (emm_ctx->guti == NULL) {
|
||||
emm_ctx->guti = (GUTI_t *)malloc(sizeof(GUTI_t));
|
||||
}
|
||||
if (emm_ctx->guti) {
|
||||
memcpy(&emm_ctx->guti->gummei,
|
||||
&_emm_data.conf.gummei, sizeof(gummei_t));
|
||||
emm_ctx->guti->m_tmsi = *tmsi;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Notify EMM that the identification procedure successfully completed
|
||||
*/
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_CNF;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
emm_sap.u.emm_reg.u.common.is_attached = emm_ctx->is_attached;
|
||||
} else {
|
||||
LOG_TRACE(ERROR, "EMM-PROC - No EMM context exists");
|
||||
/*
|
||||
* Notify EMM that the identification procedure failed
|
||||
*/
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_REJ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
}
|
||||
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
@@ -389,53 +387,52 @@ int emm_proc_identification_complete(unsigned int ueid, const imsi_t* imsi,
|
||||
#ifdef NAS_MME
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Timer handlers
|
||||
* Timer handlers
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: _identification_t3470_handler() **
|
||||
** Name: _identification_t3470_handler() **
|
||||
** **
|
||||
** Description: T3470 timeout handler **
|
||||
** Upon T3470 timer expiration, the identification request **
|
||||
** message is retransmitted and the timer restarted. When **
|
||||
** retransmission counter is exceed, the MME shall abort the **
|
||||
** identification procedure and any ongoing EMM procedure. **
|
||||
** Upon T3470 timer expiration, the identification request **
|
||||
** message is retransmitted and the timer restarted. When **
|
||||
** retransmission counter is exceed, the MME shall abort the **
|
||||
** identification procedure and any ongoing EMM procedure. **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.4.4.6, case b **
|
||||
** **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
static void* _identification_t3470_handler(void* args)
|
||||
static void *_identification_t3470_handler(void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
int rc;
|
||||
|
||||
identification_data_t* data = (identification_data_t*)(args);
|
||||
identification_data_t *data = (identification_data_t *)(args);
|
||||
|
||||
/* Increment the retransmission counter */
|
||||
data->retransmission_count += 1;
|
||||
|
||||
LOG_TRACE(WARNING, "EMM-PROC - T3470 timer expired, retransmission "
|
||||
"counter = %d", data->retransmission_count);
|
||||
"counter = %d", data->retransmission_count);
|
||||
|
||||
if (data->retransmission_count < IDENTIFICATION_COUNTER_MAX) {
|
||||
/* Send identity request message to the UE */
|
||||
rc = _identification_request(data);
|
||||
}
|
||||
else {
|
||||
/* Set the failure notification indicator */
|
||||
data->notify_failure = TRUE;
|
||||
/* Abort the identification procedure */
|
||||
rc = _identification_abort(data);
|
||||
/* Send identity request message to the UE */
|
||||
rc = _identification_request(data);
|
||||
} else {
|
||||
/* Set the failure notification indicator */
|
||||
data->notify_failure = TRUE;
|
||||
/* Abort the identification procedure */
|
||||
rc = _identification_abort(data);
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN (NULL);
|
||||
@@ -443,25 +440,25 @@ static void* _identification_t3470_handler(void* args)
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* MME specific local functions
|
||||
* MME specific local functions
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: _identification_request() **
|
||||
** Name: _identification_request() **
|
||||
** **
|
||||
** Description: Sends IDENTITY REQUEST message and start timer T3470. **
|
||||
** **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: T3470 **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: T3470 **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int _identification_request(identification_data_t* data)
|
||||
int _identification_request(identification_data_t *data)
|
||||
{
|
||||
emm_sap_t emm_sap;
|
||||
int rc;
|
||||
@@ -495,16 +492,16 @@ int _identification_request(identification_data_t* data)
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
|
||||
if (rc != RETURNerror) {
|
||||
if (T3470.id != NAS_TIMER_INACTIVE_ID) {
|
||||
/* Re-start T3470 timer */
|
||||
T3470.id = nas_timer_restart(T3470.id);
|
||||
} else {
|
||||
/* Start T3470 timer */
|
||||
T3470.id = nas_timer_start(T3470.sec, _identification_t3470_handler,
|
||||
data);
|
||||
}
|
||||
LOG_TRACE(INFO,"EMM-PROC - Timer T3470 (%d) expires in %ld seconds",
|
||||
T3470.id, T3470.sec);
|
||||
if (T3470.id != NAS_TIMER_INACTIVE_ID) {
|
||||
/* Re-start T3470 timer */
|
||||
T3470.id = nas_timer_restart(T3470.id);
|
||||
} else {
|
||||
/* Start T3470 timer */
|
||||
T3470.id = nas_timer_start(T3470.sec, _identification_t3470_handler,
|
||||
data);
|
||||
}
|
||||
LOG_TRACE(INFO,"EMM-PROC - Timer T3470 (%d) expires in %ld seconds",
|
||||
T3470.id, T3470.sec);
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN (rc);
|
||||
@@ -512,53 +509,52 @@ int _identification_request(identification_data_t* data)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: _identification_abort() **
|
||||
** Name: _identification_abort() **
|
||||
** **
|
||||
** Description: Aborts the identification procedure currently in progress **
|
||||
** **
|
||||
** Inputs: args: Identification data to be released **
|
||||
** Others: None **
|
||||
** Inputs: args: Identification data to be released **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: T3470 **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: T3470 **
|
||||
** **
|
||||
***************************************************************************/
|
||||
static int _identification_abort(void* args)
|
||||
static int _identification_abort(void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
int rc = RETURNerror;
|
||||
|
||||
identification_data_t* data = (identification_data_t*)(args);
|
||||
identification_data_t *data = (identification_data_t *)(args);
|
||||
|
||||
if (data)
|
||||
{
|
||||
unsigned int ueid = data->ueid;
|
||||
int notify_failure = data->notify_failure;
|
||||
if (data) {
|
||||
unsigned int ueid = data->ueid;
|
||||
int notify_failure = data->notify_failure;
|
||||
|
||||
LOG_TRACE(WARNING, "EMM-PROC - Abort identification procedure "
|
||||
"(ueid=%u)", ueid);
|
||||
LOG_TRACE(WARNING, "EMM-PROC - Abort identification procedure "
|
||||
"(ueid=%u)", ueid);
|
||||
|
||||
/* Stop timer T3470 */
|
||||
if (T3470.id != NAS_TIMER_INACTIVE_ID) {
|
||||
LOG_TRACE(INFO, "EMM-PROC - Stop timer T3470 (%d)", T3470.id);
|
||||
T3470.id = nas_timer_stop(T3470.id);
|
||||
}
|
||||
/* Release retransmission timer paramaters */
|
||||
free(data);
|
||||
/* Stop timer T3470 */
|
||||
if (T3470.id != NAS_TIMER_INACTIVE_ID) {
|
||||
LOG_TRACE(INFO, "EMM-PROC - Stop timer T3470 (%d)", T3470.id);
|
||||
T3470.id = nas_timer_stop(T3470.id);
|
||||
}
|
||||
/* Release retransmission timer paramaters */
|
||||
free(data);
|
||||
|
||||
/*
|
||||
* Notify EMM that the identification procedure failed
|
||||
*/
|
||||
if (notify_failure) {
|
||||
emm_sap_t emm_sap;
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_REJ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
} else {
|
||||
rc = RETURNok;
|
||||
}
|
||||
/*
|
||||
* Notify EMM that the identification procedure failed
|
||||
*/
|
||||
if (notify_failure) {
|
||||
emm_sap_t emm_sap;
|
||||
emm_sap.primitive = EMMREG_COMMON_PROC_REJ;
|
||||
emm_sap.u.emm_reg.ueid = ueid;
|
||||
rc = emm_sap_send(&emm_sap);
|
||||
} else {
|
||||
rc = RETURNok;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN(rc);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,22 +1,22 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source IdleMode.h
|
||||
Source IdleMode.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2012/10/23
|
||||
Date 2012/10/23
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the functions used to get information from the list
|
||||
of available PLMNs locally maintained when the UE is in
|
||||
idle mode.
|
||||
Description Defines the functions used to get information from the list
|
||||
of available PLMNs locally maintained when the UE is in
|
||||
idle mode.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __IDLEMODE_H__
|
||||
@@ -51,12 +51,14 @@ int IdleMode_get_splmn_index(void);
|
||||
|
||||
int IdleMode_update_plmn_list(int index);
|
||||
|
||||
const char* IdleMode_get_plmn_fullname(const plmn_t* plmn, int index, size_t* len);
|
||||
const char* IdleMode_get_plmn_shortname(const plmn_t* plmn, int index, size_t* len);
|
||||
const char* IdleMode_get_plmn_id(const plmn_t* plmn, int index, size_t* len);
|
||||
const char *IdleMode_get_plmn_fullname(const plmn_t *plmn, int index,
|
||||
size_t *len);
|
||||
const char *IdleMode_get_plmn_shortname(const plmn_t *plmn, int index,
|
||||
size_t *len);
|
||||
const char *IdleMode_get_plmn_id(const plmn_t *plmn, int index, size_t *len);
|
||||
|
||||
int IdleMode_get_plmn_fullname_index(const char* plmn);
|
||||
int IdleMode_get_plmn_shortname_index(const char* plmn);
|
||||
int IdleMode_get_plmn_id_index(const char* plmn);
|
||||
int IdleMode_get_plmn_fullname_index(const char *plmn);
|
||||
int IdleMode_get_plmn_shortname_index(const char *plmn);
|
||||
int IdleMode_get_plmn_id_index(const char *plmn);
|
||||
|
||||
#endif /* __IDLEMODE_H__*/
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source LowerLayer.c
|
||||
Source LowerLayer.c
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2012/03/14
|
||||
Date 2012/03/14
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines EMM procedures executed by the Non-Access Stratum
|
||||
upon receiving notifications from lower layers so that data
|
||||
transfer succeed or failed, or NAS signalling connection is
|
||||
released, or ESM unit data has been received from under layer,
|
||||
and to request ESM unit data transfer to under layer.
|
||||
Description Defines EMM procedures executed by the Non-Access Stratum
|
||||
upon receiving notifications from lower layers so that data
|
||||
transfer succeed or failed, or NAS signalling connection is
|
||||
released, or ESM unit data has been received from under layer,
|
||||
and to request ESM unit data transfer to under layer.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -31,7 +31,7 @@ Description Defines EMM procedures executed by the Non-Access Stratum
|
||||
#include "emm_sap.h"
|
||||
#include "esm_sap.h"
|
||||
|
||||
#include <string.h> // memset
|
||||
#include <string.h> // memset
|
||||
|
||||
/****************************************************************************/
|
||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||
@@ -47,10 +47,10 @@ Description Defines EMM procedures executed by the Non-Access Stratum
|
||||
* receiving lower layer notifications
|
||||
*/
|
||||
static struct {
|
||||
lowerlayer_success_callback_t success; /* Successful data delivery */
|
||||
lowerlayer_failure_callback_t failure; /* Lower layer failure */
|
||||
lowerlayer_release_callback_t release; /* NAS signalling release */
|
||||
void* args; /* EMM procedure argument parameters */
|
||||
lowerlayer_success_callback_t success; /* Successful data delivery */
|
||||
lowerlayer_failure_callback_t failure; /* Lower layer failure */
|
||||
lowerlayer_release_callback_t release; /* NAS signalling release */
|
||||
void *args; /* EMM procedure argument parameters */
|
||||
} _lowerlayer_data;
|
||||
#endif
|
||||
|
||||
@@ -60,23 +60,23 @@ static struct {
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Lower layer notification handlers
|
||||
* Lower layer notification handlers
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: lowerlayer_success() **
|
||||
** Name: lowerlayer_success() **
|
||||
** **
|
||||
** Description: Notify the EPS Mobility Management entity that data have **
|
||||
** been successfully delivered to the network **
|
||||
** been successfully delivered to the network **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int lowerlayer_success(unsigned int ueid)
|
||||
@@ -95,17 +95,17 @@ int lowerlayer_success(unsigned int ueid)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: lowerlayer_failure() **
|
||||
** Name: lowerlayer_failure() **
|
||||
** **
|
||||
** Description: Notify the EPS Mobility Management entity that lower la- **
|
||||
** yers failed to deliver data to the network **
|
||||
** yers failed to deliver data to the network **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int lowerlayer_failure(unsigned int ueid)
|
||||
@@ -124,18 +124,18 @@ int lowerlayer_failure(unsigned int ueid)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: lowerlayer_establish() **
|
||||
** Name: lowerlayer_establish() **
|
||||
** **
|
||||
** Description: Update the EPS connection management status upon recei- **
|
||||
** ving indication so that the NAS signalling connection is **
|
||||
** established **
|
||||
** ving indication so that the NAS signalling connection is **
|
||||
** established **
|
||||
** **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int lowerlayer_establish(void)
|
||||
@@ -152,17 +152,17 @@ int lowerlayer_establish(void)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: lowerlayer_release() **
|
||||
** Name: lowerlayer_release() **
|
||||
** **
|
||||
** Description: Notify the EPS Mobility Management entity that NAS signal-**
|
||||
** ling connection has been released **
|
||||
** ling connection has been released **
|
||||
** **
|
||||
** Inputs: cause: Release cause **
|
||||
** Others: None **
|
||||
** Inputs: cause: Release cause **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int lowerlayer_release(int cause)
|
||||
@@ -186,21 +186,21 @@ int lowerlayer_release(int cause)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: lowerlayer_data_ind() **
|
||||
** Name: lowerlayer_data_ind() **
|
||||
** **
|
||||
** Description: Notify the EPS Session Management entity that data have **
|
||||
** been received from lower layers **
|
||||
** been received from lower layers **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** data: Data transfered from lower layers **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** data: Data transfered from lower layers **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int lowerlayer_data_ind(unsigned int ueid, const OctetString* data)
|
||||
int lowerlayer_data_ind(unsigned int ueid, const OctetString *data)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -218,21 +218,21 @@ int lowerlayer_data_ind(unsigned int ueid, const OctetString* data)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: lowerlayer_data_req() **
|
||||
** Name: lowerlayer_data_req() **
|
||||
** **
|
||||
** Description: Notify the EPS Mobility Management entity that data have **
|
||||
** to be transfered to lower layers **
|
||||
** to be transfered to lower layers **
|
||||
** **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** data: Data to be transfered to lower layers **
|
||||
** Others: None **
|
||||
** Inputs: ueid: UE lower layer identifier **
|
||||
** data: Data to be transfered to lower layers **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int lowerlayer_data_req(unsigned int ueid, const OctetString* data)
|
||||
int lowerlayer_data_req(unsigned int ueid, const OctetString *data)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -275,35 +275,35 @@ int lowerlayer_data_req(unsigned int ueid, const OctetString* data)
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* EMM procedure handlers
|
||||
* EMM procedure handlers
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_lowerlayer_initialize() **
|
||||
** Name: emm_proc_lowerlayer_initialize() **
|
||||
** **
|
||||
** Description: Initialize EMM procedure handler **
|
||||
** **
|
||||
** Inputs: success: EMM procedure executed when data have been **
|
||||
** successfully delivered by lower layers **
|
||||
** failure: EMM procedure executed upon transmission **
|
||||
** failure reported by lower layers **
|
||||
** release: EMM procedure executed when lower layers **
|
||||
** report that NAS signalling connection has **
|
||||
** been released **
|
||||
** args: EMM procedure argument parameters **
|
||||
** Others: None **
|
||||
** Inputs: success: EMM procedure executed when data have been **
|
||||
** successfully delivered by lower layers **
|
||||
** failure: EMM procedure executed upon transmission **
|
||||
** failure reported by lower layers **
|
||||
** release: EMM procedure executed when lower layers **
|
||||
** report that NAS signalling connection has **
|
||||
** been released **
|
||||
** args: EMM procedure argument parameters **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _lowerlayer_data **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: _lowerlayer_data **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_lowerlayer_initialize(lowerlayer_success_callback_t success,
|
||||
lowerlayer_failure_callback_t failure,
|
||||
lowerlayer_release_callback_t release,
|
||||
void* args)
|
||||
lowerlayer_failure_callback_t failure,
|
||||
lowerlayer_release_callback_t release,
|
||||
void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
@@ -317,18 +317,18 @@ int emm_proc_lowerlayer_initialize(lowerlayer_success_callback_t success,
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_lowerlayer_success() **
|
||||
** Name: emm_proc_lowerlayer_success() **
|
||||
** **
|
||||
** Description: Handles EMM procedure to be executed upon receiving noti- **
|
||||
** fication that data have been successfully delivered to **
|
||||
** the network. **
|
||||
** fication that data have been successfully delivered to **
|
||||
** the network. **
|
||||
** **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_lowerlayer_success(void)
|
||||
@@ -340,8 +340,8 @@ int emm_proc_lowerlayer_success(void)
|
||||
lowerlayer_success_callback_t emm_callback = _lowerlayer_data.success;
|
||||
|
||||
if (emm_callback) {
|
||||
rc = (*emm_callback)(_lowerlayer_data.args);
|
||||
_lowerlayer_data.success = NULL;
|
||||
rc = (*emm_callback)(_lowerlayer_data.args);
|
||||
_lowerlayer_data.success = NULL;
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN (rc);
|
||||
@@ -349,18 +349,18 @@ int emm_proc_lowerlayer_success(void)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_lowerlayer_failure() **
|
||||
** Name: emm_proc_lowerlayer_failure() **
|
||||
** **
|
||||
** Description: Handles EMM procedure to be executed upon receiving noti- **
|
||||
** fication that data failed to be delivered to the network. **
|
||||
** fication that data failed to be delivered to the network. **
|
||||
** **
|
||||
** Inputs: is_initial: TRUE if the NAS message that failed to be **
|
||||
** transfered is an initial NAS message **
|
||||
** Others: None **
|
||||
** Inputs: is_initial: TRUE if the NAS message that failed to be **
|
||||
** transfered is an initial NAS message **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_lowerlayer_failure(int is_initial)
|
||||
@@ -372,8 +372,8 @@ int emm_proc_lowerlayer_failure(int is_initial)
|
||||
lowerlayer_failure_callback_t emm_callback = _lowerlayer_data.failure;
|
||||
|
||||
if (emm_callback) {
|
||||
rc = (*emm_callback)(is_initial, _lowerlayer_data.args);
|
||||
_lowerlayer_data.failure = NULL;
|
||||
rc = (*emm_callback)(is_initial, _lowerlayer_data.args);
|
||||
_lowerlayer_data.failure = NULL;
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN (rc);
|
||||
@@ -381,17 +381,17 @@ int emm_proc_lowerlayer_failure(int is_initial)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_proc_lowerlayer_release() **
|
||||
** Name: emm_proc_lowerlayer_release() **
|
||||
** **
|
||||
** Description: Handles EMM procedure to be executed upon receiving noti- **
|
||||
** fication that NAS signalling connection has been released **
|
||||
** fication that NAS signalling connection has been released **
|
||||
** **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** Inputs: None **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: RETURNok, RETURNerror **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
int emm_proc_lowerlayer_release(void)
|
||||
@@ -403,8 +403,8 @@ int emm_proc_lowerlayer_release(void)
|
||||
lowerlayer_release_callback_t emm_callback = _lowerlayer_data.release;
|
||||
|
||||
if (emm_callback) {
|
||||
rc = (*emm_callback)(_lowerlayer_data.args);
|
||||
_lowerlayer_data.release = NULL;
|
||||
rc = (*emm_callback)(_lowerlayer_data.args);
|
||||
_lowerlayer_data.release = NULL;
|
||||
}
|
||||
|
||||
LOG_FUNC_RETURN (rc);
|
||||
@@ -413,60 +413,59 @@ int emm_proc_lowerlayer_release(void)
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: emm_as_set_security_data() **
|
||||
** Name: emm_as_set_security_data() **
|
||||
** **
|
||||
** Description: Setup security data according to the given EPS security **
|
||||
** context when data transfer to lower layers is requested **
|
||||
** context when data transfer to lower layers is requested **
|
||||
** **
|
||||
** Inputs: args: EPS security context currently in use **
|
||||
** is_new: Indicates whether a new security context **
|
||||
** has just been taken into use **
|
||||
** is_ciphered: Indicates whether the NAS message has to **
|
||||
** be sent ciphered **
|
||||
** Others: None **
|
||||
** Inputs: args: EPS security context currently in use **
|
||||
** is_new: Indicates whether a new security context **
|
||||
** has just been taken into use **
|
||||
** is_ciphered: Indicates whether the NAS message has to **
|
||||
** be sent ciphered **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: data: EPS NAS security data to be setup **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** Outputs: data: EPS NAS security data to be setup **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
void emm_as_set_security_data(emm_as_security_data_t* data, const void* args,
|
||||
int is_new, int is_ciphered)
|
||||
void emm_as_set_security_data(emm_as_security_data_t *data, const void *args,
|
||||
int is_new, int is_ciphered)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
const emm_security_context_t* context = (emm_security_context_t*)(args);
|
||||
const emm_security_context_t *context = (emm_security_context_t *)(args);
|
||||
|
||||
memset(data, 0, sizeof(emm_as_security_data_t));
|
||||
|
||||
if ( context && (context->type != EMM_KSI_NOT_AVAILABLE) ) {
|
||||
/* 3GPP TS 24.301, sections 5.4.3.3 and 5.4.3.4
|
||||
* Once a valid EPS security context exists and has been taken
|
||||
* into use, UE and MME shall cipher and integrity protect all
|
||||
* NAS signalling messages with the selected NAS ciphering and
|
||||
* NAS integrity algorithms */
|
||||
data->is_new = is_new;
|
||||
data->ksi = context->eksi;
|
||||
data->sqn = context->ul_count.seq_num;
|
||||
data->count = *(UInt32_t*)(&context->ul_count);
|
||||
/* NAS integrity and cyphering keys may not be available if the
|
||||
* current security context is a partial EPS security context
|
||||
* and not a full native EPS security context */
|
||||
data->k_int = &context->knas_int;
|
||||
if (is_ciphered) {
|
||||
/* 3GPP TS 24.301, sections 4.4.5
|
||||
* When the UE establishes a new NAS signalling connection,
|
||||
* it shall send initial NAS messages integrity protected
|
||||
* and unciphered */
|
||||
/* 3GPP TS 24.301, section 5.4.3.2
|
||||
* The MME shall send the SECURITY MODE COMMAND message integrity
|
||||
* protected and unciphered */
|
||||
data->k_enc = &context->knas_enc;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* No valid EPS security context exists */
|
||||
data->ksi = EMM_AS_NO_KEY_AVAILABLE;
|
||||
/* 3GPP TS 24.301, sections 5.4.3.3 and 5.4.3.4
|
||||
* Once a valid EPS security context exists and has been taken
|
||||
* into use, UE and MME shall cipher and integrity protect all
|
||||
* NAS signalling messages with the selected NAS ciphering and
|
||||
* NAS integrity algorithms */
|
||||
data->is_new = is_new;
|
||||
data->ksi = context->eksi;
|
||||
data->sqn = context->ul_count.seq_num;
|
||||
data->count = *(UInt32_t *)(&context->ul_count);
|
||||
/* NAS integrity and cyphering keys may not be available if the
|
||||
* current security context is a partial EPS security context
|
||||
* and not a full native EPS security context */
|
||||
data->k_int = &context->knas_int;
|
||||
if (is_ciphered) {
|
||||
/* 3GPP TS 24.301, sections 4.4.5
|
||||
* When the UE establishes a new NAS signalling connection,
|
||||
* it shall send initial NAS messages integrity protected
|
||||
* and unciphered */
|
||||
/* 3GPP TS 24.301, section 5.4.3.2
|
||||
* The MME shall send the SECURITY MODE COMMAND message integrity
|
||||
* protected and unciphered */
|
||||
data->k_enc = &context->knas_enc;
|
||||
}
|
||||
} else {
|
||||
/* No valid EPS security context exists */
|
||||
data->ksi = EMM_AS_NO_KEY_AVAILABLE;
|
||||
}
|
||||
|
||||
LOG_FUNC_OUT;
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source lowerlayer.h
|
||||
Source lowerlayer.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/06/19
|
||||
Date 2013/06/19
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines EMM procedures executed by the Non-Access Stratum
|
||||
upon receiving notifications from lower layers so that data
|
||||
transfer succeed or failed, or NAS signalling connection is
|
||||
released, or ESM unit data has been received from under layer,
|
||||
and to request ESM unit data transfer to under layer.
|
||||
Description Defines EMM procedures executed by the Non-Access Stratum
|
||||
upon receiving notifications from lower layers so that data
|
||||
transfer succeed or failed, or NAS signalling connection is
|
||||
released, or ESM unit data has been received from under layer,
|
||||
and to request ESM unit data transfer to under layer.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __LOWERLAYER_H__
|
||||
@@ -35,19 +35,19 @@ Description Defines EMM procedures executed by the Non-Access Stratum
|
||||
* Type of EMM procedure callback function executed whenever data are
|
||||
* successfully delivered to the network
|
||||
*/
|
||||
typedef int (*lowerlayer_success_callback_t)(void*);
|
||||
typedef int (*lowerlayer_success_callback_t)(void *);
|
||||
|
||||
/*
|
||||
* Type of EMM procedure callback function executed when data are not
|
||||
* delivered to the network because a lower layer failure occurred
|
||||
*/
|
||||
typedef int (*lowerlayer_failure_callback_t)(int, void*);
|
||||
typedef int (*lowerlayer_failure_callback_t)(int, void *);
|
||||
|
||||
/*
|
||||
* Type of EMM procedure callback function executed when NAS signalling
|
||||
* connection is released
|
||||
*/
|
||||
typedef int (*lowerlayer_release_callback_t)(void*);
|
||||
typedef int (*lowerlayer_release_callback_t)(void *);
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -67,7 +67,7 @@ int lowerlayer_failure(unsigned int ueid);
|
||||
int lowerlayer_establish(void);
|
||||
int lowerlayer_release(int cause);
|
||||
|
||||
int lowerlayer_data_ind(unsigned int ueid, const OctetString* data);
|
||||
int lowerlayer_data_req(unsigned int ueid, const OctetString* data);
|
||||
int lowerlayer_data_ind(unsigned int ueid, const OctetString *data);
|
||||
int lowerlayer_data_req(unsigned int ueid, const OctetString *data);
|
||||
|
||||
#endif /* __LOWERLAYER_H__*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,30 +1,30 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source ServiceRequest.c
|
||||
Source ServiceRequest.c
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/05/07
|
||||
Date 2013/05/07
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the service request EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
Description Defines the service request EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
|
||||
The purpose of the service request procedure is to transfer
|
||||
the EMM mode from EMM-IDLE to EMM-CONNECTED mode and establish
|
||||
the radio and S1 bearers when uplink user data or signalling
|
||||
is to be sent.
|
||||
The purpose of the service request procedure is to transfer
|
||||
the EMM mode from EMM-IDLE to EMM-CONNECTED mode and establish
|
||||
the radio and S1 bearers when uplink user data or signalling
|
||||
is to be sent.
|
||||
|
||||
This procedure is used when the network has downlink signalling
|
||||
pending, the UE has uplink signalling pending, the UE or the
|
||||
network has user data pending and the UE is in EMM-IDLE mode.
|
||||
This procedure is used when the network has downlink signalling
|
||||
pending, the UE has uplink signalling pending, the UE or the
|
||||
network has user data pending and the UE is in EMM-IDLE mode.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -46,19 +46,19 @@ Description Defines the service request EMM procedure executed by the
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Internal data handled by the service request procedure in the UE
|
||||
* Internal data handled by the service request procedure in the UE
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
/*
|
||||
* Timer handlers
|
||||
*/
|
||||
void* _emm_service_t3417_handler(void*);
|
||||
void *_emm_service_t3417_handler(void *);
|
||||
#endif // NAS_UE
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Internal data handled by the service request procedure in the MME
|
||||
* Internal data handled by the service request procedure in the MME
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_MME
|
||||
@@ -75,27 +75,27 @@ void* _emm_service_t3417_handler(void*);
|
||||
#ifdef NAS_UE
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Timer handlers
|
||||
* Timer handlers
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: _emm_service_t3417_handler() **
|
||||
** Name: _emm_service_t3417_handler() **
|
||||
** **
|
||||
** Description: T3417 timeout handler **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.6.1.6 case c **
|
||||
** **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
void* _emm_service_t3417_handler(void* args)
|
||||
void *_emm_service_t3417_handler(void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source TrackingAreaUpdate.c
|
||||
Source TrackingAreaUpdate.c
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2013/05/07
|
||||
Date 2013/05/07
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the tracking area update EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
Description Defines the tracking area update EMM procedure executed by the
|
||||
Non-Access Stratum.
|
||||
|
||||
The tracking area updating procedure is always initiated by the
|
||||
UE and is used to update the registration of the actual tracking
|
||||
area of a UE in the network, to periodically notify the availa-
|
||||
bility of the UE to the network, for MME load balancing, to up-
|
||||
date certain UE specific parameters in the network.
|
||||
The tracking area updating procedure is always initiated by the
|
||||
UE and is used to update the registration of the actual tracking
|
||||
area of a UE in the network, to periodically notify the availa-
|
||||
bility of the UE to the network, for MME load balancing, to up-
|
||||
date certain UE specific parameters in the network.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -50,7 +50,7 @@ Description Defines the tracking area update EMM procedure executed by the
|
||||
/*
|
||||
* Timer handlers
|
||||
*/
|
||||
void* _emm_tau_t3430_handler(void*);
|
||||
void *_emm_tau_t3430_handler(void *);
|
||||
#endif // NAS_UE
|
||||
|
||||
/*
|
||||
@@ -72,27 +72,27 @@ void* _emm_tau_t3430_handler(void*);
|
||||
#ifdef NAS_UE
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Timer handlers
|
||||
* Timer handlers
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
** **
|
||||
** Name: _emm_tau_t3430_handler() **
|
||||
** Name: _emm_tau_t3430_handler() **
|
||||
** **
|
||||
** Description: T3430 timeout handler **
|
||||
** **
|
||||
** 3GPP TS 24.301, section 5.5.3.2.6 case c **
|
||||
** **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** Inputs: args: handler parameters **
|
||||
** Others: None **
|
||||
** **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** Outputs: None **
|
||||
** Return: None **
|
||||
** Others: None **
|
||||
** **
|
||||
***************************************************************************/
|
||||
void* _emm_tau_t3430_handler(void* args)
|
||||
void *_emm_tau_t3430_handler(void *args)
|
||||
{
|
||||
LOG_FUNC_IN;
|
||||
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source emmData.h
|
||||
Source emmData.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2012/10/18
|
||||
Date 2012/10/18
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines internal private data handled by EPS Mobility
|
||||
Management sublayer.
|
||||
Description Defines internal private data handled by EPS Mobility
|
||||
Management sublayer.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __EMMDATA_H__
|
||||
@@ -45,37 +45,37 @@ Description Defines internal private data handled by EPS Mobility
|
||||
* 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"
|
||||
#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"
|
||||
#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
|
||||
#define EMM_DATA_PLMN_AUTO NET_PLMN_AUTO
|
||||
#define EMM_DATA_PLMN_MANUAL NET_PLMN_MANUAL
|
||||
|
||||
#endif // NAS_UE
|
||||
|
||||
/* Checks Mobile Country Code equality */
|
||||
#define MCCS_ARE_EQUAL(n1, n2) (((n1).MCCdigit1 == (n2).MCCdigit1) && \
|
||||
((n1).MCCdigit2 == (n2).MCCdigit2) && \
|
||||
((n1).MCCdigit3 == (n2).MCCdigit3))
|
||||
#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))
|
||||
#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))))
|
||||
#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))
|
||||
#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 ************************/
|
||||
@@ -96,21 +96,21 @@ typedef enum {
|
||||
|
||||
/* EPS NAS security context structure */
|
||||
typedef struct {
|
||||
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 */
|
||||
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 */
|
||||
struct {
|
||||
UInt32_t spare:8;
|
||||
UInt32_t overflow:16;
|
||||
UInt32_t seq_num:8;
|
||||
} dl_count, ul_count; /* Downlink and uplink count parameters */
|
||||
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 encryption:4; /* algorithm used for ciphering */
|
||||
UInt8_t integrity:4; /* algorithm used for integrity protection */
|
||||
} capability; /* UE network capability */
|
||||
UInt8_t encryption:4; /* algorithm used for ciphering */
|
||||
UInt8_t integrity:4; /* algorithm used for integrity protection */
|
||||
} capability; /* UE network capability */
|
||||
} emm_security_context_t;
|
||||
|
||||
/*
|
||||
@@ -129,11 +129,11 @@ typedef struct {
|
||||
*
|
||||
* 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.
|
||||
* 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).
|
||||
* was correctly performed, but the answer from the MME was negative
|
||||
* (because of roaming or subscription restrictions).
|
||||
*/
|
||||
typedef enum {
|
||||
EU1_UPDATED,
|
||||
@@ -144,10 +144,10 @@ typedef enum {
|
||||
/*
|
||||
* EPS Connection Management states
|
||||
* --------------------------------
|
||||
* ECM-IDLE: No NAS signalling connection between UE and network exists.
|
||||
* No UE context exists in the network.
|
||||
* 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).
|
||||
* and the MME (RRC connection and S1_MME connection).
|
||||
*/
|
||||
typedef enum {
|
||||
ECM_IDLE,
|
||||
@@ -171,9 +171,9 @@ typedef enum {
|
||||
*/
|
||||
typedef struct {
|
||||
imsi_t imsi;
|
||||
plmn_t rplmn; /* The registered PLMN */
|
||||
/* List of equivalent PLMNs */
|
||||
#define EMM_DATA_EPLMN_MAX 16
|
||||
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;
|
||||
|
||||
@@ -182,17 +182,17 @@ typedef struct {
|
||||
* -------------------------
|
||||
*/
|
||||
typedef struct {
|
||||
int usim_is_valid; /* Indication of USIM data validity */
|
||||
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 */
|
||||
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 */
|
||||
int is_attached; /* Network attachment indicator */
|
||||
int is_emergency; /* Emergency bearer services indicator */
|
||||
emm_eps_update_t status; /* The current EPS update status */
|
||||
emm_ecm_state_t ecm_status; /* The EPS Connection Management status */
|
||||
int is_attached; /* Network attachment indicator */
|
||||
int 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
|
||||
@@ -200,84 +200,84 @@ typedef struct {
|
||||
* 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
|
||||
#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 */
|
||||
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 */
|
||||
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];
|
||||
#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_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
|
||||
/* 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
|
||||
/* 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
|
||||
/* 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
|
||||
/* 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
|
||||
/* 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;
|
||||
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
|
||||
/* 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
|
||||
/* 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;
|
||||
|
||||
/*
|
||||
@@ -302,8 +302,8 @@ typedef struct {
|
||||
* EPS NAS security context
|
||||
* ------------------------
|
||||
*/
|
||||
emm_security_context_t* security; /* current security context */
|
||||
emm_security_context_t* non_current; /* non-current security context */
|
||||
emm_security_context_t *security; /* current security context */
|
||||
emm_security_context_t *non_current; /* non-current security context */
|
||||
|
||||
} emm_data_t;
|
||||
|
||||
@@ -320,28 +320,28 @@ typedef struct {
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
typedef struct emm_data_context_s {
|
||||
unsigned int ueid; /* UE identifier */
|
||||
int is_dynamic; /* Dynamically allocated context indicator */
|
||||
int is_attached; /* Attachment indicator */
|
||||
int is_emergency; /* Emergency bearer services indicator */
|
||||
unsigned int ueid; /* UE identifier */
|
||||
int is_dynamic; /* Dynamically allocated context indicator */
|
||||
int is_attached; /* Attachment indicator */
|
||||
int is_emergency; /* Emergency bearer services indicator */
|
||||
|
||||
imsi_t* imsi; /* The IMSI provided by the UE or the MME */
|
||||
imei_t* imei; /* The IMEI provided by the UE */
|
||||
int guti_is_new; /* New GUTI indicator */
|
||||
GUTI_t* guti; /* The GUTI assigned to the UE */
|
||||
GUTI_t* old_guti; /* The old GUTI */
|
||||
int n_tacs; /* Number of concecutive tracking areas the UE is
|
||||
* registered to */
|
||||
tac_t tac; /* Code of the first tracking area the UE is
|
||||
* registered to */
|
||||
imsi_t *imsi; /* The IMSI provided by the UE or the MME */
|
||||
imei_t *imei; /* The IMEI provided by the UE */
|
||||
int guti_is_new; /* New GUTI indicator */
|
||||
GUTI_t *guti; /* The GUTI assigned to the UE */
|
||||
GUTI_t *old_guti; /* The old GUTI */
|
||||
int n_tacs; /* Number of concecutive tracking areas the UE is
|
||||
* registered to */
|
||||
tac_t tac; /* Code of the first tracking area the UE is
|
||||
* registered to */
|
||||
|
||||
int ksi; /* Security key set identifier provided by the UE */
|
||||
int eea; /* EPS encryption algorithms supported by the UE */
|
||||
int eia; /* EPS integrity algorithms supported by the UE */
|
||||
auth_vector_t vector; /* EPS authentication vector */
|
||||
emm_security_context_t* security; /* Current EPS NAS security context */
|
||||
int ksi; /* Security key set identifier provided by the UE */
|
||||
int eea; /* EPS encryption algorithms supported by the UE */
|
||||
int eia; /* EPS integrity algorithms supported by the UE */
|
||||
auth_vector_t vector; /* EPS authentication vector */
|
||||
emm_security_context_t *security; /* Current EPS NAS security context */
|
||||
OctetString esm_msg; /* ESM message contained within the initial request */
|
||||
int emm_cause; /* EMM failure cause code */
|
||||
int emm_cause; /* EMM failure cause code */
|
||||
|
||||
emm_fsm_state_t _emm_fsm_status;
|
||||
|
||||
@@ -368,15 +368,15 @@ typedef struct {
|
||||
/* Use a tree for ue data context within MME */
|
||||
RB_HEAD(emm_data_context_map, emm_data_context_s) ctx_map;
|
||||
# else
|
||||
# define EMM_DATA_NB_UE_MAX (MME_API_NB_UE_MAX + 1)
|
||||
emm_data_context_t* ctx [EMM_DATA_NB_UE_MAX];
|
||||
# define EMM_DATA_NB_UE_MAX (MME_API_NB_UE_MAX + 1)
|
||||
emm_data_context_t *ctx [EMM_DATA_NB_UE_MAX];
|
||||
# endif
|
||||
} emm_data_t;
|
||||
|
||||
struct emm_data_context_s *emm_data_context_get(
|
||||
emm_data_t *_emm_data, unsigned int _ueid);
|
||||
|
||||
struct emm_data_context_s * emm_data_context_remove(
|
||||
struct emm_data_context_s *emm_data_context_remove(
|
||||
emm_data_t *_emm_data, struct emm_data_context_s *elm);
|
||||
|
||||
void emm_data_context_add(emm_data_t *emm_data, struct emm_data_context_s *elm);
|
||||
@@ -389,58 +389,58 @@ void emm_data_context_add(emm_data_t *emm_data, struct emm_data_context_s *elm);
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* EPS mobility management data (used within EMM only)
|
||||
* EPS mobility management data (used within EMM only)
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
emm_data_t _emm_data;
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* EPS mobility management timers – UE side
|
||||
* EPS mobility management timers – UE side
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
#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 */
|
||||
#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 */
|
||||
|
||||
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 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 */
|
||||
struct nas_timer_t T3423; /* E-UTRAN deactivate ISR timer */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* EPS mobility management timers – Network side
|
||||
* EPS mobility management timers – Network side
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_MME
|
||||
#define T3450_DEFAULT_VALUE 6 /* 6 seconds */
|
||||
#define T3460_DEFAULT_VALUE 6 /* 6 seconds */
|
||||
#define T3470_DEFAULT_VALUE 6 /* 6 seconds */
|
||||
#define T3450_DEFAULT_VALUE 6 /* 6 seconds */
|
||||
#define T3460_DEFAULT_VALUE 6 /* 6 seconds */
|
||||
#define T3470_DEFAULT_VALUE 6 /* 6 seconds */
|
||||
|
||||
struct nas_timer_t T3450; /* EMM message retransmission timer */
|
||||
struct nas_timer_t T3460; /* Authentication timer */
|
||||
struct nas_timer_t T3470; /* Identification timer */
|
||||
struct nas_timer_t T3450; /* EMM message retransmission timer */
|
||||
struct nas_timer_t T3460; /* Authentication timer */
|
||||
struct nas_timer_t T3470; /* Identification timer */
|
||||
|
||||
/*
|
||||
* mobile reachable timer
|
||||
|
||||
@@ -45,7 +45,7 @@ struct emm_data_context_s *emm_data_context_get(
|
||||
return RB_FIND(emm_data_context_map, &emm_data->ctx_map, &reference);
|
||||
}
|
||||
|
||||
struct emm_data_context_s * emm_data_context_remove(
|
||||
struct emm_data_context_s *emm_data_context_remove(
|
||||
emm_data_t *emm_data, struct emm_data_context_s *elm)
|
||||
{
|
||||
return RB_REMOVE(emm_data_context_map, &emm_data->ctx_map, elm);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,21 +1,21 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source emm_main.h
|
||||
Source emm_main.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2012/10/10
|
||||
Date 2012/10/10
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the EPS Mobility Management procedure call manager,
|
||||
the main entry point for elementary EMM processing.
|
||||
Description Defines the EPS Mobility Management procedure call manager,
|
||||
the main entry point for elementary EMM processing.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __EMM_MAIN_H__
|
||||
@@ -41,7 +41,7 @@ Description Defines the EPS Mobility Management procedure call manager,
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef NAS_UE
|
||||
void emm_main_initialize(emm_indication_callback_t cb, const char* imei);
|
||||
void emm_main_initialize(emm_indication_callback_t cb, const char *imei);
|
||||
#endif
|
||||
#ifdef NAS_MME
|
||||
void emm_main_initialize(void);
|
||||
@@ -51,24 +51,24 @@ void emm_main_cleanup(void);
|
||||
#ifdef NAS_UE
|
||||
|
||||
/* User's getter of UE's identity */
|
||||
const imsi_t* emm_main_get_imsi(void);
|
||||
const imsi_t *emm_main_get_imsi(void);
|
||||
|
||||
/* User's getter of the subscriber dialing number */
|
||||
const msisdn_t* emm_main_get_msisdn(void);
|
||||
const msisdn_t *emm_main_get_msisdn(void);
|
||||
|
||||
/* User's getter/setter for network selection */
|
||||
int emm_main_set_plmn_selection_mode(int mode, int format,
|
||||
const network_plmn_t* plmn, int rat);
|
||||
const network_plmn_t *plmn, int rat);
|
||||
int emm_main_get_plmn_selection_mode(void);
|
||||
int emm_main_get_plmn_list(const char** plist);
|
||||
const char* emm_main_get_selected_plmn(network_plmn_t* plmn, int format);
|
||||
int emm_main_get_plmn_list(const char **plist);
|
||||
const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format);
|
||||
|
||||
/* User's getter for network registration */
|
||||
Stat_t emm_main_get_plmn_status(void);
|
||||
tac_t emm_main_get_plmn_tac(void);
|
||||
ci_t emm_main_get_plmn_ci(void);
|
||||
AcT_t emm_main_get_plmn_rat(void);
|
||||
const char* emm_main_get_registered_plmn(network_plmn_t* plmn, int format);
|
||||
const char *emm_main_get_registered_plmn(network_plmn_t *plmn, int format);
|
||||
|
||||
/* User's getter for network attachment */
|
||||
int emm_main_is_attached(void);
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
/*****************************************************************************
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
Eurecom OpenAirInterface 3
|
||||
Copyright(c) 2012 Eurecom
|
||||
|
||||
Source emm_proc.h
|
||||
Source emm_proc.h
|
||||
|
||||
Version 0.1
|
||||
Version 0.1
|
||||
|
||||
Date 2012/10/16
|
||||
Date 2012/10/16
|
||||
|
||||
Product NAS stack
|
||||
Product NAS stack
|
||||
|
||||
Subsystem EPS Mobility Management
|
||||
Subsystem EPS Mobility Management
|
||||
|
||||
Author Frederic Maurel
|
||||
Author Frederic Maurel
|
||||
|
||||
Description Defines the EPS Mobility Management procedures executed at
|
||||
the EMM Service Access Points.
|
||||
Description Defines the EPS Mobility Management procedures executed at
|
||||
the EMM Service Access Points.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef __EMM_PROC_H__
|
||||
@@ -78,7 +78,7 @@ typedef enum {
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
* EMM status procedure
|
||||
* EMM status procedure
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
int emm_proc_status_ind(unsigned int ueid, int emm_cause);
|
||||
@@ -86,14 +86,14 @@ int emm_proc_status(unsigned int ueid, int emm_cause);
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
* Lower layer procedure
|
||||
* Lower layer procedure
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
int emm_proc_lowerlayer_initialize(lowerlayer_success_callback_t success,
|
||||
lowerlayer_failure_callback_t failure,
|
||||
lowerlayer_release_callback_t release,
|
||||
void* args);
|
||||
lowerlayer_failure_callback_t failure,
|
||||
lowerlayer_release_callback_t release,
|
||||
void *args);
|
||||
int emm_proc_lowerlayer_success(void);
|
||||
int emm_proc_lowerlayer_failure(int is_initial);
|
||||
int emm_proc_lowerlayer_release(void);
|
||||
@@ -101,7 +101,7 @@ int emm_proc_lowerlayer_release(void);
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
* UE's Idle mode procedure
|
||||
* UE's Idle mode procedure
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
@@ -112,17 +112,19 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat);
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Attach procedure
|
||||
* Attach procedure
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
int emm_proc_attach(emm_proc_attach_type_t type);
|
||||
int emm_proc_attach_request(void* args);
|
||||
int emm_proc_attach_accept(long T3412, long T3402, long T3423, int n_tais, tai_t* tai, GUTI_t* guti, int n_eplmns, plmn_t* eplmn, const OctetString* esm_msg);
|
||||
int emm_proc_attach_reject(int emm_cause, const OctetString* esm_msg);
|
||||
int emm_proc_attach_complete(void* args);
|
||||
int emm_proc_attach_failure(int is_initial, void* args);
|
||||
int emm_proc_attach_release(void* args);
|
||||
int emm_proc_attach_request(void *args);
|
||||
int emm_proc_attach_accept(long T3412, long T3402, long T3423, int n_tais,
|
||||
tai_t *tai, GUTI_t *guti, int n_eplmns, plmn_t *eplmn,
|
||||
const OctetString *esm_msg);
|
||||
int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg);
|
||||
int emm_proc_attach_complete(void *args);
|
||||
int emm_proc_attach_failure(int is_initial, void *args);
|
||||
int emm_proc_attach_release(void *args);
|
||||
int emm_proc_attach_restart(void);
|
||||
|
||||
int emm_proc_attach_set_emergency(void);
|
||||
@@ -130,32 +132,36 @@ int emm_proc_attach_set_detach(void);
|
||||
#endif
|
||||
|
||||
#ifdef NAS_MME
|
||||
int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type, int native_ksi, int ksi, int native_guti, GUTI_t* guti, imsi_t* imsi, imei_t* imei, tai_t* tai, int eea, int eia, const OctetString* esm_msg);
|
||||
int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
|
||||
int native_ksi, int ksi, int native_guti, GUTI_t *guti, imsi_t *imsi,
|
||||
imei_t *imei, tai_t *tai, int eea, int eia, const OctetString *esm_msg);
|
||||
int emm_proc_attach_reject(unsigned int ueid, int emm_cause);
|
||||
int emm_proc_attach_complete(unsigned int ueid, const OctetString* esm_msg);
|
||||
int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Detach procedure
|
||||
* Detach procedure
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
int emm_proc_detach(emm_proc_detach_type_t type, int switch_off);
|
||||
int emm_proc_detach_request(void* args);
|
||||
int emm_proc_detach_request(void *args);
|
||||
int emm_proc_detach_accept(void);
|
||||
int emm_proc_detach_failure(int is_initial, void* args);
|
||||
int emm_proc_detach_release(void* args);
|
||||
int emm_proc_detach_failure(int is_initial, void *args);
|
||||
int emm_proc_detach_release(void *args);
|
||||
#endif
|
||||
|
||||
#ifdef NAS_MME
|
||||
int emm_proc_detach(unsigned int ueid, emm_proc_detach_type_t type);
|
||||
int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type, int switch_off, int native_ksi, int ksi, GUTI_t* guti, imsi_t* imsi, imei_t* imei);
|
||||
int emm_proc_detach_request(unsigned int ueid, emm_proc_detach_type_t type,
|
||||
int switch_off, int native_ksi, int ksi, GUTI_t *guti, imsi_t *imsi,
|
||||
imei_t *imei);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Identification procedure
|
||||
* Identification procedure
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
@@ -169,50 +175,54 @@ int emm_proc_identification(unsigned int ueid,
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure);
|
||||
int emm_proc_identification_complete(unsigned int ueid, const imsi_t* imsi, const imei_t* imei, UInt32_t* tmsi);
|
||||
int emm_proc_identification_complete(unsigned int ueid, const imsi_t *imsi,
|
||||
const imei_t *imei, UInt32_t *tmsi);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Authentication procedure
|
||||
* Authentication procedure
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
int emm_proc_authentication_request(int native_ksi, int ksi, const OctetString* rand, const OctetString* autn);
|
||||
int emm_proc_authentication_request(int native_ksi, int ksi,
|
||||
const OctetString *rand, const OctetString *autn);
|
||||
int emm_proc_authentication_reject(void);
|
||||
int emm_proc_authentication_delete(void);
|
||||
#endif
|
||||
|
||||
#ifdef NAS_MME
|
||||
int emm_proc_authentication(unsigned int ueid, int ksi,
|
||||
const OctetString* rand, const OctetString* autn,
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure);
|
||||
int emm_proc_authentication_complete(unsigned int ueid, int emm_cause, const OctetString* res);
|
||||
const OctetString *rand, const OctetString *autn,
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure);
|
||||
int emm_proc_authentication_complete(unsigned int ueid, int emm_cause,
|
||||
const OctetString *res);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------------
|
||||
* Security mode control procedure
|
||||
* Security mode control procedure
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
int emm_proc_security_mode_command(int native_ksi, int ksi, int seea, int seia, int reea, int reia);
|
||||
int emm_proc_security_mode_command(int native_ksi, int ksi, int seea, int seia,
|
||||
int reea, int reia);
|
||||
#endif
|
||||
|
||||
#ifdef NAS_MME
|
||||
int emm_proc_security_mode_control(unsigned int ueid, int ksi, int eea, int eia,
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure);
|
||||
emm_common_success_callback_t success,
|
||||
emm_common_reject_callback_t reject,
|
||||
emm_common_failure_callback_t failure);
|
||||
int emm_proc_security_mode_complete(unsigned int ueid);
|
||||
int emm_proc_security_mode_reject(unsigned int ueid);
|
||||
#endif
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
* Network indication handlers
|
||||
* Network indication handlers
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef NAS_UE
|
||||
|
||||
Reference in New Issue
Block a user