Commit 2d5d6107 authored by Cedric Roux's avatar Cedric Roux

- Work in progress

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4589 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 167455d2
...@@ -11,11 +11,14 @@ MESSAGE_DEF(NAS_NON_DELIVERY_IND, MESSAGE_PRIORITY_MED, nas_non_del_ ...@@ -11,11 +11,14 @@ MESSAGE_DEF(NAS_NON_DELIVERY_IND, MESSAGE_PRIORITY_MED, nas_non_del_
MESSAGE_DEF(NAS_RAB_ESTABLISHMENT_REQ, MESSAGE_PRIORITY_MED, nas_rab_est_req_t, nas_rab_est_req) MESSAGE_DEF(NAS_RAB_ESTABLISHMENT_REQ, MESSAGE_PRIORITY_MED, nas_rab_est_req_t, nas_rab_est_req)
MESSAGE_DEF(NAS_RAB_ESTABLISHMENT_RESP, MESSAGE_PRIORITY_MED, nas_rab_est_rsp_t, nas_rab_est_rsp) MESSAGE_DEF(NAS_RAB_ESTABLISHMENT_RESP, MESSAGE_PRIORITY_MED, nas_rab_est_rsp_t, nas_rab_est_rsp)
MESSAGE_DEF(NAS_RAB_RELEASE_REQ, MESSAGE_PRIORITY_MED, nas_rab_rel_req_t, nas_rab_rel_req) MESSAGE_DEF(NAS_RAB_RELEASE_REQ, MESSAGE_PRIORITY_MED, nas_rab_rel_req_t, nas_rab_rel_req)
/* NAS layer -> MME app messages */
MESSAGE_DEF(NAS_AUTHENTICATION_REQ, MESSAGE_PRIORITY_MED, nas_auth_req_t, nas_auth_req) MESSAGE_DEF(NAS_AUTHENTICATION_REQ, MESSAGE_PRIORITY_MED, nas_auth_req_t, nas_auth_req)
MESSAGE_DEF(NAS_AUTHENTICATION_RESP, MESSAGE_PRIORITY_MED, nas_auth_resp_t, nas_auth_resp) MESSAGE_DEF(NAS_AUTHENTICATION_PARAM_REQ, MESSAGE_PRIORITY_MED, nas_auth_param_req_t, nas_auth_param_req)
/* MME app -> NAS layer messages */ /* MME app -> NAS layer messages */
MESSAGE_DEF(NAS_BEARER_PARAM, MESSAGE_PRIORITY_MED, nas_bearer_param_t, nas_bearer_param) MESSAGE_DEF(NAS_BEARER_PARAM, MESSAGE_PRIORITY_MED, nas_bearer_param_t, nas_bearer_param)
MESSAGE_DEF(NAS_AUTHENTICATION_RESP, MESSAGE_PRIORITY_MED, nas_auth_resp_t, nas_auth_resp)
#if defined(DISABLE_USE_NAS) #if defined(DISABLE_USE_NAS)
MESSAGE_DEF(NAS_ATTACH_REQ, MESSAGE_PRIORITY_MED, nas_attach_req_t, nas_attach_req) MESSAGE_DEF(NAS_ATTACH_REQ, MESSAGE_PRIORITY_MED, nas_attach_req_t, nas_attach_req)
......
...@@ -6,8 +6,11 @@ ...@@ -6,8 +6,11 @@
#define NAS_UL_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.nas_ul_data_ind #define NAS_UL_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.nas_ul_data_ind
#define NAS_DL_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_dl_data_req #define NAS_DL_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_dl_data_req
#define NAS_DL_DATA_CNF(mSGpTR) (mSGpTR)->ittiMsg.nas_dl_data_cnf #define NAS_DL_DATA_CNF(mSGpTR) (mSGpTR)->ittiMsg.nas_dl_data_cnf
#define NAS_CONN_EST_IND(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_est_ind
#define NAS_CONN_EST_CNF(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_est_cnf #define NAS_CONN_EST_CNF(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_est_cnf
#define NAS_BEARER_PARAM(mSGpTR) (mSGpTR)->ittiMsg.nas_bearer_param #define NAS_BEARER_PARAM(mSGpTR) (mSGpTR)->ittiMsg.nas_bearer_param
#define NAS_AUTHENTICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_auth_req
#define NAS_AUTHENTICATION_PARAM_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_auth_param_req
typedef struct { typedef struct {
...@@ -90,17 +93,28 @@ typedef struct { ...@@ -90,17 +93,28 @@ typedef struct {
} nas_attach_req_t; } nas_attach_req_t;
typedef struct { typedef struct {
/* UE imsi */
char imsi[16]; char imsi[16];
#define NAS_FAILURE_OK 0x0 #define NAS_FAILURE_OK 0x0
#define NAS_FAILURE_IND 0x1 #define NAS_FAILURE_IND 0x1
unsigned failure:1; unsigned failure:1;
int cause; int cause;
} nas_auth_req_t; } nas_auth_req_t;
typedef struct { typedef struct {
char imsi[16]; char imsi[16];
} nas_auth_resp_t; } nas_auth_resp_t;
typedef struct nas_auth_param_req_s {
uint8_t imsi_length;
char imsi[15];
uint8_t initial_req:1;
} nas_auth_param_req_t;
typedef struct nas_attach_accept_s {
} nas_attach_accept_t;
#endif /* NAS_MESSAGES_TYPES_H_ */ #endif /* NAS_MESSAGES_TYPES_H_ */
...@@ -45,11 +45,13 @@ Description Implements the API used by the NAS layer running in the MME ...@@ -45,11 +45,13 @@ Description Implements the API used by the NAS layer running in the MME
/* Default APN */ /* Default APN */
static const OctetString mme_api_default_apn = { static const OctetString mme_api_default_apn = {
14, (uint8_t*)("www.eurecom.fr")}; 14, (uint8_t *)("www.eurecom.fr")
};
/* APN configured for emergency bearer services */ /* APN configured for emergency bearer services */
static const OctetString mme_api_emergency_apn = { static const OctetString mme_api_emergency_apn = {
18, (uint8_t*)("www.eurecom_sos.fr")}; 18, (uint8_t *)("www.eurecom_sos.fr")
};
/* Public Land Mobile Network identifier */ /* Public Land Mobile Network identifier */
static const plmn_t mme_api_plmn = {0, 2, 0xf, 8, 0, 1}; // 20810 static const plmn_t mme_api_plmn = {0, 2, 0xf, 8, 0, 1}; // 20810
...@@ -147,8 +149,7 @@ static uint8_t _mme_api_ipv4v6_addr[MME_API_PDN_MAX][12] = { ...@@ -147,8 +149,7 @@ static uint8_t _mme_api_ipv4v6_addr[MME_API_PDN_MAX][12] = {
/* 192.168.12.189, FE80::221:70FF:C0A8:0CC3/64 */ /* 192.168.12.189, FE80::221:70FF:C0A8:0CC3/64 */
{0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC3}, {0xC0, 0xA8, 0x0C, 0xBD, 0x02, 0x21, 0x70, 0xFF, 0xC0, 0xA8, 0x0C, 0xC3},
}; };
static const OctetString _mme_api_pdn_addr[MME_API_ADDR_MAX][MME_API_PDN_MAX] = static const OctetString _mme_api_pdn_addr[MME_API_ADDR_MAX][MME_API_PDN_MAX] = {
{
{ /* IPv4 network capability */ { /* IPv4 network capability */
{4, _mme_api_ipv4_addr[0]}, {4, _mme_api_ipv4_addr[0]},
{4, _mme_api_ipv4_addr[1]}, {4, _mme_api_ipv4_addr[1]},
...@@ -223,9 +224,10 @@ static int _mme_api_pdn_id = 0; ...@@ -223,9 +224,10 @@ static int _mme_api_pdn_id = 0;
** ** ** **
***************************************************************************/ ***************************************************************************/
#if defined(EPC_BUILD) #if defined(EPC_BUILD)
int mme_api_get_emm_config(mme_api_emm_config_t* config, mme_config_t *mme_config_p) int mme_api_get_emm_config(mme_api_emm_config_t *config,
mme_config_t *mme_config_p)
#else #else
int mme_api_get_emm_config(mme_api_emm_config_t* config) int mme_api_get_emm_config(mme_api_emm_config_t *config)
#endif #endif
{ {
LOG_FUNC_IN; LOG_FUNC_IN;
...@@ -268,7 +270,7 @@ int mme_api_get_emm_config(mme_api_emm_config_t* config) ...@@ -268,7 +270,7 @@ int mme_api_get_emm_config(mme_api_emm_config_t* config)
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
int mme_api_get_esm_config(mme_api_esm_config_t* config) int mme_api_get_esm_config(mme_api_esm_config_t *config)
{ {
LOG_FUNC_IN; LOG_FUNC_IN;
...@@ -303,12 +305,12 @@ int mme_api_get_esm_config(mme_api_esm_config_t* config) ...@@ -303,12 +305,12 @@ int mme_api_get_esm_config(mme_api_esm_config_t* config)
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
int mme_api_identify_guti(const GUTI_t* guti, auth_vector_t* vector) int mme_api_identify_guti(const GUTI_t *guti, auth_vector_t *vector)
{ {
LOG_FUNC_IN;
int rc = RETURNerror; int rc = RETURNerror;
LOG_FUNC_IN;
LOG_FUNC_RETURN(rc); LOG_FUNC_RETURN(rc);
} }
...@@ -330,12 +332,12 @@ int mme_api_identify_guti(const GUTI_t* guti, auth_vector_t* vector) ...@@ -330,12 +332,12 @@ int mme_api_identify_guti(const GUTI_t* guti, auth_vector_t* vector)
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
int mme_api_identify_imsi(const imsi_t* imsi, auth_vector_t* vector) int mme_api_identify_imsi(const imsi_t *imsi, auth_vector_t *vector)
{ {
LOG_FUNC_IN;
int rc = RETURNok; int rc = RETURNok;
LOG_FUNC_IN;
memcpy(vector->rand, _mme_api_rand, AUTH_RAND_SIZE); memcpy(vector->rand, _mme_api_rand, AUTH_RAND_SIZE);
memcpy(vector->autn, _mme_api_autn, AUTH_AUTN_SIZE); memcpy(vector->autn, _mme_api_autn, AUTH_AUTN_SIZE);
memcpy(vector->xres, _mme_api_xres, AUTH_XRES_SIZE); memcpy(vector->xres, _mme_api_xres, AUTH_XRES_SIZE);
...@@ -361,12 +363,12 @@ int mme_api_identify_imsi(const imsi_t* imsi, auth_vector_t* vector) ...@@ -361,12 +363,12 @@ int mme_api_identify_imsi(const imsi_t* imsi, auth_vector_t* vector)
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
int mme_api_identify_imei(const imei_t* imei, auth_vector_t* vector) int mme_api_identify_imei(const imei_t *imei, auth_vector_t *vector)
{ {
LOG_FUNC_IN;
int rc = RETURNerror; int rc = RETURNerror;
LOG_FUNC_IN;
LOG_FUNC_RETURN(rc); LOG_FUNC_RETURN(rc);
} }
...@@ -392,14 +394,14 @@ int mme_api_identify_imei(const imei_t* imei, auth_vector_t* vector) ...@@ -392,14 +394,14 @@ int mme_api_identify_imei(const imei_t* imei, auth_vector_t* vector)
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
int mme_api_new_guti(const imsi_t* imsi, GUTI_t* guti, tac_t* tac, int* n_tacs) int mme_api_new_guti(const imsi_t *imsi, GUTI_t *guti, tac_t *tac, int *n_tacs)
{ {
LOG_FUNC_IN;
int rc = RETURNok; int rc = RETURNok;
static unsigned int tmsi = 1; static unsigned int tmsi = 1;
LOG_FUNC_IN;
guti->gummei.plmn = mme_api_plmn; guti->gummei.plmn = mme_api_plmn;
guti->gummei.MMEgid = MME_API_MME_GID; guti->gummei.MMEgid = MME_API_MME_GID;
guti->gummei.MMEcode = MME_API_MME_CODE; guti->gummei.MMEcode = MME_API_MME_CODE;
...@@ -437,13 +439,13 @@ int mme_api_new_guti(const imsi_t* imsi, GUTI_t* guti, tac_t* tac, int* n_tacs) ...@@ -437,13 +439,13 @@ int mme_api_new_guti(const imsi_t* imsi, GUTI_t* guti, tac_t* tac, int* n_tacs)
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
int mme_api_subscribe(OctetString* apn, OctetString* pdn_addr, int mme_api_subscribe(OctetString *apn, OctetString *pdn_addr,
int is_emergency, mme_api_qos_t* qos) int is_emergency, mme_api_qos_t *qos)
{ {
LOG_FUNC_IN;
int rc = RETURNok; int rc = RETURNok;
LOG_FUNC_IN;
if ( apn && (apn->length == 0) ) { if ( apn && (apn->length == 0) ) {
/* PDN connectivity to default APN */ /* PDN connectivity to default APN */
if (is_emergency) { if (is_emergency) {
...@@ -500,7 +502,7 @@ int mme_api_subscribe(OctetString* apn, OctetString* pdn_addr, ...@@ -500,7 +502,7 @@ int mme_api_subscribe(OctetString* apn, OctetString* pdn_addr,
** Others: None ** ** Others: None **
** ** ** **
***************************************************************************/ ***************************************************************************/
int mme_api_unsubscribe(OctetString* apn) int mme_api_unsubscribe(OctetString *apn)
{ {
LOG_FUNC_IN; LOG_FUNC_IN;
......
...@@ -40,7 +40,7 @@ Description Implements the API used by the NAS layer running in the MME ...@@ -40,7 +40,7 @@ Description Implements the API used by the NAS layer running in the MME
#ifdef NAS_MME #ifdef NAS_MME
/* Features supported by the MME */ /* Features supported by the MME */
typedef enum { typedef enum mme_api_feature_s {
MME_API_NO_FEATURE_SUPPORTED = 0, MME_API_NO_FEATURE_SUPPORTED = 0,
MME_API_EMERGENCY_ATTACH = (1<<0), MME_API_EMERGENCY_ATTACH = (1<<0),
MME_API_UNAUTHENTICATED_IMSI = (1<<1), MME_API_UNAUTHENTICATED_IMSI = (1<<1),
...@@ -53,7 +53,7 @@ typedef enum { ...@@ -53,7 +53,7 @@ typedef enum {
* EPS Mobility Management configuration data * EPS Mobility Management configuration data
* ------------------------------------------ * ------------------------------------------
*/ */
typedef struct { typedef struct mme_api_emm_config_s {
mme_api_feature_t features; /* Supported features */ mme_api_feature_t features; /* Supported features */
gummei_t gummei; /* EPS Globally Unique MME Identity */ gummei_t gummei; /* EPS Globally Unique MME Identity */
} mme_api_emm_config_t; } mme_api_emm_config_t;
...@@ -62,7 +62,7 @@ typedef struct { ...@@ -62,7 +62,7 @@ typedef struct {
* EPS Session Management configuration data * EPS Session Management configuration data
* ----------------------------------------- * -----------------------------------------
*/ */
typedef struct { typedef struct mme_api_esm_config_s {
mme_api_feature_t features; /* Supported features */ mme_api_feature_t features; /* Supported features */
} mme_api_esm_config_t; } mme_api_esm_config_t;
...@@ -71,7 +71,7 @@ typedef struct { ...@@ -71,7 +71,7 @@ typedef struct {
/****************************************************************************/ /****************************************************************************/
/* EPS subscribed QoS profile */ /* EPS subscribed QoS profile */
typedef struct { typedef struct mme_api_qos_s {
#define MME_API_UPLINK 0 #define MME_API_UPLINK 0
#define MME_API_DOWNLINK 1 #define MME_API_DOWNLINK 1
#define MME_API_DIRECTION 2 #define MME_API_DIRECTION 2
...@@ -81,7 +81,7 @@ typedef struct { ...@@ -81,7 +81,7 @@ typedef struct {
} mme_api_qos_t; } mme_api_qos_t;
/* Traffic Flow Template */ /* Traffic Flow Template */
typedef struct { typedef struct mme_api_tft_s {
} mme_api_tft_t; } mme_api_tft_t;
/****************************************************************************/ /****************************************************************************/
...@@ -93,19 +93,21 @@ typedef struct { ...@@ -93,19 +93,21 @@ typedef struct {
/****************************************************************************/ /****************************************************************************/
#if defined(EPC_BUILD) #if defined(EPC_BUILD)
int mme_api_get_emm_config(mme_api_emm_config_t* config, mme_config_t *mme_config_p); int mme_api_get_emm_config(mme_api_emm_config_t *config,
mme_config_t *mme_config_p);
#else #else
int mme_api_get_emm_config(mme_api_emm_config_t* config); int mme_api_get_emm_config(mme_api_emm_config_t *config);
#endif #endif
int mme_api_get_esm_config(mme_api_esm_config_t* config); int mme_api_get_esm_config(mme_api_esm_config_t *config);
int mme_api_identify_guti(const GUTI_t* guti, auth_vector_t* vector); int mme_api_identify_guti(const GUTI_t *guti, auth_vector_t *vector);
int mme_api_identify_imsi(const imsi_t* imsi, auth_vector_t* vector); int mme_api_identify_imsi(const imsi_t *imsi, auth_vector_t *vector);
int mme_api_identify_imei(const imei_t* imei, auth_vector_t* vector); int mme_api_identify_imei(const imei_t *imei, auth_vector_t *vector);
int mme_api_new_guti(const imsi_t* imsi, GUTI_t* guti, tac_t* tac, int* n_tacs); int mme_api_new_guti(const imsi_t *imsi, GUTI_t *guti, tac_t *tac, int *n_tacs);
int mme_api_subscribe(OctetString* apn, OctetString* pdn_addr, int is_emergency, mme_api_qos_t* qos); int mme_api_subscribe(OctetString *apn, OctetString *pdn_addr,
int mme_api_unsubscribe(OctetString* apn); int is_emergency, mme_api_qos_t *qos);
int mme_api_unsubscribe(OctetString *apn);
#endif // NAS_MME #endif // NAS_MME
......
...@@ -47,6 +47,9 @@ Description Defines the attach related EMM procedure executed by the ...@@ -47,6 +47,9 @@ Description Defines the attach related EMM procedure executed by the
#ifdef NAS_MME #ifdef NAS_MME
#include "mme_api.h" #include "mme_api.h"
# if defined(EPC_BUILD)
# include "nas_itti_messaging.h"
# endif
#endif #endif
#include <string.h> // memcmp, memcpy #include <string.h> // memcmp, memcpy
...@@ -1835,6 +1838,10 @@ static int _emm_attach_identify(void *args) ...@@ -1835,6 +1838,10 @@ static int _emm_attach_identify(void *args)
emm_ctx->ueid, (emm_ctx->imsi)? "IMSI" : (emm_ctx->guti)? "GUTI" : emm_ctx->ueid, (emm_ctx->imsi)? "IMSI" : (emm_ctx->guti)? "GUTI" :
(emm_ctx->imei)? "IMEI" : "none"); (emm_ctx->imei)? "IMEI" : "none");
#if defined(EPC_BUILD)
nas_itti_auth_info_req(emm_ctx->imsi, 1);
#endif
/* /*
* UE's identification * UE's identification
* ------------------- * -------------------
......
...@@ -529,15 +529,15 @@ int emm_proc_authentication(unsigned int ueid, int ksi, ...@@ -529,15 +529,15 @@ int emm_proc_authentication(unsigned int ueid, int ksi,
emm_common_failure_callback_t failure) emm_common_failure_callback_t failure)
{ {
LOG_FUNC_IN;
int rc = RETURNerror; int rc = RETURNerror;
authentication_data_t *data;
LOG_FUNC_IN;
LOG_TRACE(INFO, "EMM-PROC - Initiate authentication KSI = %d", ksi); LOG_TRACE(INFO, "EMM-PROC - Initiate authentication KSI = %d", ksi);
/* Allocate parameters of the retransmission timer callback */ /* Allocate parameters of the retransmission timer callback */
authentication_data_t *data = data = (authentication_data_t *)malloc(sizeof(authentication_data_t));
(authentication_data_t *)malloc(sizeof(authentication_data_t));
if (data != NULL) { if (data != NULL) {
/* Setup ongoing EMM procedure callback functions */ /* Setup ongoing EMM procedure callback functions */
......
...@@ -320,6 +320,10 @@ typedef struct { ...@@ -320,6 +320,10 @@ typedef struct {
* --------------------------------------------------------------------------- * ---------------------------------------------------------------------------
*/ */
typedef struct emm_data_context_s { typedef struct emm_data_context_s {
#if defined(EPC_BUILD)
RB_ENTRY(emm_data_context_s) entries;
#endif
unsigned int ueid; /* UE identifier */ unsigned int ueid; /* UE identifier */
int is_dynamic; /* Dynamically allocated context indicator */ int is_dynamic; /* Dynamically allocated context indicator */
int is_attached; /* Attachment indicator */ int is_attached; /* Attachment indicator */
...@@ -344,10 +348,6 @@ typedef struct emm_data_context_s { ...@@ -344,10 +348,6 @@ typedef struct emm_data_context_s {
int emm_cause; /* EMM failure cause code */ int emm_cause; /* EMM failure cause code */
emm_fsm_state_t _emm_fsm_status; emm_fsm_state_t _emm_fsm_status;
#if defined(EPC_BUILD)
RB_ENTRY(emm_data_context_s) entries;
#endif
} emm_data_context_t; } emm_data_context_t;
/* /*
......
/*******************************************************************************
Eurecom OpenAirInterface
Copyright(c) 1999 - 2013 Eurecom
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Contact Information
Openair Admin: openair_admin@eurecom.fr
Openair Tech : openair_tech@eurecom.fr
Forums : http://forums.eurecom.fr/openairinterface
Address : EURECOM, Campus SophiaTech, 450 Route des Chappes
06410 Biot FRANCE
*******************************************************************************/
#ifndef NAS_DEFS_H_ #ifndef NAS_DEFS_H_
#define NAS_DEFS_H_ #define NAS_DEFS_H_
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
*******************************************************************************/ *******************************************************************************/
#include <string.h>
#include "intertask_interface.h" #include "intertask_interface.h"
#include "nas_itti_messaging.h" #include "nas_itti_messaging.h"
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
*******************************************************************************/ *******************************************************************************/
#include "intertask_interface.h"
#include "conversions.h"
#ifndef NAS_ITTI_MESSAGING_H_ #ifndef NAS_ITTI_MESSAGING_H_
#define NAS_ITTI_MESSAGING_H_ #define NAS_ITTI_MESSAGING_H_
...@@ -37,4 +40,19 @@ int nas_itti_dl_data_req(const uint32_t ue_id, void * const data, ...@@ -37,4 +40,19 @@ int nas_itti_dl_data_req(const uint32_t ue_id, void * const data,
void nas_itti_establish_cnf(const nas_error_code_t error_code, void * const data, void nas_itti_establish_cnf(const nas_error_code_t error_code, void * const data,
const uint32_t length); const uint32_t length);
static inline void nas_itti_auth_info_req(const imsi_t * const imsi,
uint8_t initial_req)
{
MessageDef *message_p;
message_p = itti_alloc_new_message(TASK_NAS, NAS_AUTHENTICATION_PARAM_REQ);
hexa_to_ascii((uint8_t *)imsi->u.value, NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi,
imsi->length);
NAS_AUTHENTICATION_PARAM_REQ(message_p).initial_req = initial_req;
NAS_AUTHENTICATION_PARAM_REQ(message_p).imsi_length = imsi->length - imsi->u.num.parity;
itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p);
}
#endif /* NAS_ITTI_MESSAGING_H_ */ #endif /* NAS_ITTI_MESSAGING_H_ */
/*******************************************************************************
Eurecom OpenAirInterface
Copyright(c) 1999 - 2013 Eurecom
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Contact Information
Openair Admin: openair_admin@eurecom.fr
Openair Tech : openair_tech@eurecom.fr
Forums : http://forums.eurecom.fr/openairinterface
Address : EURECOM, Campus SophiaTech, 450 Route des Chappes
06410 Biot FRANCE
*******************************************************************************/
#include <pthread.h> #include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
*******************************************************************************/ *******************************************************************************/
#include <stdint.h> #include <stdint.h>
#include <string.h>
#include "intertask_interface.h" #include "intertask_interface.h"
...@@ -38,10 +39,30 @@ ...@@ -38,10 +39,30 @@
int s1ap_mme_itti_send_sctp_request(uint8_t *buffer, uint32_t length, int s1ap_mme_itti_send_sctp_request(uint8_t *buffer, uint32_t length,
uint32_t assoc_id, uint16_t stream); uint32_t assoc_id, uint16_t stream);
int s1ap_mme_itti_nas_uplink_ind(const uint32_t ue_id, uint8_t * const buffer, int s1ap_mme_itti_nas_uplink_ind(const uint32_t ue_id, uint8_t *const buffer,
const uint32_t length); const uint32_t length);
int s1ap_mme_itti_nas_downlink_cnf(const uint32_t ue_id, int s1ap_mme_itti_nas_downlink_cnf(const uint32_t ue_id,
nas_error_code_t error_code); nas_error_code_t error_code);
static inline void s1ap_mme_itti_nas_establish_ind(
const uint32_t ue_id, uint8_t * const nas_msg, const uint32_t nas_msg_length,
const long cause, const uint16_t tac)
{
MessageDef *message_p;
message_p = itti_alloc_new_message(TASK_S1AP, NAS_CONNECTION_ESTABLISHMENT_IND);
NAS_CONN_EST_IND(message_p).nas.UEid = ue_id;
/* Mapping between asn1 definition and NAS definition */
NAS_CONN_EST_IND(message_p).nas.asCause = cause + 1;
NAS_CONN_EST_IND(message_p).nas.tac = tac;
NAS_CONN_EST_IND(message_p).nas.initialNasMsg.length = nas_msg_length;
NAS_CONN_EST_IND(message_p).nas.initialNasMsg.data = malloc(sizeof(uint8_t) * nas_msg_length);
memcpy(NAS_CONN_EST_IND(message_p).nas.initialNasMsg.data, nas_msg, nas_msg_length);
itti_send_msg_to_task(TASK_NAS, INSTANCE_DEFAULT, message_p);
}
#endif /* S1AP_MME_ITTI_MESSAGING_H_ */ #endif /* S1AP_MME_ITTI_MESSAGING_H_ */
...@@ -75,7 +75,11 @@ int s1ap_mme_handle_initial_ue_message(uint32_t assoc_id, uint32_t stream, ...@@ -75,7 +75,11 @@ int s1ap_mme_handle_initial_ue_message(uint32_t assoc_id, uint32_t stream,
S1AP_DEBUG("New Initial UE message received with eNB UE S1AP ID: 0x%06x\n", S1AP_DEBUG("New Initial UE message received with eNB UE S1AP ID: 0x%06x\n",
eNB_ue_s1ap_id); eNB_ue_s1ap_id);
if ((ue_ref = s1ap_is_ue_eNB_id_in_list(eNB_ref, eNB_ue_s1ap_id)) == NULL) { ue_ref = s1ap_is_ue_eNB_id_in_list(eNB_ref, eNB_ue_s1ap_id);
if (ue_ref == NULL)
{
uint16_t tac = 0;
/* This UE eNB Id has currently no known s1 association. /* This UE eNB Id has currently no known s1 association.
* Create new UE context by associating new mme_ue_s1ap_id. * Create new UE context by associating new mme_ue_s1ap_id.
* Update eNB UE list. * Update eNB UE list.
...@@ -115,57 +119,21 @@ int s1ap_mme_handle_initial_ue_message(uint32_t assoc_id, uint32_t stream, ...@@ -115,57 +119,21 @@ int s1ap_mme_handle_initial_ue_message(uint32_t assoc_id, uint32_t stream,
/* TODO: should take the first available mme_ue_s1ap_id instead of /* TODO: should take the first available mme_ue_s1ap_id instead of
* the mme_ue_s1ap_id variable. * the mme_ue_s1ap_id variable.
*/ */
assert(0); DevMessage("mme ue s1ap id has wrapped -> case not handled\n");
}
s1ap_dump_eNB(ue_ref->eNB);
{
/* We received the first NAS transport message: initial UE message.
* The containt of the NAS pdu should be forwarded to NAS for processing
*/
MessageDef *message_p;
nas_establish_ind_t *con_ind_p;
s1ap_initial_ue_message_t *s1ap_p;
message_p = itti_alloc_new_message(TASK_S1AP, NAS_CONNECTION_ESTABLISHMENT_IND);
/* We failed to allocate a new message... */
if (message_p == NULL) {
return -1;
} }
con_ind_p = &message_p->ittiMsg.nas_conn_est_ind.nas;
s1ap_p = &message_p->ittiMsg.nas_conn_est_ind.transparent; s1ap_dump_eNB(ue_ref->eNB);
s1ap_p->eNB_ue_s1ap_id = eNB_ue_s1ap_id;
s1ap_p->mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id;
#if !defined(DISABLE_USE_NAS)
con_ind_p->UEid = ue_ref->mme_ue_s1ap_id;
#endif
BIT_STRING_TO_CELL_IDENTITY(&initialUEMessage_p->eutran_cgi.cell_ID, OCTET_STRING_TO_TAC(&initialUEMessage_p->tai.tAC, tac);
s1ap_p->e_utran_cgi.cell_identity);
TBCD_TO_PLMN_T(&initialUEMessage_p->eutran_cgi.pLMNidentity,
&s1ap_p->e_utran_cgi.plmn);
#if !defined(DISABLE_USE_NAS) /* We received the first NAS transport message: initial UE message.
/* Copy the TAI */ * Send a NAS ESTABLISH IND to NAS layer
// TBCD_TO_PLMN_T(&initialUEMessage_p->tai.pLMNidentity, &con_ind_p->tai.plmn); */
OCTET_STRING_TO_INT16(&initialUEMessage_p->tai.tAC, con_ind_p->tac); s1ap_mme_itti_nas_establish_ind(ue_ref->mme_ue_s1ap_id,
#else initialUEMessage_p->nas_pdu.buf,
/* TODO: copy the TAC */ initialUEMessage_p->nas_pdu.size,
// TBCD_TO_PLMN_T(&initialUEMessage_p->tai.pLMNidentity, &con_ind_p->tai.plmn); initialUEMessage_p->rrC_Establishment_Cause,
OCTET_STRING_TO_INT16(&initialUEMessage_p->tai.tAC, con_ind_p->tac); tac);
#endif
/* Copy the NAS payload */
con_ind_p->initialNasMsg.length = initialUEMessage_p->nas_pdu.size;
con_ind_p->initialNasMsg.data = malloc(sizeof(con_ind_p->initialNasMsg.data) *
initialUEMessage_p->nas_pdu.size);
memcpy(con_ind_p->initialNasMsg.data, initialUEMessage_p->nas_pdu.buf,
initialUEMessage_p->nas_pdu.size);
return itti_send_msg_to_task(TASK_NAS, INSTANCE_DEFAULT, message_p);
}
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment