- Work in progress
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4589 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -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 @@
|
|||||||
#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 {
|
|||||||
} 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
|
|||||||
|
|
||||||
/* 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] = {
|
|||||||
/* 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;
|
|||||||
** **
|
** **
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#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)
|
|||||||
** 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)
|
|||||||
** 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)
|
|||||||
** 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)
|
|||||||
** 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)
|
|||||||
** 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)
|
|||||||
** 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,
|
|||||||
** 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
|
|||||||
#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 {
|
|||||||
* 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 {
|
|||||||
* 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 {
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* 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 {
|
|||||||
} 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 {
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
#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
|
|||||||
|
|
||||||
#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)
|
|||||||
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,
|
|||||||
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 {
|
|||||||
* ---------------------------------------------------------------------------
|
* ---------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
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 {
|
|||||||
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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1,3 +1,33 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
|
||||||
|
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 @@
|
|||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#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 @@
|
|||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#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,
|
|||||||
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_ */
|
||||||
|
|||||||
@@ -1,3 +1,33 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
|
||||||
|
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 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
|
|
||||||
@@ -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,
|
|||||||
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,
|
|||||||
/* 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);
|
s1ap_dump_eNB(ue_ref->eNB);
|
||||||
{
|
|
||||||
|
OCTET_STRING_TO_TAC(&initialUEMessage_p->tai.tAC, tac);
|
||||||
|
|
||||||
/* We received the first NAS transport message: initial UE message.
|
/* We received the first NAS transport message: initial UE message.
|
||||||
* The containt of the NAS pdu should be forwarded to NAS for processing
|
* Send a NAS ESTABLISH IND to NAS layer
|
||||||
*/
|
*/
|
||||||
MessageDef *message_p;
|
s1ap_mme_itti_nas_establish_ind(ue_ref->mme_ue_s1ap_id,
|
||||||
nas_establish_ind_t *con_ind_p;
|
initialUEMessage_p->nas_pdu.buf,
|
||||||
|
initialUEMessage_p->nas_pdu.size,
|
||||||
s1ap_initial_ue_message_t *s1ap_p;
|
initialUEMessage_p->rrC_Establishment_Cause,
|
||||||
|
tac);
|
||||||
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_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,
|
|
||||||
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)
|
|
||||||
/* Copy the TAI */
|
|
||||||
// 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);
|
|
||||||
#else
|
|
||||||
/* TODO: copy the TAC */
|
|
||||||
// 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);
|
|
||||||
#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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user